var isNN = document.layers ? true : false;
var isIE = document.all ? true : false;

// Mouse coordinates
var x;
var y;

// Table holding regionId/awarenessType/awarenessLevel/rowNr
var regionTable;

// regionId -> Text mapping
var regionIdToText;

var imageBaseUrl;
var cacheKiller;

// Mapping for filtering gefahren table with regionId
var regionIdToRow;

// Mapping for filtering waldbrand table with regionId
var regionIdToWbRow;

// Mapping for filtering gefahren table with awareness type
var awTypeToRow;

// Calculate offset of gefahrenkarte
var img;
var pin;
var rollover;
var offsetX;
var offsetY;

// Mapping gefahr  -> legende-icon/text
var gefahrTranslator;

// Tooltip stuff
var toolTipRegionId = -1;
var oldNode;

var seeCount;
var flugplatzCount;
var regionCount;

// Do some subclassing
Array.prototype.contains = function (element) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == element) {
			return true;
		}
	}
};

String.prototype.endsWith =  function(suffix) {
	var startPos = this.length - suffix.length;
	if (startPos < 0) {
		return false;
	}
	return  (this.lastIndexOf(suffix, startPos) == startPos);
};

// Gefahren colors
var gefahrenColors = {
'0':'not_selected',
'1':'green',
'2':'yellow',
'3':'orange',
'4':'red',
'5':'dark-red'
};

// Gefahrentypes
var gefahrenTypes = {
'wind':'',
'glatteis':'',
'hitze':'',
'frost':'',
'gewitter':'',
'regen':'',
'tauwetter':'',
'schnee':''
};

// Model for toggle buttons [on/off/mouseover]
var buttonImgModel;

// Path to gefahren level images
var levelImgPath = "/images/warnings/symbole/legende/farben/";

// Initialize View etc
function initialize() {
	hideElement('selected_region', true);
	hideElement('selected_region_legende', false);
   	hideElement('selected_gefahr_legende', false);

	hideElement('link_region', true);
    hideGefahrenTable();
    showAllSeeTable();
    showAllFpTable();
    showAllWbTable();
}

// -------------------
// Gefahrenmodel stuff
// -------------------

// Register listeners
var gefahrenModel;
var toggledChangedListener;
var regionSelectionListener;
var viewUpdateListener;
var gefahrenLevelListener;
var updateGefahrenMapListener;
var updateLegendeListener;

// Updates the view according to changes of the selected region
function RegionSelectionListener(gefahrenModel) {
	gefahrenModel.addPropertyChangedListener(this);

	this.propertyChanged = function(property) {
		if (property.name == 'selectedregionid') {
		
			// Region deselected
			if (property.newValue == 0) {
			
				pin.style.visibility = "hidden";

				clearElementText('selected_region', true);
				clearElementText('selected_region', true);
				hideElement('selected_region', true);
				hideElement('link_region', true);

				// If no radio button is pressed, we display
				// the max level of gefahren for each gefahrentyp
				setAllGefahrLevelToMax();			
	
				// The spec. goes that we see all see & flughafen
				// with no region selected
                showAllSeeTable();
                showAllFpTable();
				showAllWbTable();

				// We must not see gefahren table
                hideGefahrenTable();
			} 
			// Region selected
			else {
			
				// Clear gefahren.since gefahr and region 
				// cannot be selected at the same time
				gefahrenModel.clearGefahrenTypes();

				// Set gefahren level for each radio button
				for (var gefahr in gefahrenTypes) {
					var maxGefahrLevel = gefahrenColors[getMaxGefahrenLevel(gefahr, [property.newValue])];
					gefahrenModel.setGefahrenLevel(gefahr, maxGefahrLevel);
				}
				
				// Update view
				var regionText = getRegionText(property.newValue);
				setElementText('selected_region', regionText);
				showElement('selected_region', true);
				showElement('link_region', true);
				showElement('fp_table', false);
				showElement('see_table', false);
				showElement('wb_table', false);

				// Set pin to new position
				var point = getPinPositionForRegionId(property.newValue);
				if (point) {
					// We are within a container
					pin.style.left = point.x + "px";
					pin.style.top = point.y + "px";
					pin.style.visibility = "visible";
				}

				// Filter see & flughafen tables according to new regionId
				var seeRows = regionIdToSeeRow[property.newValue];				
				if (seeRows) {
					showFilteredSeeTable(property.newValue);
				}
                else {
	            	showEmptySeeTable();
				}
				var fpRows = regionIdToFpRow[property.newValue];
                if (fpRows) {
					showFilteredFpTable(property.newValue);
				}			
                else {
					showEmptyFpTable();
                }
				var wbRows = regionIdToWbRow["a"+property.newValue];				
				if (wbRows) {
					showFilteredWbTable(property.newValue);
				}
                else {
	            	showEmptyWbTable();
				}


				// Filter situations
	            if (regionIdToRow['a' + property.newValue]) {
	                // Normal filter
					//	showGefahrenRows(property.newValue);
	                showGefahrenTable(property.newValue);
	                colorGefahrenTable();
	            }
	            else {
	                showEmptyGefahrenTable()
				}
			}
		}
	}
	// Position footer
	moveFooter();
}

// Implements the radio-button behaviour for gefahren buttons
function ToggleChangedListener(gefahrenModel) {
	
	gefahrenModel.addPropertyChangedListener(this);
	
	this.propertyChanged = function(property) {

		if (property.type == 'gefahren') {

			if (property.newValue) {
		
				// Either gefahr or region can be selected
				gefahrenModel.setSelectedRegionId(0);

				// If a radio button is pressed, all other buttons are inactive
				var type = gefahrenModel.getAllGefahrenType();
			
				for (var i = 0; i < type.length; i++) {
					if(type[i] != property.name) {
						gefahrenModel.setGefahrenType(type[i], false);
					}
				}

				// If a radio button is pressed all other level are inactive
				for (var gefahr in gefahrenTypes) {
					gefahrenModel.setGefahrenLevel(gefahr, 0);
				}
			}
			else{
				// If no radio button is pressed, we display
				// the max level of gefahren for each gefahrentyp
				for (var gefahr in gefahrenTypes) {
					var maxGefahrLevel = gefahrenColors[getMaxGefahrenLevel(gefahr, [property.newValue])];
					gefahrenModel.setGefahrenLevel(gefahr, maxGefahrLevel);
				}
			}
			moveFooter();
		} 
	}
}

// Updates the view (buttons/tables)
function ViewUpdateListener(gefahrenModel) {

	gefahrenModel.addPropertyChangedListener(this);
	
	this.propertyChanged = function(property) {
		
		if (property.type == 'gefahren') {
			
			// Toggle image of pushed radio button
			var doc = document.getElementById(property.name + '_toggle');
			var src = doc.src;

			if (property.newValue) {
				// Set max gefahren level
				var maxGefahr = gefahrenColors[getMaxGefahrenLevel(property.name, 0)];
				gefahrenModel.setGefahrenLevel(property.name, maxGefahr);
				doc.src = buttonImgModel.getSelected(property.name);

				// Filter situations
				var r = regionTable.findRows('awarenessType', gefahrenModel.getAllSetGefahrenType());
	            if (r.getRowCount()) {
	                // Normal filter
                    document.getElementById('gefahren_table').style.display = 'block';
	                filterTableByGefahren(gefahrenModel.getAllSetGefahrenType());
	                colorGefahrenTable();
	            }
	            else {
	                showEmptyGefahrenTable()
				}

				colorGefahrenTable();

				// See & Flugplaetze must not be shown when gefahr is selected
                hideSeeTable();
                hideFpTable();
				hideWbTable();
			}
			else {
				doc.src = buttonImgModel.getUnselected(property.name);
				// Clear table
                hideGefahrenTable();
                showAllSeeTable();
                showAllFpTable();
				showAllWbTable();
			}
			moveFooter();
		}
	}
}

function GefahrenLevelListener(gefahrenModel) {

	gefahrenModel.addPropertyChangedListener(this);

	this.propertyChanged = function(property) {
		if (property.type == 'level') {
			var docLevel = document.getElementById(property.name + '_level');
			var srcLevel = docLevel.src;
			
			if (property.newValue) {
				srcLevel = levelImgPath + property.newValue + '.png';
			}
			else {
				srcLevel = levelImgPath + 'not_selected.gif';
			}
			docLevel.src = srcLevel;
		}
	}
}

function UpdateGefahrenMapListener(gefahrenModel) {

	gefahrenModel.addPropertyChangedListener(this);

	this.propertyChanged = function(property) {
		if (property.type == 'gefahren') {
			if (property.newValue) {
				// Show swiss map colored with selected gefahr
                document.getElementById('all_regions').src = imageBaseUrl + 'details_' + property.name + '.png?' + cacheKiller;

			}
			else {
				// If no gefahren selected, switch to all gefahren image
				if (!gefahrenModel.isGefahrenTypeSet()) {
					
					// Table must not be shown
					document.getElementById('gefahren_table').style.display = 'none';
					// Show swiss map with all max gefahren per region
					document.getElementById('all_regions').src = imageBaseUrl + 'uebersicht.png?' + cacheKiller;

					// See & Flughafen -> show
					showElement('fp_table', false);
					showElement('see_table', false);
					showElement('wb_table', false);
				}
			}
			moveFooter();
		}
	}
}

function UpdateLegendeListener(gefahrenModel) {

	gefahrenModel.addPropertyChangedListener(this);

	this.propertyChanged = function(property) {
		if (property.type == 'gefahren') {
			if (property.newValue) {
                hideElement('selected_region_legende', false);
				
				setElementText('selected_gefahr_legende_txt', gefahrTranslator[property.name][1]);

				document.getElementById('selected_gefahr_legende_src').src = gefahrTranslator[property.name][0];
                // Show selected gefahr instead of region
                showElement('selected_region', true);
                showElement('link_region', true);
				setElementText('selected_region', gefahrTranslator[property.name][2]);
				showElement('selected_gefahr_legende', false);
                showElement('selected_gefahr_legende', false);
			}
			else {
				hideElement('selected_gefahr_legende', false);
                hideElement('selected_gefahr_legende', false);
                hideElement('selected_region', true);
                hideElement('link_region', true);
			}
			moveFooter();
		}
		if (property.name == 'selectedregionid') {
			if (property.newValue) {
                showElement('selected_region_legende', false);
				setElementText('selected_region_legende_txt', getRegionText(property.newValue));
                hideElement('selected_gefahr_legende', false);
			}
			else {
                 hideElement('selected_region_legende', false);
			}
		}
	}
}

// If we click outside of the map and radio is pressed, reset to all gefahren
function resetRadiosIfOutsideMap(regionId) {
	if (!regionId && gefahrenModel.isGefahrenTypeSet()) {
		gefahrenModel.setSelectedRegionId(0);
		gefahrenModel.clearGefahrenTypes();
	}
}

function showFilteredSeeTable(regionId) {
    showElement('see_table_title', false);
	// Filter see & flughafen tables according to new regionId
	var seeRows = regionIdToSeeRow[regionId];				
	hideElement('see_table_empty', false);
	filterOtherTable('see', seeRows);
	colorOtherTable('see');
}

function showFilteredWbTable(regionId) {
    showElement('wb_table_title', false);
	// Filter wb tables according to new regionId
	var wbRows = regionIdToWbRow["a"+regionId];				
	hideElement('wb_table_empty', false);
	filterWbTable(wbRows, regionId);
	colorOtherTable('wb');
}


function showEmptySeeTable() {
	showElement('see_table_empty', false);
    hideElement('see_table', false);
    showElement('see_table_title', false);
}

function showEmptyWbTable() {
	showElement('wb_table_empty', false);
    hideElement('wb_table', false);
    showElement('wb_table_title', false);
}


function hideSeeTable() {
	hideElement('see_table_empty', false);
	hideElement('see_table_title', false);
    hideElement('see_table', false);
}

function hideWbTable() {
	hideElement('wb_table_empty', false);
	hideElement('wb_table_title', false);
    hideElement('wb_table', false);
}


function showAllSeeTable() {
	if (seeCount > 0) {
    	hideElement('see_table_empty', false);
		showElement('see_table', false);
    	showElement('see_table_title', false);
    	showAllRecordsSeenFpTable('see', true);
		colorOtherTable('see');
    }
	else {
		showEmptySeeTable();	
	}
}

function showAllWbTable() {
	hideElement('wb_table_empty', false);
	showElement('wb_table', false);
	showElement('wb_table_title', false);
	showAllRecordsWbTable(true);
	colorOtherTable('wb');
}


function showFilteredFpTable(regionId) {
    showElement('see_table_title', false);
	// Filter see & flughafen tables according to new regionId
	var seeRows = regionIdToFpRow[regionId];				
	hideElement('fp_table_empty', false);
	filterOtherTable('fp', seeRows);
	colorOtherTable('fp');

}

function showEmptyFpTable() {
	showElement('fp_table_empty', false);
    hideElement('fp_table', false);
    showElement('see_table_title', false);
}

function hideFpTable() {
	hideElement('fp_table_empty', false);
	hideElement('see_table_title', false);
    hideElement('fp_table', false);
}

function showAllFpTable() {
	if (flugplatzCount > 0) {
    	hideElement('fp_table_empty', false);
		showElement('fp_table', false);
    	showElement('see_table_title', false);
    	showAllRecordsSeenFpTable('fp', true);
		colorOtherTable('fp');
    }
	else {
		showEmptyFpTable();	
	}
}

function showGefahrenTable(regionId) {
	hideElement('gefahren_table_empty', false);
	showElement('gefahren_table', false);
	showGefahrenRows(regionId);
}

function showEmptyGefahrenTable() {
	showElement('gefahren_table_empty', false);
    hideElement('gefahren_table', false);
}

function hideGefahrenTable() {
	hideElement('gefahren_table_empty', false);
    hideElement('gefahren_table', false);
}



// Does hide an element. If keepSpace is true, the taken space won't be changed
function hideElement(id, /* Boolean */ keepSpace) {
	var doc = document.getElementById(id);
    if (!doc) return;

	if (keepSpace) {
		doc.style.visibility = 'hidden';
	}
	else {
		doc.style.display = 'none';
	}
}

// Does show an element. If keepSpace is true, the taken space won't be changed
function showElement (id, /* Boolean */ keepSpace) {
	var doc = document.getElementById(id);
	if (!doc) return;

	if (keepSpace) {	
		doc.style.visibility = 'visible';
	}
	else {
		doc.style.display = 'block';	
	}
}

function setElementText(id, text) {
        var doc = document.getElementById(id);
		if (!doc) return;
		doc.innerHTML = text;
}

function clearElementText(id) {
	setElementText(id, '');
}

function buttonRollOver(/* String */ button, rollover) {
	var doc = document.getElementById(button + '_toggle');
	
	if (rollover) {
		buttonImgModel.setMouseOver(button, true);
		doc.src = buttonImgModel.getRollover(button);
	}
	else {
		buttonImgModel.setMouseOver(button,false);
		doc.src = buttonImgModel.getLast(button);
	}
}

// Adds a tooltip job
function addToolTipJob(regionId) {
	// Show tooltip only if we have a region change
	if (toolTipRegionId != regionId) {
		setTimeout('showToolTip(' + regionId + ');', 500);
		toolTipRegionId = regionId;
	}
}

// Tooltip is only shown if current 
// regionId is equal to regionId when the tooltip was scheduled
function showToolTip(regionId) {
	var currentRegionId = getRegionId(x, y);
  if (regionId == currentRegionId && currentRegionId != 0) {
		displayRollover(currentRegionId);
	}
	else if (currentRegionId == 0) {
		clearRollover();
	}
}

function setAllGefahrLevelToMax() {
	for (var gefahr in gefahrenTypes) {
		var maxGefahrLevel = gefahrenColors[getMaxGefahrenLevel(gefahr, 0)];
		gefahrenModel.setGefahrenLevel(gefahr, maxGefahrLevel);
	}
}

function /* String */ getMaxGefahrenLevel(/* String */ gefahr, regionId) {
	var r = regionTable.findRows('awarenessType', [gefahr]);
	
	if (regionId != 0) {
		r = r.findRows('regionId', regionId); 
	}

	var row = r.getRow(0);
	
	if (row) {
		return row[2];
	}
	else {
		// No gefahr
		return 1;
	}
	
	return 0;
}

function /* void */ colorGefahrenTable() {
	var row = 0;
	var visibleRow = 0;

	while(1) {
		var tableRow = document.getElementById('gefahren_row_' + row);
		
		// None or no more rows
		if (!tableRow) {
			break;
		}
		
		// Skip hidden rows
		if (tableRow.style.display == 'none') {
			row++;
			continue;
		}
		
		if (visibleRow % 2) {
			tableRow.setAttribute('class', 'even');
			tableRow.setAttribute('className', 'even');
		}
		else {
			tableRow.setAttribute('class', 'odd');
			tableRow.setAttribute('className', 'odd');
		}
		row++;
		visibleRow++;
	}
}


function filterTableByGefahren(/* [] */ gefahren) {
	var r = regionTable.findRows('awarenessType', gefahren);
	
	// Create array of distinct table indices
	var tableRowIndices = new Array();
	for (var i = 0; i < r.getRowCount(); i++) {
		var row = r.getRow(i);
		if (!tableRowIndices.contains(row[3])) {
			tableRowIndices.push(row[3]);
		}
	}
	
	showGefahrenTableRows(tableRowIndices, 0);
}

function /* void */ showGefahrenRows(/* Integer */ regionId) {
	var rows = regionIdToRow['a' + regionId];
	if (rows) {
		showGefahrenTableRows(rows, regionId);
	}
	else {
		// Unknown region
		showGefahrenTableRows([], regionId);
	}
}

function /* void */ showWbRows(/* Integer */ regionId) {
	var rows = regionIdToWbRow['a' + regionId];
	if (rows) {
		showWbTableRows(rows, regionId);
	}
	else {
		// Unknown region
		showWbTableRows([], regionId);
	}
}


function /* void */ showGefahrenTableRows(/* Integer[] */ rows, regionId) {
	var row = 0;
	
	while(1) {
		var tableRow = document.getElementById('gefahren_row_' + row);
		
		// None or no more rows
		if (!tableRow) {
			break;
		}
		
		if (rows.contains(row)) {
			tableRow.style.display = '';
			
			// Text for single region
			setElementText('table_row_region_' + row, getRegionText(regionId));
			
			if (regionId ==0) {
				// Display all regions
				document.getElementById('table_row_all_regions_'+row).style.display = '';
				document.getElementById('table_row_region_' + row).style.display = 'none';
				showElement('table_row_all_regions_' + row);
				hideElement('table_row_region_' + row);
			}
			else {
				document.getElementById('table_row_all_regions_'+row).style.display = 'none';
				document.getElementById('table_row_region_' + row).style.display = '';
				hideElement('table_row_all_regions_' + row);
				showElement('table_row_region_' + row);
			}
		}
		else {
			tableRow.style.display = 'none';
		}
		row++;
	}
}


function /* void */ colorOtherTable(prefix) {
	var row = 0;
	var visibleRow = 0;

	while(1) {
		var tableRow = document.getElementById(prefix+'_tr_' + row);
		
		// None or no more rows
		if (!tableRow) {
			break;
		}
		
		// Skip hidden rows
		if (tableRow.style.display == 'none') {
			row++;
			continue;
		}
		
		if (visibleRow % 2) {
			tableRow.setAttribute('class', 'even');
			tableRow.setAttribute('className', 'even');
		}
		else {
			tableRow.setAttribute('class', 'odd');
			tableRow.setAttribute('className', 'odd');
		}
		row++;
		visibleRow++;
	}
}


// prefix=[see|fp], rows to display
function filterOtherTable(prefix, rows) {
    var row = 0;
    var visibleRow = 0;

	// Hide all
	if (!rows) {
		rows = [];
	}
	
	while(1) {
		var tableRow = document.getElementById(prefix + '_tr_' + row);
		
		// None or no more rows
		if (!tableRow) {
			break;
		}
		
		if (rows.contains(row)) {
			tableRow.style.display = '';
		}
		else {
			tableRow.style.display = 'none';
		}
		row++;
	}
}

function filterWbTable(rows, regionId) {
    var row = 0;
    var visibleRow = 0;

	// Hide all
	if (!rows) {
		rows = [];
	}
	
	while(1) {
		var tableRow = document.getElementById('wb_tr_' + row);
		
		// None or no more rows
		if (!tableRow) {
			break;
		}
		
		if (rows.contains(row)) {
			tableRow.style.display = '';
		}
		else {
			tableRow.style.display = 'none';
		}

		hideElement("table_row_all_regions_wb_"+row);
		showElement("table_row_region_wb_"+row);
		setElementText('table_row_region_wb_' + row, getRegionText(regionId));

		row++;
	}
}


// prefix = [see|fp] 
function showAllRecordsSeenFpTable(prefix, show) {
	var row = 0;	
	while(1) {
		var tableRow = document.getElementById(prefix + '_tr_' + row);
		
		// None or no more rows
		if (!tableRow) {
			break;
		}
		
		if (show) {
			tableRow.style.display = '';
		}
		else {
			tableRow.style.display = 'none';
		}
		row++;
	}
}

function showAllRecordsWbTable(show) {
	var row = 0;	
	while(1) {
		var tableRow = document.getElementById('wb_tr_' + row);
		
		// None or no more rows
		if (!tableRow) {
			break;
		}
		
		if (show) {
			tableRow.style.display = '';
		}
		else {
			tableRow.style.display = 'none';
		}
		
		showElement("table_row_all_regions_wb_"+row);
		hideElement("table_row_region_wb_"+row);

		row++;
	}
}



function /* void */ clearRollover() {
		if (oldNode) {
		  rollover.style.visibility = 'hidden';
		}
}

function /* void */ displayRollover(regionId) {

	var r = regionTable.findRows('regionId', [regionId]);
	
	// Do we need to filter for gefahr?
	var selectedGefahren = gefahrenModel.getAllSetGefahrenType();
	if (selectedGefahren.length > 0) {
		r = r.findRows('awarenessType', selectedGefahren);
	}

	var row = r.getRow(0);
	var tableDiv;
	if (!row || row[3] < 0) {

/*		clearRollover();
		return;*/
		tableDiv = document.getElementById('gefahren_table_none');
	} else {
		tableDiv = document.getElementById('rollover_' + row[3]);
	}
	
	if (tableDiv) {
		var newNode = tableDiv.cloneNode(true);
		
		if (oldNode) {
			rollover.removeChild(oldNode);
		}
		
		var bb = getBoundingBox(regionId);
		
		oldNode = newNode;
		rollover.appendChild(newNode);
		rollover.style.left = bb.x + bb.width + 5 + 'px';
		rollover.style.top = bb.y + 'px';
		rollover.style.visibility= 'visible';
		var doc = document.getElementById('warningRegionText');
		doc.innerHTML = getRegionText(regionId);
	}
}

function getRegionText(regionId) {
	return regionIdToText["r" + regionId];
}


function handleMouseMove(evt) {
  // IE passes null
  if (!evt) evt = window.event;

  // FF, Moz, Opera
  if (evt.pageX || evt.pageY) {
    x = evt.pageX - offsetX;
    y = evt.pageY - offsetY;
  } 
  // IE
  else if (evt.clientX || evt.clientY) {
    x = evt.clientX + document.body.scrollLeft;
    y = evt.clientY + document.body.scrollTop;
    x = evt.offsetX;
    y = evt.offsetY;
  }

  // window.status = "Mouse: X="+ x +",Y="+ y + " xOffset=" + offsetX + " yOffset=" + offsetY + " RegionId=" + getRegionId(x,y);
  return false;
}

function getAbsX(element) {
  return (element.offsetParent)? 
  element.offsetLeft+getAbsX(element.offsetParent) : element.offsetLeft;
}

function getAbsY(element) {
  return (element.offsetParent)? 
  element.offsetTop+getAbsY(element.offsetParent) : element.offsetTop;
}

var scanlines = [[],
[324,138,324],
[324,138,329,326,138,326,328,138,329],
[324,138,334,334,138,334],
[326,138,336,334,138,336],
[326,138,337,335,138,337],
[319,138,338,335,138,338],
[316,138,338,319,138,330,335,138,338],
[314,138,338,334,138,338],
[313,138,343,333,138,338,341,138,343],
[313,138,344],
[311,138,342],
[311,138,342],
[311,138,341],
[311,138,341],
[311,138,341,351,139,352],
[309,138,343,349,139,354],
[309,138,343,350,139,354],
[308,138,343,350,139,357],
[306,138,343,353,139,359],
[306,138,343,354,139,358],
[306,138,337,332,139,358,336,138,337,339,139,340,343,139,345,353,139,358],
[307,138,330,332,139,358,339,139,348,353,139,358,379,151,381],
[307,138,330,332,139,358,353,139,358,377,151,386],
[306,138,329,331,139,361,375,151,390],
[306,138,327,324,138,327,330,139,361,374,151,392],
[308,138,319,331,139,361,372,151,392,394,162,397],
[309,138,318,331,139,359,371,151,392,394,162,398],
[313,138,319,332,139,358,360,151,392,362,151,362,368,151,392,394,162,399],
[314,138,319,319,138,319,332,139,358,360,151,391,392,162,403],
[332,139,358,360,151,391,392,162,403],
[329,139,354,356,141,358,360,151,391,392,162,407],
[329,139,353,355,141,359,361,151,391,392,162,408],
[319,140,320,329,139,353,354,141,360,362,151,390,392,162,411],
[318,140,323,329,139,353,339,139,344,346,141,363,349,139,353,354,141,363,365,151,390,392,162,413],
[280,122,280,318,140,323,330,139,353,336,141,363,345,141,348,349,139,353,354,141,363,365,151,390,392,162,413],
[279,122,282,285,130,287,314,140,323,329,139,353,334,141,363,351,139,353,354,141,363,364,151,390,392,162,415],
[278,122,282,284,130,290,314,140,323,329,139,353,334,141,363,353,139,353,354,141,363,364,151,390,392,162,416],
[278,122,282,283,130,290,313,140,323,329,139,330,332,141,363,354,141,363,367,151,390,392,162,417],
[276,122,284,286,130,290,312,140,326,328,141,366,368,151,390,392,162,419],
[213,101,213,273,122,285,286,130,290,313,140,327,316,140,327,329,141,366,368,151,389,391,162,421],
[205,101,214,211,101,214,233,112,242,238,112,242,273,122,287,289,130,293,316,140,334,336,141,363,365,151,388,390,162,424],
[205,101,215,210,101,215,233,112,242,237,112,242,268,122,288,290,130,293,316,140,335,336,141,363,366,151,389,391,162,423],
[205,101,216,210,101,216,233,112,243,268,122,287,289,130,304,304,130,304,317,140,335,337,141,363,343,141,363,366,151,389,391,162,424],
[202,101,215,233,112,243,268,122,285,288,130,318,303,130,307,309,130,318,319,140,339,343,141,363,365,152,366,368,151,389,378,151,389,392,162,423],
[202,101,213,232,112,243,268,122,287,288,130,318,319,140,337,321,140,337,340,141,363,364,152,377,370,151,388,375,152,377,379,151,388,390,162,424],
[200,101,210,231,112,262,262,112,262,264,122,287,288,130,321,326,141,362,329,140,335,336,141,362,364,152,377,380,151,388,390,162,424],
[199,101,211,230,112,262,250,112,256,261,112,262,264,122,287,288,130,322,324,141,362,329,140,332,336,141,362,364,152,379,388,151,388,390,162,426],
[198,101,212,228,112,263,250,112,263,266,122,287,289,130,322,324,141,361,330,140,330,333,141,361,363,152,387,390,162,426],
[195,101,213,224,112,265,266,122,287,289,130,323,324,141,361,363,152,389,391,162,428,414,162,428],
[195,101,214,221,112,265,266,122,287,289,130,323,325,141,361,363,152,389,391,162,429,407,173,412,414,162,429],
[198,101,222,225,112,255,258,122,287,289,130,324,326,141,362,364,152,389,391,162,430,407,173,412,414,162,430],
[198,101,224,228,112,255,256,122,287,288,130,325,326,141,362,364,152,389,391,162,430,407,173,413,417,162,430],
[198,101,227,230,112,254,256,122,287,288,130,325,326,141,361,363,152,389,391,162,431,407,173,416,417,162,431],
[195,101,229,198,101,229,231,112,252,254,122,284,288,130,325,326,141,362,340,141,362,364,152,388,389,163,391,392,162,430,407,173,446,418,162,430,432,173,433,446,173,446],
[196,101,229,231,112,252,253,122,284,286,131,287,291,130,325,326,141,362,342,141,362,364,152,386,389,163,391,393,162,430,404,162,405,407,173,446,413,173,417,419,162,430,432,173,434,445,173,446],
[135,201,136,196,101,228,230,112,251,253,122,283,283,122,283,285,131,292,294,130,325,326,141,363,339,142,343,344,141,363,364,152,384,386,163,411,397,163,406,409,163,411,412,173,448,422,162,427,430,173,436,445,173,448],
[133,201,150,148,201,150,196,101,227,229,112,250,243,112,250,252,122,280,282,123,282,285,131,293,294,130,325,326,141,363,339,142,343,345,141,363,364,152,384,386,163,411,412,173,449,423,162,426,428,173,436,443,173,449],
[132,201,151,147,201,151,186,101,226,195,101,226,228,112,249,239,112,239,241,113,242,244,112,249,251,122,280,281,123,283,285,131,293,296,130,325,326,141,363,339,142,343,345,141,363,365,152,383,385,163,410,412,173,449,425,162,425,427,173,449],
[132,201,155,185,101,224,194,101,224,225,113,242,233,112,248,236,113,242,245,112,248,250,122,272,278,123,282,283,131,297,307,130,325,327,141,363,339,142,355,346,141,352,354,142,355,357,141,363,364,152,382,384,163,410,412,173,452,426,173,449,452,173,452],
[132,201,155,187,101,223,193,101,223,225,113,244,236,113,242,244,113,244,250,122,272,273,123,281,283,131,305,307,130,325,330,141,362,337,141,337,339,142,355,349,141,351,353,142,355,358,141,362,364,152,381,383,163,410,412,173,452,452,173,452],
[132,201,154,189,101,222,223,113,247,249,122,270,272,123,282,283,131,307,310,130,323,325,142,359,331,141,361,334,142,359,361,141,361,363,152,381,382,163,411,414,173,456],
[132,201,154,189,101,222,223,113,247,249,122,270,272,123,282,283,131,309,311,130,322,324,142,359,331,141,332,334,142,359,362,152,378,382,163,413,418,173,457],
[134,201,154,189,101,221,223,113,247,249,122,270,271,123,282,283,131,310,313,130,320,323,142,359,332,141,332,334,142,359,361,152,378,380,163,416,418,173,455],
[133,201,154,187,101,220,197,102,200,203,101,220,222,113,247,248,122,268,270,123,282,284,131,314,316,130,318,320,142,357,333,142,357,359,152,380,382,163,416,417,173,451,454,174,456],
[134,201,154,186,101,219,193,102,201,203,101,219,221,113,247,249,122,266,270,123,283,285,131,315,317,130,317,319,142,356,358,152,381,382,163,416,385,163,416,417,173,448,452,174,456],
[130,201,153,188,102,204,206,101,218,220,113,248,250,122,264,266,123,284,286,131,317,319,142,354,356,152,381,382,153,384,386,163,415,417,173,444,446,174,456],
[130,201,153,185,102,205,210,101,217,214,101,217,220,113,248,250,122,262,261,122,262,265,123,284,286,131,316,318,142,354,356,152,379,382,153,385,388,163,414,416,173,441,445,174,456],
[130,201,156,174,102,213,183,102,209,211,102,213,215,101,217,219,113,248,250,122,258,260,123,284,264,123,284,286,131,316,318,142,354,356,152,378,380,153,386,388,163,414,416,173,441,442,174,456],
[126,201,161,168,102,214,215,101,217,218,113,249,251,122,252,258,123,284,286,131,315,317,142,356,357,152,377,379,153,386,389,163,413,414,173,442,425,173,442,444,174,457],
[127,201,161,167,102,214,215,101,216,218,113,250,251,122,251,253,114,256,258,123,284,286,131,315,317,142,356,357,152,378,380,153,386,388,163,413,414,173,441,423,164,424,427,173,429,432,173,441,444,174,457],
[127,201,161,162,102,215,164,102,215,217,113,248,251,114,257,260,123,283,285,131,315,316,142,356,359,152,378,380,153,386,388,163,412,414,173,440,421,164,431,430,164,431,433,173,440,442,174,458],
[127,201,160,162,102,215,217,113,247,249,114,258,260,123,283,285,131,315,317,142,357,359,152,376,379,153,386,388,163,412,414,173,440,419,164,431,433,173,440,442,174,459],
[126,201,160,162,102,214,216,113,246,248,114,258,260,123,283,285,131,316,320,142,356,358,152,376,378,153,386,388,163,412,398,163,412,414,173,439,418,164,431,434,173,434,436,173,439,441,174,460],
[123,201,159,160,102,214,215,113,245,246,114,257,260,123,284,286,131,320,322,142,356,358,152,376,377,153,387,389,164,434,400,163,413,416,164,434,436,173,437,439,174,459],
[123,201,159,161,102,213,215,113,243,246,114,259,261,123,285,286,131,321,324,142,356,358,152,376,377,153,387,389,164,434,401,163,413,415,164,434,439,174,459],
[122,201,159,161,102,213,215,113,243,245,114,260,261,123,285,288,131,323,325,142,355,357,152,375,377,153,388,389,164,437,402,163,414,416,164,437,439,174,459],
[122,201,159,156,202,156,159,201,159,163,102,213,215,113,243,245,114,260,262,123,287,289,131,320,325,143,325,327,142,357,359,152,375,373,152,375,377,153,388,389,164,437,402,163,414,416,164,437,439,174,454],
[122,201,152,155,202,157,160,203,162,165,102,212,176,102,212,214,113,240,244,114,260,261,123,287,289,131,320,321,143,325,327,142,356,339,142,348,350,142,356,358,152,374,372,153,388,374,152,374,376,153,388,391,164,436,403,163,413,415,164,436,438,174,453],
[120,201,146,152,202,158,160,203,176,178,102,214,180,103,187,187,103,187,189,102,192,194,102,214,218,113,235,231,113,235,237,114,259,261,123,285,294,131,319,321,143,351,330,142,357,336,143,339,344,143,346,348,143,351,354,142,357,359,152,368,362,152,368,371,153,389,375,153,389,391,164,436,404,163,411,413,164,436,438,174,452],
[120,201,134,147,202,158,160,203,176,178,102,216,180,103,230,193,103,193,198,102,216,222,113,235,228,103,230,231,113,235,236,114,259,261,123,285,286,132,293,304,131,318,320,143,353,331,142,358,335,143,353,355,142,358,360,152,368,363,152,368,369,153,390,393,164,436,404,163,411,412,164,436,438,174,451],
[120,201,132,138,202,158,160,203,176,178,102,215,180,103,230,198,102,215,217,103,221,223,113,234,228,103,230,232,113,234,236,114,258,260,123,285,278,123,285,286,132,303,310,131,318,314,131,318,320,143,353,331,142,359,334,143,353,355,142,359,361,153,391,363,152,366,369,153,391,393,164,436,404,163,410,412,164,436,438,174,451],
[119,201,124,123,201,124,140,202,156,157,203,176,178,204,179,180,103,230,200,102,211,216,103,222,223,113,226,228,103,230,233,114,257,258,123,282,276,132,315,281,123,282,284,132,315,316,131,318,319,143,355,333,142,359,334,143,355,357,142,359,361,153,391,369,153,391,392,164,433,409,164,433,435,174,451],
[140,202,156,157,203,176,178,204,179,181,103,229,200,102,210,212,103,222,224,113,226,228,103,229,231,114,256,258,123,281,276,132,315,281,123,281,283,132,315,316,131,317,319,143,356,334,143,356,362,153,391,392,164,431,406,164,431,434,174,451],
[141,202,154,156,203,176,178,204,181,183,103,229,203,102,207,210,103,223,227,103,229,231,114,255,257,123,272,274,132,316,283,132,316,318,143,361,365,153,391,392,164,428,431,174,450],
[141,202,154,156,203,175,177,204,181,183,103,229,205,102,206,208,103,223,225,103,229,231,114,256,258,123,272,273,132,316,283,132,316,318,143,364,364,143,364,366,153,391,393,164,428,430,174,450],
[141,202,154,155,203,175,177,204,182,183,103,229,207,103,229,231,114,256,258,123,272,273,132,316,318,143,364,366,153,391,393,164,427,429,174,449],
[140,202,152,154,203,174,176,204,183,185,103,227,229,104,229,231,114,255,253,123,272,255,114,255,258,123,272,274,132,316,318,143,363,366,153,392,394,164,426,428,174,449],
[139,202,151,153,203,174,176,204,184,185,103,224,228,104,229,231,114,251,253,123,273,256,123,273,275,132,316,318,143,364,366,153,392,394,164,426,428,174,448],
[135,202,150,152,203,175,177,204,184,185,103,223,225,104,230,231,114,251,253,123,275,277,132,317,319,143,363,365,144,370,372,153,394,396,164,422,426,174,446],
[135,202,149,151,203,175,177,204,184,186,103,222,224,104,230,231,114,251,253,123,275,269,123,271,273,123,275,277,132,317,319,143,363,365,144,371,372,153,394,379,153,394,396,164,421,423,174,446],
[135,202,146,150,203,175,177,204,184,186,103,222,223,104,230,232,114,251,253,123,275,268,124,272,272,124,272,275,123,275,277,132,317,319,143,362,366,144,371,372,153,394,378,154,378,380,153,394,396,164,419,422,174,445],
[135,202,144,147,203,174,176,204,190,193,103,217,220,104,230,232,114,252,254,123,259,262,124,275,277,132,317,319,143,356,357,144,373,375,154,381,382,153,396,397,164,418,420,174,444],
[134,202,144,146,203,174,176,204,191,193,103,216,218,104,231,233,114,253,255,123,258,260,124,276,279,132,317,319,143,356,357,144,373,375,154,381,382,153,396,397,164,418,420,174,444],
[130,202,144,146,203,172,174,204,192,193,103,215,217,104,231,233,114,252,259,124,277,279,132,317,319,143,354,356,144,372,374,154,380,382,153,391,395,165,396,398,164,418,420,174,442],
[127,202,144,146,203,168,173,204,192,193,103,213,216,104,232,233,114,250,253,124,277,279,132,318,319,143,354,356,144,373,374,154,380,382,153,391,392,165,397,400,164,419,420,174,441,443,175,443],
[127,202,144,146,203,167,169,204,192,193,103,210,214,104,232,233,114,247,251,124,277,279,132,318,320,143,354,356,144,373,374,154,381,382,153,391,392,165,398,401,164,419,420,174,441,443,175,443],
[127,202,144,145,203,166,168,204,190,192,103,205,210,104,232,234,114,242,246,124,278,280,132,319,321,143,352,344,143,348,352,143,352,355,144,373,375,154,382,384,153,389,391,165,402,405,164,419,420,174,441,436,174,441,442,175,442,444,176,445],
[127,202,144,145,203,167,168,204,190,192,103,201,206,104,232,234,114,240,243,124,279,281,132,320,321,143,345,341,144,373,344,143,345,350,144,351,353,144,373,375,154,383,384,153,388,391,165,403,409,164,419,416,164,419,421,174,440,434,175,442,437,174,440,442,175,442,444,176,446],
[127,202,144,145,203,165,168,204,190,192,103,198,200,104,233,238,124,279,281,132,320,322,143,337,340,144,370,372,154,384,386,153,387,389,165,420,418,164,418,420,165,420,422,174,430,432,175,441,441,175,441,443,176,447],
[127,202,144,145,203,158,166,204,190,192,103,197,199,104,233,236,124,279,281,132,321,315,132,321,323,143,333,338,144,368,371,154,384,389,165,421,419,165,421,424,174,429,431,175,441,443,176,447],
[127,202,143,145,203,156,159,204,190,192,103,196,198,104,232,234,115,235,236,124,280,281,132,322,311,145,314,316,132,322,324,143,332,335,144,367,369,154,388,390,165,423,425,174,429,429,174,429,430,175,441,442,176,447],
[127,202,143,145,203,152,156,204,191,194,104,230,231,115,235,241,124,280,282,132,323,307,145,315,310,132,310,312,145,315,317,132,323,325,143,333,334,144,362,366,154,390,392,165,421,423,175,440,442,176,446],
[128,202,143,145,203,150,153,204,188,192,105,192,194,104,228,231,115,240,241,124,280,282,132,324,307,145,315,312,145,315,318,132,324,326,143,332,329,143,329,331,143,332,334,144,360,360,144,360,363,154,391,392,165,421,423,175,440,442,176,446],
[127,202,142,144,203,146,149,204,183,186,105,192,194,104,227,228,115,240,241,124,281,283,132,324,306,145,320,319,145,320,322,132,324,327,144,356,331,143,331,333,144,356,358,154,391,392,165,421,422,175,439,441,176,448],
[126,202,142,147,204,179,184,105,192,194,104,225,228,115,240,241,124,281,283,132,303,295,132,303,306,145,321,326,144,355,333,144,355,357,154,391,392,165,421,422,175,439,441,176,449],
[125,202,141,143,204,177,180,205,180,183,105,192,194,104,224,227,115,240,241,124,282,283,132,303,292,133,294,296,132,303,306,145,324,326,144,354,332,144,354,356,154,391,392,165,420,422,175,439,441,176,449],
[124,202,139,142,204,167,176,205,179,181,105,192,194,104,219,221,115,240,224,115,240,241,124,282,283,132,298,288,133,304,296,132,298,304,133,304,306,145,325,326,144,353,355,154,391,393,165,421,423,175,439,440,176,449],
[122,202,139,141,204,164,152,204,164,168,205,177,180,105,192,193,104,219,220,115,240,241,124,282,286,133,304,299,133,304,306,145,325,326,144,353,354,154,391,393,165,422,424,175,438,440,176,449],
[120,202,138,140,204,159,149,205,174,157,204,159,162,205,174,178,105,192,193,104,217,219,115,240,242,124,282,283,133,304,306,145,323,326,144,352,354,154,392,394,165,422,424,175,438,440,176,449],
[120,202,138,140,204,143,146,205,172,160,205,172,175,105,191,193,104,217,219,115,241,243,124,282,283,133,305,306,145,323,324,146,325,326,144,352,354,154,393,394,165,421,423,175,438,440,176,449],
[119,202,139,140,204,140,144,205,170,173,105,191,193,104,217,218,115,242,243,124,282,247,124,282,284,133,305,306,145,321,324,146,325,328,144,350,353,154,393,394,165,421,422,175,438,440,176,449],
[118,202,136,139,205,170,172,105,190,192,104,215,208,104,215,217,115,243,245,125,248,250,124,282,255,124,256,263,124,282,284,133,304,306,145,322,325,146,326,329,144,350,352,154,392,396,165,420,422,175,438,440,176,448],
[118,202,135,137,205,170,172,105,190,192,104,214,204,106,206,211,104,214,216,115,242,244,125,262,253,125,254,257,125,262,266,124,283,285,133,304,306,145,323,324,146,328,329,144,350,352,154,391,393,166,394,396,165,420,402,165,420,422,175,438,440,176,448],
[117,202,133,135,205,169,171,105,189,191,104,197,199,106,211,216,115,242,243,125,265,267,124,283,279,124,283,285,133,305,307,145,323,325,146,328,330,144,348,349,155,350,354,154,389,367,154,378,379,156,379,381,154,389,392,166,403,404,165,420,422,175,439,440,176,451],
[115,202,132,134,205,167,170,105,189,190,104,195,198,106,215,217,115,242,243,125,265,267,124,284,272,124,272,276,133,305,280,124,284,286,133,305,307,145,323,325,146,329,331,144,347,349,155,366,355,154,389,366,155,366,367,154,377,379,156,380,382,154,389,391,166,403,405,165,419,422,175,439,440,176,452],
[115,202,131,134,205,166,168,105,189,190,104,194,196,106,216,218,115,242,245,125,266,268,124,284,273,133,306,281,124,284,286,133,306,309,145,321,324,146,330,331,144,345,348,155,366,357,154,389,365,155,366,367,154,377,379,156,381,382,154,389,391,166,403,405,165,419,421,175,439,441,176,452],
[116,202,129,132,205,165,165,205,165,167,105,188,190,104,192,194,106,217,218,115,245,246,125,267,268,124,270,271,133,308,285,133,308,309,145,321,323,146,348,334,144,338,339,146,348,349,155,367,357,154,390,364,155,367,371,154,376,378,156,382,384,154,390,392,166,417,406,165,408,412,166,417,420,175,440,442,176,455],
[115,202,127,130,205,162,164,207,164,166,105,187,193,106,216,218,115,245,240,115,245,246,125,267,268,124,270,271,133,308,311,145,320,322,146,348,334,144,337,339,146,348,350,155,369,358,154,390,364,155,369,372,154,376,377,156,383,384,154,390,392,166,419,409,166,419,422,175,441,442,176,455],
[114,206,114,117,202,126,127,205,160,149,207,165,151,205,160,162,207,165,167,105,186,188,106,216,218,115,245,236,125,266,241,115,245,247,125,266,268,124,270,271,133,310,312,145,321,323,146,348,350,155,372,360,154,391,362,155,372,375,154,375,377,156,384,386,154,391,392,166,421,423,175,441,427,175,441,442,176,455],
[113,206,116,118,202,125,127,205,159,148,207,166,151,205,159,161,207,166,168,105,186,188,106,216,218,115,245,236,125,265,241,115,245,246,125,265,267,124,270,271,133,310,312,145,321,323,146,348,350,155,374,361,155,374,376,156,385,387,154,391,392,166,426,425,166,426,429,175,441,443,176,456],
[112,206,117,119,202,124,126,205,158,146,207,166,151,205,158,160,207,166,168,105,186,188,106,216,218,115,244,236,125,266,241,115,244,246,125,266,268,124,270,271,133,310,311,145,321,323,146,348,350,155,374,376,156,386,387,154,388,392,166,427,429,175,441,443,176,456],
[111,206,117,119,202,121,123,205,156,135,205,140,143,207,165,153,205,156,158,207,165,167,105,185,187,106,215,217,115,235,236,125,267,244,125,267,269,124,270,272,133,310,311,145,321,323,146,349,351,155,374,376,156,393,394,166,427,429,175,441,443,176,455],
[110,206,134,120,202,120,122,205,154,134,206,134,137,205,139,141,207,166,153,205,154,157,207,166,168,105,185,187,106,214,216,115,235,236,125,267,269,124,270,272,133,309,311,145,320,323,146,349,351,155,374,376,156,393,394,166,428,430,175,441,444,176,455],
[107,206,136,121,205,131,133,206,136,138,207,167,168,105,185,187,106,213,215,115,235,236,125,269,273,133,308,309,145,320,322,146,348,350,155,375,377,156,393,394,166,429,431,175,442,444,176,456],
[105,206,136,120,205,131,132,206,136,137,207,167,168,105,186,189,106,213,215,115,233,237,125,272,273,133,307,309,145,320,322,146,348,350,155,375,377,156,393,394,166,430,432,175,442,444,176,456],
[103,206,135,120,205,127,132,206,135,137,207,167,168,105,187,189,106,213,215,115,232,234,125,272,273,133,306,308,145,321,324,146,348,349,155,374,376,156,392,394,166,430,432,175,442,444,176,456],
[101,206,134,117,205,124,126,206,134,136,207,164,168,105,184,187,106,213,215,115,232,234,125,274,276,133,305,307,145,323,325,146,346,349,155,373,375,156,392,394,166,430,432,177,433,437,175,442,444,176,456],
[102,206,133,116,205,124,125,206,133,135,207,163,165,105,182,185,106,214,215,115,232,233,125,275,276,133,304,306,145,323,325,146,346,348,155,373,374,156,393,394,166,431,432,177,436,437,175,441,443,176,456],
[102,206,132,116,205,122,124,206,132,134,207,162,164,105,177,180,106,214,216,115,228,227,115,228,231,125,275,277,133,303,306,145,324,311,134,311,313,145,324,326,146,346,348,155,373,377,156,393,395,166,431,432,177,437,439,175,440,442,176,454],
[102,206,132,116,205,121,124,206,132,134,207,161,163,105,176,178,106,214,217,115,222,226,125,270,229,125,270,278,133,304,306,145,325,310,134,312,314,145,325,326,146,346,348,155,374,377,156,393,395,166,431,432,177,437,441,176,454],
[99,206,132,115,205,121,123,206,132,134,207,161,162,105,175,177,106,216,218,115,222,224,125,270,271,126,276,278,133,304,290,133,304,307,145,324,309,134,312,314,145,324,326,146,346,348,155,373,376,156,393,395,166,431,433,177,438,440,176,454],
[97,206,131,116,205,118,121,206,131,133,207,161,163,105,173,176,106,217,219,115,222,223,125,268,270,126,289,278,133,301,288,126,289,291,133,301,303,134,313,314,145,325,326,146,346,348,155,373,375,156,392,394,166,431,433,177,446,438,176,453,446,177,446,447,176,453,463,181,463],
[97,206,131,116,205,116,119,206,131,133,207,161,163,105,171,174,106,217,216,106,217,219,115,222,223,125,267,269,126,289,278,133,300,288,126,289,291,133,300,302,134,313,314,145,325,326,146,346,348,155,373,374,156,392,394,166,431,433,177,446,438,176,451,445,177,446,448,176,451,454,181,463,461,181,463],
[96,206,131,117,206,131,132,209,132,135,207,161,163,105,169,171,106,212,214,116,220,223,125,267,265,125,267,268,126,290,277,133,296,286,126,290,293,133,296,300,134,313,314,145,324,326,146,347,349,155,372,374,156,393,394,166,432,434,177,446,440,177,446,450,181,466],
[96,206,130,117,206,130,132,209,134,135,207,161,162,105,170,172,106,212,213,116,222,223,125,266,264,126,290,266,125,266,268,126,275,277,133,295,284,126,290,293,133,295,297,134,313,314,145,324,326,146,346,348,155,372,374,156,393,395,166,431,431,166,431,433,177,448,450,181,466],
[97,206,130,116,206,130,132,209,134,135,207,160,162,105,170,172,106,212,213,116,222,223,125,255,232,125,255,257,126,290,268,126,275,277,133,277,282,126,290,291,134,313,296,134,313,315,145,324,326,146,345,341,146,345,347,155,372,374,156,394,396,166,427,432,177,449,450,181,470],
[99,206,129,131,209,134,135,207,157,160,105,170,173,106,210,212,116,234,225,116,234,238,125,255,257,126,287,289,134,313,314,145,323,325,146,346,339,157,339,341,146,346,348,155,370,372,156,395,397,166,423,426,178,429,430,177,450,452,181,476],
[98,206,129,130,209,133,135,207,157,159,105,169,171,106,209,211,116,237,241,125,255,256,126,288,290,134,313,315,145,323,324,146,345,339,157,340,341,146,345,347,155,365,371,156,395,397,166,421,407,166,421,424,178,428,430,177,450,452,181,478],
[97,206,128,130,209,132,134,207,156,158,210,165,167,105,169,170,106,209,211,116,240,242,125,252,255,126,285,288,134,315,316,145,320,321,146,345,338,157,339,341,146,345,346,155,363,365,156,394,396,167,406,397,166,420,403,167,406,409,166,420,422,178,428,430,177,453,455,181,481,485,185,487],
[96,206,127,129,209,132,134,207,155,157,210,165,167,105,168,170,106,209,211,116,241,243,125,252,253,126,285,286,134,315,317,145,319,321,146,345,337,157,340,341,146,345,346,155,363,364,156,393,395,167,408,398,167,408,409,166,419,422,178,428,430,177,453,455,181,481,483,185,486],
[92,208,93,98,206,126,128,209,132,134,207,154,152,207,154,156,210,165,167,105,167,169,106,210,212,116,241,243,125,251,253,126,285,286,134,316,318,145,319,321,146,345,336,157,340,344,146,345,346,155,363,364,156,393,395,167,408,409,166,419,420,178,428,430,177,453,455,181,481,483,185,487,551,319,551],
[91,208,98,102,206,124,127,209,133,135,207,147,150,210,162,155,210,162,165,107,166,168,105,168,170,106,211,213,116,242,243,125,250,251,126,285,287,134,318,320,147,323,325,146,330,332,157,345,347,155,362,364,156,392,394,167,408,410,166,413,417,178,428,430,177,452,443,177,452,454,181,479,481,185,488,546,319,552],
[90,208,100,102,206,124,125,209,133,135,207,146,148,210,161,163,107,167,168,105,169,173,106,211,213,116,242,244,125,249,251,126,285,287,134,318,320,147,323,325,146,328,331,157,345,347,155,361,363,156,391,383,156,391,393,167,408,410,166,411,414,178,442,430,177,452,442,178,442,444,177,452,454,181,479,481,185,489,546,319,553],
[89,208,98,99,206,122,124,209,134,135,207,145,147,210,161,162,107,181,169,105,172,173,106,212,181,107,181,185,106,212,214,116,242,244,125,248,250,126,288,290,134,318,320,147,328,330,157,347,349,155,358,363,156,390,381,159,383,384,156,390,392,167,409,411,178,443,430,177,453,440,178,443,445,177,453,455,181,479,481,185,488,546,319,555],
[89,208,98,99,206,122,124,209,134,136,207,145,147,210,161,162,107,184,168,105,172,173,106,212,177,107,184,186,106,212,214,116,242,244,125,249,248,125,249,251,126,289,291,134,318,319,147,329,331,157,362,351,155,356,359,157,362,366,156,389,380,159,383,385,156,389,391,167,409,411,178,443,430,177,454,439,178,443,445,177,454,455,181,479,480,185,488,545,319,555],
[89,208,97,99,206,122,124,209,135,137,207,144,146,210,160,162,107,185,170,105,172,173,106,212,175,107,185,188,106,212,213,116,240,246,117,246,251,126,289,291,134,316,319,147,328,330,157,365,352,155,353,357,157,365,367,156,378,379,159,384,390,167,408,410,178,442,430,177,454,438,178,442,444,177,454,456,181,478,480,185,488,545,319,555],
[87,208,93,97,206,121,123,209,136,138,207,144,145,210,159,160,107,190,193,106,210,212,116,230,232,117,249,241,117,249,251,126,287,289,134,313,315,147,329,334,157,366,368,156,376,378,159,388,390,167,408,410,178,442,430,177,454,435,178,442,444,177,454,457,181,477,479,185,487,545,319,555],
[86,208,92,94,206,121,122,209,137,139,207,141,145,210,159,160,107,192,196,106,210,202,106,210,212,116,230,232,117,249,251,126,286,288,134,311,314,147,333,334,157,366,368,156,376,378,159,388,390,167,408,410,178,442,434,178,442,444,177,454,456,181,477,479,185,487,545,319,555],
[81,208,91,93,206,114,117,209,137,121,209,137,140,210,158,160,107,195,163,107,195,197,106,209,201,116,230,204,106,209,210,116,230,232,117,249,251,126,286,288,134,309,311,147,333,335,157,366,368,156,374,377,159,388,390,167,409,411,178,443,445,177,454,455,181,476,478,185,487,543,319,560],
[79,208,91,93,206,112,115,209,136,121,209,136,138,210,162,160,107,194,162,210,162,164,107,194,198,106,207,200,116,230,205,106,207,210,116,230,231,117,249,251,126,286,288,134,306,310,147,333,335,157,367,369,156,373,375,159,388,390,167,408,410,178,443,445,177,453,455,181,475,477,185,487,542,319,561],
[77,208,91,92,206,111,113,209,136,138,210,158,160,107,193,163,107,193,195,116,230,197,116,197,200,116,203,208,116,230,231,117,248,250,126,284,287,134,305,307,147,334,336,157,367,369,156,372,374,159,388,390,167,408,410,178,443,445,177,453,455,181,474,477,185,487,542,319,562],
[69,208,88,73,208,88,90,206,111,113,209,138,140,210,161,163,107,190,193,116,228,230,117,248,250,126,276,278,134,303,283,134,303,304,147,334,337,157,372,369,156,371,372,157,372,374,159,388,389,167,408,410,178,441,442,177,452,454,181,472,475,185,487,543,319,562],
[69,208,89,91,206,112,97,206,112,114,209,139,140,210,161,163,107,189,191,116,228,230,117,247,250,126,275,278,134,302,304,147,336,338,157,372,370,156,370,372,157,372,374,159,387,389,167,408,409,178,441,442,177,452,454,181,471,473,185,487,543,319,562],
[68,208,99,101,206,113,110,206,113,115,209,141,144,210,161,162,107,189,191,116,227,229,117,247,248,126,276,278,134,301,303,147,343,344,157,371,373,159,386,388,167,408,409,178,440,442,177,454,455,181,471,474,185,489,534,319,562,541,319,562],
[67,208,99,101,206,113,107,209,140,111,206,113,115,209,140,142,210,160,162,107,189,191,116,226,228,117,247,248,126,275,278,134,301,303,147,343,345,157,371,373,159,387,389,167,408,410,178,439,441,177,454,455,181,473,475,185,490,534,319,562,539,319,562],
[67,208,100,102,206,113,106,209,138,112,206,113,115,209,138,141,210,160,162,107,189,191,116,224,227,117,246,248,126,275,277,134,301,303,147,344,346,157,371,373,159,388,389,167,409,411,178,439,441,177,453,455,181,474,475,185,492,534,319,562],
[65,208,97,99,206,102,104,209,136,138,210,159,161,107,190,192,116,223,222,116,223,225,117,245,247,126,275,261,126,275,277,134,300,302,147,346,348,157,371,373,159,388,390,167,410,412,178,439,441,177,453,455,181,474,476,185,494,533,319,562],
[65,208,97,99,206,100,103,209,136,138,210,159,161,107,191,193,116,218,220,117,245,224,117,245,247,126,275,259,127,260,263,126,275,277,134,299,302,147,345,349,157,371,374,159,389,391,167,410,412,178,439,440,177,453,455,181,474,475,185,500,533,319,562],
[63,208,96,100,209,134,136,210,159,160,107,191,193,116,216,219,117,246,248,126,273,257,127,261,263,126,273,275,134,297,286,135,287,293,134,297,299,147,344,325,147,344,346,157,371,373,159,391,392,167,409,412,178,439,441,177,454,455,181,474,475,185,502,533,319,561],
[64,208,96,97,209,130,136,210,159,160,107,189,196,116,214,217,117,247,248,126,272,257,127,262,263,126,272,274,134,297,284,135,291,293,134,297,299,147,343,322,148,324,326,147,326,329,147,343,346,157,369,372,159,389,392,167,409,411,169,411,412,178,438,440,177,454,456,181,474,475,185,503,505,186,505,533,319,560],
[64,208,96,97,209,129,131,212,134,137,210,159,160,107,189,191,118,195,197,116,213,215,117,247,249,126,272,256,127,262,263,126,272,273,134,298,283,135,291,294,134,298,299,147,339,321,148,328,327,148,328,331,147,339,344,157,368,370,159,388,390,167,408,410,169,411,413,178,437,419,178,437,439,177,454,456,181,474,475,185,503,505,186,507,533,319,561],
[65,208,93,96,209,129,131,212,135,137,210,159,160,107,189,174,108,174,176,107,189,191,118,196,198,116,212,203,116,212,213,117,249,251,126,271,256,127,262,264,126,271,273,134,298,280,135,294,296,134,298,299,147,339,316,148,328,329,147,339,341,158,345,346,157,366,368,159,387,389,167,406,408,169,422,427,178,436,438,177,455,457,181,475,477,185,502,504,186,508,533,319,561],
[65,208,93,94,209,129,131,212,135,137,210,158,160,107,188,170,108,174,176,107,188,190,118,202,201,118,202,204,116,210,213,117,250,251,126,270,256,127,263,265,126,270,272,134,298,277,135,295,297,134,298,299,147,338,316,148,327,329,147,334,338,147,338,340,158,345,347,157,365,367,159,387,389,167,406,407,169,426,427,178,437,439,177,455,457,181,475,477,185,502,498,185,502,504,186,508,533,319,561],
[66,208,91,93,209,127,129,212,135,137,210,157,159,213,160,168,108,183,175,107,187,183,108,183,185,107,187,189,118,203,205,116,209,210,117,250,251,126,270,254,127,263,265,126,270,271,134,273,276,135,296,299,147,330,315,148,338,327,147,330,334,148,338,339,158,348,349,157,363,365,159,388,389,167,405,407,169,425,427,178,435,439,177,455,457,181,474,476,185,502,497,186,509,501,185,502,504,186,509,535,319,562],
[67,208,91,92,209,127,129,212,135,137,210,156,158,213,159,161,108,184,176,107,188,178,108,184,188,107,188,190,118,204,205,116,208,210,117,250,252,126,270,253,127,264,268,126,270,271,134,272,274,135,297,299,147,330,315,148,336,327,147,330,332,148,336,339,158,348,352,157,363,365,159,387,389,167,404,406,169,425,427,178,435,437,179,438,440,177,455,457,181,474,476,185,495,497,186,509,503,186,509,531,318,534,536,319,562],
[67,208,90,92,209,125,128,212,134,136,210,156,157,213,159,161,108,186,178,108,186,188,107,189,190,118,204,210,117,251,253,127,267,268,126,268,273,135,297,299,147,330,316,148,336,327,147,330,331,148,336,338,158,351,356,157,363,365,159,387,389,167,403,406,169,426,427,178,435,437,179,439,440,177,455,457,181,474,459,181,474,476,185,495,497,186,509,528,318,534,535,319,562],
[67,208,85,87,209,123,90,209,123,125,212,134,136,210,154,156,213,159,161,108,187,188,118,207,208,117,252,233,127,267,235,117,236,239,117,252,254,127,267,268,135,296,298,147,315,316,148,336,329,148,336,338,158,360,364,159,387,391,167,398,403,169,426,427,178,434,436,179,440,442,177,452,455,182,475,464,182,464,466,181,473,475,182,475,478,185,495,497,186,514,527,318,534,536,319,561],
[67,208,85,87,209,122,124,212,134,137,210,153,155,213,160,162,108,187,189,118,207,208,117,252,233,127,267,239,117,252,254,127,267,268,135,296,298,147,313,316,148,337,339,158,361,363,159,386,388,168,399,394,167,397,399,168,399,401,169,426,428,178,433,435,179,441,443,177,451,454,182,476,468,181,472,475,182,476,478,185,495,497,186,514,525,318,534,536,319,560],
[67,208,81,85,209,121,92,209,121,122,212,139,140,210,151,153,213,161,164,108,188,190,118,207,209,117,252,232,127,265,239,117,252,254,127,265,268,135,296,298,147,313,315,148,338,340,158,361,363,159,385,387,168,400,395,167,396,398,168,400,402,169,426,434,179,442,445,177,450,452,182,478,472,182,478,481,185,495,497,186,514,515,317,515,520,318,534,535,319,560],
[67,208,79,82,211,84,92,209,120,122,212,139,140,210,151,152,213,163,165,108,189,190,118,207,209,117,253,232,127,265,240,117,253,255,127,265,266,135,297,299,147,313,315,148,338,341,158,361,363,159,385,387,168,399,397,168,399,401,169,426,428,179,443,451,182,479,481,185,495,497,186,513,515,317,519,518,317,519,521,318,533,535,319,560],
[67,208,78,80,211,91,86,211,91,92,209,120,122,212,138,140,210,151,150,210,151,152,213,163,165,108,189,191,118,207,209,117,253,232,127,264,241,117,253,255,127,264,266,135,297,299,147,313,315,148,340,342,158,361,364,159,385,387,168,400,402,169,427,429,179,444,445,182,479,481,185,495,497,186,512,515,317,520,523,318,533,535,319,560],
[67,208,75,77,211,91,92,209,119,120,212,136,138,210,141,143,213,162,164,108,189,191,118,207,208,117,253,232,127,264,241,117,253,255,127,264,266,135,296,298,147,310,315,148,341,344,158,361,362,159,384,386,168,401,403,169,428,430,179,444,445,182,479,480,186,512,488,185,494,496,186,512,514,317,522,524,318,533,535,319,560],
[66,208,74,76,211,91,93,209,117,120,212,136,138,210,141,143,213,161,163,108,190,192,118,207,209,117,253,232,127,265,241,117,253,255,127,265,266,135,296,298,147,307,311,148,343,345,158,361,362,159,383,385,168,401,403,169,429,430,179,444,445,182,479,480,186,512,489,185,494,496,186,512,513,317,523,525,318,533,537,319,560],
[65,208,73,75,211,92,94,209,116,117,212,136,137,210,141,142,213,160,162,108,191,193,118,207,209,117,252,231,127,265,241,117,252,253,127,265,266,135,296,298,147,307,309,148,344,346,158,363,363,158,363,365,159,383,385,168,402,404,169,429,431,179,443,445,182,479,481,186,511,492,185,496,498,186,511,513,317,524,525,318,536,538,319,559],
[65,208,73,74,211,93,94,209,115,117,212,135,137,210,141,142,213,159,161,108,191,193,118,207,209,117,252,231,127,264,241,117,252,253,127,264,266,135,297,299,147,306,308,148,344,346,158,363,365,159,383,384,168,402,404,169,429,431,179,442,444,182,479,480,186,509,493,185,497,498,186,509,513,317,524,526,318,537,538,319,559],
[64,208,70,74,211,93,94,209,114,116,212,133,136,210,141,142,213,159,160,108,191,193,118,207,209,117,251,231,127,263,241,117,251,253,127,263,265,135,298,299,147,306,308,148,343,345,158,364,366,159,383,384,168,402,404,169,429,431,179,442,444,182,478,480,186,509,495,185,496,498,186,509,510,317,524,526,318,537,539,319,558],
[64,208,68,70,211,91,93,209,112,115,212,133,135,210,140,142,213,158,160,108,189,191,118,206,208,117,229,221,117,229,231,127,262,245,127,245,247,127,248,251,127,262,264,135,297,299,147,305,306,148,343,344,158,364,366,159,382,384,168,402,404,169,429,431,179,441,443,182,476,477,186,508,510,317,526,528,318,539,540,319,555],
[64,208,68,70,211,92,94,209,111,113,212,132,134,210,140,142,213,158,160,108,189,191,118,205,207,117,230,214,117,214,216,119,220,222,117,230,231,127,263,265,135,295,298,147,305,306,148,343,346,158,364,366,159,381,383,168,402,404,169,429,430,179,441,443,182,476,477,186,507,510,317,526,528,318,539,541,319,555],
[64,208,68,69,211,94,97,209,109,111,212,132,139,210,140,142,213,158,160,108,189,190,118,202,205,117,231,212,119,222,226,117,231,233,127,266,269,135,296,298,147,304,306,148,346,348,158,363,365,160,367,370,159,376,381,168,403,404,169,427,425,169,427,429,179,441,442,182,475,477,186,503,505,317,527,528,318,541,543,319,557],
[63,208,67,69,211,96,99,209,109,110,212,138,141,213,158,160,108,189,190,118,203,205,117,232,208,117,209,211,119,224,226,117,232,234,127,268,270,135,297,299,147,303,305,148,345,348,158,362,364,160,368,370,159,373,377,168,403,379,168,403,404,169,426,422,171,424,426,169,426,428,179,441,442,182,473,477,186,502,504,317,527,528,318,542,543,319,557],
[63,208,66,68,211,98,100,209,107,110,212,138,140,213,158,161,108,189,190,118,204,207,119,225,210,119,225,227,117,232,234,127,269,271,135,297,299,147,303,305,148,345,346,158,361,363,160,368,370,159,372,374,168,403,405,169,421,422,171,425,427,179,441,443,182,472,474,186,502,504,317,527,528,318,542,543,319,558],
[64,208,66,67,211,98,101,209,106,107,212,137,140,213,162,164,108,188,190,118,204,205,119,227,229,117,229,237,127,269,271,135,298,300,147,304,306,148,344,346,158,358,362,160,371,372,168,405,407,169,420,422,171,426,427,179,441,443,182,470,473,186,502,504,317,527,528,318,543,545,319,558],
[64,208,66,67,211,98,99,212,136,101,209,105,107,212,136,138,213,163,148,213,163,166,108,188,190,118,204,205,119,235,209,119,228,230,119,235,237,127,268,270,135,296,299,136,299,301,147,305,306,148,343,345,158,358,359,160,371,372,168,405,407,169,419,421,171,426,427,179,441,443,182,470,473,186,501,503,317,527,529,318,544,546,319,558],
[66,216,67,69,211,96,98,212,135,102,209,104,106,212,135,137,213,167,144,214,146,148,213,167,173,108,189,190,118,208,210,119,237,239,127,267,261,127,267,268,135,294,296,136,301,304,147,308,309,148,343,330,149,333,335,148,343,344,158,358,359,160,371,373,168,406,407,169,419,420,171,426,427,179,441,442,182,470,472,187,474,476,186,499,501,317,527,529,318,545,547,319,558],
[65,216,66,68,211,96,97,212,135,102,209,102,106,212,135,137,213,168,142,214,147,149,213,168,170,109,172,173,108,189,192,118,208,210,119,238,240,127,257,243,127,257,260,128,260,268,135,294,296,136,303,304,147,308,310,148,343,329,149,333,336,148,343,344,158,358,360,160,371,373,168,406,408,169,419,420,171,426,428,179,441,443,182,469,472,187,475,478,186,499,500,317,527,529,318,546,550,319,559],
[65,216,66,67,211,94,97,212,135,103,212,104,106,212,135,137,213,168,142,214,148,152,213,168,170,109,171,173,108,191,193,118,207,209,119,242,241,119,242,243,127,255,258,128,267,268,135,294,296,136,303,305,147,308,310,148,340,322,148,322,324,149,334,336,148,340,344,158,358,360,160,370,372,168,405,408,169,419,421,171,426,428,179,441,444,182,469,470,187,477,479,186,499,501,317,528,530,318,549,551,319,557],
[64,216,66,67,211,92,94,212,134,137,214,154,140,214,154,156,213,167,169,109,172,173,108,192,193,118,207,208,119,242,243,127,254,256,128,268,270,135,295,296,136,305,306,147,306,312,148,315,318,149,336,341,158,359,361,160,368,370,168,403,406,171,427,409,169,419,421,171,427,429,179,443,445,182,469,470,187,479,482,186,497,499,317,529,530,318,552,553,319,555],
[64,216,65,67,211,91,93,212,134,136,214,154,157,213,167,169,109,172,174,108,191,193,118,207,209,119,242,243,127,252,255,128,269,271,135,293,283,135,293,296,136,311,307,136,311,316,149,340,341,158,358,360,160,368,370,168,402,404,171,427,409,169,419,414,169,419,421,171,427,429,179,444,450,182,468,470,187,481,483,186,497,499,317,529,530,318,552],
[63,216,63,65,211,91,92,212,132,134,214,157,159,213,166,168,109,175,178,108,191,193,118,209,213,119,241,243,127,251,253,128,270,271,135,292,279,136,311,285,135,285,286,136,288,290,135,292,294,136,311,313,149,340,342,158,356,358,160,368,370,168,399,402,171,426,415,169,419,420,171,426,428,179,443,445,180,454,456,182,466,469,187,481,483,186,497,498,317,529,531,318,555],
[62,216,63,65,211,91,92,212,132,134,214,158,160,213,165,167,109,176,178,108,191,193,118,212,213,119,241,243,127,250,252,128,270,274,135,291,277,136,310,286,136,289,291,135,291,293,136,310,313,149,340,342,158,356,358,160,368,371,168,399,401,171,426,420,171,426,428,179,443,445,180,455,457,182,464,467,187,481,483,186,497,498,317,530,533,318,555],
[61,216,63,65,211,91,92,212,131,133,214,159,161,213,164,166,109,175,178,108,190,193,118,212,213,119,241,243,127,250,251,128,273,276,136,310,292,136,310,312,149,341,344,158,356,358,160,369,372,168,399,401,171,426,428,179,443,445,180,456,457,182,464,465,187,481,483,186,497,498,317,531,535,318,555],
[57,216,64,66,211,91,92,212,129,131,214,161,162,213,164,166,109,177,179,108,189,190,118,211,213,119,242,245,127,247,249,128,272,275,136,310,312,149,340,342,158,356,351,160,371,353,158,356,358,160,371,373,168,398,399,171,425,427,179,443,445,180,456,458,182,461,463,187,482,483,186,497,500,317,536,538,318,555],
[57,216,65,67,211,91,92,212,129,100,212,129,130,214,161,165,109,177,179,108,189,190,118,210,212,119,244,246,127,247,248,128,273,275,136,310,312,149,340,341,158,356,350,160,371,353,158,356,358,160,371,373,168,396,399,171,425,427,179,443,445,180,456,457,183,457,460,182,460,462,187,482,483,186,499,500,317,537,538,318,554],
[57,216,68,71,211,91,92,215,100,97,215,100,102,212,126,129,214,163,165,109,180,182,108,188,185,108,188,190,118,209,211,119,246,248,128,275,276,136,311,313,149,340,342,158,348,349,160,374,354,160,374,376,168,395,397,171,424,426,179,442,445,180,455,457,183,459,461,187,482,484,186,498,500,317,537,538,318,554],
[55,216,70,74,211,90,92,215,100,102,212,125,117,212,125,127,214,164,165,109,184,184,109,184,189,118,209,211,119,245,247,128,275,277,136,311,313,149,340,342,158,348,349,160,373,375,161,375,377,168,395,397,171,424,426,179,439,443,180,454,456,183,459,462,187,482,484,186,498,500,317,537,538,318,553],
[55,216,72,74,211,89,92,215,116,102,212,124,115,215,116,118,212,120,122,212,124,126,214,164,165,109,186,188,118,209,211,119,245,246,128,276,278,136,311,313,149,340,342,158,348,350,160,373,375,161,376,377,168,395,398,171,424,426,179,435,440,180,454,455,183,460,462,187,482,485,186,498,500,317,537,539,318,552],
[52,216,71,73,211,89,91,215,121,103,212,104,108,215,118,120,215,121,124,214,164,166,109,187,188,118,209,213,119,242,244,128,275,277,136,311,313,149,340,342,158,347,349,160,373,374,161,376,378,168,393,395,170,398,401,171,424,425,179,434,436,180,454,455,183,461,463,187,482,484,186,494,500,317,539,539,317,539,540,318,552],
[52,216,71,73,211,89,91,215,121,105,215,121,122,214,164,166,109,187,188,118,210,212,119,240,243,128,273,276,136,311,313,149,340,342,158,346,348,160,372,374,161,377,380,168,392,394,170,400,404,171,423,428,179,434,435,180,454,455,183,461,463,187,482,483,186,492,489,186,492,495,316,499,500,317,539,542,318,552],
[50,216,71,63,216,71,72,211,89,91,215,120,122,214,164,166,109,187,188,118,209,211,119,240,241,128,273,275,136,312,314,149,341,343,158,345,347,160,372,374,161,379,381,168,392,394,170,403,406,171,423,425,180,454,435,180,454,455,183,461,463,187,488,483,186,492,487,187,488,490,186,492,494,316,499,500,317,541,543,318,552],
[47,216,68,59,217,63,67,216,68,72,211,88,90,215,119,120,214,165,167,109,187,197,118,209,211,119,238,240,128,272,274,136,312,288,136,312,314,149,341,343,160,370,364,160,370,372,161,380,382,168,391,393,170,406,408,171,422,424,180,453,455,183,461,463,187,488,484,186,484,485,187,488,490,316,499,501,317,543,545,318,552],
[46,216,54,57,217,66,70,211,88,81,211,88,90,215,119,120,214,165,167,109,196,199,118,209,211,119,237,239,128,270,270,128,270,273,136,312,286,137,287,290,136,312,314,149,340,342,160,366,365,160,366,371,161,380,382,168,391,393,170,407,409,171,421,423,180,453,455,183,461,463,187,487,485,187,487,489,316,499,501,317,543,545,318,553],
[43,216,51,54,217,67,69,211,88,80,215,118,82,211,88,91,215,118,120,214,164,166,109,198,201,118,209,211,119,237,238,128,265,266,136,305,281,137,294,296,136,305,314,149,339,341,160,361,362,161,381,383,168,387,390,170,407,409,171,423,425,180,453,455,183,462,464,187,488,490,316,499,502,317,543,545,314,545,546,318,553,550,318,553],
[42,216,51,53,217,67,69,211,88,80,215,117,83,211,88,90,215,117,119,214,164,166,109,200,204,118,209,215,119,236,238,128,265,266,136,305,281,137,295,296,136,305,306,149,339,341,160,361,362,161,381,383,168,386,388,170,407,409,171,424,425,180,452,454,183,462,465,187,488,490,316,500,503,317,542,545,314,548,547,318,553,548,314,548,550,318,553],
[42,216,51,52,217,67,69,211,88,81,215,116,84,211,88,89,215,116,118,214,164,165,109,211,205,118,209,211,109,211,213,120,214,215,119,235,237,128,264,266,136,305,280,137,295,296,136,305,306,149,339,341,160,360,362,161,382,387,170,408,410,171,424,425,180,451,453,183,464,467,187,487,489,316,502,505,317,541,543,314,549,548,314,549,553,318,554],
[41,216,51,52,217,68,70,211,87,75,211,78,80,215,116,84,211,87,89,215,116,117,214,163,165,109,212,207,109,207,210,109,212,213,120,214,217,119,235,237,128,261,239,128,256,261,128,261,263,129,265,268,136,305,280,137,296,298,136,305,307,149,335,336,150,339,339,150,339,341,160,359,361,161,382,384,170,408,410,171,424,425,180,449,452,183,465,467,187,488,490,316,504,506,317,540,542,314,552,553,318,554],
[40,216,51,52,217,69,75,211,87,80,215,116,84,211,87,89,215,116,117,214,162,157,214,162,164,109,212,213,120,215,217,119,235,239,128,254,251,128,254,257,129,267,262,129,267,268,136,305,279,137,297,299,136,305,307,149,334,336,150,340,341,160,358,360,161,382,384,170,408,410,171,424,425,180,449,450,183,466,467,187,489,490,316,504,506,317,540,542,314,562,555,314,555,557,314,562],
[39,216,51,52,217,73,74,211,87,77,211,78,80,215,114,87,211,87,89,215,114,116,214,150,152,225,159,163,109,212,214,120,217,218,119,235,238,128,246,248,129,267,269,136,306,278,137,298,300,136,306,308,149,333,334,150,338,341,160,358,360,161,382,384,170,409,411,171,424,426,180,447,450,183,466,468,187,489,491,316,506,508,317,539,535,317,539,541,314,563],
[38,216,50,52,217,76,76,217,76,80,215,114,89,215,109,111,215,111,114,215,114,116,214,150,152,225,161,163,109,212,214,120,217,219,119,235,237,128,245,247,129,267,270,136,307,278,137,298,301,136,307,309,149,331,334,150,338,339,160,358,360,161,383,384,170,409,411,171,424,425,180,446,448,183,467,469,187,490,492,316,507,508,317,540,535,317,540,542,314,564],
[37,216,50,52,217,78,74,217,78,81,215,114,112,223,112,114,215,114,115,214,149,151,225,161,163,109,212,205,109,212,214,120,217,219,119,235,236,128,244,246,129,268,270,136,305,278,137,299,301,136,305,309,149,330,332,150,337,339,160,358,359,161,383,384,170,410,412,171,423,425,180,446,448,183,467,469,187,490,493,316,507,510,317,539,516,317,527,530,317,532,536,317,539,542,314,565],
[36,216,51,52,217,77,80,215,101,105,223,113,115,214,149,150,225,161,163,109,212,202,110,204,206,109,212,214,120,219,220,119,234,236,128,244,246,129,269,271,136,305,277,137,300,302,136,305,306,246,308,309,149,324,327,150,337,330,150,337,339,160,356,358,161,383,384,170,410,412,171,419,423,180,444,447,183,467,469,187,490,492,316,516,513,316,516,518,317,538,538,317,538,540,314,565],
[35,216,50,52,217,78,79,215,101,102,223,113,115,214,149,150,225,161,163,109,212,201,110,204,206,109,212,214,120,219,224,119,233,235,128,244,246,129,270,271,136,304,277,137,301,303,136,304,306,246,308,309,149,323,325,150,337,339,160,356,358,161,383,384,170,410,412,171,418,420,180,442,445,183,467,469,187,488,491,316,517,518,317,522,539,314,565],
[33,216,48,50,217,79,81,215,100,102,223,114,116,214,148,150,225,161,163,109,211,168,109,169,174,109,199,201,110,206,208,109,211,213,120,224,226,119,232,233,128,243,245,129,270,273,136,276,278,137,302,304,246,308,309,149,319,323,150,337,339,160,355,357,161,383,377,161,383,384,170,408,411,171,418,420,180,442,445,183,467,469,187,487,489,316,517,538,314,565],
[32,216,48,50,217,80,74,217,80,82,215,99,101,223,114,116,214,148,150,225,172,163,109,209,167,225,167,168,109,168,170,225,172,174,109,199,200,110,207,209,109,209,213,120,225,228,119,232,233,128,242,244,129,272,274,136,275,277,137,302,304,246,308,310,149,318,320,150,338,339,160,355,357,161,383,375,303,375,377,161,383,384,170,408,410,171,418,420,180,443,445,183,467,469,187,487,489,316,517,537,314,565],
[31,216,48,49,217,80,72,221,72,74,217,80,82,215,98,100,223,114,116,214,147,149,225,172,163,109,198,166,225,167,168,109,168,170,225,172,173,109,193,197,109,198,200,110,207,210,120,227,230,119,231,233,128,242,244,129,273,276,137,301,303,246,308,311,149,317,316,149,317,319,150,338,339,160,353,356,161,383,374,303,375,377,161,383,384,170,409,412,171,418,420,180,443,445,183,467,469,187,487,489,316,517,536,314,565],
[31,216,45,47,217,79,72,221,73,74,217,79,81,222,81,83,215,98,99,223,114,116,214,146,122,214,146,148,225,172,164,225,172,173,109,190,193,110,207,198,110,207,209,120,230,232,128,237,241,129,273,275,137,302,304,246,308,310,150,340,341,160,353,355,161,383,370,303,375,377,161,378,382,161,383,384,170,411,412,171,418,420,180,442,444,183,469,470,187,483,487,316,517,536,314,565],
[29,216,44,46,217,79,71,221,73,75,217,79,81,222,81,83,215,97,99,223,121,116,214,146,120,223,121,122,214,137,145,214,146,148,225,172,173,109,189,191,110,207,209,120,230,232,128,237,238,129,273,275,137,302,304,246,308,309,150,340,341,160,352,354,161,383,370,303,381,377,161,378,379,303,381,383,161,383,385,170,409,412,171,419,420,180,442,430,180,442,444,183,469,470,187,483,485,316,517,536,314,565],
[27,216,42,44,217,66,69,221,75,81,222,82,84,215,97,99,223,121,117,223,121,123,214,135,137,225,172,147,225,172,173,109,187,180,110,207,185,109,187,189,110,207,209,120,232,233,128,236,238,129,272,274,137,301,303,246,307,309,150,340,341,160,351,353,161,369,371,303,384,386,170,409,411,171,419,420,172,429,423,172,429,430,180,442,444,183,468,470,187,483,486,316,517,537,314,564,540,314,564],
[26,216,41,44,217,65,67,221,78,81,222,82,84,215,97,99,223,121,117,223,121,125,214,134,136,225,171,146,225,171,173,109,186,179,110,207,186,109,186,188,110,207,208,120,232,233,128,236,238,129,272,274,137,300,302,246,306,309,150,340,341,160,350,352,161,369,371,303,385,387,170,409,411,171,419,420,172,429,431,180,442,441,180,442,444,183,468,470,187,485,487,316,514,497,316,514,542,314,564],
[25,216,40,42,218,42,44,217,64,66,221,78,80,222,83,84,215,96,98,223,124,126,214,133,135,225,171,175,109,176,178,110,207,187,110,207,208,120,232,234,128,235,237,129,271,273,137,300,302,246,307,309,150,340,341,160,350,351,161,369,371,303,385,387,170,409,411,171,417,420,172,440,438,172,440,443,183,469,470,187,485,487,316,514,493,315,495,497,316,514,542,314,564],
[24,216,38,40,218,43,45,217,63,65,221,78,80,222,83,87,215,96,98,223,126,127,214,131,133,225,174,175,110,206,208,120,233,236,129,270,272,137,300,302,246,306,308,150,340,342,160,350,351,161,368,370,303,385,387,170,409,411,171,412,415,172,442,444,183,469,471,187,481,484,315,496,498,316,514,543,314,564,552,314,564],
[23,216,37,39,218,43,46,217,61,64,221,78,80,222,86,89,215,96,98,223,126,128,214,129,132,225,173,175,110,205,207,120,234,236,129,271,273,137,300,303,246,306,308,150,340,342,160,349,351,161,366,369,303,385,387,170,409,413,172,442,444,183,469,471,187,478,482,315,496,498,316,514,543,314,563,547,314,548,553,314,556,558,314,563],
[23,216,36,38,218,46,47,217,63,64,221,78,79,222,88,89,215,96,97,223,127,130,225,172,174,110,204,206,120,234,236,129,270,273,137,300,302,246,307,309,150,338,335,150,338,340,302,343,345,160,349,349,160,349,351,161,363,367,303,383,386,170,408,410,172,443,445,183,471,455,184,456,462,183,471,472,187,474,474,187,474,477,315,497,498,316,513,560,314,562],
[24,216,35,37,218,46,48,217,63,65,221,78,79,222,88,92,215,95,97,223,127,129,225,172,174,110,204,205,120,234,236,129,270,272,137,300,301,246,308,309,150,338,331,302,342,336,150,338,339,302,342,344,161,362,346,161,348,350,161,357,361,161,362,364,303,383,385,170,407,409,172,443,445,183,471,454,184,460,464,183,471,472,187,472,475,315,497,498,316,512,561,314,562],
[24,216,35,37,218,47,49,217,63,65,221,78,79,222,91,92,215,93,97,223,127,129,225,172,174,110,203,205,120,234,236,129,270,272,137,300,301,246,308,309,150,337,331,302,342,336,150,337,339,302,342,344,161,361,358,303,383,361,161,361,363,303,383,385,170,406,408,172,442,444,183,471,454,184,463,467,183,471,473,315,497,498,316,511,562,314,562],
[26,216,34,36,218,48,49,217,63,64,221,77,79,222,96,94,222,96,97,223,127,105,223,127,129,225,171,173,110,203,205,120,234,236,129,271,261,129,271,273,137,298,300,246,308,310,150,325,330,302,342,347,161,353,355,303,383,385,170,403,407,172,442,444,183,451,453,184,466,471,315,497,498,316,511],
[26,216,33,35,218,48,49,217,62,64,221,77,79,222,104,98,223,127,103,222,104,105,223,127,129,225,170,172,110,203,205,120,233,235,129,271,258,245,260,262,129,271,273,137,297,299,246,308,310,150,325,326,302,345,349,161,353,354,303,383,384,170,403,404,304,406,407,172,442,444,183,451,454,184,466,468,315,497,498,316,512],
[27,216,32,34,218,48,50,217,61,64,221,77,79,222,104,105,223,126,128,225,169,164,225,169,170,110,202,204,120,233,235,129,271,256,245,263,265,246,308,268,129,271,273,137,294,296,246,308,310,150,323,325,302,353,354,303,383,384,170,400,402,304,406,407,172,442,444,183,451,453,184,467,469,315,497,499,316,512],
[27,216,31,33,218,49,54,217,61,62,221,77,79,222,104,105,223,126,127,225,168,131,225,159,161,226,163,165,225,168,170,110,200,205,120,232,234,129,255,256,245,264,266,246,309,272,137,294,296,246,309,311,150,323,324,302,352,354,303,383,384,170,399,401,304,406,407,172,442,444,183,451,452,184,467,469,315,498,500,316,512],
[27,216,30,32,218,53,54,217,61,62,221,76,79,222,104,105,223,124,130,224,130,132,225,168,160,226,163,165,225,168,170,110,199,202,121,204,206,120,232,234,129,252,256,245,264,266,246,310,272,137,292,295,246,310,311,150,323,324,302,352,354,303,383,384,170,399,401,304,406,407,172,442,444,183,451,452,184,467,470,315,499,500,316,512],
[26,216,29,31,218,53,54,217,60,62,221,76,78,222,104,106,223,119,124,224,130,132,225,158,160,226,164,166,110,199,200,121,207,208,120,232,234,129,251,253,245,265,266,246,313,275,137,289,292,246,313,316,150,317,320,302,352,354,303,383,384,170,396,398,304,406,408,172,442,444,183,449,451,184,467,469,315,499,500,316,510],
[25,216,28,30,218,53,55,217,60,62,221,76,78,222,104,105,223,119,121,224,131,132,225,153,159,226,164,166,110,199,200,121,207,209,120,232,234,129,252,253,245,265,267,246,314,279,137,288,290,246,314,318,302,351,353,303,383,384,170,395,397,304,406,407,172,443,447,183,449,451,184,468,472,315,499,500,316,511],
[24,216,27,29,218,54,56,217,61,62,221,76,78,222,105,107,223,118,120,224,131,132,225,149,152,226,165,167,110,198,200,121,209,210,120,233,218,120,233,235,129,252,254,245,265,267,246,315,279,137,280,285,246,315,316,302,356,354,303,383,356,302,356,360,303,383,384,170,394,396,304,405,407,172,446,440,172,446,450,184,472,474,315,498,500,316,511],
[23,216,27,29,218,55,57,217,61,63,221,76,78,222,105,82,222,105,107,223,118,120,224,131,132,225,149,150,226,165,167,110,198,200,121,217,211,120,233,215,121,217,223,120,233,235,129,252,254,245,265,267,246,314,281,246,314,316,302,359,355,302,359,362,303,383,384,170,393,393,170,393,395,304,406,407,172,446,410,172,421,428,172,436,440,172,446,449,184,472,474,315,498,500,316,511],
[22,216,26,28,218,56,57,217,61,63,221,76,74,221,76,77,222,105,82,222,105,107,223,116,119,224,131,132,225,149,150,226,164,166,111,166,168,110,197,199,121,222,212,120,234,214,121,222,226,120,234,236,129,252,253,245,266,268,246,314,316,302,361,363,303,383,385,170,386,388,304,406,394,304,406,412,172,446,429,172,435,440,172,446,448,184,471,473,315,499,501,316,511],
[21,216,24,26,218,58,59,217,61,63,221,68,87,222,104,107,223,115,117,224,131,133,225,148,150,226,164,165,111,171,173,110,196,198,121,227,229,120,234,236,129,250,252,245,267,268,246,313,315,302,363,365,303,385,387,304,411,413,172,441,428,172,434,440,172,441,443,184,471,448,184,471,473,315,500,502,316,510],
[21,216,23,25,218,58,60,217,61,62,221,68,93,222,104,106,223,115,117,224,131,135,225,148,150,226,164,165,111,171,173,110,195,197,121,228,230,120,234,236,129,248,251,245,267,268,246,312,314,302,363,332,302,363,365,303,385,387,304,411,412,172,434,429,172,434,443,184,471,473,315,501,506,316,506],
[21,216,21,24,218,58,57,218,58,61,221,66,96,222,109,105,223,114,109,222,109,110,223,114,116,224,130,132,226,165,137,225,146,140,225,146,148,226,165,167,111,171,173,110,192,196,121,229,235,129,247,249,245,267,269,246,305,311,302,363,329,301,333,336,302,363,365,303,384,386,307,386,388,304,408,410,172,434,430,172,434,440,184,471,472,315,512],
[23,218,57,54,219,56,57,218,57,59,221,65,97,222,109,106,222,109,112,223,114,115,224,130,132,226,165,138,226,139,141,225,144,147,226,165,167,111,170,172,110,192,194,121,232,234,129,246,248,245,268,270,246,305,306,302,363,327,301,335,337,302,363,365,303,384,386,307,386,388,304,408,410,172,434,430,172,434,440,184,471,472,315,512],
[20,216,20,22,218,49,52,219,56,58,221,64,97,222,110,101,222,110,113,223,113,115,224,130,132,226,164,141,225,144,146,226,164,166,111,170,172,110,192,178,110,192,194,121,233,236,129,245,247,245,268,270,246,305,306,302,363,327,301,336,338,302,363,366,303,383,385,307,386,388,304,408,392,304,408,409,172,433,431,172,433,440,184,471,472,315,512],
[19,216,19,21,218,42,44,219,56,58,221,63,102,222,111,112,224,129,131,226,164,143,226,164,166,111,177,179,110,192,194,121,235,237,129,241,245,245,269,271,246,304,306,302,364,326,301,340,344,302,364,366,303,383,384,307,391,393,304,408,410,172,415,440,184,471,473,315,510],
[20,218,41,44,219,56,58,221,62,104,222,111,112,224,129,131,226,164,166,111,178,180,110,192,194,121,235,242,245,269,271,246,304,306,302,363,323,302,324,326,301,343,345,302,363,365,303,383,384,307,392,394,304,408,410,172,415,440,184,471,473,315,510],
[17,218,41,42,219,56,56,219,56,58,221,58,111,222,111,112,224,128,130,226,164,166,111,179,180,110,192,194,121,234,236,245,267,269,246,304,306,302,364,313,302,318,321,301,344,346,302,364,366,303,383,384,307,392,394,304,409,411,172,415,440,184,471,472,315,510],
[17,218,40,42,219,50,112,224,128,130,226,164,166,111,179,181,110,193,195,121,233,236,245,267,269,246,304,306,302,364,314,302,317,319,301,345,346,302,364,366,303,382,384,307,392,394,304,409,411,172,413,440,184,470,472,315,511],
[17,218,38,41,219,49,112,224,128,130,226,164,165,111,179,180,110,193,195,121,232,234,245,267,269,246,305,306,302,365,314,302,315,318,301,344,346,302,365,367,303,382,384,307,392,394,304,409,412,172,412,440,184,468,472,315,511],
[19,218,37,39,219,48,115,224,128,130,226,163,165,111,179,181,110,192,195,121,230,232,245,268,271,246,301,315,301,344,346,302,366,367,303,381,383,307,391,393,304,411,440,184,466,468,315,508,510,313,524,515,313,515,522,313,524],
[19,218,36,39,219,46,116,224,128,130,226,162,164,111,179,181,110,193,195,121,229,231,245,269,271,246,300,315,301,344,346,302,366,369,303,381,383,307,391,393,304,411,440,184,465,467,315,508,510,313,524,521,313,524],
[18,218,35,37,219,46,118,224,128,130,226,159,158,226,159,162,111,179,181,110,189,196,121,227,229,245,270,271,246,299,315,301,345,347,302,368,369,303,381,382,307,392,394,304,412,440,184,464,462,184,464,466,315,507,508,313,524],
[17,218,35,36,219,45,121,224,128,130,226,155,157,111,195,160,111,179,180,110,187,190,111,195,197,121,227,228,245,270,271,246,298,314,301,346,348,302,368,370,303,381,382,307,392,394,304,413,440,184,464,461,312,461,463,184,464,465,315,507,508,313,525],
[16,218,35,36,219,44,121,224,128,130,226,155,157,111,196,180,110,183,188,111,196,198,121,225,228,245,268,271,246,298,315,301,347,349,302,368,370,303,381,382,307,393,394,304,413,440,184,457,459,312,461,465,315,504,508,313,526],
[16,218,33,35,219,43,123,224,130,132,226,156,157,111,198,180,110,182,183,111,198,200,121,224,225,245,267,269,246,294,314,301,348,349,302,370,372,303,381,382,307,393,395,304,416,440,184,454,456,312,467,469,315,504,505,313,526],
[18,218,33,35,219,43,123,224,131,132,226,156,158,111,199,180,110,182,183,111,199,200,121,222,214,121,217,220,121,222,225,245,267,268,246,293,315,301,348,350,302,371,372,303,381,382,307,393,395,304,416,440,184,452,455,312,468,470,315,504,505,313,526],
[20,218,30,33,219,42,124,224,130,132,226,157,159,111,199,202,121,215,209,236,219,214,121,215,217,236,219,222,245,266,243,244,268,246,245,266,268,244,268,271,246,293,316,301,348,350,302,372,374,303,381,382,307,392,394,304,416,440,184,451,453,312,470,472,315,503,505,313,522],
[20,218,29,32,219,41,124,224,130,132,226,157,159,111,198,207,236,219,216,236,219,221,245,265,242,244,270,249,245,265,267,244,270,271,246,287,315,301,348,352,302,370,374,303,380,382,307,393,394,304,416,441,184,451,453,312,471,473,315,502,504,313,522],
[22,218,29,31,219,41,124,224,130,132,226,157,159,111,197,199,236,219,220,245,265,241,244,270,255,245,265,266,244,270,273,246,287,288,243,293,315,301,348,350,306,350,354,302,366,371,307,392,374,303,380,382,307,392,394,304,416,441,184,451,452,312,471,474,315,499,496,315,499,504,313,522],
[24,218,28,30,219,41,41,219,41,124,224,128,132,226,156,145,227,145,147,226,156,158,111,197,199,236,218,220,245,262,239,244,275,256,245,262,264,244,275,278,246,285,287,243,295,316,301,347,349,306,353,357,302,363,365,307,391,380,307,391,394,304,416,440,184,450,452,312,473,475,315,492,503,313,522],
[25,218,26,29,219,38,120,228,131,122,228,123,129,228,131,132,226,156,145,227,146,147,226,156,158,111,198,200,236,217,220,245,261,239,244,276,256,245,261,263,244,276,279,246,283,286,243,295,316,301,347,349,306,356,359,302,363,365,307,392,394,304,416,440,184,449,451,312,473,475,315,491,503,313,522],
[27,219,37,108,229,113,112,229,113,116,228,132,134,226,155,136,227,146,140,227,146,148,226,155,157,111,200,203,236,217,220,245,260,236,244,272,256,245,260,261,244,272,276,243,295,280,246,280,283,243,295,316,301,348,349,306,359,362,302,362,364,307,393,394,304,416,442,184,444,450,312,473,475,315,486,504,313,520],
[28,219,36,108,229,115,117,228,132,135,227,146,147,226,155,153,226,155,157,111,199,188,111,199,203,236,217,218,237,219,220,245,258,235,244,270,256,245,258,261,244,270,273,243,295,281,243,295,316,301,348,349,306,360,362,302,362,364,307,393,394,304,416,445,312,474,475,315,484,505,313,519],
[28,219,35,108,229,116,118,228,133,135,227,152,150,227,152,155,226,155,157,111,199,186,236,217,193,111,199,200,236,201,203,236,217,218,237,219,221,245,258,234,244,269,256,245,258,260,244,269,271,243,294,316,301,347,349,306,360,363,307,393,394,304,416,444,312,474,475,315,484,508,313,519],
[29,219,34,107,229,116,118,228,131,133,227,156,157,111,180,183,236,215,195,236,215,217,237,219,220,245,257,232,244,270,257,245,257,259,244,270,271,243,292,316,301,346,348,306,361,363,307,392,394,304,416,445,312,473,477,315,482,507,313,519],
[28,219,33,107,229,117,119,228,132,134,227,156,157,111,179,181,236,215,217,237,219,221,245,257,232,244,270,257,245,257,259,244,270,272,243,289,316,301,345,347,306,361,363,307,392,394,304,418,445,312,472,477,315,480,507,313,519],
[27,219,33,104,229,116,118,228,131,133,227,156,158,111,178,180,236,214,216,237,220,223,245,257,231,244,272,257,245,257,258,244,272,273,243,289,315,301,344,346,306,363,364,307,391,393,304,419,445,312,471,506,313,519],
[27,219,33,104,229,116,118,228,131,133,227,156,158,111,177,179,236,214,216,237,222,223,245,257,231,244,272,257,245,257,258,244,272,274,243,289,316,301,343,345,306,363,365,307,390,392,304,418,446,312,472,505,313,520],
[26,219,32,105,229,116,118,228,131,132,227,156,158,111,174,178,236,214,216,237,222,223,245,257,231,244,272,257,245,257,258,244,272,273,243,288,316,301,343,344,306,363,365,307,389,397,304,418,404,304,418,447,312,471,505,313,520],
[25,219,32,105,229,118,120,228,130,132,227,157,159,111,170,173,235,176,178,236,214,215,237,222,224,245,228,230,244,271,258,244,271,273,243,285,316,301,343,331,305,332,335,301,335,338,301,343,344,306,363,364,307,389,391,308,412,409,308,412,414,304,418,447,312,471,507,313,521],
[25,219,31,105,229,119,122,228,129,131,227,158,160,111,170,172,235,176,178,236,214,206,236,214,215,237,222,224,245,227,229,244,267,258,244,267,272,243,285,316,301,342,330,305,337,336,305,337,339,301,342,344,306,362,364,307,389,391,308,413,447,312,472,508,313,522],
[24,219,31,107,229,122,124,228,129,130,227,159,160,111,167,171,235,176,178,236,209,204,237,222,207,236,209,213,237,222,224,245,226,228,244,267,259,244,267,269,243,284,315,301,328,330,305,338,343,306,362,364,307,390,367,307,390,392,308,418,449,312,471,508,313,524],
[24,219,30,107,229,122,124,228,129,130,227,158,168,235,176,178,236,209,203,237,222,207,236,209,210,237,222,224,245,226,228,244,265,268,243,284,314,301,329,331,305,342,344,306,365,365,306,365,367,307,390,392,308,416,449,312,471,508,313,524],
[23,219,30,108,229,122,124,228,128,130,227,157,159,235,176,178,236,209,203,237,223,206,236,209,210,237,223,225,245,225,227,244,262,266,243,283,314,301,330,332,305,342,344,306,366,367,307,391,392,308,416,450,312,471,452,312,465,467,312,471,507,313,525],
[22,219,29,110,229,123,125,228,128,130,227,156,137,227,156,159,235,176,178,236,208,203,237,223,206,236,208,210,237,223,226,244,254,257,243,282,313,301,332,334,305,344,348,306,367,371,307,389,391,308,416,459,312,470,470,312,470,508,313,526],
[22,219,29,111,229,123,125,228,128,130,227,156,137,227,156,157,235,176,178,236,201,203,237,224,209,237,224,226,244,255,256,243,282,313,301,331,334,305,346,349,306,370,372,307,389,391,308,416,460,312,462,509,313,527],
[22,219,28,111,229,123,125,228,135,137,227,154,157,235,175,177,236,200,202,237,224,220,237,224,225,244,255,256,243,280,276,243,280,311,301,330,331,305,348,349,306,370,372,307,388,390,308,415,513,313,527],
[22,219,27,112,229,123,125,228,135,137,227,154,156,235,175,177,236,197,201,237,224,220,237,224,225,244,255,242,244,255,256,243,277,277,243,277,311,301,328,331,305,348,351,306,369,371,307,388,389,308,415,514,313,528],
[21,219,27,113,229,124,126,228,134,136,227,154,155,235,174,176,236,196,198,237,224,220,237,224,225,244,255,243,244,255,256,243,271,312,301,327,329,305,350,352,306,369,371,307,388,390,308,414,515,313,528],
[21,219,27,115,229,126,127,228,134,135,227,154,155,235,174,176,236,196,198,237,224,220,240,242,223,237,224,226,244,255,242,240,242,244,244,255,256,243,270,313,301,326,328,305,350,352,306,369,371,307,389,391,308,413,515,313,528],
[21,219,27,35,220,35,116,229,126,127,228,134,135,227,154,156,235,174,176,236,194,197,237,224,219,240,243,224,237,224,226,244,255,241,240,243,246,244,255,256,243,270,313,301,327,329,305,351,354,306,370,372,307,388,390,308,413,515,313,528],
[21,219,27,34,220,36,115,229,126,127,228,133,135,227,155,157,235,174,175,236,192,194,237,225,200,239,206,206,239,206,208,237,217,218,240,247,225,237,225,227,244,254,238,240,247,248,244,254,256,243,268,314,301,328,329,305,353,355,306,371,372,307,386,388,308,413,515,313,527],
[22,219,27,34,220,36,115,229,126,127,228,133,135,227,154,156,235,173,175,236,189,186,236,189,193,237,216,200,239,206,208,237,216,218,240,247,226,244,254,238,240,247,249,244,254,256,243,267,314,301,325,329,305,353,354,306,371,372,307,386,387,308,413,515,313,525],
[22,219,26,32,220,37,115,229,126,127,228,134,135,227,154,156,235,174,175,236,189,185,237,216,187,236,189,190,237,199,200,239,207,208,237,216,218,240,248,226,244,254,238,240,248,250,244,254,256,243,267,315,301,324,326,305,353,354,306,371,372,307,385,387,308,413,515,313,525],
[23,219,25,31,220,43,43,220,43,115,229,124,118,229,124,125,228,134,137,227,152,154,235,174,176,236,183,179,237,214,182,236,183,185,237,186,188,237,198,200,239,208,210,237,214,216,240,249,225,244,254,238,240,249,251,244,254,257,243,266,314,301,319,321,305,353,355,306,372,374,307,378,380,308,412,386,308,412,514,313,522],
[31,220,44,42,220,44,116,230,117,120,229,124,125,228,136,130,228,136,138,227,151,153,235,174,176,236,182,179,237,214,182,236,182,184,237,197,199,239,208,210,237,214,216,240,248,226,244,254,238,240,248,250,244,254,258,243,267,314,301,318,320,305,353,355,306,372,374,307,377,379,308,412,516,313,517],
[14,220,44,16,220,18,21,220,25,31,220,44,112,230,128,130,228,137,139,227,150,152,235,175,178,237,214,198,239,209,213,237,214,215,240,248,226,244,254,236,240,248,250,244,254,256,242,270,263,243,267,270,242,270,316,305,356,357,306,371,372,307,376,377,308,412],
[14,220,44,20,220,25,31,220,44,112,230,128,130,228,138,140,227,149,152,235,175,177,237,214,198,239,212,213,237,214,215,240,248,226,244,254,234,240,248,250,244,254,256,242,270,264,243,267,268,242,270,316,305,356,357,306,371,374,307,374,377,308,409],
[10,220,43,13,220,25,31,220,43,112,230,128,130,228,138,140,227,149,150,235,175,177,237,197,181,237,197,198,239,212,215,240,249,226,244,254,232,240,249,251,244,254,256,242,270,268,242,270,316,305,356,357,306,373,375,308,409],
[8,220,43,30,220,43,110,230,128,130,228,138,140,227,146,148,235,171,173,234,176,178,237,197,183,237,197,198,239,213,215,240,249,226,244,254,231,240,249,251,244,254,256,242,272,321,305,356,358,306,372,374,308,408],
[7,220,41,30,220,41,110,230,127,129,228,138,140,227,146,147,235,170,172,234,177,178,237,197,183,237,197,199,239,214,215,240,249,227,244,254,231,240,249,251,244,254,256,242,272,321,305,356,358,306,372,374,308,408],
[4,220,39,29,220,39,110,230,126,128,228,138,140,227,146,147,235,169,171,234,178,180,237,197,183,238,186,188,237,197,199,239,214,215,240,249,231,240,249,251,244,254,256,242,274,324,305,356,357,306,371,374,308,406],
[4,220,38,29,220,38,109,230,126,128,228,139,140,227,145,147,235,169,171,234,178,180,237,197,183,238,187,190,237,197,199,239,214,215,240,248,250,244,254,256,242,274,324,305,356,359,306,367,372,308,406],
[4,220,35,27,220,35,109,230,126,127,228,139,141,227,144,146,235,170,172,234,179,183,238,189,190,237,197,199,239,214,215,240,248,250,244,254,256,242,274,325,305,358,361,306,366,368,308,406],
[4,220,33,108,230,124,125,228,140,142,227,142,144,235,169,170,234,179,180,238,191,194,237,197,199,239,214,215,240,248,250,244,255,257,242,275,326,305,361,362,306,364,368,308,406],
[5,220,32,108,230,124,125,228,139,143,235,168,170,234,179,180,238,193,195,237,197,199,239,214,215,240,249,251,244,255,257,242,275,326,305,361,363,306,363,367,308,406],
[6,220,30,109,230,124,125,228,141,142,235,164,168,234,179,180,238,192,194,237,197,199,239,213,215,240,252,255,244,255,257,242,275,328,305,365,364,305,365,367,308,406],
[6,220,29,109,230,124,125,228,141,142,235,163,165,234,179,180,238,192,194,237,197,198,239,213,215,240,254,257,242,276,329,305,364,366,308,405],
[6,220,29,109,230,124,125,228,141,143,235,161,164,234,178,180,238,192,194,237,197,198,239,213,215,240,255,257,242,277,329,305,364,366,308,402],
[4,220,29,108,230,124,126,228,141,143,235,157,160,234,177,179,238,192,194,237,196,198,239,214,215,240,251,253,241,256,258,242,276,329,305,364,366,308,401,377,309,381,382,308,401],
[4,220,29,108,230,123,126,228,141,142,235,156,158,234,177,179,238,192,194,237,196,198,239,214,215,240,250,252,241,256,258,242,276,329,305,363,366,308,400,374,309,381,384,308,400],
[4,220,27,107,230,121,123,228,141,142,235,156,157,234,177,179,238,193,195,237,195,198,239,215,217,240,250,251,241,257,258,242,275,331,305,363,369,309,383,384,308,398],
[3,220,25,14,220,17,19,220,25,106,230,121,123,228,141,143,235,154,157,234,177,178,238,196,196,238,196,198,239,215,217,240,248,251,241,257,258,242,275,334,305,363,367,309,383,385,308,398,390,308,398],
[3,220,24,19,220,24,106,230,121,122,228,141,143,235,152,155,234,176,178,238,196,198,239,215,217,240,246,249,241,257,258,242,275,333,305,363,366,309,389,385,308,398,387,309,389,391,308,398],
[3,220,3,107,230,121,122,228,141,142,235,149,152,234,175,177,238,196,198,239,214,216,240,242,244,241,257,258,242,275,332,305,358,362,309,390,392,308,397],
[2,220,3,107,230,121,122,228,140,142,235,149,150,234,175,177,238,196,198,239,214,216,240,242,243,241,257,258,242,275,334,305,358,359,309,391,392,308,396],
[108,230,121,122,228,140,135,228,137,139,228,140,142,235,147,149,234,174,176,238,197,198,239,215,217,240,242,243,241,257,259,242,272,334,305,356,358,309,391,393,308,393],
[112,230,121,123,228,140,134,231,134,139,228,140,142,235,146,148,234,174,176,238,197,199,239,215,217,240,241,243,241,257,259,242,271,334,305,355,357,309,391],
[115,230,121,123,228,140,132,231,136,138,228,140,142,235,146,148,234,174,176,238,198,200,239,216,218,240,241,243,241,257,259,242,270,335,305,354,339,305,349,351,305,354,356,309,388],
[120,231,136,129,231,136,137,228,139,141,235,145,147,234,175,162,234,175,177,238,199,200,239,217,218,240,241,243,241,258,260,242,270,340,305,353,352,305,353,354,309,384,387,310,391],
[120,231,136,137,228,139,141,235,144,146,234,175,156,234,156,157,233,161,163,234,175,177,238,199,200,239,217,220,240,240,242,241,259,261,242,270,343,305,352,352,305,352,354,309,382,385,310,392],
[120,231,136,139,228,139,142,235,143,145,234,176,152,233,163,165,234,176,178,238,199,201,239,220,222,240,240,241,241,260,261,242,267,267,242,267,346,305,346,354,309,379,382,310,393],
[119,231,138,142,235,142,144,234,176,152,233,164,165,234,176,178,238,200,202,239,220,222,240,240,241,241,260,262,242,263,355,309,376,360,309,376,380,310,393],
[118,231,139,141,235,141,143,234,176,151,233,164,166,234,176,178,238,201,203,239,220,222,240,240,241,241,260,361,309,374,377,310,393],
[118,231,139,140,235,140,142,234,176,150,233,167,168,234,176,178,238,202,203,239,219,221,240,239,241,241,260,362,309,366,369,310,393,373,310,393],
[118,231,149,141,234,176,147,231,149,150,233,167,169,234,176,178,238,202,204,239,219,221,240,239,241,241,260,364,309,366,367,310,392],
[119,231,151,152,233,169,170,234,177,173,234,177,178,238,203,205,239,219,220,240,239,241,241,260,365,310,392],
[119,231,150,152,233,169,173,234,176,178,238,203,205,239,218,220,240,239,241,241,260,365,310,392],
[119,231,149,151,232,151,152,233,172,174,234,175,177,238,203,205,239,218,220,240,240,241,241,259,365,310,388],
[117,231,148,125,231,148,150,232,151,154,233,172,175,234,175,177,238,205,207,239,217,219,240,240,241,241,260,365,310,386],
[117,231,146,125,231,146,149,232,153,155,233,174,177,238,205,207,239,217,219,240,240,221,240,240,241,241,260,364,310,384],
[117,231,145,124,231,145,147,232,154,155,233,175,177,238,206,208,239,217,218,241,260,220,241,220,223,240,240,241,241,260,364,310,384],
[117,231,145,126,231,145,147,232,154,155,233,175,177,238,207,209,239,216,218,241,260,225,240,241,243,241,260,363,310,383],
[126,231,145,147,232,154,156,233,175,177,238,207,208,239,216,218,241,260,225,240,242,245,241,260,362,310,383],
[127,231,144,146,232,154,157,233,177,178,238,207,209,239,214,216,241,259,225,240,242,244,241,259,362,310,383],
[127,231,144,145,232,156,157,233,177,178,238,207,210,239,212,215,241,258,225,240,242,243,241,258,361,310,384],
[128,231,143,145,232,156,157,233,177,178,238,207,209,241,258,213,241,223,225,240,242,243,241,258,360,310,385],
[130,231,144,145,232,156,157,233,177,179,238,207,208,241,258,226,240,241,234,241,235,237,240,241,243,241,258,359,310,385],
[130,231,143,145,232,156,157,233,177,179,238,207,208,241,258,226,240,227,232,241,236,242,241,258,358,310,384],
[130,231,139,142,232,159,161,233,178,181,238,206,208,241,257,357,310,383,384,311,386],
[131,231,138,140,232,160,162,233,179,181,238,207,208,241,256,357,310,377,379,311,386,383,311,386],
[133,231,136,139,232,160,162,233,180,182,238,206,208,241,256,357,310,378,379,311,385],
[134,231,136,138,232,161,162,233,181,183,238,204,185,238,204,206,241,245,363,310,378,379,311,383],
[134,231,136,138,232,161,164,233,184,184,233,184,186,238,204,205,241,245,364,310,378,379,311,382],
[137,232,164,165,233,188,188,233,188,190,238,199,205,241,243,365,310,377,379,311,381],
[135,232,164,166,233,189,191,238,199,205,241,242,215,241,242,366,310,377,379,311,381],
[134,232,164,166,233,190,193,238,199,205,241,242,216,241,242,367,310,377,378,311,382],
[134,232,164,166,233,191,193,238,199,218,241,242,371,310,377,378,311,384],
[135,232,164,165,233,192,193,238,199,218,241,241,371,310,377,378,311,384],
[137,232,164,165,233,191,220,241,241,371,310,376,378,311,384],
[137,232,164,165,233,191,221,241,241,371,310,376,377,311,384],
[137,232,164,166,233,190,221,241,240,371,310,375,377,311,385],
[137,232,166,169,233,190,221,241,240,229,241,240,371,310,374,376,311,385],
[137,232,168,170,233,188,221,241,240,229,241,240,371,310,373,375,311,388],
[137,232,168,170,233,186,222,241,241,231,241,234,236,241,241,374,311,390],
[138,232,167,169,233,186,232,241,241,239,241,241,374,311,391],
[139,232,167,170,233,185,374,311,392],
[140,232,167,177,233,183,375,311,392],
[140,232,166,178,233,182,374,311,393],
[141,232,164,180,233,181,375,311,392],
[142,232,164,376,311,392],
[142,232,159,376,311,391],
[143,232,157,376,311,390],
[144,232,156,152,232,156,377,311,389],
[144,232,156,154,232,156,376,311,389],
[144,232,156,154,232,156,375,311,389],
[145,232,156,155,232,156,375,311,389],
[374,311,388],
[374,311,387,379,311,387],
[384,311,387],
[384,311,387],
[384,311,387],
[],
[]];


var boundingBoxes =[[305,316,265,49,42],
[304,387,226,32,39],
[307,363,237,30,46],
[306,343,254,30,37],
[309,354,295,37,16],
[308,366,265,52,37],
[311,374,325,19,32],
[310,357,305,36,34],
[313,503,245,25,36],
[312,444,248,30,23],
[315,465,219,47,42],
[314,536,202,29,22],
[317,498,169,45,42],
[316,485,198,32,38],
[319,533,141,29,46],
[318,520,165,35,40],
[301,311,237,37,44],
[302,306,222,66,36],
[303,353,213,32,41],
[102,160,64,56,21],
[103,180,79,50,22],
[101,185,40,44,30],
[110,166,210,41,41],
[111,157,234,43,33],
[108,160,162,32,32],
[109,163,185,49,34],
[106,169,113,48,37],
[107,160,142,35,24],
[104,190,87,43,30],
[105,159,103,33,43],
[119,205,178,41,36],
[118,188,161,24,43],
[117,205,146,48,36],
[116,191,134,51,31],
[115,215,101,30,32],
[114,231,70,29,28],
[113,214,58,36,25],
[112,221,41,44,18],
[127,231,158,38,35],
[126,247,131,43,35],
[125,223,112,52,33],
[124,236,91,48,32],
[123,253,57,34,36],
[122,248,35,40,35],
[121,194,229,41,23],
[120,204,204,30,32],
[137,272,201,30,31],
[136,266,183,46,30],
[139,329,15,32,23],
[138,306,1,38,28],
[141,324,31,42,32],
[140,312,33,27,15],
[143,318,77,46,27],
[142,316,56,43,26],
[129,234,205,39,35],
[128,232,185,44,34],
[131,283,55,40,28],
[130,283,36,42,29],
[133,271,106,39,30],
[132,273,80,51,27],
[135,264,159,34,31],
[134,271,129,47,36],
[152,356,44,33,37],
[153,361,66,35,33],
[154,352,91,41,30],
[155,346,114,29,32],
[156,363,114,32,39],
[157,330,137,42,29],
[158,338,162,26,37],
[159,362,144,29,37],
[144,326,89,47,29],
[145,306,101,19,40],
[146,321,110,28,33],
[147,298,142,48,45],
[148,305,160,41,27],
[149,306,184,35,30],
[150,308,205,32,25],
[151,360,22,32,25],
[171,397,180,30,40],
[170,384,197,27,37],
[169,401,160,28,29],
[168,370,168,36,35],
[175,420,95,23,34],
[174,420,64,40,37],
[173,407,50,50,24],
[172,407,217,39,27],
[163,380,54,36,27],
[162,390,26,41,32],
[161,344,195,39,31],
[160,339,179,35,43],
[167,388,139,22,30],
[166,391,113,41,30],
[165,389,94,34,23],
[164,389,70,48,29],
[186,473,160,41,40],
[187,461,184,29,39],
[184,440,222,32,35],
[185,473,139,30,37],
[178,409,137,34,31],
[179,425,165,19,33],
[176,438,97,18,36],
[177,430,127,25,42],
[182,442,167,37,26],
[183,443,193,28,38],
[180,420,189,36,29],
[181,450,132,31,36],
[205,115,106,65,27],
[204,140,82,52,29],
[207,133,118,34,30],
[206,90,119,46,39],
[201,119,56,42,26],
[203,144,78,32,26],
[202,115,77,43,46],
[220,2,276,42,25],
[221,58,214,20,28],
[222,77,215,34,27],
[223,97,209,30,30],
[216,19,184,53,56],
[217,44,200,36,36],
[218,16,219,42,37],
[219,21,238,35,42],
[212,92,161,47,36],
[213,137,164,31,28],
[214,115,184,50,37],
[215,79,194,42,30],
[208,63,141,37,42],
[209,85,134,56,51],
[210,134,139,31,40],
[211,65,170,33,37],
[239,198,277,22,44],
[238,176,287,31,47],
[237,177,258,48,39],
[236,175,252,44,29],
[235,140,265,36,45],
[234,141,285,38,30],
[233,150,306,42,39],
[232,134,314,34,38],
[231,117,303,34,26],
[230,106,281,22,23],
[229,104,257,22,24],
[228,116,256,25,51],
[227,130,255,29,35],
[226,130,228,35,31],
[225,127,207,47,32],
[224,112,229,19,26],
[246,265,210,50,47],
[244,225,252,51,40],
[245,220,226,50,43],
[242,256,282,21,26],
[243,256,254,39,29],
[240,215,275,40,49],
[241,205,295,55,46]];

var regionIdToPinPosition = {
'r305':[340,284],
'r304':[402,244],
'r307':[379,263],
'r306':[358,270],
'r309':[371,300],
'r308':[396,280],
'r311':[381,342],
'r310':[366,324],
'r313':[513,259],
'r312':[459,257],
'r315':[486,236],
'r314':[550,210],
'r317':[516,190],
'r316':[502,214],
'r319':[547,162],
'r318':[536,182],
'r301':[328,249],
'r302':[351,237],
'r303':[373,231],
'r102':[204,72],
'r103':[197,89],
'r101':[210,55],
'r110':[195,233],
'r111':[170,251],
'r108':[178,175],
'r109':[180,203],
'r106':[196,130],
'r107':[175,151],
'r104':[212,101],
'r105':[177,118],
'r119':[225,193],
'r118':[197,182],
'r117':[237,154],
'r116':[220,143],
'r115':[228,112],
'r114':[251,86],
'r113':[231,66],
'r112':[239,48],
'r127':[259,167],
'r126':[267,144],
'r125':[251,125],
'r124':[263,99],
'r123':[272,71],
'r122':[275,46],
'r121':[211,240],
'r120':[219,220],
'r137':[286,214],
'r136':[299,193],
'r139':[344,25],
'r138':[320,18],
'r141':[361,46],
'r140':[334,43],
'r143':[334,87],
'r142':[338,66],
'r129':[251,216],
'r128':[259,192],
'r131':[299,66],
'r130':[307,49],
'r133':[293,116],
'r132':[296,90],
'r135':[282,173],
'r134':[298,142],
'r152':[371,57],
'r153':[381,80],
'r154':[375,104],
'r155':[359,128],
'r156':[382,130],
'r157':[357,152],
'r158':[352,176],
'r159':[378,161],
'r144':[349,101],
'r145':[320,114],
'r146':[334,126],
'r147':[323,149],
'r148':[322,171],
'r149':[325,195],
'r150':[321,217],
'r151':[377,32],
'r171':[414,198],
'r170':[396,212],
'r169':[414,171],
'r168':[386,185],
'r175':[430,109],
'r174':[436,86],
'r173':[432,60],
'r172':[423,222],
'r163':[400,62],
'r162':[402,37],
'r161':[368,205],
'r160':[352,201],
'r167':[399,151],
'r166':[410,126],
'r165':[405,103],
'r164':[412,85],
'r186':[490,182],
'r187':[475,202],
'r184':[457,234],
'r185':[485,158],
'r178':[426,152],
'r179':[434,181],
'r176':[448,120],
'r177':[451,153],
'r182':[473,179],
'r183':[455,209],
'r180':[434,204],
'r181':[463,147],
'r205':[153,113],
'r204':[179,95],
'r207':[147,129],
'r206':[108,140],
'r201':[141,66],
'r203':[162,86],
'r202':[134,99],
'r220':[18,288],
'r221':[77,219],
'r222':[92,228],
'r223':[111,222],
'r216':[38,216],
'r217':[59,208],
'r218':[33,236],
'r219':[31,268],
'r212':[122,182],
'r213':[155,179],
'r214':[139,200],
'r215':[97,201],
'r208':[79,157],
'r209':[105,167],
'r210':[150,154],
'r211':[81,184],
'r239':[207,297],
'r238':[190,310],
'r237':[211,273],
'r236':[187,267],
'r235':[164,278],
'r234':[164,303],
'r233':[169,323],
'r232':[150,333],
'r231':[132,313],
'r230':[116,290],
'r229':[114,266],
'r228':[132,291],
'r227':[144,269],
'r226':[149,244],
'r225':[155,217],
'r224':[129,234],
'r246':[290,238],
'r244':[266,259],
'r245':[248,243],
'r242':[266,292],
'r243':[287,262],
'r240':[231,298],
'r241':[233,329]
};


function /* Point */ getPinPositionForRegionId(regionId) {
	var point = new Object();
	// adjust to pin with pin img -> (5,14)
	point.x = regionIdToPinPosition['r'+regionId][0] - 10;
    point.y = regionIdToPinPosition['r'+regionId][1] - 14;		 	
	return point;
}

function /* Point */ getTextPositionForRegionId(regionId) {
	var point = new Object();
	point.x = regionIdToTextPosition['r'+regionId][0];
    point.y = regionIdToTextPosition['r'+regionId][1];		 	
	return point;
}

function ButtonImgModel() {
	
	this.path = "/images/warnings/symbole/buttons/";

	// Value -> 0 = path, 1 = mousOver [true|false]
	this.gefahrImgs = {
		'wind':['',''],
		'glatteis':['',''],
		'hitze':['',''],
		'frost':['',''],
		'gewitter':['',''],
		'regen':['',''],
		'tauwetter':['',''],
		'schnee':['','']
	}
	
	this.setMouseOver = function(gefahr, /* Boolean */ mouseOver) {
		this.gefahrImgs[gefahr][1] = mouseOver;
	}
	
	this.isMouseOver = function() {
		return this.gefahrImgs[gefahr][1];
	}
	
	this.init = function() {
		for (var gefahr in this.gefahrImgs) {
			this.gefahrImgs[gefahr][0] = this.getUnselected(gefahr);
		}
	}
	
  	this.getSelected = function(/* String*/ gefahr) {
		this.gefahrImgs[gefahr][0] = this.path + gefahr + '_sel.png';
		if (this.gefahrImgs[gefahr][1]) {
			return this.getRollover(gefahr);
		}
		return this.gefahrImgs[gefahr][0];
	}
	
	this.getUnselected = function(/* String*/ gefahr) {
		this.gefahrImgs[gefahr][0] = this.path + gefahr + '.png';
		if (this.gefahrImgs[gefahr][1]) {
			return this.getRollover(gefahr);
		}
		return this.gefahrImgs[gefahr][0];
	}
	
	this.getLast = function(/* String */ gefahr) {
		if (this.gefahrImgs[gefahr][1]) {
			return this.getRollover(gefahr);
		}
		return this.gefahrImgs[gefahr][0];
	}
	
	this.getRollover = function(/* String*/ gefahr) {
		return this.path + gefahr + '_rollover.png';
	}
}

function /* Rectangle */ getBoundingBox(regionId) {
	
	for(var i = 0; i < boundingBoxes.length; i++) {
		if (boundingBoxes[i][0] == regionId) {
			var rectangle = new Object();
			rectangle.x = boundingBoxes[i][1];
			rectangle.y = boundingBoxes[i][2];
			rectangle.width = boundingBoxes[i][3];
			rectangle.height = boundingBoxes[i][4];
			
			return rectangle;
		}
	}
	
	return 0;
}

function getRegionId(x, y) {

	if (isNaN(y)) return 0;
	
	if (y < 0 || y >= scanlines.length) {
		return 0;
	}	
		
	var scanline = scanlines[y];
	
	for(var i = 0; i < scanline.length; i+=3 ) {
		var from = scanline[i];
		var regionId = scanline[i+1];
		var to = scanline[i+2];
		
		if (x >= from && x <= to) {
			return regionId;
		}
	}	
	return 0;
}

function Table(/* columns[] */ columns) {
	this.columns = columns;
	this.data = new Array();
	
	Array.prototype.contains = function (element) {
		for (var i = 0; i < this.length; i++) {
			if (this[i] == element) {
				return true;
			}
		}
		return false;
	};
	
	Array.prototype.indexOf = function (element) {
		for (var i = 0; i < this.length; i++) {
			if (this[i] == element) {
				return i;
			}
		}
	};
	
	Array.prototype.mergeSort = function(column, list, compare){
		// Check if we are done
		if (list.length < 2) {
			return list;
		}
		
		// Divide array
		var middle = Math.ceil(list.length / 2);
		var leftList = list.slice(0, middle);
		var rightList = list.slice(middle);
		
		return this.merge(column, this.mergeSort(column, leftList, compare), this.mergeSort(column, rightList, compare), compare);
	};	
	
	Array.prototype.merge = function (column, leftList, rightList, compare) {
		var result = new Array();
		while((leftList.length > 0) && (rightList.length > 0))
		{
			if(compare(leftList[0][column],rightList[0][column]) <= 0)
				result.push(leftList.shift());
			else
				result.push(rightList.shift());
		}
		while(leftList.length > 0)
			result.push(leftList.shift());
		while(rightList.length > 0)
			result.push(rightList.shift());
		return result;
	};
	
	this.compareAsc = function(a, b) {
		var tmpA = a;
		var tmpB = b;
		
		if (!isNaN(a)) {
			tmpA = parseInt(a);
		}
		if (!isNaN(b)) {
			tmpB = parseInt(b);
		}
	
		if (tmpA > tmpB) {
			return 1;
		}
		if (tmpA < tmpB) {
			return -1;
		}
		return 0;
	};
	
	this.compareDesc = function(b, a) {
		var tmpA = a;
		var tmpB = b;
		
		if (!isNaN(a)) {
			tmpA = parseInt(a);
		}
		if (!isNaN(b)) {
			tmpB = parseInt(b);
		}
	
		if (tmpA > tmpB) {
			return 1;
		}
		if (tmpA < tmpB) {
			return -1;
		}
		return 0;
	};


	this.insertRow = function /* Integer */ ( /* rowData[] */ row) {
		if (row && row.length == this.columns.length) {
			this.data.push(row);
			return 1;
		}
		return 0;
	}
	
	this.insertRows = function ( /* rowData[][] */ rows) {
		this.data = this.data.concat(rows);
	}
	
	this.findRows = /* Table */ function (column, /* [] */ values) {
		var col = this.columns.indexOf(column);
		var newTable = new Table(this.columns);
		
		for ( var i=0, len=this.data.length; i<len; ++i ) {
		  for ( var j=0; j < values.length; j++ ) {
				if (this.compareAsc(this.data[i][col], values[j]) == 0) {
					newTable.insertRow(this.data[i]);
				}
			}
		}
		
		return newTable;
	}
	
	this.getRowCount = /* Integer */ function() {
		return this.data.length;
	}
	
	this.getRow = function(rowNr) {
		if (rowNr < 0 || rowNr > this.getRowCount()) {
			return 0;
		}
		
		return this.data[rowNr];
	}
	
	this.sort = function /* Integer */ ( /* String */ column, direction) {
	   var comp;
	   
	   if (direction.toLowerCase() == 'asc') {
			comp = this.compareAsc;
	   } 
	   else if (direction.toLowerCase() == 'desc') {
			comp = this.compareDesc;
	   } 
	   else {
			return 0;
	   }
	
	   if (this.columns.contains(column)) {
		   this.data = this.data.mergeSort(this.columns.indexOf(column), this.data, comp);
		   return 1;
	   }
	   return 0;
	}
}

function GefahrenModel() {
	this.listeners = new Array();

	// Holding gefahrenType->value
	this.gefahrenType = new Object();
	this.gefahrenLevel = new Object();

	this.selectedRegionId = 0;
	
	this.createProperty = function(name, type, oldValue, newValue) {
		var property = new Object();
		property.name = name;
		property.type = type;
		property.oldValue = oldValue;
		property.newValue = newValue;

		return property;
	}
	
	this.addPropertyChangedListener = function(listener){
		this.listeners.push(listener);
	}

	this.removeProperyChangedListener = function(listener){
		for(var i=0; i < this.listeners.length; i++){
			if(this.listeners[i] === observer){
				this.listeners.splice(i, 1);
			}
		}
	}

	this.firePropertyChanged = function(property){
		for (var i=0, len=this.listeners.length; i<len; ++i ) {
			if (property.oldValue != property.newValue) {
				this.listeners[i].propertyChanged(property);
			}
		}
	}

	this.setSelectedRegionId = function(regionId) {

		// Deselect region
		if (this.selectedRegionId == regionId) {
			regionId = 0;
		}
		var property = this.createProperty('selectedregionid', '', this.selectedRegionId, regionId);
		this.selectedRegionId = regionId;
		this.firePropertyChanged(property);
	}

	this.getSelectedRegionId = function() {
		return this.selectedRegionId;
	}

	this.setGefahrenType = function(type, value) {
		var property = this.createProperty(type, 'gefahren', this.gefahrenType[type], value)
		this.gefahrenType[type] = value;
		this.firePropertyChanged(property);
	}

	this.clearGefahrenTypes = function() {
		for (var type in this.gefahrenType) {
			this.setGefahrenType(type, 0);
		}
	}

	this.setGefahrenTypeWithoutFire = function(type, value) {
		this.gefahrenType[type] = value;
	}

	this.getGefahrenType = function(type){
		return this.gefahrenType[type];
	}

	this.setGefahrenLevel = function(type, value) {
		var property = this.createProperty(type, 'level', this.gefahrenLevel[type], value)
		this.gefahrenLevel[type] = value;
		this.firePropertyChanged(property);
	}

	this.getGefahrenLevel = function(type){
		return this.gefahrenLevel[type];
	}

	this.getAllGefahrenType = function() {
		var types = new Array();
		for(var type in this.gefahrenType) {
			types.push(type);
		}
		return types;
	}
	
	this.getAllSetGefahrenType = function() {
		var types = new Array();
		for(var type in this.gefahrenType) {
			if (this.gefahrenType[type]) {
				types.push(type);
			}
		}
		return types;
	}

	this.isGefahrenTypeSet = function() {
		var types = this.getAllSetGefahrenType();
		for (var i = 0; i < types.length; i++) {
			if (types[i]) {
				return true;
			}
		}
		return false;
	}
}

// Initialize stuff that needs template functionality
function moveWebcamPopUps() {
    img = document.getElementById('all_regions');
    pin = document.getElementById('pin');
    rollover = document.getElementById('warningPopup');
	initialize();
	createRegionTable();
	calculateRegionIdToTextMapping()
	buttonImgModel = new ButtonImgModel();
	buttonImgModel.init();
	gefahrenModel = new GefahrenModel();
	toggledChangedListener = new ToggleChangedListener(gefahrenModel);
	regionSelectionListener = new RegionSelectionListener(gefahrenModel);
	viewUpdateListener = new ViewUpdateListener(gefahrenModel);
	gefahrenLevelListener = new GefahrenLevelListener(gefahrenModel);
	updateGefahrenMapListener = new UpdateGefahrenMapListener(gefahrenModel);
	updateLegendeListener = new UpdateLegendeListener(gefahrenModel);
	
	// We start with max level.
	setAllGefahrLevelToMax();

	calculateRegionIdToRowMapping();
	calculateRegionIdToWbRowMapping();
	calculateAwTypeToRowMapping();
	calculateRegionIdToSeeMapping();
	calculateRegionIdToFpRowMapping();

	// Calculate offset of gefahrenkarte
	img = document.getElementById('all_regions');
	pin = document.getElementById('pin');
	rollover = document.getElementById('warningPopup');
	offsetX = getAbsX(img);
	offsetY = getAbsY(img);
	// Display debug stuff 
	if (isNN) document.captureEvents(Event.MOUSEMOVE);
	document.onmousemove = handleMouseMove;
}

