Merge last PGO-green changeset of mozilla-inbound to mozilla-central

This commit is contained in:
Ed Morley 2012-02-07 10:22:34 +00:00
commit 20dbb08e1f
110 changed files with 3990 additions and 2678 deletions

View File

@ -1374,6 +1374,30 @@ nsAccessible::GetAttributesInternal(nsIPersistentProperties *aAttributes)
if (NS_SUCCEEDED(rv))
nsAccUtils::SetAccAttr(aAttributes, nsGkAtoms::textIndent, value);
// Expose 'margin-left' attribute.
rv = GetComputedStyleValue(EmptyString(), NS_LITERAL_STRING("margin-left"),
value);
if (NS_SUCCEEDED(rv))
nsAccUtils::SetAccAttr(aAttributes, nsGkAtoms::marginLeft, value);
// Expose 'margin-right' attribute.
rv = GetComputedStyleValue(EmptyString(), NS_LITERAL_STRING("margin-right"),
value);
if (NS_SUCCEEDED(rv))
nsAccUtils::SetAccAttr(aAttributes, nsGkAtoms::marginRight, value);
// Expose 'margin-top' attribute.
rv = GetComputedStyleValue(EmptyString(), NS_LITERAL_STRING("margin-top"),
value);
if (NS_SUCCEEDED(rv))
nsAccUtils::SetAccAttr(aAttributes, nsGkAtoms::marginTop, value);
// Expose 'margin-bottom' attribute.
rv = GetComputedStyleValue(EmptyString(), NS_LITERAL_STRING("margin-bottom"),
value);
if (NS_SUCCEEDED(rv))
nsAccUtils::SetAccAttr(aAttributes, nsGkAtoms::marginBottom, value);
// Expose draggable object attribute?
nsCOMPtr<nsIDOMHTMLElement> htmlElement = do_QueryInterface(mContent);
if (htmlElement) {

View File

@ -2,6 +2,7 @@
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=439566
https://bugzilla.mozilla.org/show_bug.cgi?id=460932
https://bugzilla.mozilla.org/show_bug.cgi?id=689540
-->
<head>
<title>CSS-like attributes tests</title>
@ -25,7 +26,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=460932
var attrs = {
"display": computedStyle.display,
"text-align": computedStyle.textAlign,
"text-indent": computedStyle.textIndent
"text-indent": computedStyle.textIndent,
"margin-left": computedStyle.marginLeft,
"margin-right": computedStyle.marginRight,
"margin-top": computedStyle.marginTop,
"margin-bottom": computedStyle.marginBottom
};
testAttrs(aID, attrs, true);
}
@ -34,7 +39,15 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=460932
{
testCSSAttrs("span");
testCSSAttrs("div");
testCSSAttrs("p");
testCSSAttrs("p2");
testCSSAttrs("pml");
testCSSAttrs("pmr");
testCSSAttrs("pmt");
testCSSAttrs("pmb");
testCSSAttrs("input");
testCSSAttrs("table");
testCSSAttrs("tr");
@ -59,6 +72,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=460932
title="text-indent and text-align should really be object attribute">
Mozilla Bug 460932
</a>
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=689540"
title="Expose IA2 margin- object attributes">
Mozilla Bug 689540
</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
@ -67,7 +85,15 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=460932
<span id="span" role="group">It's span</span>
<div id="div">It's div</div>
<p id="p">It's paragraph"</p>
<p id="p2" style="text-indent: 5px">It's another paragraph</p>
<p id="pml" style="margin-left : 11px;">It's a paragraph with left margin</p>
<p id="pmr" style="margin-right : 21px;">It's a paragraph with right margin</p>
<p id="pmt" style="margin-top : 31px;">It's a paragraph with top margin</p>
<p id="pmb" style="margin-bottom : 41px;">It's a paragraph with bottom margin</p>
<input id="input"/>
<table id="table">
<tr id="tr" role="group">

View File

@ -45,12 +45,11 @@ relativesrcdir = accessible/relations
include $(DEPTH)/config/autoconf.mk
include $(topsrcdir)/config/rules.mk
# test_tabbrowser.xul disabled for misusing <tabbrowser> (bug 715857)
_TEST_FILES =\
test_embeds.xul \
test_general.html \
test_general.xul \
test_tabbrowser.xul \
test_tree.xul \
test_update.html \
$(NULL)

View File

@ -3,20 +3,13 @@
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
type="text/css"?>
<!-- Firefox tabbrowser -->
<?xml-stylesheet href="chrome://browser/content/browser.css"
type="text/css"?>
<!-- SeaMonkey tabbrowser -->
<?xml-stylesheet href="chrome://navigator/content/navigator.css"
type="text/css"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
title="Accessible XUL tabbrowser relation tests">
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
<script type="application/javascript"
src="chrome://browser/content/utilityOverlay.js"/>
src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
<script type="application/javascript"
src="../common.js" />
@ -26,75 +19,63 @@
src="../relations.js" />
<script type="application/javascript"
src="../events.js" />
<script type="application/javascript"
src="../browser.js"></script>
<script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>
<script type="application/javascript">
<![CDATA[
////////////////////////////////////////////////////////////////////////////
// Test
// Invoker
function testTabRelations()
{
this.eventSeq = [
new invokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, tabDocumentAt, 0),
new invokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, tabDocumentAt, 1)
];
const Ci = Components.interfaces;
// Hack to make xul:tabbrowser work.
var handleDroppedLink = null;
Components.utils.import("resource://gre/modules/Services.jsm");
var XULBrowserWindow = {
isBusy: false,
setOverLink: function (link, b) {
this.invoke = function testTabRelations_invoke()
{
var docURIs = ["about:", "about:mozilla"];
tabBrowser().loadTabs(docURIs, false, true);
}
};
var gFindBar = {
hidden: true
};
this.finalCheck = function testTabRelations_finalCheck(aEvent)
{
////////////////////////////////////////////////////////////////////////
// 'labelled by'/'label for' relations for xul:tab and xul:tabpanel
var tabs = tabBrowser().tabContainer.childNodes;
var panels = tabBrowser().mTabBox.tabpanels.childNodes;
testRelation(panels[0], RELATION_LABELLED_BY, tabs[0]);
testRelation(tabs[0], RELATION_LABEL_FOR, panels[0]);
testRelation(panels[1], RELATION_LABELLED_BY, tabs[1]);
testRelation(tabs[1], RELATION_LABEL_FOR, panels[1]);
}
this.getID = function testTabRelations_getID()
{
return "relations of tabs";
}
}
////////////////////////////////////////////////////////////////////////////
// Test
var gQueue = null;
function doTest()
{
var tabBrowser = document.getElementById("tabbrowser");
// Load documents into tabs and wait for DocLoadComplete events caused by
// these documents load before we start the test.
// Load documents into tabs and wait for reorder events caused by these
// documents load before we start the test.
var docURIs = ["about:", "about:mozilla"];
gQueue = new eventQueue();
var handler = {
handleEvent: function handleEvent(aEvent) {
var target = aEvent.accessible;
if (target.role == ROLE_INTERNAL_FRAME &&
target.parent.parent == getAccessible(this.tabBrowser.mTabBox.tabpanels)) {
this.reorderCnt++;
}
if (this.reorderCnt == docURIs.length) {
unregisterA11yEventListener(EVENT_REORDER, this);
testRelations();
}
},
tabBrowser: tabBrowser,
reorderCnt: 0
};
registerA11yEventListener(EVENT_REORDER, handler);
tabBrowser.loadTabs(docURIs, false, true);
}
function testRelations()
{
//////////////////////////////////////////////////////////////////////////
// 'labelled by'/'label for' relations for xul:tab and xul:tabpanel
var tabs = getNode("tabbrowser").tabContainer.childNodes;
var panels = getNode("tabbrowser").mTabBox.tabpanels.childNodes;
testRelation(panels[0], RELATION_LABELLED_BY, tabs[0]);
testRelation(tabs[0], RELATION_LABEL_FOR, panels[0]);
testRelation(panels[1], RELATION_LABELLED_BY, tabs[1]);
testRelation(tabs[1], RELATION_LABEL_FOR, panels[1]);
SimpleTest.finish();
gQueue.push(new testTabRelations());
gQueue.onFinish = function() { closeBrowserWindow(); }
gQueue.invoke(); // Will call SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTest);
openBrowserWindow(doTest);
]]>
</script>
@ -112,26 +93,7 @@
</pre>
</body>
<!-- Hack to make xul:tabbrowser work -->
<menubar>
<menu label="menu">
<menupopup>
<menuitem label="close window hook" id="menu_closeWindow"/>
<menuitem label="close hook" id="menu_close"/>
</menupopup>
</menu>
</menubar>
<tabs id="tabbrowser-tabs" class="tabbrowser-tabs"
tabbrowser="tabbrowser"
setfocus="false">
<tab class="tabbrowser-tab" selected="true"/>
</tabs>
<tabbrowser id="tabbrowser"
type="content-primary"
tabcontainer="tabbrowser-tabs"
flex="1"/>
<toolbar id="addon-bar"/>
<vbox id="eventdump"></vbox>
</vbox>
</window>

View File

@ -45,8 +45,6 @@ relativesrcdir = accessible/tree
include $(DEPTH)/config/autoconf.mk
include $(topsrcdir)/config/rules.mk
# test_tabbrowser.xul disabled for misusing <tabbrowser> (bug 715857)
_TEST_FILES =\
dockids.html \
$(warning test_applicationacc.xul temporarily disabled, see bug 561508) \
@ -72,6 +70,7 @@ _TEST_FILES =\
test_media.html \
test_select.html \
test_tabbox.xul \
test_tabbrowser.xul \
test_table.html \
test_tree.xul \
test_txtcntr.html \

View File

@ -1,13 +1,6 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<!-- Firefox tabbrowser -->
<?xml-stylesheet href="chrome://browser/content/browser.css"
type="text/css"?>
<!-- SeaMonkey tabbrowser -->
<?xml-stylesheet href="chrome://navigator/content/navigator.css"
type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
type="text/css"?>
@ -17,7 +10,7 @@
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
<script type="application/javascript"
src="chrome://browser/content/utilityOverlay.js"/>
src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
<script type="application/javascript"
src="../common.js" />
@ -25,201 +18,186 @@
src="../role.js" />
<script type="application/javascript"
src="../events.js" />
<script type="application/javascript"
src="../browser.js"></script>
<script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>
<script type="application/javascript">
<![CDATA[
////////////////////////////////////////////////////////////////////////////
// Test
const Ci = Components.interfaces;
// Hack to make xul:tabbrowser work.
Components.utils.import("resource://gre/modules/Services.jsm");
var handleDroppedLink = null;
var XULBrowserWindow = {
isBusy: false,
setOverLink: function (link, b) {}
};
var gFindBar = {
hidden: true
};
function doTest()
// invoker
function testTabHierarchy()
{
var tabBrowser = document.getElementById("tabbrowser");
this.eventSeq = [
new invokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, tabDocumentAt, 0),
new invokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, tabDocumentAt, 1)
];
// Load documents into tabs and wait for reorder events caused by these
// documents load before we start the test.
var docURIs = ["about:", "about:mozilla"];
var handler = {
handleEvent: function handleEvent(aEvent) {
var target = aEvent.accessible;
if (target.role == ROLE_INTERNAL_FRAME &&
target.parent.parent == getAccessible(this.tabBrowser.mTabBox.tabpanels)) {
this.reorderCnt++;
}
if (this.reorderCnt == docURIs.length) {
unregisterA11yEventListener(EVENT_REORDER, this);
testAccTree();
}
},
tabBrowser: tabBrowser,
reorderCnt: 0
};
registerA11yEventListener(EVENT_REORDER, handler);
// Test XUL and HTML documents.
tabBrowser.loadTabs(docURIs, false, true);
}
function testAccTree()
{
var tabBrowser = document.getElementById("tabbrowser");
////////////////////
// Tab bar
////////////////////
var tabsAccTree = {
// xul:tabs
role: ROLE_PAGETABLIST,
children: [
// Children depend on application (UI): see below.
]
};
// SeaMonkey and Firefox tabbrowser UIs differ.
if ("restoreTab" in tabBrowser) {
SimpleTest.ok(true, "Testing SeaMonkey tabbrowser UI.");
tabsAccTree.children.splice(0, 0,
{
// xul:toolbarbutton ("Open a new tab")
role: ROLE_PUSHBUTTON,
children: []
},
{
// xul:tab ("about:")
role: ROLE_PAGETAB,
children: []
},
{
// tab ("about:mozilla")
role: ROLE_PAGETAB,
children: []
},
{
// xul:toolbarbutton ("List all tabs")
role: ROLE_PUSHBUTTON,
children: [
{
// xul:menupopup
role: ROLE_MENUPOPUP,
children: []
}
]
},
{
// xul:toolbarbutton ("Close current tab")
role: ROLE_PUSHBUTTON,
children: []
}
);
} else {
SimpleTest.ok(true, "Testing Firefox tabbrowser UI.");
// NB: The (3) buttons are not visible, unless manually hovered,
// probably due to size reduction in this test.
tabsAccTree.children.splice(0, 0,
{
// xul:tab ("about:")
role: ROLE_PAGETAB,
children: [
{
// xul:toolbarbutton ("Close Tab")
role: ROLE_PUSHBUTTON,
children: []
}
]
},
{
// tab ("about:mozilla")
role: ROLE_PAGETAB,
children: [
{
// xul:toolbarbutton ("Close Tab")
role: ROLE_PUSHBUTTON,
children: []
}
]
},
{
// xul:toolbarbutton ("Open a new tab")
role: ROLE_PUSHBUTTON,
children: []
}
// "List all tabs" dropdown
// XXX: This child(?) is not present in this test.
// I'm not sure why (though probably expected).
);
this.invoke = function testTabHierarchy_invoke()
{
var docURIs = ["about:", "about:mozilla"];
tabBrowser().loadTabs(docURIs, false, true);
}
testAccessibleTree(tabBrowser.tabContainer, tabsAccTree);
this.finalCheck = function testTabHierarchy_finalCheck(aEvent)
{
////////////////////
// Tab bar
////////////////////
var tabsAccTree = {
// xul:tabs
role: ROLE_PAGETABLIST,
children: [
// Children depend on application (UI): see below.
]
};
////////////////////
// Tab contents
////////////////////
var tabboxAccTree = {
// xul:tabpanels
role: ROLE_PANE,
children: [
{
// xul:notificationbox
role: ROLE_PROPERTYPAGE,
children: [
{
// xul:browser
role: ROLE_INTERNAL_FRAME,
children: [
{
// #document ("about:")
role: ROLE_DOCUMENT
// children: [ ... ] // Ignore document content.
}
]
}
]
},
{
// notificationbox
role: ROLE_PROPERTYPAGE,
children: [
{
// browser
role: ROLE_INTERNAL_FRAME,
children: [
{
// #document ("about:mozilla")
role: ROLE_DOCUMENT
// children: [ ... ] // Ignore document content.
}
]
}
]
}
]
};
// SeaMonkey and Firefox tabbrowser UIs differ.
if ("restoreTab" in tabBrowser) {
SimpleTest.ok(true, "Testing SeaMonkey tabbrowser UI.");
testAccessibleTree(tabBrowser.mTabBox.tabpanels, tabboxAccTree);
tabsAccTree.children.splice(0, 0,
{
// xul:toolbarbutton ("Open a new tab")
role: ROLE_PUSHBUTTON,
children: []
},
{
// xul:tab ("about:")
role: ROLE_PAGETAB,
children: []
},
{
// tab ("about:mozilla")
role: ROLE_PAGETAB,
children: []
},
{
// xul:toolbarbutton ("List all tabs")
role: ROLE_PUSHBUTTON,
children: [
{
// xul:menupopup
role: ROLE_MENUPOPUP,
children: []
}
]
},
{
// xul:toolbarbutton ("Close current tab")
role: ROLE_PUSHBUTTON,
children: []
}
);
} else {
SimpleTest.ok(true, "Testing Firefox tabbrowser UI.");
SimpleTest.finish();
// NB: The (3) buttons are not visible, unless manually hovered,
// probably due to size reduction in this test.
tabsAccTree.children.splice(0, 0,
{
// xul:tab ("about:")
role: ROLE_PAGETAB,
children: [
{
// xul:toolbarbutton ("Close Tab")
role: ROLE_PUSHBUTTON,
children: []
}
]
},
{
// tab ("about:mozilla")
role: ROLE_PAGETAB,
children: [
{
// xul:toolbarbutton ("Close Tab")
role: ROLE_PUSHBUTTON,
children: []
}
]
},
{
// xul:toolbarbutton ("Open a new tab")
role: ROLE_PUSHBUTTON,
children: []
}
// "List all tabs" dropdown
// XXX: This child(?) is not present in this test.
// I'm not sure why (though probably expected).
);
}
testAccessibleTree(tabBrowser().tabContainer, tabsAccTree);
////////////////////
// Tab contents
////////////////////
var tabboxAccTree = {
// xul:tabpanels
role: ROLE_PANE,
children: [
{
// xul:notificationbox
role: ROLE_PROPERTYPAGE,
children: [
{
// xul:browser
role: ROLE_INTERNAL_FRAME,
children: [
{
// #document ("about:")
role: ROLE_DOCUMENT
// children: [ ... ] // Ignore document content.
}
]
}
]
},
{
// notificationbox
role: ROLE_PROPERTYPAGE,
children: [
{
// browser
role: ROLE_INTERNAL_FRAME,
children: [
{
// #document ("about:mozilla")
role: ROLE_DOCUMENT
// children: [ ... ] // Ignore document content.
}
]
}
]
}
]
};
testAccessibleTree(tabBrowser().mTabBox.tabpanels, tabboxAccTree);
}
this.getID = function testTabHierarchy_getID()
{
return "hierarchy of tabs";
}
}
////////////////////////////////////////////////////////////////////////////
// Test
var gQueue = null;
function doTest()
{
// Load documents into tabs and wait for docLoadComplete events caused by these
// documents load before we start the test.
gQueue = new eventQueue();
gQueue.push(new testTabHierarchy());
gQueue.onFinish = function() { closeBrowserWindow(); }
gQueue.invoke(); // Will call SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTest);
openBrowserWindow(doTest);
]]>
</script>
@ -242,26 +220,7 @@
</pre>
</body>
<!-- Hack to make xul:tabbrowser work -->
<menubar>
<menu label="menu">
<menupopup>
<menuitem label="close window hook" id="menu_closeWindow"/>
<menuitem label="close hook" id="menu_close"/>
</menupopup>
</menu>
</menubar>
<tabs id="tabbrowser-tabs" class="tabbrowser-tabs"
tabbrowser="tabbrowser"
setfocus="false">
<tab class="tabbrowser-tab" selected="true" fadein="true"/>
</tabs>
<tabbrowser id="tabbrowser"
type="content-primary"
tabcontainer="tabbrowser-tabs"
flex="1"/>
<toolbar id="addon-bar"/>
<vbox id="eventdump"></vbox>
</vbox>
</window>

View File

@ -850,11 +850,6 @@
label="&printButton.label;" command="cmd_print"
tooltiptext="&printButton.tooltip;"/>
<toolbaritem id="navigator-throbber" title="&throbberItem.title;" align="center" pack="center"
mousethrough="always">
<image/>
</toolbaritem>
<toolbarbutton id="downloads-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
observes="Tools:Downloads"
ondrop="DownloadsButtonDNDObserver.onDrop(event)"
@ -885,21 +880,6 @@
ondragenter="newWindowButtonObserver.onDragOver(event)"
ondragexit="newWindowButtonObserver.onDragExit(event)"/>
<toolbarbutton id="cut-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&cutCmd.label;"
command="cmd_cut"
tooltiptext="&cutButton.tooltip;"/>
<toolbarbutton id="copy-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&copyCmd.label;"
command="cmd_copy"
tooltiptext="&copyButton.tooltip;"/>
<toolbarbutton id="paste-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&pasteCmd.label;"
command="cmd_paste"
tooltiptext="&pasteButton.tooltip;"/>
<toolbarbutton id="fullscreen-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
observes="View:FullScreen"
type="checkbox"
@ -917,12 +897,7 @@
command="cmd_fullZoomEnlarge"
tooltiptext="&zoomInButton.tooltip;"/>
</toolbaritem>
#ifdef MOZ_SERVICES_SYNC
<toolbarbutton id="sync-button"
class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&syncToolbarButton.label;"
oncommand="gSyncUI.handleToolbarButton()"/>
#endif
<toolbarbutton id="feed-button"
type="menu"
class="toolbarbutton-1 chromeclass-toolbar-additional"
@ -937,6 +912,33 @@
onclick="checkForMiddleClick(this, event);"/>
</toolbarbutton>
<toolbarbutton id="cut-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&cutCmd.label;"
command="cmd_cut"
tooltiptext="&cutButton.tooltip;"/>
<toolbarbutton id="copy-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&copyCmd.label;"
command="cmd_copy"
tooltiptext="&copyButton.tooltip;"/>
<toolbarbutton id="paste-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&pasteCmd.label;"
command="cmd_paste"
tooltiptext="&pasteButton.tooltip;"/>
#ifdef MOZ_SERVICES_SYNC
<toolbarbutton id="sync-button"
class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&syncToolbarButton.label;"
oncommand="gSyncUI.handleToolbarButton()"/>
#endif
<toolbaritem id="navigator-throbber" title="&throbberItem.title;" align="center" pack="center"
mousethrough="always">
<image/>
</toolbaritem>
<toolbarbutton id="tabview-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
label="&tabGroupsButton.label;"
command="Browser:ToggleTabView"

View File

@ -415,6 +415,9 @@ BrowserGlue.prototype = {
browser.selectedTab = browser.addTab("about:newaddon?id=" + aAddon.id);
})
});
let keywordURLUserSet = Services.prefs.prefHasUserValue("keyword.URL");
Services.telemetry.getHistogramById("FX_KEYWORD_URL_USERSET").add(keywordURLUserSet);
},
_onQuitRequest: function BG__onQuitRequest(aCancelQuit, aQuitType) {

View File

@ -37,6 +37,7 @@
# ***** END LICENSE BLOCK *****
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
Components.utils.import("resource://gre/modules/Services.jsm");
#ifndef XP_WIN
#define BROKEN_WM_Z_ORDER
@ -176,9 +177,7 @@ PrivateBrowsingService.prototype = {
this._closePageInfoWindows();
// save view-source windows URIs and close them
let viewSrcWindowsEnum = Cc["@mozilla.org/appshell/window-mediator;1"].
getService(Ci.nsIWindowMediator).
getEnumerator("navigator:view-source");
let viewSrcWindowsEnum = Services.wm.getEnumerator("navigator:view-source");
while (viewSrcWindowsEnum.hasMoreElements()) {
let win = viewSrcWindowsEnum.getNext();
if (this._inPrivateBrowsing) {
@ -190,13 +189,25 @@ PrivateBrowsingService.prototype = {
}
win.close();
}
var windowsEnum = Services.wm.getEnumerator("navigator:browser");
while (windowsEnum.hasMoreElements()) {
var window = windowsEnum.getNext();
window.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
.treeOwner
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIXULWindow)
.docShell.QueryInterface(Ci.nsILoadContext)
.usePrivateBrowsing = this._inPrivateBrowsing;
}
if (!this._quitting && this._saveSession) {
let browserWindow = this._getBrowserWindow();
// if there are open browser windows, load a dummy session to get a distinct
// if there are open browser windows, load a dummy session to get a distinct
// separation between private and non-private sessions
if (browserWindow) {
if (browserWindow) {
// set an empty session to transition from/to pb mode, see bug 476463
ss.setBrowserState(blankState);

View File

@ -103,7 +103,7 @@ function TabItem(tab, options) {
if (Utils.isEmptyObject(TabItems.tabItemPadding)) {
TabItems.tabItemPadding.x = parseInt($div.css('padding-left'))
+ parseInt($div.css('padding-right'));
TabItems.tabItemPadding.y = parseInt($div.css('padding-top'))
+ parseInt($div.css('padding-bottom'));
}

View File

@ -181,6 +181,13 @@ Section "MaintenanceService"
; not via calling its 'install' cmdline which works by version comparison.
CopyFiles "$EXEDIR\maintenanceservice.exe" "$INSTDIR\$TempMaintServiceName"
; The updater.ini file is only used when performing an install or upgrade,
; and only if that install or upgrade is successful. If an old updater.ini
; happened to be copied into the maintenance service installation directory
; but the service was not newer, the updater.ini file would be unused.
; It is used to fill the description of the service on success.
CopyFiles "$EXEDIR\updater.ini" "$INSTDIR\updater.ini"
; Install the application maintenance service.
; If a service already exists, the command line parameter will stop the
; service and only install itself if it is newer than the already installed
@ -252,6 +259,8 @@ Section "Uninstall"
; Delete the service so that no updates will be attempted
nsExec::Exec '"$INSTDIR\maintenanceservice.exe" uninstall'
Push "$INSTDIR\updater.ini"
Call un.RenameDelete
Push "$INSTDIR\maintenanceservice.exe"
Call un.RenameDelete
Push "$INSTDIR\maintenanceservice_tmp.exe"

View File

@ -60,6 +60,9 @@ RequestExecutionLevel user
; prevents compiling of the reg write logging.
!define NO_LOG
!define MaintUninstallKey \
"Software\Microsoft\Windows\CurrentVersion\Uninstall\MozillaMaintenanceService"
Var TmpVal
Var MaintCertKey
@ -200,6 +203,47 @@ UninstPage custom un.preConfirm un.leaveConfirm
; Use the default dialog for IDD_VERIFY for a simple Banner
ChangeUI IDD_VERIFY "${NSISDIR}\Contrib\UIs\default.exe"
; This function is used to uninstall the maintenance service if the
; application currently being uninstalled is the last application to use the
; maintenance service.
Function un.UninstallServiceIfNotUsed
; $0 will store if a subkey exists
; $1 will store the first subkey if it exists or an empty string if it doesn't
; Backup the old values
Push $0
Push $1
; The maintenance service always uses the 64-bit registry on x64 systems
SetRegView 64
; Figure out the number of subkeys
StrCpy $0 0
loop:
EnumRegKey $1 HKLM "Software\Mozilla\MaintenanceService" $0
StrCmp $1 "" doneCount
IntOp $0 $0 + 1
goto loop
doneCount:
; Restore back the registry view
SetRegView lastUsed
${If} $0 == 0
; Get the path of the maintenance service uninstaller
ReadRegStr $1 HKLM ${MaintUninstallKey} "UninstallString"
; If the uninstall string does not exist, skip executing it
StrCmp $1 "" doneUninstall
; $1 is already a quoted string pointing to the install path
; so we're already protected against paths with spaces
nsExec::Exec "$1 /S"
doneUninstall:
${EndIf}
; Restore the old value of $1 and $0
Pop $1
Pop $0
FunctionEnd
################################################################################
# Install Sections
; Empty section required for the installer to compile as an uninstaller
@ -395,6 +439,7 @@ Section "Uninstall"
DeleteRegKey HKLM "$MaintCertKey\"
SetRegView lastused
${EndIf}
Call un.UninstallServiceIfNotUsed
!endif
SectionEnd

View File

@ -1,4 +1,8 @@
; This file is in the UTF-8 encoding
; All strings must be less than 600 chars.
[Strings]
TitleText=%MOZ_APP_DISPLAYNAME% Update
InfoText=%MOZ_APP_DISPLAYNAME% is installing your updates and will start in a few moments…
[MaintenanceServiceStrings]
ServiceDescription=The Mozilla Maintenance Service ensures that you have the latest and most secure version of Mozilla Firefox on your computer. Keeping Firefox up to date is very important for your online security, and Mozilla strongly recommends that you keep this service enabled.

View File

@ -237,6 +237,7 @@ class DeviceManagerADB(DeviceManager):
def listFiles(self, rootdir):
p = self.runCmd(["shell", "ls", "-a", rootdir])
data = p.stdout.readlines()
data[:] = [item.rstrip('\r\n') for item in data]
if (len(data) == 1):
if (data[0] == rootdir):
return []
@ -282,7 +283,7 @@ class DeviceManagerADB(DeviceManager):
self.checkCmd(["shell"] + cmd)
return outputFile
acmd = ["shell", "am","start"]
acmd = ["shell", "am", "start", "-W"]
cmd = ' '.join(cmd).strip()
i = cmd.find(" ")
# SUT identifies the URL by looking for :\\ -- another strategy to consider
@ -297,10 +298,18 @@ class DeviceManagerADB(DeviceManager):
args = cmd[i:].strip()
acmd.append("-n")
acmd.append(cmd[0:i] + "/.App")
acmd.append("--es")
if args != "":
acmd.append("--es")
acmd.append("args")
acmd.append(args)
if env != '' and env != None:
envCnt = 0
# env is expected to be a dict of environment variables
for envkey, envval in env.iteritems():
acmd.append("--es")
acmd.append("env" + str(envCnt))
acmd.append(envkey + "=" + envval);
envCnt += 1
if uri != "":
acmd.append("-d")
acmd.append(''.join(['\'',uri, '\'']));

View File

@ -1987,6 +1987,10 @@ GK_ATOM(itemset, "itemset")
GK_ATOM(lineNumber, "line-number")
GK_ATOM(linkedPanel, "linkedpanel")
GK_ATOM(live, "live")
GK_ATOM(marginBottom, "margin-bottom")
GK_ATOM(marginLeft, "margin-left")
GK_ATOM(marginRight, "margin-right")
GK_ATOM(marginTop, "margin-top")
GK_ATOM(mixed, "mixed")
GK_ATOM(multiline, "multiline")
GK_ATOM(password, "password")

View File

@ -206,7 +206,7 @@ nsLineBreaker::AppendText(nsIAtom* aLangGroup, const PRUnichar* aText, PRUint32
if (aSink && (aFlags & BREAK_NEED_CAPITALIZATION)) {
if (!capitalizationState.AppendElements(aLength))
return NS_ERROR_OUT_OF_MEMORY;
memset(capitalizationState.Elements(), false, aLength);
memset(capitalizationState.Elements(), false, aLength*sizeof(bool));
}
PRUint32 start = offset;

View File

@ -211,6 +211,8 @@ _TEST_FILES1 = \
file_bug426646-1.html \
file_bug426646-2.html \
test_bug429157.html \
test_header.html \
header.sjs \
test_XHR.html \
file_XHR_pass1.xml \
file_XHR_pass2.txt \

View File

@ -0,0 +1,8 @@
function handleRequest(request, response) {
response.setHeader("Content-Type", "text/plain", false);
response.setHeader("Cache-Control", "no-cache", false);
var value = request.hasHeader("SomeHeader") ? request.getHeader("SomeHeader")
: "";
response.write("SomeHeader: " + value);
}

View File

@ -0,0 +1,31 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Test for XHR header preservation</title>
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
/** Test for Bug 421622 **/
const SJS_URL = "http://mochi.test:8888/tests/content/base/test/header.sjs";
const VALUE = "http://www.mozilla.org/";
var req = new XMLHttpRequest();
req.open("GET", SJS_URL, false);
req.setRequestHeader("SomeHeader", VALUE);
req.send(null);
is(req.responseText,
"SomeHeader: " + VALUE,
"Header received by server does not match what was set");
</script>
</pre>
</body>
</html>

View File

@ -215,8 +215,10 @@ static PRUint32 CountNewlinesInXPLength(nsIContent* aContent,
const nsTextFragment* text = aContent->GetText();
if (!text)
return 0;
NS_ASSERTION(aXPLength == PR_UINT32_MAX || aXPLength <= text->GetLength(),
"text offset is out-of-bounds");
// For automated tests, we should abort on debug build.
NS_ABORT_IF_FALSE(
(aXPLength == PR_UINT32_MAX || aXPLength <= text->GetLength()),
"aXPLength is out-of-bounds");
const PRUint32 length = NS_MIN(aXPLength, text->GetLength());
PRUint32 newlines = 0;
for (PRUint32 i = 0; i < length; ++i) {
@ -236,11 +238,17 @@ static PRUint32 CountNewlinesInNativeLength(nsIContent* aContent,
if (!text) {
return 0;
}
// For automated tests, we should abort on debug build.
NS_ABORT_IF_FALSE(
(aNativeLength == PR_UINT32_MAX || aNativeLength <= text->GetLength() * 2),
"aNativeLength is unexpected value");
const PRUint32 xpLength = text->GetLength();
PRUint32 newlines = 0;
for (PRUint32 i = 0, nativeOffset = 0;
i < xpLength && nativeOffset < aNativeLength;
++i, ++nativeOffset) {
// For automated tests, we should abort on debug build.
NS_ABORT_IF_FALSE(i < text->GetLength(), "i is out-of-bounds");
if (text->CharAt(i) == '\n') {
++newlines;
++nativeOffset;

View File

@ -339,12 +339,12 @@ public:
mList = nsnull;
}
PRUint32 Length() {
PRUint32 Length() const {
return mList ? mList->Length() : 0;
}
/// This may return a non-finite value
float operator[](PRUint32 aIndex) {
float operator[](PRUint32 aIndex) const {
return (*mList)[aIndex].GetValueInUserUnits(mElement, mAxis);
}

View File

@ -28,6 +28,9 @@
<foreignObject>
<g id="g3"/>
</foreignObject>
<image>
<g id="g4"/>
</image>
<use xlink:href="#sym" id="use"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -34,6 +34,7 @@ function runTest()
var outer = doc.getElementById("outer");
var g2 = doc.getElementById("g2");
var g3 = doc.getElementById("g3");
var g4 = doc.getElementById("g4");
var sym = doc.getElementById("sym");
var symbolRect = doc.getElementById("symbolRect");
/* Tests the consistency with nearestViewportElement
@ -53,6 +54,9 @@ function runTest()
is((function(){try{return g2.getCTM().f}catch(e){return e}})(), 700, "g2.getCTM().f");
// g3.nearestViewportElement == null
is((function(){try{return g3.getCTM()}catch(e){return e}})(), null, "g3.getCTM()");
// g4.nearestViewportElement == null
is((function(){try{return g4.getCTM().e}catch(e){return e}})(), 1, "g4.getCTM().e");
is((function(){try{return g4.getCTM().f}catch(e){return e}})(), 2, "g4.getCTM().f");
// symbolRect.nearestViewportElement == sym
is((function(){try{return symbolRect.getCTM().e}catch(e){return e}})(), 70, "symbolRect.getCTM().e");
is((function(){try{return symbolRect.getCTM().f}catch(e){return e}})(), 80, "symbolRect.getCTM().f");

View File

@ -235,6 +235,13 @@ GetWindows(const PRUint64& aId, nsGlobalWindow*& aWindow, void* aClosure)
return PL_DHASH_NEXT;
}
NS_IMETHODIMP
nsDOMMemoryMultiReporter::GetName(nsACString &aName)
{
aName.AssignLiteral("dom+style");
return NS_OK;
}
NS_IMETHODIMP
nsDOMMemoryMultiReporter::CollectReports(nsIMemoryMultiReporterCallback* aCb,
nsISupports* aClosure)

View File

@ -40,6 +40,7 @@ function testSteps()
request.onsuccess = function(event) {
is(stepNumber, 1, "This callback came first");
stepNumber++;
event.target.transaction.oncomplete = grabEventAndContinueHandler;
}
request = db.transaction(["foo"], READ_WRITE)
@ -49,6 +50,7 @@ function testSteps()
request.onsuccess = function(event) {
is(stepNumber, 2, "This callback came second");
stepNumber++;
event.target.transaction.oncomplete = grabEventAndContinueHandler;
}
request = db.transaction(["foo", "bar"], READ_WRITE)
@ -58,6 +60,7 @@ function testSteps()
request.onsuccess = function(event) {
is(stepNumber, 3, "This callback came third");
stepNumber++;
event.target.transaction.oncomplete = grabEventAndContinueHandler;
}
request = db.transaction(["foo", "bar"], READ_WRITE)
@ -67,6 +70,7 @@ function testSteps()
request.onsuccess = function(event) {
is(stepNumber, 4, "This callback came fourth");
stepNumber++;
event.target.transaction.oncomplete = grabEventAndContinueHandler;
}
request = db.transaction(["bar"], READ_WRITE)
@ -80,7 +84,7 @@ function testSteps()
}
stepNumber++;
yield;
yield; yield; yield; yield; yield;
is(stepNumber, 6, "All callbacks received");
}

View File

@ -1,38 +1,11 @@
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is Telephony.
#
# The Initial Developer of the Original Code is
# The Mozilla Foundation.
# Portions created by the Initial Developer are Copyright (C) 2011
# the Initial Developer. All Rights Reserved.
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/. */#
#
# Contributor(s):
# Ben Turner <bent.mozilla@gmail.com> (Original Author)
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ../../..

View File

@ -228,6 +228,12 @@ public:
return NS_OK;
}
NS_IMETHOD GetName(nsACString &aName)
{
aName.AssignLiteral("workers");
return NS_OK;
}
NS_IMETHOD
CollectReports(nsIMemoryMultiReporterCallback* aCallback,
nsISupports* aClosure)

View File

@ -981,7 +981,8 @@ public:
static already_AddRefed<GLContextEGL>
CreateEGLPBufferOffscreenContext(const gfxIntSize& aSize,
const ContextFormat& aFormat);
const ContextFormat& aFormat,
bool bufferUnused = false);
void SetOffscreenSize(const gfxIntSize &aRequestedSize,
const gfxIntSize &aActualSize)
@ -991,6 +992,9 @@ public:
}
void *GetD3DShareHandle() {
if (!mPBufferCanBindToTexture)
return nsnull;
if (!sEGLLibrary.HasANGLESurfaceD3DTexture2DShareHandle()) {
return nsnull;
}
@ -2062,7 +2066,8 @@ FillPBufferAttribs(nsTArray<EGLint>& aAttrs,
already_AddRefed<GLContextEGL>
GLContextEGL::CreateEGLPBufferOffscreenContext(const gfxIntSize& aSize,
const ContextFormat& aFormat)
const ContextFormat& aFormat,
bool bufferUnused)
{
EGLConfig config;
EGLSurface surface;
@ -2139,9 +2144,11 @@ TRY_ATTRIBS_AGAIN:
sEGLLibrary.fBindAPI(LOCAL_EGL_OPENGL_ES_API);
GLContextEGL* shareContext = GetGlobalContextEGL();
context = sEGLLibrary.fCreateContext(EGL_DISPLAY(),
config,
EGL_NO_CONTEXT,
shareContext ? shareContext->mContext
: EGL_NO_CONTEXT,
sEGLLibrary.HasRobustness() ? gContextAttribsRobustness
: gContextAttribs);
if (!context) {
@ -2150,7 +2157,7 @@ TRY_ATTRIBS_AGAIN:
return nsnull;
}
nsRefPtr<GLContextEGL> glContext = new GLContextEGL(aFormat, nsnull,
nsRefPtr<GLContextEGL> glContext = new GLContextEGL(aFormat, shareContext,
config, surface, context,
true);
@ -2158,9 +2165,11 @@ TRY_ATTRIBS_AGAIN:
return nsnull;
}
glContext->SetOffscreenSize(aSize, pbsize);
glContext->mIsPBuffer = true;
glContext->mPBufferCanBindToTexture = configCanBindToTexture;
if (!bufferUnused) {
glContext->SetOffscreenSize(aSize, pbsize);
glContext->mIsPBuffer = true;
glContext->mPBufferCanBindToTexture = configCanBindToTexture;
}
return glContext.forget();
}
@ -2321,12 +2330,12 @@ GLContextProviderEGL::CreateOffscreen(const gfxIntSize& aSize,
#if defined(ANDROID) || defined(XP_WIN)
nsRefPtr<GLContextEGL> glContext =
GLContextEGL::CreateEGLPBufferOffscreenContext(aSize, aFormat);
GLContextEGL::CreateEGLPBufferOffscreenContext(gfxIntSize(16, 16), aFormat, true);
if (!glContext)
return nsnull;
if (!glContext->ResizeOffscreenFBO(glContext->OffscreenActualSize(), false))
if (!glContext->ResizeOffscreenFBO(aSize, true))
return nsnull;
return glContext.forget();
@ -2408,10 +2417,12 @@ GLContextProviderEGL::GetGlobalContext()
static bool triedToCreateContext = false;
if (!triedToCreateContext && !gGlobalContext) {
triedToCreateContext = true;
gGlobalContext =
GLContextEGL::CreateEGLPixmapOffscreenContext(gfxIntSize(16, 16),
ContextFormat(ContextFormat::BasicRGB24),
false);
// Don't assign directly to gGlobalContext here, because
// CreateOffscreen can call us re-entrantly.
nsRefPtr<GLContext> ctx =
GLContextProviderEGL::CreateOffscreen(gfxIntSize(16, 16),
ContextFormat(ContextFormat::BasicRGB24));
gGlobalContext = ctx;
if (gGlobalContext)
gGlobalContext->SetIsGlobalSharedContext(true);
}

View File

@ -178,7 +178,16 @@ typedef enum
/* Unicode-6.0 additions */
HB_SCRIPT_BATAK, /* Batk */
HB_SCRIPT_BRAHMI, /* Brah */
HB_SCRIPT_MANDAIC /* Mand */
HB_SCRIPT_MANDAIC, /* Mand */
/* Unicode-6.1 additions */
HB_SCRIPT_CHAKMA, /* Cakm */
HB_SCRIPT_MEROITIC_CURSIVE, /* Merc */
HB_SCRIPT_MEROITIC_HIEROGLYPHS, /* Mero */
HB_SCRIPT_MIAO, /* Plrd */
HB_SCRIPT_SHARADA, /* Shrd */
HB_SCRIPT_SORA_SOMPENG, /* Sora */
HB_SCRIPT_TAKRI /* Takr */
} hb_script_t;

View File

@ -132,7 +132,7 @@ ImageLayerD3D10::RenderLayer()
}
if (!cairoImage->GetBackendData(LayerManager::LAYERS_D3D10)) {
nsAutoPtr<CairoD3D10BackendData> dat = new CairoD3D10BackendData();
nsAutoPtr<CairoD3D10BackendData> dat(new CairoD3D10BackendData());
dat->mTexture = SurfaceToTexture(device(), cairoImage->mSurface, cairoImage->mSize);
if (dat->mTexture) {
@ -276,8 +276,8 @@ ImageLayerD3D10::RenderLayer()
void ImageLayerD3D10::AllocateTexturesYCbCr(PlanarYCbCrImage *aImage)
{
nsAutoPtr<PlanarYCbCrD3D10BackendData> backendData =
new PlanarYCbCrD3D10BackendData;
nsAutoPtr<PlanarYCbCrD3D10BackendData> backendData(
new PlanarYCbCrD3D10BackendData);
PlanarYCbCrImage::Data &data = aImage->mData;

View File

@ -141,8 +141,8 @@ static void AllocateTexturesYCbCr(PlanarYCbCrImage *aImage,
IDirect3DDevice9 *aDevice,
LayerManagerD3D9 *aManager)
{
nsAutoPtr<PlanarYCbCrD3D9BackendData> backendData =
new PlanarYCbCrD3D9BackendData;
nsAutoPtr<PlanarYCbCrD3D9BackendData> backendData(
new PlanarYCbCrD3D9BackendData);
PlanarYCbCrImage::Data &data = aImage->mData;
@ -323,7 +323,7 @@ ImageLayerD3D9::RenderLayer()
}
if (!cairoImage->GetBackendData(LayerManager::LAYERS_D3D9)) {
nsAutoPtr<CairoD3D9BackendData> dat = new CairoD3D9BackendData();
nsAutoPtr<CairoD3D9BackendData> dat(new CairoD3D9BackendData());
dat->mTexture = SurfaceToTexture(device(), cairoImage->mSurface, cairoImage->mSize);
if (dat->mTexture) {

View File

@ -367,6 +367,16 @@ gfxPlatform::Shutdown()
}
mozilla::gl::GLContextProvider::Shutdown();
mozilla::gl::GLContextProviderOSMesa::Shutdown();
#if defined(XP_WIN)
// The above shutdown call shuts down the default context provider for the
// platform. Windows is a "special snowflake", though, and has three context
// providers available, so we have to shut all of them down.
// We should only support one GL provider on Windows; then, this could go
// away. We currently support WGL for WebGL on Optimus.
mozilla::gl::GLContextProviderEGL::Shutdown();
#endif
delete gPlatform;
gPlatform = nsnull;

View File

@ -40,7 +40,7 @@
* ***** END LICENSE BLOCK ***** */
/*
* Created on Wed Jan 11 23:35:54 2012.
* Created on Sun Feb 5 20:41:21 2012.
*
* * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * *
*/
@ -50,14 +50,14 @@
static const PRUint8 sScriptPlanes[16] = {1,2,3,3,3,3,3,3,3,3,3,3,3,4,3,3};
static const PRUint16 sScriptPages[5][1024] = {
{0,1,2,3,4,4,4,4,4,4,5,6,7,8,9,10,11,11,12,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,56,57,58,59,59,59,59,60,61,62,63,64,65,66,67,68,68,68,68,68,68,68,68,68,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,27,86,87,88,89,90,91,27,92,93,94,95,96,4,4,4,4,97,98,99,100,101,102,103,104,105,106,107,0,0,0,0,0,0,0,0,108,109,110,0,0,0,0,0,0,0,0,0,0,111,0,0,112,113,113,113,113,0,0,0,0,0,0,0,0,0,114,27,27,115,116,117,118,119,120,121,122,123,27,124,125,126,126,126,127,128,129,130,131,132,59,133,134,135,136,0,137,138,139,0,0,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,140,0,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,143,144,145,145,145,145,146,147,148,149,150,4,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,27,27,166,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,167,168,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,126,126,126,126,169,169,126,170,171,172,19,173,19,19,19,19,174,175,176,177,178,179,19,180,181,182,183,184},
{185,186,187,188,189,190,191,192,27,27,193,194,195,196,197,198,199,200,201,27,27,27,27,27,27,27,27,27,27,27,27,27,202,203,27,27,204,27,27,27,205,206,27,27,207,208,27,27,209,210,27,27,27,27,27,27,27,211,27,27,27,27,27,27,212,213,214,215,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,216,216,216,216,216,216,216,216,216,216,216,216,216,217,27,27,216,218,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,220,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,221,221,221,221,221,221,221,221,222,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,223,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,0,0,0,224,225,226,227,228,190,229,27,27,0,230,27,27,0,231,232,233,234,235,0,0,0,0,236,0,0,0,0,237,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,238,0,239,240,241,242,243,244,245,246,27,27,247,248,249,250,251,252,0,253,254,255,27,256,257,258,0,259,0,108,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27},
{126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,260,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,261,126,126,126,262,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,126,126,126,126,126,126,126,126,262,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27},
{27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27},
{263,0,27,27,7,7,7,264,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27}
{0,1,2,3,4,4,4,4,4,4,5,6,7,8,9,10,11,11,12,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,57,58,59,60,60,60,60,61,62,63,64,65,66,67,68,69,69,69,69,69,69,69,69,69,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,87,94,95,96,97,98,4,4,4,4,99,100,101,102,103,104,105,106,107,108,109,0,0,0,0,0,0,0,0,110,111,112,0,0,0,0,0,0,0,0,0,0,113,0,0,0,114,114,114,114,0,0,0,0,0,0,0,0,0,115,87,87,116,117,118,119,120,121,122,123,124,87,125,126,127,127,127,128,129,130,131,132,133,60,134,135,136,137,0,138,139,140,0,0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,141,0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,142,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,144,145,146,146,146,146,147,11,148,149,150,4,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,87,87,166,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,167,168,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,127,127,127,127,127,169,127,170,171,172,19,173,19,19,19,19,174,175,176,177,178,179,19,180,181,182,183,184},
{185,186,187,188,189,190,191,192,87,87,193,194,195,196,197,198,199,200,201,87,87,87,87,87,87,87,87,87,87,87,87,87,202,203,87,87,204,87,205,87,206,207,87,87,208,209,87,87,210,211,87,87,87,87,87,87,87,212,87,87,87,87,87,87,213,214,215,216,217,218,219,220,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,221,222,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,223,223,223,223,223,223,223,223,223,223,223,223,223,224,87,87,223,225,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,226,227,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,228,228,228,228,228,228,228,228,229,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,230,231,232,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,233,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,0,0,0,234,235,236,237,238,190,239,87,87,0,240,87,87,0,241,242,243,244,245,0,0,0,0,246,0,0,0,0,247,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,248,249,250,251,87,87,87,87,252,0,253,254,255,252,256,257,258,259,87,87,260,261,262,263,264,265,0,266,267,268,87,269,0,270,0,271,0,110,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87},
{127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,272,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,273,127,127,127,274,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,127,127,127,127,127,127,127,127,274,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87},
{87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87},
{275,0,87,87,7,7,7,276,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87}
};
static const PRUint8 sScriptValues[265][64] = {
static const PRUint8 sScriptValues[277][64] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0},
@ -73,9 +73,9 @@ static const PRUint8 sScriptValues[265][64] = {
{8,8,8,8,8,1,1,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8},
{8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,61,61,61,61,61,61,61,61,61,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
{3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,61,61,3,3,3,3,3,3,3,61,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3},
{3,3,3,3,3,3,3,3,61,0,3,61,61,61,61,61,61,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19},
{3,3,3,3,3,3,3,3,61,0,3,61,61,61,61,3,61,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19},
{19,19,19,19,19,19,19,19,61,61,61,61,61,61,61,61,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,61,61,61,61,61,19,19,19,19,19,61,61,61,61,61,61,61,61,61,61,61},
{2,2,2,2,61,61,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,61,61,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,61,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,61,61,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{0,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
@ -85,15 +85,16 @@ static const PRUint8 sScriptValues[265][64] = {
{66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,61,61,61,61,61},
{90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,61,61,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,61},
{95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,61,61,95,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,61,2,2,2,2,2,2,2,2,2,2,2,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61},
{10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10},
{10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,10,10,10,10,0,10,10,10,10,10,10,10,61,10,10,10,10,10,10,10},
{10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,61,10,10,10,10,10,10,10},
{61,4,4,4,61,4,4,4,4,4,4,4,4,61,61,4,4,61,61,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,61,4,4,4,4,4,4,4,61,4,61,61,61,4,4,4,4,61,61,4,4,4,4},
{4,4,4,4,4,61,61,4,4,61,61,4,4,4,4,61,61,61,61,61,61,61,61,4,61,61,61,61,4,4,61,4,4,4,4,4,61,61,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,61,61,61,61},
{61,16,16,16,61,16,16,16,16,16,16,61,61,61,61,16,16,61,61,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,61,16,16,16,16,16,16,16,61,16,16,61,16,16,61,16,16,61,61,16,61,16,16},
{16,16,16,61,61,61,61,16,16,61,61,16,16,16,61,61,61,16,61,61,61,61,61,61,61,16,16,16,16,61,16,61,61,61,61,61,61,61,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,61,61,61,61,61,61,61,61,61,61},
{61,15,15,15,61,15,15,15,15,15,15,15,15,15,61,15,15,15,61,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,61,15,15,15,15,15,15,15,61,15,15,61,15,15,15,15,15,61,61,15,15,15,15},
{15,15,15,15,15,15,61,15,15,15,61,15,15,15,61,61,15,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,15,15,15,15,61,61,15,15,15,15,15,15,15,15,15,15,61,15,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{15,15,15,15,15,15,61,15,15,15,61,15,15,15,61,61,15,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,15,15,15,15,61,61,15,15,15,15,15,15,15,15,15,15,15,15,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,31,31,31,61,31,31,31,31,31,31,31,31,61,61,31,31,61,61,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,61,31,31,31,31,31,31,31,61,31,31,61,31,31,31,31,31,61,61,31,31,31,31},
{31,31,31,31,31,61,61,31,31,61,61,31,31,31,61,61,61,61,61,61,61,61,31,31,61,61,61,61,31,31,61,31,31,31,31,31,61,61,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,61,61,61,61,61,61,61,61},
{61,61,35,35,61,35,35,35,35,35,35,61,61,61,35,35,35,61,35,35,35,35,61,61,61,35,35,61,35,61,35,35,61,61,61,35,35,61,61,61,35,35,35,61,61,61,35,35,35,35,35,35,35,35,35,35,35,35,61,61,61,61,35,35},
@ -109,14 +110,14 @@ static const PRUint8 sScriptValues[265][64] = {
{61,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,61,61,61,61,0},
{38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,24,24,61,24,61,61,24,24,61,24,61,61,24,61,61,61,61,61,61,24,24,24,24,61,24,24,24,24,24,24,24,61,24,24,24,61,24,61,24,61,61,24,24,61,24,24,24,24,24,24,24,24,24,24,24,24,24,61,24,24,24,61,61},
{24,24,24,24,24,61,24,61,24,24,24,24,24,24,61,61,24,24,24,24,24,24,24,24,24,24,61,61,24,24,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{24,24,24,24,24,61,24,61,24,24,24,24,24,24,61,61,24,24,24,24,24,24,24,24,24,24,61,61,24,24,24,24,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39},
{39,39,39,39,39,39,39,39,61,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,61,61,61,61,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39},
{39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,61,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,61,39,39},
{39,39,39,39,39,39,39,39,39,39,39,39,39,61,39,39,39,39,39,39,39,0,0,0,0,39,39,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28},
{28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12},
{12,12,12,12,12,12,61,61,61,61,61,61,61,61,61,61,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,12,61,61,61},
{12,12,12,12,12,12,61,12,61,61,61,61,61,12,61,61,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,12,12,12,12},
{18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18},
{11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11},
{11,11,11,11,11,11,11,11,11,61,11,11,11,11,61,61,11,11,11,11,11,11,11,61,11,61,11,11,11,11,61,61,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11},
@ -144,13 +145,14 @@ static const PRUint8 sScriptValues[265][64] = {
{55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,61,61,55,55,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91},
{91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,61,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,61,61,91},
{91,91,91,91,91,91,91,91,91,91,61,61,61,61,61,61,91,91,91,91,91,91,91,91,91,91,61,61,61,61,61,61,91,91,91,91,91,91,91,91,91,91,91,91,91,91,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62},
{62,62,62,62,62,62,62,62,62,62,62,62,61,61,61,61,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,61,61,61},
{70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,61,61,61,70,70,70,70,70,70,70,70,70,70,70,70,61,61,61,61,61,61},
{70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70},
{93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,93,61,61,61,61,61,61,61,61,93,93,93,93},
{68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,68,61,61,61,68,68,68,68,68},
{68,68,68,68,68,68,68,68,68,68,61,61,61,68,68,68,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61},
{70,70,70,70,70,70,70,70,61,61,61,61,61,61,61,61,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,61,61,61,61,61,61,61,61,61},
{25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,14,14,14,14,14,8,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25},
{25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,14,14,14,14,14,25,25,25,25,14,14,14,14,14,25,25,25,25,25,25,25,25,25,25,25,25,25,8,25,25,25,25,25,25,25},
{25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,14},
@ -170,18 +172,17 @@ static const PRUint8 sScriptValues[265][64] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,61,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46},
{0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,61,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56},
{56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,61,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25},
{7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7},
{7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,61,61,61,61,61,61,61,7,7,7,7,7,7,7},
{12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,61,61,61,61,61,61,61,61,61,61,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57},
{57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,61,61,61,61,61,61,61,61,61,57,57,61,61,61,61,61,61,61,61,61,61,61,61,61,61,57},
{7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,61,61,61,61,61,7,7,7,7,7,7,7},
{12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,61,12,61,61,61,61,61,12,61,61,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57},
{57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,61,61,61,61,61,61,61,57,57,61,61,61,61,61,61,61,61,61,61,61,61,61,61,57},
{11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,61,61,61,61,61,61,61,61,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61},
{11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61},
{17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17},
{17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61},
{17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17},
@ -199,18 +200,17 @@ static const PRUint8 sScriptValues[265][64] = {
{22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22},
{22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61},
{17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},
{41,41,41,41,41,41,41,41,41,41,41,41,41,61,61,61,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41},
{41,41,41,41,41,41,41,61,61,61,61,61,61,61,61,61,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86,86},
{74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74},
{74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,61,61,61,61,61,61,61,61,8,8,8,8},
{8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,61,61,61,61,61,61,61,61,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79},
{8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,61,61,61,61,61,61,61,8,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79},
{79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,61,61,61,61,61,61,61,61},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25},
{25,25,25,25,25,25,25,25,0,0,0,25,25,25,25,61,25,25,61,61,61,61,61,61,61,61,61,61,61,61,61,61,25,25,25,25,25,25,25,25,25,25,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,25,25,25,25,25,25},
{25,25,25,25,25,25,25,25,0,0,0,25,25,25,25,61,25,25,25,25,61,61,61,61,61,61,61,61,61,61,61,61,25,25,25,25,25,25,25,25,25,25,25,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,25,25,25,25,25,25,25,25},
{58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,61,61,61,61,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61},
{65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,61,61,61,61,61,61,61,61},
{71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71},
@ -222,7 +222,7 @@ static const PRUint8 sScriptValues[265][64] = {
{72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,61,61,61,61,61,61,61,61,61},
{72,72,72,72,72,72,72,72,72,72,72,72,72,72,61,61,72,72,72,72,72,72,72,72,72,72,61,61,72,72,72,72,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,61,61,61,61},
{92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92},
{92,92,92,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,92,92,92,92,92,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{92,92,92,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,92,92,92,92,92,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,61,61,61,61,61,61,61,61,61},
{61,11,11,11,11,11,11,61,61,11,11,11,11,11,11,61,61,11,11,11,11,11,11,61,61,61,61,61,61,61,61,61,11,11,11,11,11,11,11,61,11,11,11,11,11,11,11,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,61,61,87,87,87,87,87,87,87,87,87,87,61,61,61,61,61,61},
{18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,61,61,61,61,61,61,61,61,61,61,61,61,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18},
@ -263,6 +263,7 @@ static const PRUint8 sScriptValues[265][64] = {
{47,47,47,47,47,47,61,61,47,61,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,61,47,47,61,61,61,47,61,61,47},
{81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,61,81,81,81,81,81,81,81,81,81,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,61,61,61,64,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,61,61,61,61,61,77},
{98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,61,61,61,61,61,61,97,97},
{60,60,60,60,61,60,60,61,61,61,61,61,60,60,60,60,60,60,60,60,61,60,60,60,61,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,61,61,61,61,60,60,60,61,61,61,61,60},
{60,60,60,60,60,60,60,60,61,61,61,61,61,61,61,61,60,60,60,60,60,60,60,60,60,61,61,61,61,61,61,61,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88,88},
{78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,61,61,61,78,78,78,78,78,78,78},
@ -273,7 +274,13 @@ static const PRUint8 sScriptValues[265][64] = {
{94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94},
{94,94,94,94,94,94,94,94,94,94,94,94,94,94,61,61,61,61,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85},
{85,85,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{85,85,61,61,61,61,61,61,61,61,61,61,61,61,61,61,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,61,61,61,61,61,61,61,101,101,101,101,101,101,101,101,101,101,61,61,61,61,61,61},
{96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,61,96,96,96,96,96,96,96,96,96,96},
{96,96,96,96,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100},
{100,100,100,100,100,100,100,100,100,61,61,61,61,61,61,61,100,100,100,100,100,100,100,100,100,100,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,61,61,61,61,61,61,61,61},
{102,102,102,102,102,102,102,102,102,102,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63},
{63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,61,61,61,61,61,61,61,61,61,61,61,61,61,63,63,63,63,61,61,61,61,61,61,61,61,61,61,61,61},
@ -281,6 +288,9 @@ static const PRUint8 sScriptValues[265][64] = {
{80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79},
{79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,61,61,61,61,61,61,61},
{99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99},
{99,99,99,99,99,61,61,61,61,61,61,61,61,61,61,61,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{22,20,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@ -296,11 +306,14 @@ static const PRUint8 sScriptValues[265][64] = {
{0,0,0,0,0,61,0,61,61,61,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{2,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,2,2,61,2,61,61,2,61,2,2,2,2,2,2,2,2,2,2,61,2,2,2,2,61,2,61,2,61,61,61,61},
{61,61,2,61,61,61,61,2,61,2,61,2,61,2,2,2,61,2,2,61,2,61,61,2,61,2,61,2,61,2,61,2,61,2,2,61,2,61,61,2,2,2,2,61,2,2,2,2,2,2,2,61,2,2,2,2,61,2,2,2,2,61,2,61},
{2,2,2,2,2,2,2,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,61,61,61,61,2,2,2,61,2,2,2,2,2,61,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,61,61,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,2,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61},
{61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{20,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61},
@ -313,9 +326,8 @@ static const PRUint8 sScriptValues[265][64] = {
{0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,61,61,61},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,0,0,0,0,0},
{61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,61,0,61,0,61,0,61,0,0,0,61,0,0,0,0,0,0,61,61,0,0,0,0,61,0,61,61,0,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0},
{0,61,61,61,61,0,0,0,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
{17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61},
@ -330,12 +342,12 @@ static const PRUint8 sScriptValues[265][64] = {
static const PRUint8 sCClassPlanes[16] = {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
static const PRUint8 sCClassPages[3][1024] = {
{0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,3,0,0,0,4,5,6,7,0,8,9,10,0,11,12,13,0,0,14,15,14,16,14,16,14,16,14,16,0,16,0,17,14,16,0,16,0,18,19,20,21,22,23,24,25,26,27,0,28,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,31,0,0,32,0,33,0,0,0,34,35,0,0,36,37,38,39,40,0,0,41,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,0,45,0,46,0,0,0,0,0,0,0,0,47,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,0,50,0,0,0,0,51,0,0,52,53,54,55,56,0,0,57,58,0,0,0,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,66,0,0,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,3,0,0,0,4,5,6,7,0,8,9,10,0,11,12,13,0,14,15,16,15,17,15,17,15,17,15,17,0,17,0,18,15,17,0,17,0,19,20,21,22,23,24,25,26,27,28,0,29,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,32,0,0,33,0,34,0,0,0,35,36,0,0,37,38,39,40,41,0,0,42,0,0,0,43,0,0,0,0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,46,0,47,0,0,0,0,0,0,0,0,48,0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,51,52,0,0,0,0,53,0,0,54,55,56,57,58,0,0,59,60,0,0,0,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,63,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,66,0,67,0,0,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,70,0,0,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
static const PRUint8 sCClassValues[68][64] = {
static const PRUint8 sCClassValues[72][64] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220,220,220,220,220,220,220,220,220,1,1,1,1,1,220,220,220,220,230,230,230},
{230,230,230,230,230,240,230,220,220,220,230,230,230,220,220,0,230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233,234,234,233,230,230,230,230,230,230,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@ -350,6 +362,7 @@ static const PRUint8 sCClassValues[68][64] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,220,230,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,0,230,230,230,230,230,230,230,230,230,0,230,230,230,0,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,220,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,220,230,230,220,230,230,230,220,220,220,27,28,29,230,230,230,220,230,230,220,220,230,230,230,230,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,230,220,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@ -374,10 +387,10 @@ static const PRUint8 sCClassValues[68][64] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,230,0,0,220},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,220,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,1,220,220,220,220,220,230,230,220,220,220,220,230,0,1,1,1,1,1,1,1,0,0,0,0,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,1,220,220,220,220,220,230,230,220,220,220,220,230,0,1,1,1,1,1,1,1,0,0,0,0,220,0,0,0,0,0,0,230,0,0,0,0,0,0,0,0,0,0,0},
{230,230,220,230,230,230,230,230,230,230,220,230,230,234,214,220,202,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,233,220,230,220},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,1,1,230,230,230,230,1,1,1,230,230,0,0,0,0,230,0,0,0,1,1,230,220,230,1,1,220,220,220,220,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@ -385,7 +398,8 @@ static const PRUint8 sCClassValues[68][64] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,218,228,232,222,224,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,0,0,0,0,0,0,0,0,0,0,0,0,230,230,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,0,0,0,0,230,230,230,230,230,230,230,230,230,230,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@ -394,13 +408,15 @@ static const PRUint8 sCClassValues[68][64] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0},
{9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,0,230,230,220,0,0,230,230,0,0,0,0,0,230,230},
{0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,220,0,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,1,220,0,0,0,0,9},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0},
{230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,216,1,1,1,0,0,0,226,216,216,216,216,216,0,0,0,0,0,0,0,0,220,220,220,220,220},
{220,220,220,0,0,230,230,230,230,230,220,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
@ -442,7 +458,7 @@ static const PRInt8 sMirrorValues[19][128] = {
{1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,1,-1,1,-1,0,0,0,0,0,66,0,0,0,0,0,0,0,0,0,1,-1,0,0,67,0,68,69,0,70,0,0,0,0,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,71,0,0,1,-1,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,1,-1,8,8,8,0,7,7,0,0,-8,-8,-8,-7,-7,0},
{0,0,0,0,0,0,0,0,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,1,-1,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,0,1,-1,0,2,0,-2,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,1,-1,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,3,1,-1,-3,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,1,-1,0,0,1,-1,0,0,0,0,0,0,0,0,0,1,-1,1,-1,0,1,-1,0,0,1,-1,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,0,1,-1,0,0,1,-1,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,1,-1,0,0,0,0,0,1,-1,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,1,-1,1},
{-1,1,-1,1,-1,0,0,0,0,0,0,1,-1,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,1,-1,0,0,0,1,-1,1,-1,1,-1,1,-1,0,1,-1,0,0,1,-1,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,1,-1,1,-1,1,-1,1,-1,1,-1,0,0,0,0,0,0,0,74,0,0,0,0,75,76,77,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,1,-1,1,-1,0,0,0,0,0},
@ -457,21 +473,21 @@ static const PRInt8 sMirrorValues[19][128] = {
static const PRUint8 sCatEAWPlanes[16] = {1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,6};
static const PRUint8 sCatEAWPages[7][512] = {
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,41,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,78,79,80,79,79,81,17,82,83,84,85,86,87,88,89,90,91,92,93,94,95,88,88,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,97,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,98,99,96,96,96,96,96,96,96,96,100,41,41,101,102,103,104,105,106,107,108,109,110,111,112,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,113,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,96,96,116,117,118,119,41,41,120,121,122,123,124,125},
{126,127,128,129,17,130,131,132,133,134,17,17,17,17,17,17,135,17,136,17,137,17,138,17,139,17,17,17,140,17,17,17,141,142,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,41,41,41,41,41,41,143,17,144,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,41,41,41,41,41,41,41,41,145,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,41,41,41,41,146,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,147,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,78,148,149,150,151,17,152,17,153,154,155,156,157,158,159,160,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,161,162,163,164,165,17,166,167,168,169,170,171,172,173,174,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17},
{96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,175,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,176,96,177,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,96,96,96,96,177,178,178,178,178,178,178,178,178,178,178,179},
{178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,179},
{17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17},
{180,17,181,182,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17},
{115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,183}
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,41,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,78,79,80,79,79,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,89,89,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,98,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,99,100,97,97,97,97,97,97,97,97,101,41,41,102,103,104,105,106,107,108,109,110,111,112,113,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,114,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,97,97,117,118,119,120,41,41,121,122,123,124,125,126},
{127,128,129,130,82,131,132,133,134,135,82,82,82,82,82,82,136,82,137,138,139,82,140,82,141,82,82,82,142,82,82,82,143,144,145,146,82,82,82,82,82,82,82,82,82,147,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,41,41,41,41,41,41,148,82,149,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,41,41,41,41,41,41,41,41,150,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,41,41,41,41,151,82,82,82,82,82,82,82,82,82,152,153,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,154,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,78,155,156,157,158,82,159,82,160,161,162,163,164,165,166,167,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,168,169,82,82,170,171,172,173,174,82,175,176,177,178,179,180,181,182,183,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82},
{97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,184,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,185,97,186,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,97,97,97,97,186,187,187,187,187,187,187,187,187,187,187,188},
{187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,188},
{82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82},
{189,82,190,191,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82,82},
{116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,192}
};
static const struct {
unsigned char mEAW:3;
unsigned char mCategory:5;
} sCatEAWValues[184][128] = {
} sCatEAWValues[193][128] = {
{{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{4,29},{4,21},{4,21},{4,21},{4,23},{4,21},{4,21},{4,21},{4,22},{4,18},{4,21},{4,25},{4,21},{4,17},{4,21},{4,21},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,13},{4,21},{4,21},{4,25},{4,25},{4,25},{4,21},{4,21},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,9},{4,22},{4,21},{4,18},{4,24},{4,16},{4,24},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,5},{4,22},{4,25},{4,18},{4,25},{3,0}},
{{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,29},{0,21},{4,23},{4,23},{0,23},{4,23},{4,26},{0,26},{0,24},{3,26},{0,5},{3,20},{4,25},{0,1},{0,26},{4,24},{0,26},{0,25},{0,15},{0,15},{0,24},{3,5},{0,26},{0,21},{0,24},{0,15},{0,5},{3,19},{0,15},{0,15},{0,15},{0,21},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,25},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{0,5},{0,5},{0,5},{3,5},{3,5},{3,5},{3,5},{0,5},{3,5},{0,5},{0,5},{0,5},{3,5},{0,5},{0,5},{3,5},{3,5},{0,5},{3,5},{0,5},{0,5},{3,5},{3,5},{3,5},{0,25},{0,5},{0,5},{0,5},{3,5},{0,5},{3,5},{0,5},{3,5}},
{{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,0},{3,29},{0,21},{4,23},{4,23},{0,23},{4,23},{4,26},{0,21},{0,24},{3,26},{0,7},{3,20},{4,25},{0,1},{0,26},{4,24},{0,26},{0,25},{0,15},{0,15},{0,24},{3,5},{0,21},{0,21},{0,24},{0,15},{0,7},{3,19},{0,15},{0,15},{0,15},{0,21},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,25},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{0,5},{0,5},{0,5},{3,5},{3,5},{3,5},{3,5},{0,5},{3,5},{0,5},{0,5},{0,5},{3,5},{0,5},{0,5},{3,5},{3,5},{0,5},{3,5},{0,5},{0,5},{3,5},{3,5},{3,5},{0,25},{0,5},{0,5},{0,5},{3,5},{0,5},{3,5},{0,5},{3,5}},
{{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{3,9},{3,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,5},{0,9},{0,5},{3,9},{3,5},{3,9},{3,5},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{0,9},{0,5},{3,9},{0,5},{3,9},{3,5},{3,9},{0,5},{0,5},{0,9},{0,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,9},{0,5},{3,9},{3,5},{3,9},{0,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5}},
{{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,5},{3,7},{3,9},{3,5},{3,5},{3,5},{3,7},{3,7},{3,7},{3,7},{3,9},{3,8},{3,5},{3,9},{3,8},{3,5},{3,9},{3,8},{3,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,9},{0,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,8},{3,5},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,5},{3,9},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{0,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}},
@ -481,17 +497,17 @@ static const struct {
{{3,9},{0,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,9},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{0,5},{3,5},{0,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}},
{{3,9},{3,5},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,11},{3,11},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{0,2},{3,6},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,21},{3,17},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,17},{3,12},{3,21},{3,12},{3,12},{3,21},{3,12},{3,12},{3,21},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,1},{3,1},{3,1},{3,1},{0,2},{0,2},{3,25},{3,25},{3,25},{3,21},{3,21},{3,23},{3,21},{3,21},{3,26},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{0,2},{0,2},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{3,21},{3,21},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,21},{3,17},{0,2},{0,2},{0,2},{0,2},{3,23},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,17},{3,12},{3,21},{3,12},{3,12},{3,21},{3,12},{3,12},{3,21},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,1},{3,1},{3,1},{3,1},{3,1},{0,2},{3,25},{3,25},{3,25},{3,21},{3,21},{3,23},{3,21},{3,21},{3,26},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{0,2},{0,2},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{3,21},{3,21},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,1},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,6},{3,6},{3,12},{3,12},{3,26},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,26},{3,26},{3,7}},
{{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{3,1},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,6},{3,6},{3,26},{3,21},{3,21},{3,21},{3,6},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,6},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,6},{3,12},{3,12},{3,12},{3,6},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{0,2},{0,2},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2}},
{{3,12},{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,12},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,12},{3,10},{3,10},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,21},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,6},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{0,2},{3,12},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,10},{3,10},{0,2},{0,2},{3,10},{3,10},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,10},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,23},{3,23},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,23},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{3,12},{3,12},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{0,2},{3,12},{0,2},{3,10},{3,10},{3,10},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{0,2},{0,2},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,12},{3,12},{3,7},{3,7},{3,7},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{3,12},{3,12},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,10},{0,2},{3,10},{3,10},{3,12},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{3,23},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{3,12},{3,12},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,10},{0,2},{3,10},{3,10},{3,12},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,23},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{3,12},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,7},{3,10},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,10},{3,10},{0,2},{0,2},{3,10},{3,10},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,10},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,26},{3,7},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{0,2},{3,12},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{3,12},{3,10},{3,10},{0,2},{0,2},{0,2},{3,10},{3,10},{3,10},{0,2},{3,10},{3,10},{3,10},{3,12},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,15},{3,15},{3,15},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,23},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{3,10},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{0,2},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26}},
@ -499,23 +515,23 @@ static const struct {
{{0,2},{0,2},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{0,2},{3,10},{3,10},{3,10},{0,2},{3,10},{3,10},{3,10},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{3,26},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{0,2},{0,2},{3,10},{3,10},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,12},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{0,2},{3,12},{0,2},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{3,23},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,6},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,26},{3,26},{3,26},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,26},{3,26},{3,26},{3,26},{3,26},{3,12},{3,12},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,12},{3,26},{3,12},{3,26},{3,12},{3,22},{3,18},{3,22},{3,18},{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10}},
{{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,6},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,26},{3,26},{3,26},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,26},{3,21},{3,26},{3,26},{3,26},{3,12},{3,12},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,12},{3,26},{3,12},{3,26},{3,12},{3,22},{3,18},{3,22},{3,18},{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10}},
{{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,12},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,21},{3,21},{3,21},{3,21},{3,21},{3,26},{3,26},{3,26},{3,26},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,7},{3,10},{3,10},{3,10},{3,7},{3,7},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,12},{3,10},{3,10},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,7},{3,10},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,10},{3,10},{3,10},{3,12},{3,26},{3,26},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,6},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,12},{3,10},{3,10},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,7},{3,10},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,10},{3,10},{3,10},{3,12},{3,26},{3,26},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{3,9},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,6},{3,7},{3,7},{3,7}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{5,7},{5,7},{5,7},{5,7},{5,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,12},{3,12},{3,26},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,12},{3,12},{3,12},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,17},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,29},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,22},{3,18},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,21},{3,14},{3,14},{3,14},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,1},{3,1},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,21},{3,21},{3,6},{3,21},{3,21},{3,21},{3,23},{3,7},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,21},{3,21},{3,6},{3,21},{3,21},{3,21},{3,23},{3,7},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,17},{3,21},{3,21},{3,21},{3,21},{3,12},{3,12},{3,12},{3,29},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,12},{3,12},{3,10},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{3,10},{3,10},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{3,26},{0,2},{0,2},{0,2},{3,21},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
@ -523,10 +539,10 @@ static const struct {
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,10},{3,10},{3,10},{0,2},{0,2},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,12},{3,10},{3,12},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{3,12}},
{{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,6},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,12},{3,12},{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2}},
{{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,10},{0,2},{0,2},{0,2},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,12},{3,12},{3,10},{3,10},{3,10},{3,12},{3,10},{3,12},{3,12},{3,12},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21}},
{{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,10},{3,12},{3,10},{3,10},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,12},{3,12},{3,10},{3,10},{3,10},{3,12},{3,10},{3,12},{3,12},{3,12},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,21},{3,21}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,21},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,21},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5}},
@ -547,46 +563,47 @@ static const struct {
{{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{0,26},{0,26},{0,26},{3,26},{0,26},{0,26},{0,26},{0,26},{3,26},{0,26},{0,26},{3,26},{0,25},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26}},
{{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15}},
{{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{0,2},{3,25},{0,2},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{4,22},{4,18},{4,22},{4,18},{4,22},{4,18},{4,22},{4,18},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25}},
{{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{4,22},{4,18},{4,22},{4,18},{4,22},{4,18},{4,22},{4,18},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}},
{{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25}},
{{3,25},{3,25},{3,25},{3,22},{3,18},{4,22},{4,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,22},{3,18},{3,22},{3,18},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,22},{3,18},{3,25},{3,25}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{3,26},{3,26},{3,25},{3,25},{3,25},{3,25},{3,25},{3,25},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,9},{3,9}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,9},{3,5},{3,9},{3,5},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,15},{3,21},{3,21}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,6},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,9},{3,5},{3,9},{3,9},{3,9},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,9},{3,9},{3,5},{3,9},{3,5},{3,5},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,6},{3,6},{3,9},{3,9}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,9},{3,5},{3,9},{3,5},{3,12},{3,12},{3,12},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,15},{3,21},{3,21}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{3,5},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,6},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12}},
{{3,21},{3,21},{3,20},{3,19},{3,20},{3,19},{3,21},{3,21},{3,21},{3,20},{3,19},{3,21},{3,20},{3,19},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,17},{3,21},{3,21},{3,17},{3,21},{3,20},{3,19},{3,21},{3,21},{3,20},{3,19},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,21},{3,21},{3,21},{3,21},{3,21},{3,6},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,21},{3,21},{3,20},{3,19},{3,20},{3,19},{3,21},{3,21},{3,21},{3,20},{3,19},{3,21},{3,20},{3,19},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,17},{3,21},{3,21},{3,17},{3,21},{3,20},{3,19},{3,21},{3,21},{3,20},{3,19},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,22},{3,18},{3,21},{3,21},{3,21},{3,21},{3,21},{3,6},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,17},{3,17},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26}},
{{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2}},
{{1,29},{5,21},{5,21},{5,21},{5,26},{5,6},{5,7},{5,14},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,26},{5,26},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,17},{5,22},{5,18},{5,18},{5,26},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,12},{5,12},{5,12},{5,12},{5,12},{5,12},{5,17},{5,6},{5,6},{5,6},{5,6},{5,6},{5,26},{5,26},{5,14},{5,14},{5,14},{5,6},{5,7},{5,21},{5,26},{3,26},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}},
{{1,29},{5,21},{5,21},{5,21},{5,26},{5,6},{5,7},{5,14},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,26},{5,26},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,22},{5,18},{5,17},{5,22},{5,18},{5,18},{5,26},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,14},{5,12},{5,12},{5,12},{5,12},{5,10},{5,10},{5,17},{5,6},{5,6},{5,6},{5,6},{5,6},{5,26},{5,26},{5,14},{5,14},{5,14},{5,6},{5,7},{5,21},{5,26},{3,26},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{5,12},{5,12},{5,24},{5,24},{5,6},{5,6},{5,7},{5,17},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,21},{5,6},{5,6},{5,6},{5,7}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{5,26},{5,26},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}},
{{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{5,26},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26}},
{{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{5,26},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26}},
{{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,15},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,6},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,21},{3,21}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,21},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,7},{3,12},{3,11},{3,11},{3,11},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,21},{3,6}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,12},{3,12},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,21},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,7},{3,12},{3,11},{3,11},{3,11},{3,21},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,6}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,12},{3,12},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,24},{3,24},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,6},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,9},{3,5}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,6},{3,24},{3,24},{3,9},{3,5},{3,9},{3,5},{0,2},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,5},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,6},{3,24},{3,24},{3,9},{3,5},{3,9},{3,5},{0,2},{3,9},{3,5},{3,9},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{3,5},{3,9},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,6},{3,6},{3,5},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,12},{3,10},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,26},{3,26},{3,23},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,21},{3,7},{0,2},{0,2},{0,2},{0,2}},
{{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2}},
{{3,12},{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,10},{3,10},{3,10},{3,10},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{3,6},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,6},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,26},{3,26},{3,26},{3,7},{3,10},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,12},{3,12},{3,12},{3,7},{3,7},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,7},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,6},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,7},{3,12},{3,12},{3,12},{3,7},{3,7},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,7},{3,12},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,6},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,12},{3,12},{3,10},{3,10},{3,21},{3,21},{3,7},{3,6},{3,6},{3,10},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,12},{3,10},{3,10},{3,12},{3,10},{3,10},{3,21},{3,10},{3,12},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{0,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{0,2},{0,2},{0,2},{0,2}},
{{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4},{3,4}},
{{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3},{0,3}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,25},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{3,24},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7}},
@ -598,7 +615,7 @@ static const struct {
{{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,6},{2,6},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{0,2},{0,2},{0,2},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{0,2},{0,2},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{0,2},{0,2},{2,7},{2,7},{2,7},{2,7},{2,7},{2,7},{0,2},{0,2},{2,7},{2,7},{2,7},{0,2},{0,2},{0,2},{1,23},{1,23},{1,25},{1,24},{1,26},{1,23},{1,23},{0,2},{2,26},{2,25},{2,25},{2,25},{2,25},{2,26},{2,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,1},{3,1},{3,1},{3,26},{0,26},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,21},{3,21},{3,26},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,15},{3,15},{3,15},{3,15},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}},
{{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,15},{3,15},{3,15},{3,15},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,12},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,14},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,14},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
@ -607,16 +624,22 @@ static const struct {
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,21},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,12},{3,12},{3,12},{0,2},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{0,2},{0,2},{0,2},{0,2},{3,12},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,15},{3,15},{3,21}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{0,2}},
{{3,10},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,15},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,21},{3,21},{3,1},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,12},{3,12},{3,21},{3,21},{3,1},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,12},{3,12},{3,12},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,12},{3,12},{3,10},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,10},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,10},{3,7},{3,7},{3,7},{3,7},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,12},{3,10},{3,12},{3,10},{3,10},{3,12},{3,12},{3,12},{3,12},{3,12},{3,12},{3,10},{3,12},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{3,14},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,21},{3,21},{3,21},{3,21},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{0,2}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,12},{3,12},{3,12},{3,12},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{3,6},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{5,7},{5,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,10},{3,10},{3,12},{3,12},{3,12},{3,26},{3,26},{3,26},{3,10},{3,10},{3,10},{3,10},{3,10},{3,10},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,1},{3,12},{3,12},{3,12},{3,12},{3,12}},
@ -631,18 +654,20 @@ static const struct {
{{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{0,2},{0,2},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5}},
{{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,9},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,25},{3,5},{3,5},{3,5},{3,5},{3,5},{3,5},{3,9},{3,5},{0,2},{0,2},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13},{3,13}},
{{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{0,2},{0,2},{0,2},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{0,2},{3,7},{3,7},{0,2},{3,7},{0,2},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{0,2}},
{{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{3,7},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,25},{3,25},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{0,2},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26}},
{{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,15},{0,2},{0,2},{0,2},{0,2},{0,2},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{0,2},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26}},
{{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}},
{{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{5,26},{5,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26}},
{{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{0,2},{3,26},{0,2},{3,26},{0,2},{3,26},{0,2},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{3,26},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2},{0,2}},
{{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,7},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2},{5,2}},

View File

@ -1,39 +1,12 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
* Jim Straus <jstraus@mozilla.com>
*
* ***** END LICENSE BLOCK ***** */
@ -344,6 +317,18 @@ void SetScreenBrightness(double brightness)
PROXY_IF_SANDBOXED(SetScreenBrightness(clamped(brightness, 0.0, 1.0)));
}
bool SetLight(LightType light, const hal::LightConfiguration& aConfig)
{
AssertMainThread();
RETURN_PROXY_IF_SANDBOXED(SetLight(light, aConfig));
}
bool GetLight(LightType light, hal::LightConfiguration* aConfig)
{
AssertMainThread();
RETURN_PROXY_IF_SANDBOXED(GetLight(light, aConfig));
}
void
EnableSensorNotifications(SensorType aSensor) {
AssertMainThread();

View File

@ -1,39 +1,12 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
* Jim Straus <jstraus@mozilla.com>
*
* ***** END LICENSE BLOCK ***** */
@ -170,6 +143,23 @@ double GetScreenBrightness();
*/
void SetScreenBrightness(double brightness);
/**
* Set the value of a light to a particular color, with a specific flash pattern.
* light specifices which light. See Hal.idl for the list of constants
* mode specifies user set or based on ambient light sensor
* flash specifies whether or how to flash the light
* flashOnMS and flashOffMS specify the pattern for XXX flash mode
* color specifies the color. If the light doesn't support color, the given color is
* transformed into a brightness, or just an on/off if that is all the light is capable of.
* returns true if successful and false if failed.
*/
bool SetLight(hal::LightType light, const hal::LightConfiguration& aConfig);
/**
* GET the value of a light returning a particular color, with a specific flash pattern.
* returns true if successful and false if failed.
*/
bool GetLight(hal::LightType light, hal::LightConfiguration* aConfig);
/**
* Register an observer for the sensor of given type.

View File

@ -1,40 +1,12 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef mozilla_HalImpl_h

82
hal/HalTypes.h Normal file
View File

@ -0,0 +1,82 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
* Contributor(s):
* Mounir Lamouri <mounir.lamouri@mozilla.com> (Original Author)
* Jim Straus <jstraus@mozilla.com>
*
* ***** END LICENSE BLOCK ***** */
#ifndef mozilla_hal_Types_h
#define mozilla_hal_Types_h
#include "IPCMessageUtils.h"
namespace mozilla {
namespace hal {
/**
* These are defined by libhardware, specifically, hardware/libhardware/include/hardware/lights.h
* in the gonk subsystem.
* If these change and are exposed to JS, make sure nsIHal.idl is updated as well.
*/
enum LightType {
eHalLightID_Backlight = 0,
eHalLightID_Keyboard = 1,
eHalLightID_Buttons = 2,
eHalLightID_Battery = 3,
eHalLightID_Notifications = 4,
eHalLightID_Attention = 5,
eHalLightID_Bluetooth = 6,
eHalLightID_Wifi = 7,
eHalLightID_Count = 8 // This should stay at the end
};
enum LightMode {
eHalLightMode_User = 0, // brightness is managed by user setting
eHalLightMode_Sensor = 1 // brightness is managed by a light sensor
};
enum FlashMode {
eHalLightFlash_None = 0,
eHalLightFlash_Timed = 1, // timed flashing. Use flashOnMS and flashOffMS for timing
eHalLightFlash_Hardware = 2 // hardware assisted flashing
};
} // namespace hal
} // namespace mozilla
namespace IPC {
/**
* Light type serializer.
*/
template <>
struct ParamTraits<mozilla::hal::LightType>
: public EnumSerializer<mozilla::hal::LightType,
mozilla::hal::eHalLightID_Backlight,
mozilla::hal::eHalLightID_Count>
{};
/**
* Light mode serializer.
*/
template <>
struct ParamTraits<mozilla::hal::LightMode>
: public EnumSerializer<mozilla::hal::LightMode,
mozilla::hal::eHalLightMode_User,
mozilla::hal::eHalLightMode_Sensor>
{};
/**
* Flash mode serializer.
*/
template <>
struct ParamTraits<mozilla::hal::FlashMode>
: public EnumSerializer<mozilla::hal::FlashMode,
mozilla::hal::eHalLightFlash_None,
mozilla::hal::eHalLightFlash_Hardware>
{};
} // namespace IPC
#endif // mozilla_hal_Types_h

View File

@ -62,6 +62,7 @@ EXPORTS_mozilla = \
HalImpl.h \
HalSandbox.h \
HalSensor.h \
HalTypes.h \
$(NULL)
CPPSRCS = \
@ -103,6 +104,10 @@ CPPSRCS += \
$(NULL)
endif
ifneq (gonk,$(MOZ_WIDGET_TOOLKIT)) #{
CPPSRCS += FallbackLights.cpp
endif #}
include $(topsrcdir)/config/config.mk
include $(topsrcdir)/ipc/chromium/chromium-config.mk
include $(topsrcdir)/config/rules.mk

View File

@ -1,39 +1,12 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
* Jim Straus <jstraus@mozilla.com>
*
* ***** END LICENSE BLOCK ***** */

View File

@ -0,0 +1,28 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* vim: sw=2 ts=8 et :
*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "Hal.h"
namespace mozilla {
namespace hal_impl {
bool
SetLight(hal::LightType light, const hal::LightConfiguration& aConfig)
{
return true;
}
bool
GetLight(hal::LightType light, hal::LightConfiguration* aConfig)
{
aConfig->light() = light;
// The rest of the fields are 0 by default, which is fine.
return true;
}
} // namespace hal_impl
} // namespace mozilla

View File

@ -1,41 +1,14 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
* Michael Wu <mwu@mozilla.com>
* Justin Lebar <justin.lebar@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
* Jim Straus <jstraus@mozilla.com>
*
* ***** END LICENSE BLOCK ***** */
@ -54,6 +27,8 @@
#include "nsIThread.h"
#include "nsIObserver.h"
#include "nsIObserverService.h"
#include "hardware/lights.h"
#include "hardware/hardware.h"
#include "hardware_legacy/vibrator.h"
#include <stdio.h>
#include <math.h>
@ -314,7 +289,6 @@ namespace {
* RAII class to help us remember to close file descriptors.
*/
const char *screenEnabledFilename = "/sys/power/state";
const char *screenBrightnessFilename = "/sys/class/leds/lcd-backlight/brightness";
template<ssize_t n>
bool ReadFromFile(const char *filename, char (&buf)[n])
@ -374,24 +348,13 @@ SetScreenEnabled(bool enabled)
double
GetScreenBrightness()
{
char buf[32];
ReadFromFile(screenBrightnessFilename, buf);
hal::LightConfiguration aConfig;
hal::LightType light = hal::eHalLightID_Backlight;
errno = 0;
unsigned long val = strtoul(buf, NULL, 10);
if (errno) {
HAL_LOG(("Cannot parse contents of %s; expected an unsigned "
"int, but contains \"%s\".",
screenBrightnessFilename, buf));
return 1;
}
if (val > 255) {
HAL_LOG(("Got out-of-range brightness %d, truncating to 1.0", val));
val = 255;
}
return val / 255.0;
hal::GetLight(light, &aConfig);
// backlight is brightness only, so using one of the RGB elements as value.
int brightness = aConfig.color() & 0xFF;
return brightness / 255.0;
}
void
@ -405,14 +368,122 @@ SetScreenBrightness(double brightness)
return;
}
// Convert the value in [0, 1] to an int between 0 and 255, then write to a
// string.
// Convert the value in [0, 1] to an int between 0 and 255 and convert to a color
// note that the high byte is FF, corresponding to the alpha channel.
int val = static_cast<int>(round(brightness * 255));
char str[4];
DebugOnly<int> numChars = snprintf(str, sizeof(str), "%d", val);
MOZ_ASSERT(numChars < static_cast<int>(sizeof(str)));
uint32_t color = (0xff<<24) + (val<<16) + (val<<8) + val;
WriteToFile(screenBrightnessFilename, str);
hal::LightConfiguration aConfig;
aConfig.mode() = hal::eHalLightMode_User;
aConfig.flash() = hal::eHalLightFlash_None;
aConfig.flashOnMS() = aConfig.flashOffMS() = 0;
aConfig.color() = color;
hal::SetLight(hal::eHalLightID_Backlight, aConfig);
}
static light_device_t* sLights[hal::eHalLightID_Count]; // will be initialized to NULL
light_device_t* GetDevice(hw_module_t* module, char const* name)
{
int err;
hw_device_t* device;
err = module->methods->open(module, name, &device);
if (err == 0) {
return (light_device_t*)device;
} else {
return NULL;
}
}
void
InitLights()
{
// assume that if backlight is NULL, nothing has been set yet
// if this is not true, the initialization will occur everytime a light is read or set!
if (!sLights[hal::eHalLightID_Backlight]) {
int err;
hw_module_t* module;
err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
if (err == 0) {
sLights[hal::eHalLightID_Backlight]
= GetDevice(module, LIGHT_ID_BACKLIGHT);
sLights[hal::eHalLightID_Keyboard]
= GetDevice(module, LIGHT_ID_KEYBOARD);
sLights[hal::eHalLightID_Buttons]
= GetDevice(module, LIGHT_ID_BUTTONS);
sLights[hal::eHalLightID_Battery]
= GetDevice(module, LIGHT_ID_BATTERY);
sLights[hal::eHalLightID_Notifications]
= GetDevice(module, LIGHT_ID_NOTIFICATIONS);
sLights[hal::eHalLightID_Attention]
= GetDevice(module, LIGHT_ID_ATTENTION);
sLights[hal::eHalLightID_Bluetooth]
= GetDevice(module, LIGHT_ID_BLUETOOTH);
sLights[hal::eHalLightID_Wifi]
= GetDevice(module, LIGHT_ID_WIFI);
}
}
}
/**
* The state last set for the lights until liblights supports
* getting the light state.
*/
static light_state_t sStoredLightState[hal::eHalLightID_Count];
bool
SetLight(hal::LightType light, const hal::LightConfiguration& aConfig)
{
light_state_t state;
InitLights();
if (light < 0 || light >= hal::eHalLightID_Count || sLights[light] == NULL) {
return false;
}
memset(&state, 0, sizeof(light_state_t));
state.color = aConfig.color();
state.flashMode = aConfig.flash();
state.flashOnMS = aConfig.flashOnMS();
state.flashOffMS = aConfig.flashOffMS();
state.brightnessMode = aConfig.mode();
sLights[light]->set_light(sLights[light], &state);
sStoredLightState[light] = state;
return true;
}
bool
GetLight(hal::LightType light, hal::LightConfiguration* aConfig)
{
light_state_t state;
#ifdef HAVEGETLIGHT
InitLights();
#endif
if (light < 0 || light >= hal::eHalLightID_Count || sLights[light] == NULL) {
return false;
}
memset(&state, 0, sizeof(light_state_t));
#ifdef HAVEGETLIGHT
sLights[light]->get_light(sLights[light], &state);
#else
state = sStoredLightState[light];
#endif
aConfig->light() = light;
aConfig->color() = state.color;
aConfig->flash() = hal::FlashMode(state.flashMode);
aConfig->flashOnMS() = state.flashOnMS;
aConfig->flashOffMS() = state.flashOffMS;
aConfig->mode() = hal::LightMode(state.brightnessMode);
return true;
}
void

View File

@ -41,8 +41,12 @@ include protocol PContent;
include protocol PBrowser;
include "nspr/prtime.h";
include "mozilla/HalSensor.h";
include "mozilla/HalTypes.h";
using PRTime;
using mozilla::hal::FlashMode;
using mozilla::hal::LightType;
using mozilla::hal::LightMode;
using mozilla::hal::SensorType;
namespace mozilla {
@ -54,6 +58,15 @@ namespace hal {
double remainingTime;
};
struct LightConfiguration {
LightType light;
LightMode mode;
FlashMode flash;
uint32_t flashOnMS;
uint32_t flashOffMS;
uint32_t color;
};
struct SensorData {
SensorType sensor;
PRTime timestamp;
@ -97,6 +110,11 @@ parent:
sync GetScreenBrightness() returns (double brightness);
SetScreenBrightness(double brightness);
sync SetLight(LightType light, LightConfiguration aConfig)
returns (bool status);
sync GetLight(LightType light)
returns (LightConfiguration aConfig, bool status);
Reboot();
PowerOff();

View File

@ -1,39 +1,12 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
* Jim Straus <jstraus@mozilla.com>
*
* ***** END LICENSE BLOCK ***** */
@ -152,6 +125,22 @@ SetScreenBrightness(double brightness)
Hal()->SendSetScreenBrightness(brightness);
}
bool
SetLight(hal::LightType light, const hal::LightConfiguration& aConfig)
{
bool status;
Hal()->SendSetLight(light, aConfig, &status);
return status;
}
bool
GetLight(hal::LightType light, hal::LightConfiguration* aConfig)
{
bool status;
Hal()->SendGetLight(light, aConfig, &status);
return status;
}
void
Reboot()
{
@ -291,6 +280,20 @@ public:
return true;
}
NS_OVERRIDE virtual bool
RecvSetLight(const LightType& aLight, const hal::LightConfiguration& aConfig, bool *status)
{
*status = hal::SetLight(aLight, aConfig);
return true;
}
NS_OVERRIDE virtual bool
RecvGetLight(const LightType& aLight, LightConfiguration* aConfig, bool* status)
{
*status = hal::GetLight(aLight, aConfig);
return true;
}
NS_OVERRIDE virtual bool
RecvReboot()
{

View File

@ -1,40 +1,12 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set sw=2 ts=8 et ft=cpp : */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Code.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
* Contributor(s):
* Chris Jones <jones.chris.g@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef mozilla_SandboxHal_h

View File

@ -106,6 +106,7 @@ static const PRUint16 gToUpper[] =
0x0260, ((0x00 << 8) | 0x00), 0xff33 ,
0x0263, ((0x00 << 8) | 0x00), 0xff31 ,
0x0265, ((0x00 << 8) | 0x00), 0xa528 ,
0x0266, ((0x00 << 8) | 0x00), 0xa544 ,
0x0268, ((0x00 << 8) | 0x00), 0xff2f ,
0x0269, ((0x00 << 8) | 0x00), 0xff2d ,
0x026b, ((0x00 << 8) | 0x00), 0x29f7 ,
@ -191,7 +192,9 @@ static const PRUint16 gToUpper[] =
0x2c73, ((0x03 << 8) | 0x03), 0xffff ,
0x2c81, ((0x62 << 8) | 0x02), 0xffff ,
0x2cec, ((0x02 << 8) | 0x02), 0xffff ,
0x2cf3, ((0x00 << 8) | 0x00), 0xffff ,
0x2d00, ((0x25 << 8) | 0x01), 0xe3a0 ,
0x2d27, ((0x06 << 8) | 0x06), 0xe3a0 ,
0xa641, ((0x2c << 8) | 0x02), 0xffff ,
0xa681, ((0x16 << 8) | 0x02), 0xffff ,
0xa723, ((0x0c << 8) | 0x02), 0xffff ,
@ -199,11 +202,12 @@ static const PRUint16 gToUpper[] =
0xa77a, ((0x02 << 8) | 0x02), 0xffff ,
0xa77f, ((0x08 << 8) | 0x02), 0xffff ,
0xa78c, ((0x05 << 8) | 0x05), 0xffff ,
0xa7a1, ((0x08 << 8) | 0x02), 0xffff ,
0xa793, ((0x0e << 8) | 0x0e), 0xffff ,
0xa7a3, ((0x06 << 8) | 0x02), 0xffff ,
0xff41, ((0x19 << 8) | 0x01), 0xffe0
};
static const PRUint32 gToUpperItems = 150;
static const PRUint32 gToUpperItems = 154;
static const PRUint16 gToLower[] =
{ /* From To Every Diff */
@ -293,6 +297,7 @@ static const PRUint16 gToLower[] =
0x04d0, ((0x56 << 8) | 0x02), 0x0001 ,
0x0531, ((0x25 << 8) | 0x01), 0x0030 ,
0x10a0, ((0x25 << 8) | 0x01), 0x1c60 ,
0x10c7, ((0x06 << 8) | 0x06), 0x1c60 ,
0x1e00, ((0x94 << 8) | 0x02), 0x0001 ,
0x1e9e, ((0x00 << 8) | 0x00), 0xe241 ,
0x1ea0, ((0x5e << 8) | 0x02), 0x0001 ,
@ -340,6 +345,7 @@ static const PRUint16 gToLower[] =
0x2c7e, ((0x01 << 8) | 0x01), 0xd5c1 ,
0x2c80, ((0x62 << 8) | 0x02), 0x0001 ,
0x2ceb, ((0x02 << 8) | 0x02), 0x0001 ,
0x2cf2, ((0x00 << 8) | 0x00), 0x0001 ,
0xa640, ((0x2c << 8) | 0x02), 0x0001 ,
0xa680, ((0x16 << 8) | 0x02), 0x0001 ,
0xa722, ((0x0c << 8) | 0x02), 0x0001 ,
@ -349,12 +355,13 @@ static const PRUint16 gToLower[] =
0xa77e, ((0x08 << 8) | 0x02), 0x0001 ,
0xa78b, ((0x00 << 8) | 0x00), 0x0001 ,
0xa78d, ((0x00 << 8) | 0x00), 0x5ad8 ,
0xa790, ((0x10 << 8) | 0x10), 0x0001 ,
0xa7a2, ((0x06 << 8) | 0x02), 0x0001 ,
0xa790, ((0x02 << 8) | 0x02), 0x0001 ,
0xa7a0, ((0x08 << 8) | 0x02), 0x0001 ,
0xa7aa, ((0x00 << 8) | 0x00), 0x5abc ,
0xff21, ((0x19 << 8) | 0x01), 0x0020
};
static const PRUint32 gToLowerItems = 145;
static const PRUint32 gToLowerItems = 148;
static const PRUint32 gCaseBlocks [8] = {
0xE001003F,

File diff suppressed because it is too large Load Diff

View File

@ -1357,6 +1357,14 @@ entity.12326=[6]
entity.12327=[7]
entity.12328=[8]
entity.12329=[9]
entity.12872=(10)
entity.12873=(20)
entity.12874=(30)
entity.12875=(40)
entity.12876=(50)
entity.12877=(60)
entity.12878=(70)
entity.12879=(80)
entity.12881=(21)
entity.12882=(22)
entity.12883=(23)
@ -1814,6 +1822,46 @@ entity.69740=6
entity.69741=7
entity.69742=8
entity.69743=9
entity.69872=0
entity.69873=1
entity.69874=2
entity.69875=3
entity.69876=4
entity.69877=5
entity.69878=6
entity.69879=7
entity.69880=8
entity.69881=9
entity.69942=0
entity.69943=1
entity.69944=2
entity.69945=3
entity.69946=4
entity.69947=5
entity.69948=6
entity.69949=7
entity.69950=8
entity.69951=9
entity.70096=0
entity.70097=1
entity.70098=2
entity.70099=3
entity.70100=4
entity.70101=5
entity.70102=6
entity.70103=7
entity.70104=8
entity.70105=9
entity.71360=0
entity.71361=1
entity.71362=2
entity.71363=3
entity.71364=4
entity.71365=5
entity.71366=6
entity.71367=7
entity.71368=8
entity.71369=9
entity.74752=[2]
entity.74753=[3]
entity.74754=[4]
@ -2671,3 +2719,5 @@ entity.127275=(C)
entity.127276=(R)
entity.127277=(CD)
entity.127278=(WZ)
entity.127338=^(MC)
entity.127339=^(MD)

View File

@ -270,6 +270,7 @@ for ($i = 0; $i <= $#ucv; $i++)
#
######################################################################
if(($ud[$i] ne $ud[$i-1]) ||
(($ucv[$i] - $ucv[$i-1]) > 255) ||
(($ufrom ne $ucv[$i-1]) && ($ulastd[$i] ne $ulastd[$i-1]))) {
$every = 0;
@ -336,6 +337,7 @@ for ($i = 0; $i <= $#lcv; $i++)
#
######################################################################
if(($ld[$i] ne $ld[$i-1]) ||
(($lcv[$i] - $lcv[$i-1]) > 255) ||
(($lfrom ne $lcv[$i-1]) && ($llastd[$i] ne $llastd[$i-1]))) {
$every = 0;

View File

@ -234,14 +234,17 @@ $planeSplit = 0x1d00;
0x10000, 0x104af,
0x10800, 0x1085f,
0x10900, 0x1093f,
0x10a00, 0x10c4f,
0x10980, 0x10c4f,
0x10e60, 0x10e7f,
0x11000, 0x110cf,
0x11000, 0x111ff,
0x11600, 0x116ff,
0x12000, 0x1247f,
0x13000, 0x1342f,
0x16800, 0x16aff,
0x16f00, 0x16fff,
0x1b000, 0x1b01f,
0x1d000, 0x1d7ff,
0x1ee00, 0x1eeff,
0x1f000, 0x1f77f,
0xe0000, 0xe007f,
0xe0100, 0xe01ef

File diff suppressed because it is too large Load Diff

View File

@ -202,16 +202,19 @@ while(<UNICODATA>) {
0x10280, 0x104ff,
0x10800, 0x1085f,
0x10900, 0x1093f,
0x10a00, 0x10a7f,
0x10980, 0x10a7f,
0x10b00, 0x10b7f,
0x10c00, 0x10c4f,
0x10e60, 0x10e7f,
0x11000, 0x110cf,
0x11000, 0x111ff,
0x11680, 0x116ff,
0x12000, 0x1247f,
0x13000, 0x1342f,
0x16800, 0x16a3f,
0x16f00, 0x16fff,
0x1b000, 0x1b00f,
0x1d000, 0x1d7ff,
0x1ee00, 0x1eeff,
0x1f000, 0x1f77f,
0x2f800, 0x2fa1f,
0xe0000, 0xe01ff
@ -252,14 +255,18 @@ for($t = 1; $t <= $tt; $t++)
#and http://www.unicode.org/Public/UNIDATA/Blocks.txt
$test = ($i << 3) + $j;
if ((($test >= 0x0590) && ($test <= 0x5FF)) ||
(($test >= 0x07C0) && ($test <= 0x8FF)) ||
(($test >= 0x07C0) && ($test <= 0x89F)) ||
(($test >= 0xFB1D) && ($test <= 0xFB4F)) ||
(($test >= 0x10800) && ($test <=0x10FFF)))
(($test >= 0x10800) && ($test <=0x10FFF)) ||
(($test >= 0x1E800) && ($test <=0x1EDFF)) ||
(($test >= 0x1EF00) && ($test <=0x1EFFF)))
{
$default = $map{"R"};
} elsif ((($test >= 0x0600) && ($test <= 0x7BF)) ||
(($test >= 0x08A0) && ($test <= 0x08FF)) ||
(($test >= 0xFB50) && ($test <= 0xFDFF)) ||
(($test >= 0xFE70) && ($test <= 0xFEFE)))
(($test >= 0xFE70) && ($test <= 0xFEFE)) ||
(($test >= 0x1EE00) && ($test <= 0x1EEFF)))
{
$default = $map{"AL"};
} else

View File

@ -278,7 +278,8 @@ typedef enum nsCharType nsCharType;
#define IS_IN_BMP_RTL_BLOCK(c) ((0x590 <= (c)) && ((c) <= 0x8ff))
#define IS_RTL_PRESENTATION_FORM(c) (((0xfb1d <= (c)) && ((c) <= 0xfdff)) || \
((0xfe70 <= (c)) && ((c) <= 0xfefc)))
#define IS_IN_SMP_RTL_BLOCK(c) ((0x10800 <= (c)) && ((c) <= 0x10fff))
#define IS_IN_SMP_RTL_BLOCK(c) (((0x10800 <= (c)) && ((c) <= 0x10fff)) || \
((0x1e800 <= (c)) && ((c) <= 0x1eFFF)))
#define UCS2_CHAR_IS_BIDI(c) ((IS_IN_BMP_RTL_BLOCK(c)) || \
(IS_RTL_PRESENTATION_FORM(c)))
#define UTF32_CHAR_IS_BIDI(c) ((IS_IN_BMP_RTL_BLOCK(c)) || \

View File

@ -4556,6 +4556,12 @@ AnalyzeNewScriptProperties(JSContext *cx, TypeObject *type, JSFunction *fun, JSO
if (op != JSOP_THIS)
continue;
/* Maintain ordering property on how 'this' is used, as described above. */
if (offset < lastThisPopped) {
*pbaseobj = NULL;
return false;
}
SSAValue thisv = SSAValue::PushedValue(offset, 0);
SSAUseChain *uses = analysis->useChain(thisv);
@ -4565,11 +4571,6 @@ AnalyzeNewScriptProperties(JSContext *cx, TypeObject *type, JSFunction *fun, JSO
return false;
}
/* Maintain ordering property on how 'this' is used, as described above. */
if (offset < lastThisPopped) {
*pbaseobj = NULL;
return false;
}
lastThisPopped = uses->offset;
/* Only handle 'this' values popped in unconditional code. */

View File

@ -1928,7 +1928,7 @@ GetPropMaybeCached(VMFrame &f, ic::PICInfo *pic, bool cached)
Value v;
if (cached) {
if (!GetPropertyOperation(f.cx, f.pc(), ObjectValue(*obj), &v))
if (!GetPropertyOperation(f.cx, f.pc(), f.regs.sp[-1], &v))
THROW();
} else {
if (!obj->getProperty(f.cx, name, &v))

View File

@ -1711,6 +1711,12 @@ class XPConnectJSCompartmentsMultiReporter : public nsIMemoryMultiReporter
public:
NS_DECL_ISUPPORTS
NS_IMETHOD GetName(nsACString &name)
{
name.AssignLiteral("js");
return NS_OK;
}
NS_IMETHOD CollectReports(nsIMemoryMultiReporterCallback *callback,
nsISupports *closure)
{

View File

@ -4944,9 +4944,8 @@ nsCSSFrameConstructor::ConstructSVGForeignObjectFrame(nsFrameConstructorState& a
innerPseudoStyle = mPresShell->StyleSet()->
ResolveAnonymousBoxStyle(nsCSSAnonBoxes::mozSVGForeignContent, styleContext);
nsIFrame* blockFrame = NS_NewBlockFrame(mPresShell, innerPseudoStyle,
NS_BLOCK_FLOAT_MGR |
NS_BLOCK_MARGIN_ROOT);
nsIFrame* blockFrame = NS_NewBlockFormattingContext(mPresShell,
innerPseudoStyle);
if (NS_UNLIKELY(!blockFrame)) {
newFrame->Destroy();
return NS_ERROR_OUT_OF_MEMORY;

View File

@ -690,6 +690,13 @@ PresShell::MemoryReporter::SizeEnumerator(PresShellPtrKey *aEntry,
NS_MEMORY_REPORTER_MALLOC_SIZEOF_FUN(GfxTextrunWordCacheMallocSizeOf, "gfx/textrun-word-cache")
NS_IMETHODIMP
PresShell::MemoryReporter::GetName(nsACString &aName)
{
aName.AssignLiteral("layout");
return NS_OK;
}
NS_IMETHODIMP
PresShell::MemoryReporter::CollectReports(nsIMemoryMultiReporterCallback* aCb,
nsISupports* aClosure)
@ -2012,7 +2019,7 @@ PresShell::InitialReflow(nscoord aWidth, nscoord aHeight)
// Restore our root scroll position now if we're getting here after EndLoad
// got called, since this is our one chance to do it. Note that we need not
// have reflowed for this to work; when the scrollframe is finally reflowed
// it'll puick up the position we store in it here.
// it'll pick up the position we store in it here.
if (!mDocumentLoading) {
RestoreRootScrollPosition();
}

View File

@ -339,6 +339,10 @@ nsObjectFrame::Init(nsIContent* aContent,
void
nsObjectFrame::DestroyFrom(nsIFrame* aDestructRoot)
{
if (mReflowCallbackPosted) {
PresContext()->PresShell()->CancelReflowCallback(this);
}
// Tell content owner of the instance to disconnect its frame.
nsCOMPtr<nsIObjectLoadingContent> objContent(do_QueryInterface(mContent));
NS_ASSERTION(objContent, "Why not an object loading content?");

View File

@ -383,10 +383,14 @@ public:
/**
* Acquires the text run for this content, if necessary.
* @param aRC the rendering context to use as a reference for creating
* the textrun, if available (if not, we'll create one which will just be slower)
* @param aBlock the block ancestor for this frame, or nsnull if unknown
* @param aLine the line that this frame is on, if any, or nsnull if unknown
* @param aWhichTextRun indicates whether to get an inflated or non-inflated
* text run
* @param aInflation the text inflation scale
* @param aReferenceContext the rendering context to use as a reference for
* creating the textrun, if available (if not, we'll create one which will
* just be slower)
* @param aLineContainer the block ancestor for this frame, or nsnull if
* unknown
* @param aFlowEndInTextRun if non-null, this returns the textrun offset of
* end of the text associated with this frame and its in-flow siblings
* @return a gfxSkipCharsIterator set up to map DOM offsets for this frame

View File

@ -3027,7 +3027,7 @@ PropertyProvider::GetHyphenationBreaks(PRUint32 aStart, PRUint32 aLength,
if (!mTextStyle->WhiteSpaceCanWrap() ||
mTextStyle->mHyphens == NS_STYLE_HYPHENS_NONE)
{
memset(aBreakBefore, false, aLength);
memset(aBreakBefore, false, aLength*sizeof(bool));
return;
}
@ -3054,7 +3054,7 @@ PropertyProvider::GetHyphenationBreaks(PRUint32 aStart, PRUint32 aLength,
mFrag->CharAt(run.GetOriginalOffset() + run.GetRunLength() - 1) == CH_SHY;
} else {
PRInt32 runOffsetInSubstring = run.GetSkippedOffset() - aStart;
memset(aBreakBefore + runOffsetInSubstring, false, run.GetRunLength());
memset(aBreakBefore + runOffsetInSubstring, false, run.GetRunLength()*sizeof(bool));
// Don't allow hyphen breaks at the start of the line
aBreakBefore[runOffsetInSubstring] = allowHyphenBreakBeforeNextChar &&
(!(mFrame->GetStateBits() & TEXT_START_OF_LINE) ||
@ -6314,7 +6314,7 @@ ClusterIterator::ClusterIterator(nsTextFrame* aTextFrame, PRInt32 aPosition,
mDirection = 0; // signal failure
return;
}
memset(mWordBreaks.Elements(), false, textLen + 1);
memset(mWordBreaks.Elements(), false, (textLen + 1)*sizeof(bool));
PRInt32 textStart;
if (aDirection > 0) {
if (aContext.IsEmpty()) {

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Test case for bug 723509.html</title>
<style type="text/css">
span.fake-first-letter {
color: lime;
background-color: olive;
}
</style>
</head>
<body>
<!-- Test characters that became "punctuation" in Unicode 6.1 -->
<p><span class="fake-first-letter">&#x00a7;S</span>ection</p>
<p><span class="fake-first-letter">&#x00b6;P</span>aragraph</p>
</body>
</html>

View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Test case for bug 723509.html</title>
<style type="text/css">
p:first-letter {
color: lime;
background-color: olive;
}
</style>
</head>
<body>
<!-- Test characters that became "punctuation" in Unicode 6.1 -->
<p>&#x00a7;Section</p>
<p>&#x00b6;Paragraph</p>
</body>
</html>

View File

@ -60,3 +60,4 @@ fails-if(!cocoaWidget) == 329069-5.html 329069-5-ref.html # bug 603710
== 484400-1.html 484400-1-ref.html
== 594303-1.html 594303-1-ref.html
fails-if(!gtk2Widget&&!Android) == 617869-1.html 617869-1-ref.html
== 723509-1.html 723509-1-ref.html

View File

@ -219,7 +219,7 @@ random-if(gtk2Widget) == objectBoundingBox-and-fePointLight-02.svg objectBoundin
== svg-in-foreignObject-02.xhtml svg-in-foreignObject-01-ref.xhtml # reuse -01-ref.xhtml
== switch-01.svg pass.svg
== suspend-01.svg about:blank
random-if(winWidget) == suspend-02.svg pass.svg # bug 724281
== suspend-02.svg pass.svg
fails == suspend-03.svg pass.svg # bug 724242
== suspend-04.svg pass.svg
== suspend-05.svg pass.svg

View File

@ -3,21 +3,26 @@
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/licenses/publicdomain/
-->
<svg xmlns="http://www.w3.org/2000/svg" class="reftest-wait" onload="f()">
<svg xmlns="http://www.w3.org/2000/svg" class="reftest-wait">
<title>Test that suspendRedraw works</title>
<!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 -->
<script>
function f() {
<script type="text/javascript">
<![CDATA[
document.addEventListener("MozReftestInvalidate", doTest, false);
// in case we're not gecko
setTimeout(doTest, 5000);
function doTest() {
var svg = document.documentElement;
svg.suspendRedraw(10000);
document.getElementById("r").setAttribute("fill", "red");
setTimeout(function() {
svg.suspendRedraw(10000);
setTimeout(function() {
document.getElementById("r").setAttribute("fill", "red");
svg.removeAttribute("class");
}, 1);
}, 1);
svg.removeAttribute("class");
}, 50);
}
]]>
</script>
<rect id="r" width="100%" height="100%" fill="lime"/>
</svg>

Before

Width:  |  Height:  |  Size: 711 B

After

Width:  |  Height:  |  Size: 827 B

View File

@ -3,25 +3,30 @@
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/licenses/publicdomain/
-->
<svg xmlns="http://www.w3.org/2000/svg" class="reftest-wait" onload="f()">
<svg xmlns="http://www.w3.org/2000/svg" class="reftest-wait">
<title>Test that suspendRedraw works</title>
<!-- https://bugzilla.mozilla.org/show_bug.cgi?id=615146 -->
<script>
function f() {
<script type="text/javascript">
<![CDATA[
document.addEventListener("MozReftestInvalidate", doTest, false);
// in case we're not gecko
setTimeout(doTest, 5000);
function doTest() {
var svg = document.documentElement;
setTimeout(function() {
svg.suspendRedraw(10000);
setTimeout(function() {
var r = document.createElementNS("http://www.w3.org/2000/svg", "rect");
r.setAttribute("width", "100%");
r.setAttribute("height", "100%");
r.setAttribute("fill", "red");
svg.appendChild(r);
svg.removeAttribute("class");
}, 1);
}, 1);
var r = document.createElementNS("http://www.w3.org/2000/svg", "rect");
r.setAttribute("width", "100%");
r.setAttribute("height", "100%");
r.setAttribute("fill", "red");
svg.appendChild(r);
svg.removeAttribute("class");
}, 50);
}
]]>
</script>
<rect width="100%" height="100%" fill="lime"/>
</svg>

Before

Width:  |  Height:  |  Size: 876 B

After

Width:  |  Height:  |  Size: 988 B

View File

@ -507,6 +507,8 @@
&#x2D23;
&#x2D24;
&#x2D25;
&#x2D27;
&#x2D2D;
&#x1E01;
&#x1E03;
&#x1E05;
@ -888,6 +890,7 @@
&#x2CE3;
&#x2CEC;
&#x2CEE;
&#x2CF3;
&#xA641;
&#xA643;
&#xA645;
@ -972,11 +975,13 @@
&#xA78C;
&#x0265;
&#xA791;
&#xA793;
&#xA7A1;
&#xA7A3;
&#xA7A5;
&#xA7A7;
&#xA7A9;
&#x0266;
&#xFF41;
&#xFF42;
&#xFF43;

View File

@ -510,6 +510,8 @@
&#x10C3;
&#x10C4;
&#x10C5;
&#x10C7;
&#x10CD;
&#x1E00;
&#x1E02;
&#x1E04;
@ -891,6 +893,7 @@
&#x2CE2;
&#x2CEB;
&#x2CED;
&#x2CF2;
&#xA640;
&#xA642;
&#xA644;
@ -975,11 +978,13 @@
&#xA78B;
&#xA78D;
&#xA790;
&#xA792;
&#xA7A0;
&#xA7A2;
&#xA7A4;
&#xA7A6;
&#xA7A8;
&#xA7AA;
&#xFF21;
&#xFF22;
&#xFF23;

View File

@ -228,6 +228,7 @@
&#x0193;x
&#x0194;x
&#xA78D;x
&#xA7AA;x
&#x0197;x
&#x0196;x
&#x2C62;x
@ -864,6 +865,7 @@
&#x2CE2;x
&#x2CEB;x
&#x2CED;x
&#x2CF2;x
&#x10A0;x
&#x10A1;x
&#x10A2;x
@ -902,6 +904,8 @@
&#x10C3;x
&#x10C4;x
&#x10C5;x
&#x10C7;x
&#x10CD;x
&#xA640;x
&#xA642;x
&#xA644;x
@ -984,6 +988,7 @@
&#xA786;x
&#xA78B;x
&#xA790;x
&#xA792;x
&#xA7A0;x
&#xA7A2;x
&#xA7A4;x

View File

@ -231,6 +231,7 @@
&#x0260;x
&#x0263;x
&#x0265;x
&#x0266;x
&#x0268;x
&#x0269;x
&#x026B;x
@ -867,6 +868,7 @@
&#x2CE3;x
&#x2CEC;x
&#x2CEE;x
&#x2CF3;x
&#x2D00;x
&#x2D01;x
&#x2D02;x
@ -905,6 +907,8 @@
&#x2D23;x
&#x2D24;x
&#x2D25;x
&#x2D27;x
&#x2D2D;x
&#xA641;x
&#xA643;x
&#xA645;x
@ -987,6 +991,7 @@
&#xA787;x
&#xA78C;x
&#xA791;x
&#xA793;x
&#xA7A1;x
&#xA7A3;x
&#xA7A5;x

View File

@ -224,6 +224,7 @@
&#x0193;
&#x0194;
&#xA78D;
&#xA7AA;
&#x0197;
&#x0196;
&#x2C62;
@ -860,6 +861,7 @@
&#x2CE2;
&#x2CEB;
&#x2CED;
&#x2CF2;
&#x10A0;
&#x10A1;
&#x10A2;
@ -898,6 +900,8 @@
&#x10C3;
&#x10C4;
&#x10C5;
&#x10C7;
&#x10CD;
&#xA640;
&#xA642;
&#xA644;
@ -980,6 +984,7 @@
&#xA786;
&#xA78B;
&#xA790;
&#xA792;
&#xA7A0;
&#xA7A2;
&#xA7A4;

View File

@ -227,6 +227,7 @@
&#x0260;
&#x0263;
&#x0265;
&#x0266;
&#x0268;
&#x0269;
&#x026B;
@ -863,6 +864,7 @@
&#x2CE3;
&#x2CEC;
&#x2CEE;
&#x2CF3;
&#x2D00;
&#x2D01;
&#x2D02;
@ -901,6 +903,8 @@
&#x2D23;
&#x2D24;
&#x2D25;
&#x2D27;
&#x2D2D;
&#xA641;
&#xA643;
&#xA645;
@ -983,6 +987,7 @@
&#xA787;
&#xA78C;
&#xA791;
&#xA793;
&#xA7A1;
&#xA7A3;
&#xA7A5;

View File

@ -43,16 +43,9 @@
margin: 0;
}
/* We must declare the image as a block element. If we stay as
an inline element, our parent LineBox will be inline too and
ignore the available height during reflow.
This is bad during printing, it means tall image frames won't know
the size of the paper and cannot break into continuations along
multiple pages. */
img {
color: #eee;
text-align: center;
display: block;
position: absolute;
margin: auto;
top: 0;
@ -61,3 +54,15 @@
left: 0;
}
}
@media print {
/* We must declare the image as a block element. If we stay as
an inline element, our parent LineBox will be inline too and
ignore the available height during reflow.
This is bad during printing, it means tall image frames won't know
the size of the paper and cannot break into continuations along
multiple pages. */
img {
display: block;
}
}

View File

@ -587,7 +587,6 @@ nsSVGForeignObjectFrame::DoReflow()
return;
// initiate a synchronous reflow here and now:
nsSize availableSpace(NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE);
nsIPresShell* presShell = presContext->PresShell();
NS_ASSERTION(presShell, "null presShell");
nsRefPtr<nsRenderingContext> renderingContext =
@ -622,7 +621,7 @@ nsSVGForeignObjectFrame::DoReflow()
// page/column breaking at that height.
NS_ASSERTION(reflowState.mComputedBorderPadding == nsMargin(0, 0, 0, 0) &&
reflowState.mComputedMargin == nsMargin(0, 0, 0, 0),
"style system should ensure that :-moz-svg-foreign content "
"style system should ensure that :-moz-svg-foreign-content "
"does not get styled");
NS_ASSERTION(reflowState.ComputedWidth() == size.width,
"reflow state made child wrong size");

View File

@ -425,9 +425,11 @@ nsSVGUtils::CoordToFloat(nsPresContext *aPresContext,
bool
nsSVGUtils::EstablishesViewport(nsIContent *aContent)
{
// Although SVG 1.1 states that <image> is an element that establishes a
// viewport, this is really only for the document it references, not
// for any child content, which is what this function is used for.
return aContent && aContent->IsSVG() &&
(aContent->Tag() == nsGkAtoms::svg ||
aContent->Tag() == nsGkAtoms::image ||
aContent->Tag() == nsGkAtoms::foreignObject ||
aContent->Tag() == nsGkAtoms::symbol);
}
@ -596,6 +598,13 @@ nsSVGUtils::InvalidateCoveredRegion(nsIFrame *aFrame)
if (aFrame->GetStateBits() & NS_STATE_SVG_NONDISPLAY_CHILD)
return;
if (aFrame->GetStateBits() & NS_STATE_SVG_REDRAW_SUSPENDED) {
aFrame->AddStateBits(NS_STATE_SVG_DIRTY);
return;
}
aFrame->RemoveStateBits(NS_STATE_SVG_DIRTY);
nsSVGOuterSVGFrame* outerSVGFrame = GetOuterSVGFrame(aFrame);
NS_ASSERTION(outerSVGFrame, "no outer svg frame");
if (outerSVGFrame) {

View File

@ -60,6 +60,7 @@ import android.view.MotionEvent;
import android.view.GestureDetector;
import android.view.ScaleGestureDetector;
import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import java.lang.Math;
import java.util.Timer;
import java.util.TimerTask;
@ -406,28 +407,42 @@ public class LayerController {
if (!mWaitForTouchListeners)
return !allowDefaultActions;
boolean createTimer = false;
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_MOVE: {
if (!inTouchSession && allowDefaultTimer == null) {
inTouchSession = true;
allowDefaultTimer = new Timer();
allowDefaultTimer.schedule(new TimerTask() {
public void run() {
post(new Runnable() {
public void run() {
preventPanning(false);
}
});
}
}, PREVENT_DEFAULT_TIMEOUT);
createTimer = true;
}
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: {
// if we still have initialTouchLocation, we haven't fired any
// touchmove events. We should start the timer to wait for preventDefault
// from touchstart. If we don't hear from it we fire mouse events
if (initialTouchLocation != null)
createTimer = true;
inTouchSession = false;
}
}
if (createTimer) {
if (allowDefaultTimer != null) {
allowDefaultTimer.cancel();
}
allowDefaultTimer = new Timer();
allowDefaultTimer.schedule(new TimerTask() {
public void run() {
post(new Runnable() {
public void run() {
preventPanning(false);
}
});
}
}, PREVENT_DEFAULT_TIMEOUT);
}
return !allowDefaultActions;
}

View File

@ -643,8 +643,18 @@ nsIOService::NewChannelFromURIWithProxyFlags(nsIURI *aURI,
NS_WARNING("failed to get protocol proxy service");
}
if (mProxyService) {
rv = mProxyService->Resolve(aProxyURI ? aProxyURI : aURI,
proxyFlags, getter_AddRefs(pi));
PRUint32 flags = 0;
if (scheme.EqualsLiteral("http") || scheme.EqualsLiteral("https"))
flags = nsIProtocolProxyService::RESOLVE_NON_BLOCKING;
rv = mProxyService->Resolve(aProxyURI ? aProxyURI : aURI, proxyFlags,
getter_AddRefs(pi));
if (rv == NS_BASE_STREAM_WOULD_BLOCK) {
// Use an UNKNOWN proxy to defer resolution and avoid blocking.
rv = mProxyService->NewProxyInfo(NS_LITERAL_CSTRING("unknown"),
NS_LITERAL_CSTRING(""),
-1, 0, 0, nsnull,
getter_AddRefs(pi));
}
if (NS_FAILED(rv))
pi = nsnull;
}

View File

@ -943,7 +943,8 @@ nsProtocolProxyService::NewProxyInfo(const nsACString &aType,
kProxyType_HTTP,
kProxyType_SOCKS,
kProxyType_SOCKS4,
kProxyType_DIRECT
kProxyType_DIRECT,
kProxyType_UNKNOWN
};
// resolve type; this allows us to avoid copying the type string into each

View File

@ -1549,11 +1549,12 @@ HttpBaseChannel::IsSafeMethod(nsHttpAtom method)
nsresult
HttpBaseChannel::SetupReplacementChannel(nsIURI *newURI,
nsIChannel *newChannel,
bool preserveMethod)
bool preserveMethod,
bool forProxy)
{
LOG(("HttpBaseChannel::SetupReplacementChannel "
"[this=%p newChannel=%p preserveMethod=%d]",
this, newChannel, preserveMethod));
"[this=%p newChannel=%p preserveMethod=%d forProxy=%d]",
this, newChannel, preserveMethod, forProxy));
PRUint32 newLoadFlags = mLoadFlags | LOAD_REPLACE;
// if the original channel was using SSL and this channel is not using
// SSL, then no need to inhibit persistent caching. however, if the
@ -1677,6 +1678,21 @@ HttpBaseChannel::SetupReplacementChannel(nsIURI *newURI,
if (timed)
timed->SetTimingEnabled(mTimingEnabled);
if (forProxy) {
// Transfer all the headers from the previous channel
// this is needed for any headers that are not covered by the code above
// or have been set separately. e.g. manually setting Referer without
// setting up mReferrer
PRUint32 count = mRequestHead.Headers().Count();
for (PRUint32 i = 0; i < count; ++i) {
nsHttpAtom header;
const char *value = mRequestHead.Headers().PeekHeaderAt(i, header);
httpChannel->SetRequestHeader(nsDependentCString(header),
nsDependentCString(value), false);
}
}
return NS_OK;
}

View File

@ -233,7 +233,8 @@ protected:
void AddCookiesToRequest();
virtual nsresult SetupReplacementChannel(nsIURI *,
nsIChannel *,
bool preserveMethod);
bool preserveMethod,
bool forProxy);
// Helper function to simplify getting notification callbacks.
template <class T>

View File

@ -756,7 +756,7 @@ HttpChannelChild::Redirect1Begin(const PRUint32& newChannelId,
bool rewriteToGET = ShouldRewriteRedirectToGET(mResponseHead->Status(),
mRequestHead.Method());
rv = SetupReplacementChannel(uri, newChannel, !rewriteToGET);
rv = SetupReplacementChannel(uri, newChannel, !rewriteToGET, false);
if (NS_FAILED(rv)) {
// Veto redirect. nsHttpChannel decides to cancel or continue.
OnRedirectVerifyCallback(rv);

View File

@ -1425,7 +1425,7 @@ nsHttpChannel::AsyncRedirectChannelToHttps()
rv = ioService->NewChannelFromURI(upgradedURI, getter_AddRefs(newChannel));
NS_ENSURE_SUCCESS(rv, rv);
rv = SetupReplacementChannel(upgradedURI, newChannel, true);
rv = SetupReplacementChannel(upgradedURI, newChannel, true, false);
NS_ENSURE_SUCCESS(rv, rv);
// Inform consumers about this fake redirect
@ -1522,7 +1522,7 @@ nsHttpChannel::AsyncDoReplaceWithProxy(nsIProxyInfo* pi)
if (NS_FAILED(rv))
return rv;
rv = SetupReplacementChannel(mURI, newChannel, true);
rv = SetupReplacementChannel(mURI, newChannel, true, true);
if (NS_FAILED(rv))
return rv;
@ -1944,7 +1944,7 @@ nsHttpChannel::ProcessFallback(bool *waitingForRedirectCallback)
rv = gHttpHandler->NewChannel(mURI, getter_AddRefs(newChannel));
NS_ENSURE_SUCCESS(rv, rv);
rv = SetupReplacementChannel(mURI, newChannel, true);
rv = SetupReplacementChannel(mURI, newChannel, true, false);
NS_ENSURE_SUCCESS(rv, rv);
// Make sure the new channel loads from the fallback key.
@ -3333,13 +3333,15 @@ nsHttpChannel::ClearBogusContentEncodingIfNeeded()
nsresult
nsHttpChannel::SetupReplacementChannel(nsIURI *newURI,
nsIChannel *newChannel,
bool preserveMethod)
bool preserveMethod,
bool forProxy)
{
LOG(("nsHttpChannel::SetupReplacementChannel "
"[this=%p newChannel=%p preserveMethod=%d]",
this, newChannel, preserveMethod));
nsresult rv = HttpBaseChannel::SetupReplacementChannel(newURI, newChannel, preserveMethod);
nsresult rv = HttpBaseChannel::SetupReplacementChannel(newURI, newChannel,
preserveMethod, forProxy);
if (NS_FAILED(rv))
return rv;
@ -3362,6 +3364,26 @@ nsHttpChannel::SetupReplacementChannel(nsIURI *newURI,
resumableChannel->ResumeAt(mStartPos, mEntityID);
}
if (forProxy) {
// Transfer the cache info to the new channel, if needed.
nsCOMPtr<nsICachingChannel> cachingChannel = do_QueryInterface(newChannel);
if (cachingChannel) {
// cacheKey is just mPostID wrapped in an nsISupportsPRUint32,
// we don't need to transfer it if it's 0.
if (mPostID) {
nsCOMPtr<nsISupports> cacheKey;
GetCacheKey(getter_AddRefs(cacheKey));
if (cacheKey) {
cachingChannel->SetCacheKey(cacheKey);
}
}
// cacheClientID, cacheForOfflineUse
cachingChannel->SetOfflineCacheClientID(mOfflineCacheClientID);
cachingChannel->SetCacheForOfflineUse(mCacheForOfflineUse);
}
}
return NS_OK;
}
@ -3484,7 +3506,7 @@ nsHttpChannel::ContinueProcessRedirectionAfterFallback(nsresult rv)
rv = ioService->NewChannelFromURI(mRedirectURI, getter_AddRefs(newChannel));
if (NS_FAILED(rv)) return rv;
rv = SetupReplacementChannel(mRedirectURI, newChannel, !rewriteToGET);
rv = SetupReplacementChannel(mRedirectURI, newChannel, !rewriteToGET, false);
if (NS_FAILED(rv)) return rv;
PRUint32 redirectFlags;

View File

@ -194,7 +194,9 @@ private:
void HandleAsyncFallback();
nsresult ContinueHandleAsyncFallback(nsresult);
nsresult PromptTempRedirect();
virtual nsresult SetupReplacementChannel(nsIURI *, nsIChannel *, bool preserveMethod);
virtual nsresult SetupReplacementChannel(nsIURI *, nsIChannel *,
bool preserveMethod,
bool forProxy);
// proxy specific methods
nsresult ProxyFailover();

View File

@ -0,0 +1,138 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Google Inc.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Jeff Muizelaar <jmuizelaar@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
do_load_httpd_js();
var ios = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
function make_channel(url) {
return ios.newChannel(url, null, null)
.QueryInterface(Components.interfaces.nsIHttpChannel);
}
var httpserv = null;
// respond with the value of the header
function responseHandler(request, response) {
response.setHeader("Content-Type", "text/plain", false);
var value = request.hasHeader("SomeHeader") ? request.getHeader("SomeHeader") : "";
response.write("SomeHeader: " + value);
}
function run_test() {
httpserv = new nsHttpServer();
httpserv.start(4444);
httpserv.registerPathHandler("/test", responseHandler);
// setup an identity so we can use the server with a different name when using
// the server as a proxy
httpserv.identity.add("http", "foo", 80);
// cache key on channel creation
var orig_key;
// setup the properties that we want to be preserved
function setup_channel(chan) {
chan.setRequestHeader("SomeHeader", "Someval", false);
// set cache key to something other than 0
orig_key = chan.QueryInterface(Ci.nsICachingChannel)
.cacheKey.QueryInterface(Ci.nsISupportsPRUint32);
orig_key.data = 0x32;
chan.QueryInterface(Ci.nsICachingChannel).cacheKey = orig_key;
}
// check that these properties are preserved
function check_response(request, data) {
// check that headers are preserved
do_check_eq(data, "SomeHeader: Someval");
// check that the cacheKey is preserved
var key = request.QueryInterface(Ci.nsICachingChannel)
.cacheKey.QueryInterface(Ci.nsISupportsPRUint32);
do_check_eq(key.data, orig_key.data);
}
function setup_noproxy() {
var chan = make_channel("http://localhost:4444/test");
setup_channel(chan);
chan.asyncOpen(new ChannelListener(test_noproxy, null), null);
}
function test_noproxy(request, data, ctx) {
check_response(request, data);
setup_with_proxy();
}
function setup_with_proxy() {
// Setup a PAC rule using the server we setup as the proxy
var pac = 'data:text/plain,' +
'function FindProxyForURL(url, host) {' +
' return "PROXY localhost:4444";' +
'}';
// Configure PAC
prefs.setIntPref("network.proxy.type", 2);
prefs.setCharPref("network.proxy.autoconfig_url", pac);
var chan = make_channel("http://foo/test");
setup_channel(chan);
chan.asyncOpen(new ChannelListener(test_with_proxy, null), null);
}
function test_with_proxy(request, data, ctx) {
check_response(request, data);
// cleanup PAC
prefs.setCharPref("network.proxy.autoconfig_url", "");
prefs.setIntPref("network.proxy.type", 0);
httpserv.stop(do_test_finished);
}
setup_noproxy();
do_test_pending();
}

View File

@ -144,6 +144,7 @@ skip-if = os == "android"
[test_protocolproxyservice.js]
[test_proxy-failover_canceled.js]
[test_proxy-failover_passing.js]
[test_proxy_preservation_bug235853.js]
[test_proxy-replace_canceled.js]
[test_proxy-replace_passing.js]
[test_range_requests.js]

View File

@ -182,6 +182,12 @@ public:
"associated with connections to this database.");
}
NS_IMETHOD GetName(nsACString &aName)
{
aName.AssignLiteral("storage-sqlite");
return NS_OK;
}
// Warning: To get a Connection's measurements requires holding its lock.
// There may be a delay getting the lock if another thread is accessing the
// Connection. This isn't very nice if CollectReports is called from the

View File

@ -42,43 +42,27 @@ const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
// Must use .href here instead of .search because "about:memory" is a
// non-standard URL.
var gVerbose = (location.href.split(/[\?,]/).indexOf("verbose") !== -1);
const gVerbose = location.href === "about:memory?verbose";
var gAddedObserver = false;
const KIND_NONHEAP = Ci.nsIMemoryReporter.KIND_NONHEAP;
const KIND_HEAP = Ci.nsIMemoryReporter.KIND_HEAP;
const KIND_OTHER = Ci.nsIMemoryReporter.KIND_OTHER;
const UNITS_BYTES = Ci.nsIMemoryReporter.UNITS_BYTES;
const UNITS_COUNT = Ci.nsIMemoryReporter.UNITS_COUNT;
const KIND_NONHEAP = Ci.nsIMemoryReporter.KIND_NONHEAP;
const KIND_HEAP = Ci.nsIMemoryReporter.KIND_HEAP;
const KIND_OTHER = Ci.nsIMemoryReporter.KIND_OTHER;
const UNITS_BYTES = Ci.nsIMemoryReporter.UNITS_BYTES;
const UNITS_COUNT = Ci.nsIMemoryReporter.UNITS_COUNT;
const UNITS_COUNT_CUMULATIVE = Ci.nsIMemoryReporter.UNITS_COUNT_CUMULATIVE;
const UNITS_PERCENTAGE = Ci.nsIMemoryReporter.UNITS_PERCENTAGE;
const UNITS_PERCENTAGE = Ci.nsIMemoryReporter.UNITS_PERCENTAGE;
const kUnknown = -1; // used for _amount if a memory reporter failed
// Paths, names and descriptions all need to be sanitized before being
// displayed, because the user has some control over them via names of
// compartments, windows, etc. Also, forward slashes in URLs in paths are
// represented with backslashes to avoid being mistaken for path separators, so
// we need to undo that as well.
function escapeAll(aStr)
{
return aStr.replace(/\&/g, '&amp;').replace(/'/g, '&#39;').
replace(/\</g, '&lt;').replace(/>/g, '&gt;').
replace(/\"/g, '&quot;');
}
function flipBackslashes(aStr)
{
return aStr.replace(/\\/g, '/');
}
// Forward slashes in URLs in paths are represented with backslashes to avoid
// being mistaken for path separators. Paths/names/descriptions where this
// hasn't been undone are prefixed with "unsafe"; the rest are prefixed with
// "safe".
function makeSafe(aUnsafeStr)
{
return escapeAll(flipBackslashes(aUnsafeStr));
return aUnsafeStr.replace(/\\/g, '/');
}
const kTreeUnsafeDescriptions = {
@ -137,7 +121,8 @@ const kTreeNames = {
'other': 'Other Measurements'
};
const kMapTreePaths = ['map/resident', 'map/pss', 'map/vsize', 'map/swap'];
const kMapTreePaths =
['smaps/resident', 'smaps/pss', 'smaps/vsize', 'smaps/swap'];
function onLoad()
{
@ -168,11 +153,6 @@ function ChildMemoryListener(aSubject, aTopic, aData)
update();
}
function $(n)
{
return document.getElementById(n);
}
function doGlobalGC()
{
Cu.forceGC();
@ -304,6 +284,11 @@ function getReportersByProcess(aMgr)
var e = aMgr.enumerateMultiReporters();
while (e.hasMoreElements()) {
var mrOrig = e.getNext().QueryInterface(Ci.nsIMemoryMultiReporter);
// Ignore the "smaps" reporters in non-verbose mode.
if (!gVerbose && mrOrig.name === "smaps") {
continue;
}
try {
mrOrig.collectReports(addReporter, null);
}
@ -315,6 +300,28 @@ function getReportersByProcess(aMgr)
return reportersByProcess;
}
function appendTextNode(aP, aText)
{
var e = document.createTextNode(aText);
aP.appendChild(e);
return e;
}
function appendElement(aP, aTagName, aClassName)
{
var e = document.createElement(aTagName);
e.className = aClassName;
aP.appendChild(e);
return e;
}
function appendElementWithText(aP, aTagName, aClassName, aText)
{
var e = appendElement(aP, aTagName, aClassName);
appendTextNode(e, aText);
return e;
}
/**
* Top-level function that does the work of generating the page.
*/
@ -322,33 +329,29 @@ function update()
{
// First, clear the page contents. Necessary because update() might be
// called more than once due to ChildMemoryListener.
var content = $("content");
content.parentNode.replaceChild(content.cloneNode(false), content);
content = $("content");
if (gVerbose)
content.parentNode.classList.add('verbose');
else
content.parentNode.classList.add('non-verbose');
var oldContent = document.getElementById("content");
var content = oldContent.cloneNode(false);
oldContent.parentNode.replaceChild(content, oldContent);
content.classList.add(gVerbose ? 'verbose' : 'non-verbose');
var mgr = Cc["@mozilla.org/memory-reporter-manager;1"].
getService(Ci.nsIMemoryReporterManager);
var text = "";
// Generate output for one process at a time. Always start with the
// Main process.
var reportersByProcess = getReportersByProcess(mgr);
var hasMozMallocUsableSize = mgr.hasMozMallocUsableSize;
text += genProcessText("Main", reportersByProcess["Main"],
hasMozMallocUsableSize);
appendProcessElements(content, "Main", reportersByProcess["Main"],
hasMozMallocUsableSize);
for (var process in reportersByProcess) {
if (process !== "Main") {
text += genProcessText(process, reportersByProcess[process],
hasMozMallocUsableSize);
appendProcessElements(content, process, reportersByProcess[process],
hasMozMallocUsableSize);
}
}
appendElement(content, "hr");
// Memory-related actions.
const UpDesc = "Re-measure.";
const GCDesc = "Do a global garbage collection.";
@ -359,36 +362,43 @@ function update()
"process to reduce memory usage in other ways, e.g. by " +
"flushing various caches.";
function appendButton(aTitle, aOnClick, aText, aId)
{
var b = appendElementWithText(content, "button", "", aText);
b.title = aTitle;
b.onclick = aOnClick
if (aId) {
b.id = aId;
}
}
// The "Update" button has an id so it can be clicked in a test.
text += "<div>" +
"<button title='" + UpDesc + "' onclick='update()' id='updateButton'>Update</button>" +
"<button title='" + GCDesc + "' onclick='doGlobalGC()'>GC</button>" +
"<button title='" + CCDesc + "' onclick='doCC()'>CC</button>" +
"<button title='" + MPDesc + "' onclick='sendHeapMinNotifications()'>" + "Minimize memory usage</button>" +
"</div>";
appendButton(UpDesc, update, "Update", "updateButton");
appendButton(GCDesc, doGlobalGC, "GC");
appendButton(CCDesc, doCC, "CC");
appendButton(MPDesc, sendHeapMinNotifications, "Minimize memory usage");
// Generate verbosity option link at the bottom.
text += "<div>";
text += gVerbose
? "<span class='option'><a href='about:memory'>Less verbose</a></span>"
: "<span class='option'><a href='about:memory?verbose'>More verbose</a></span>";
text += "</div>";
var div1 = appendElement(content, "div", "");
var a;
if (gVerbose) {
var a = appendElementWithText(div1, "a", "option", "Less verbose");
a.href = "about:memory";
} else {
var a = appendElementWithText(div1, "a", "option", "More verbose");
a.href = "about:memory?verbose";
}
text += "<div>" +
"<span class='option'><a href='about:support'>Troubleshooting information</a></span>" +
"</div>";
var div2 = appendElement(content, "div", "");
a = appendElementWithText(div2, "a", "option", "Troubleshooting information");
a.href = "about:support";
text += "<div>" +
"<span class='legend'>Click on a non-leaf node in a tree to expand ('++') " +
"or collapse ('--') its children.</span>" +
"</div>";
text += "<div>" +
"<span class='legend'>Hover the pointer over the name of a memory " +
"reporter to see a description of what it measures.</span>";
var legendText1 = "Click on a non-leaf node in a tree to expand ('++') " +
"or collapse ('--') its children.";
var legendText2 = "Hover the pointer over the name of a memory reporter " +
"to see a description of what it measures.";
var div = document.createElement("div");
div.innerHTML = text;
content.appendChild(div);
appendElementWithText(content, "div", "legend", legendText1);
appendElementWithText(content, "div", "legend", legendText2);
}
// There are two kinds of TreeNode.
@ -449,7 +459,7 @@ function buildTree(aReporters, aTreeName)
// traversal.
// There should always be at least one matching reporter when |aTreeName| is
// "explicit". But there may be zero for "map" trees; if that happens,
// "explicit". But there may be zero for "smaps" trees; if that happens,
// bail.
var foundReporter = false;
for (var unsafePath in aReporters) {
@ -548,19 +558,17 @@ function buildTree(aReporters, aTreeName)
}
/**
* Ignore all the memory reporters that belong to a tree; this involves
* Ignore all the memory reports that belong to a "smaps" tree; this involves
* explicitly marking them as done.
*
* @param aReporters
* The table of Reporters, indexed by _unsafePath.
* @param aTreeName
* The name of the tree being built.
*/
function ignoreTree(aReporters, aTreeName)
function ignoreSmapsTrees(aReporters)
{
for (var unsafePath in aReporters) {
var r = aReporters[unsafePath];
if (r.treeNameMatches(aTreeName)) {
if (r.treeNameMatches("smaps")) {
var dummy = getBytes(aReporters, unsafePath);
}
}
@ -578,7 +586,6 @@ function ignoreTree(aReporters, aTreeName)
function fixUpExplicitTree(aT, aReporters)
{
// Determine how many bytes are reported by heap reporters.
var s = "";
function getKnownHeapUsedBytes(aT)
{
var n = 0;
@ -701,64 +708,64 @@ function sortTreeAndInsertAggregateNodes(aTotalBytes, aT)
// each new process.
var gUnsafePathsWithInvalidValuesForThisProcess = [];
function genWarningText(aHasKnownHeapAllocated, aHasMozMallocUsableSize)
function appendWarningElements(aP, aHasKnownHeapAllocated,
aHasMozMallocUsableSize)
{
var warningText = "";
if (!aHasKnownHeapAllocated && !aHasMozMallocUsableSize) {
warningText =
"<p class='accuracyWarning'>WARNING: the 'heap-allocated' memory " +
"reporter and the moz_malloc_usable_size() function do not work for " +
"this platform and/or configuration. This means that " +
"'heap-unclassified' is zero and the 'explicit' tree shows " +
"much less memory than it should.</p>\n\n";
appendElementWithText(aP, "p", "",
"WARNING: the 'heap-allocated' memory reporter and the " +
"moz_malloc_usable_size() function do not work for this platform " +
"and/or configuration. This means that 'heap-unclassified' is zero " +
"and the 'explicit' tree shows much less memory than it should.");
appendTextNode(aP, "\n\n");
} else if (!aHasKnownHeapAllocated) {
warningText =
"<p class='accuracyWarning'>WARNING: the 'heap-allocated' memory " +
"reporter does not work for this platform and/or configuration. " +
"This means that 'heap-unclassified' is zero and the 'explicit' tree " +
"shows less memory than it should.</p>\n\n";
appendElementWithText(aP, "p", "",
"WARNING: the 'heap-allocated' memory reporter does not work for this " +
"platform and/or configuration. This means that 'heap-unclassified' " +
"is zero and the 'explicit' tree shows less memory than it should.");
appendTextNode(aP, "\n\n");
} else if (!aHasMozMallocUsableSize) {
warningText =
"<p class='accuracyWarning'>WARNING: the moz_malloc_usable_size() " +
"function does not work for this platform and/or configuration. " +
"This means that much of the heap-allocated memory is not measured " +
"by individual memory reporters and so will fall under " +
"'heap-unclassified'.</p>\n\n";
appendElementWithText(aP, "p", "",
"WARNING: the moz_malloc_usable_size() function does not work for " +
"this platform and/or configuration. This means that much of the " +
"heap-allocated memory is not measured by individual memory reporters " +
"and so will fall under 'heap-unclassified'.");
appendTextNode(aP, "\n\n");
}
if (gUnsafePathsWithInvalidValuesForThisProcess.length > 0) {
warningText +=
"<div class='accuracyWarning'>" +
"<p>WARNING: the following values are negative or unreasonably " +
"large.</p>\n" +
"<ul>";
var div = appendElement(aP, "div", "");
appendElementWithText(div, "p", "",
"WARNING: the following values are negative or unreasonably large.");
appendTextNode(div, "\n");
var ul = appendElement(div, "ul", "");
for (var i = 0;
i < gUnsafePathsWithInvalidValuesForThisProcess.length;
i++)
{
warningText +=
" <li>" +
makeSafe(gUnsafePathsWithInvalidValuesForThisProcess[i]) +
"</li>\n";
appendTextNode(ul, " ");
appendElementWithText(ul, "li", "",
makeSafe(gUnsafePathsWithInvalidValuesForThisProcess[i]));
appendTextNode(ul, "\n");
}
warningText +=
"</ul>" +
"<p>This indicates a defect in one or more memory reporters. The " +
appendElementWithText(div, "p", "",
"This indicates a defect in one or more memory reporters. The " +
"invalid values are highlighted, but you may need to expand one " +
"or more sub-trees to see them.</p>\n\n" +
"</div>";
"or more sub-trees to see them.");
appendTextNode(div, "\n\n");
gUnsafePathsWithInvalidValuesForThisProcess = []; // reset for the next process
}
return warningText;
}
/**
* Generates the text for a single process.
* Appends the elements for a single process.
*
* @param aP
* The parent DOM node.
* @param aProcess
* The name of the process.
* @param aReporters
@ -767,46 +774,50 @@ function genWarningText(aHasKnownHeapAllocated, aHasMozMallocUsableSize)
* Boolean indicating if moz_malloc_usable_size works.
* @return The generated text.
*/
function genProcessText(aProcess, aReporters, aHasMozMallocUsableSize)
function appendProcessElements(aP, aProcess, aReporters,
aHasMozMallocUsableSize)
{
appendElementWithText(aP, "h1", "", aProcess + " Process");
appendTextNode(aP, "\n\n"); // gives nice spacing when we cut and paste
// We'll fill this in later.
var warningsDiv = appendElement(aP, "div", "accuracyWarning");
var explicitTree = buildTree(aReporters, 'explicit');
var hasKnownHeapAllocated = fixUpExplicitTree(explicitTree, aReporters);
sortTreeAndInsertAggregateNodes(explicitTree._amount, explicitTree);
var explicitText = genTreeText(explicitTree, aProcess);
appendTreeElements(aP, explicitTree, aProcess);
// We only show these breakdown trees in verbose mode.
var mapTreeText = "";
kMapTreePaths.forEach(function(t) {
if (gVerbose) {
if (gVerbose) {
kMapTreePaths.forEach(function(t) {
var tree = buildTree(aReporters, t);
// |tree| will be null if we don't have any reporters for the given
// unsafePath.
if (tree) {
sortTreeAndInsertAggregateNodes(tree._amount, tree);
tree._hideKids = true; // map trees are always initially collapsed
mapTreeText += genTreeText(tree, aProcess);
tree._hideKids = true; // smaps trees are always initially collapsed
appendTreeElements(aP, tree, aProcess);
}
} else {
ignoreTree(aReporters, t);
}
});
});
} else {
// Although we skip the "smaps" multi-reporter in getReportersByProcess(),
// we might get some smaps reports from a child process, and they must be
// explicitly ignored.
ignoreSmapsTrees(aReporters);
}
// We have to call genOtherText after we process all the trees, because it
// looks at all the reporters which aren't part of a tree.
var otherText = genOtherText(aReporters, aProcess);
// We have to call appendOtherElements after we process all the trees,
// because it looks at all the reporters which aren't part of a tree.
var otherText = appendOtherElements(aP, aReporters, aProcess);
// Generate any warnings about inaccuracies due to platform limitations.
// This must come after generating all the text. The newlines give nice
// spacing if we cut+paste into a text buffer.
var warningText = "";
var warningText =
genWarningText(hasKnownHeapAllocated, aHasMozMallocUsableSize);
// The newlines give nice spacing if we cut+paste into a text buffer.
return "<h1>" + aProcess + " Process</h1>\n\n" +
warningText + explicitText + mapTreeText + otherText +
"<hr></hr>";
// Add any warnings about inaccuracies due to platform limitations.
// These must be computed after generating all the text. The newlines give
// nice spacing if we cut+paste into a text buffer.
var warningElements =
appendWarningElements(warningsDiv, hasKnownHeapAllocated,
aHasMozMallocUsableSize);
}
/**
@ -960,13 +971,13 @@ function getUnsafeDescription(aReporters, aUnsafePath)
const kHorizontal = "\u2500",
kVertical = "\u2502",
kUpAndRight = "\u2514",
kVerticalAndRight = "\u251c";
kVerticalAndRight = "\u251c",
kDoubleHorizontalSep = " \u2500\u2500 ";
function genMrValueText(aValue, aIsInvalid)
function appendMrValueSpan(aP, aValue, aIsInvalid)
{
return aIsInvalid ?
"<span class='mrValue invalid'>" + aValue + "</span>" :
"<span class='mrValue'>" + aValue + "</span>";
appendElementWithText(aP, "span", "mrValue" + (aIsInvalid ? " invalid" : ""),
aValue);
}
function kindToString(aKind)
@ -980,42 +991,44 @@ function kindToString(aKind)
}
}
function genMrNameText(aKind, aShowSubtrees, aHasKids, aUnsafeDesc,
aUnsafeName, aIsUnknown, aIsInvalid, aNMerged)
function appendMrNameSpan(aP, aKind, aShowSubtrees, aHasKids, aUnsafeDesc,
aUnsafeName, aIsUnknown, aIsInvalid, aNMerged)
{
var text = "";
if (aHasKids) {
if (aShowSubtrees) {
text += "<span class='mrSep hidden'> ++ </span>";
text += "<span class='mrSep'> -- </span>";
appendElementWithText(aP, "span", "mrSep hidden", " ++ ");
appendElementWithText(aP, "span", "mrSep", " -- ");
} else {
text += "<span class='mrSep'> ++ </span>";
text += "<span class='mrSep hidden'> -- </span>";
appendElementWithText(aP, "span", "mrSep", " ++ ");
appendElementWithText(aP, "span", "mrSep hidden", " -- ");
}
} else {
text += "<span class='mrSep'> " + kHorizontal + kHorizontal + " </span>";
appendElementWithText(aP, "span", "mrSep", kDoubleHorizontalSep);
}
text += "<span class='mrName' title='" +
kindToString(aKind) + makeSafe(aUnsafeDesc) + "'>" +
makeSafe(aUnsafeName) + "</span>";
var nameSpan = appendElementWithText(aP, "span", "mrName",
makeSafe(aUnsafeName));
nameSpan.title = kindToString(aKind) + makeSafe(aUnsafeDesc);
if (aIsUnknown) {
const problemDesc =
var noteSpan = appendElementWithText(aP, "span", "mrNote", " [*]");
noteSpan.title =
"Warning: this memory reporter was unable to compute a useful value. ";
text += "<span class='mrNote' title=\"" + problemDesc + "\"> [*]</span>";
}
if (aIsInvalid) {
const invalidDesc =
var noteSpan = appendElementWithText(aP, "span", "mrNote", " [?!]");
noteSpan.title =
"Warning: this value is invalid and indicates a bug in one or more " +
"memory reporters. ";
text += "<span class='mrNote' title=\"" + invalidDesc + "\"> [?!]</span>";
}
if (aNMerged) {
const dupDesc = "This value is the sum of " + aNMerged +
" memory reporters that all have the same path.";
text += "<span class='mrNote' title=\"" + dupDesc + "\"> [" +
aNMerged + "]</span>";
var noteSpan = appendElementWithText(aP, "span", "mrNote",
" [" + aNMerged + "]");
noteSpan.title =
"This value is the sum of " + aNMerged +
" memory reporters that all have the same path.";
}
return text + '\n';
}
// This is used to record the (safe) IDs of which sub-trees have been toggled,
@ -1067,23 +1080,27 @@ function toggle(aEvent)
}
/**
* Generates the text for the tree, including its heading.
* Appends the elements for the tree, including its heading.
*
* @param aPOuter
* The parent DOM node.
* @param aT
* The tree.
* @param aProcess
* The process the tree corresponds to.
* @return The generated text.
*/
function genTreeText(aT, aProcess)
function appendTreeElements(aPOuter, aT, aProcess)
{
var treeBytes = aT._amount;
var rootStringLength = aT.toString().length;
var isExplicitTree = aT._unsafeName == 'explicit';
/**
* Generates the text for a particular tree, without a heading.
* Appends the elements for a particular tree, without a heading.
*
* @param aP
* The parent DOM node.
* @param aUnsafePrePath
* The partial unsafePath leading up to this node.
* @param aT
@ -1097,7 +1114,8 @@ function genTreeText(aT, aProcess)
* The length of the formatted byte count of the top node in the tree.
* @return The generated text.
*/
function genTreeText2(aUnsafePrePath, aT, aIndentGuide, aParentStringLength)
function appendTreeElements2(aP, aUnsafePrePath, aT, aIndentGuide,
aParentStringLength)
{
function repeatStr(aC, aN)
{
@ -1111,14 +1129,14 @@ function genTreeText(aT, aProcess)
// Determine if we should show the sub-tree below this entry; this
// involves reinstating any previous toggling of the sub-tree.
var unsafePath = aUnsafePrePath + aT._unsafeName;
var safeTreeId = escapeAll(aProcess + ":" + unsafePath);
var safeTreeId = makeSafe(aProcess + ":" + unsafePath);
var showSubtrees = !aT._hideKids;
if (gTogglesBySafeTreeId[safeTreeId]) {
showSubtrees = !showSubtrees;
}
// Generate the indent.
var indent = "<span class='treeLine'>";
var indent = "";
if (aIndentGuide.length > 0) {
for (var i = 0; i < aIndentGuide.length - 1; i++) {
indent += aIndentGuide[i]._isLastKid ? " " : kVertical;
@ -1137,7 +1155,6 @@ function genTreeText(aT, aProcess)
}
aIndentGuide[aIndentGuide.length - 1]._depth += extraIndentLength;
}
indent += "</span>";
// Generate the percentage; detect and record invalid values at the same
// time.
@ -1154,13 +1171,7 @@ function genTreeText(aT, aProcess)
percText = (100 * aT._amount / treeBytes).toFixed(2);
percText = pad(percText, 5, '0');
}
percText = tIsInvalid ?
"<span class='mrPerc invalid'> (" + percText + "%)</span>" :
"<span class='mrPerc'> (" + percText + "%)</span>";
// We don't want to show '(nonheap)' on a tree like 'map/vsize', since the
// whole tree is non-heap.
var kind = isExplicitTree ? aT._kind : undefined;
percText = " (" + percText + "%)";
// For non-leaf nodes, the entire sub-tree is put within a span so it can
// be collapsed if the node is clicked on.
@ -1168,35 +1179,49 @@ function genTreeText(aT, aProcess)
if (!hasKids) {
assert(!aT._hideKids, "leaf node with _hideKids set")
}
var text = indent;
appendElementWithText(aP, "span", "treeLine", indent);
var d;
if (hasKids) {
text += "<span onclick='toggle(event)' class='hasKids' id='" +
safeTreeId + "'>";
d = appendElement(aP, "span", "hasKids");
d.id = safeTreeId;
d.onclick = toggle;
} else {
d = aP;
}
text += genMrValueText(tString, tIsInvalid) + percText;
text += genMrNameText(kind, showSubtrees, hasKids, aT._unsafeDescription,
aT._unsafeName, aT._isUnknown, tIsInvalid,
aT._nMerged);
appendMrValueSpan(d, tString, tIsInvalid);
appendElementWithText(d, "span", "mrPerc", percText);
// We don't want to show '(nonheap)' on a tree like 'map/vsize', since the
// whole tree is non-heap.
var kind = isExplicitTree ? aT._kind : undefined;
appendMrNameSpan(d, kind, showSubtrees, hasKids, aT._unsafeDescription,
aT._unsafeName, aT._isUnknown, tIsInvalid, aT._nMerged);
appendTextNode(d, "\n");
if (hasKids) {
var hiddenText = showSubtrees ? "" : " hidden";
// The 'kids' class is just used for sanity checking in toggle().
text += "</span><span class='kids" + hiddenText + "'>";
d = appendElement(aP, "span", showSubtrees ? "kids" : "kids hidden");
} else {
d = aP;
}
for (var i = 0; i < aT._kids.length; i++) {
// 3 is the standard depth, the callee adjusts it if necessary.
aIndentGuide.push({ _isLastKid: (i === aT._kids.length - 1), _depth: 3 });
text += genTreeText2(unsafePath + "/", aT._kids[i], aIndentGuide,
tString.length);
appendTreeElements2(d, unsafePath + "/", aT._kids[i], aIndentGuide,
tString.length);
aIndentGuide.pop();
}
text += hasKids ? "</span>" : "";
return text;
}
var text = genTreeText2(/* prePath = */"", aT, [], rootStringLength);
return genSectionMarkup(aT._unsafeName, text);
appendSectionHeader(aPOuter, kTreeNames[aT._unsafeName]);
var pre = appendElement(aPOuter, "pre", "tree");
appendTreeElements2(pre, /* prePath = */"", aT, [], rootStringLength);
appendTextNode(aPOuter, "\n"); // gives nice spacing when we cut and paste
}
function OtherReporter(aUnsafePath, aUnits, aAmount, aUnsafeDesc, aNMerged)
@ -1247,16 +1272,22 @@ OtherReporter.compare = function(a, b) {
};
/**
* Generates the text for the "Other Measurements" section.
* Appends the elements for the "Other Measurements" section.
*
* @param aP
* The parent DOM node.
* @param aReportersByProcess
* Table of Reporters for this process, indexed by _unsafePath.
* @param aProcess
* The process these reporters correspond to.
* @return The generated text.
*/
function genOtherText(aReportersByProcess, aProcess)
function appendOtherElements(aP, aReportersByProcess, aProcess)
{
appendSectionHeader(aP, kTreeNames['other']);
var pre = appendElement(aP, "pre", "tree");
// Generate an array of Reporter-like elements, stripping out all the
// Reporters that have already been handled. Also find the width of the
// widest element, so we can format things nicely.
@ -1286,19 +1317,20 @@ function genOtherText(aReportersByProcess, aProcess)
if (oIsInvalid) {
gUnsafePathsWithInvalidValuesForThisProcess.push(o._unsafePath);
}
text += genMrValueText(pad(o._asString, maxStringLength, ' '), oIsInvalid);
text += genMrNameText(KIND_OTHER, /* showSubtrees = */true,
/* hasKids = */false, o._unsafeDescription,
o._unsafePath, o._isUnknown, oIsInvalid);
appendMrValueSpan(pre, pad(o._asString, maxStringLength, ' '), oIsInvalid);
appendMrNameSpan(pre, KIND_OTHER, /* showSubtrees = */true,
/* hasKids = */false, o._unsafeDescription,
o._unsafePath, o._isUnknown, oIsInvalid);
appendTextNode(pre, "\n");
}
return genSectionMarkup('other', text);
appendTextNode(aP, "\n"); // gives nice spacing when we cut and paste
}
function genSectionMarkup(aName, aText)
function appendSectionHeader(aP, aText)
{
return "<h2 class='sectionHeader'>" + kTreeNames[aName] + "</h2>\n" +
"<pre class='tree'>" + aText + "</pre>\n";
appendElementWithText(aP, "h2", "sectionHeader", aText);
appendTextNode(aP, "\n");
}
function assert(aCond, aMsg)
@ -1310,8 +1342,6 @@ function assert(aCond, aMsg)
function debug(x)
{
var content = $("content");
var div = document.createElement("div");
div.innerHTML = JSON.stringify(x);
content.appendChild(div);
var content = document.getElementById("content");
appendElementWithText(content, "div", "legend", JSON.stringify(x));
}

View File

@ -45,7 +45,5 @@
<script type="text/javascript" src="chrome://global/content/aboutMemory.js"/>
</head>
<!-- No newline before the div element! This avoids extraneous spaces when
pasting the entire output after selecting it with Ctrl-a. -->
<body onload="onLoad()" onunload="onUnload()"><div id="content"></div></body>
<body id="content" onload="onLoad()" onunload="onUnload()"></body>
</html>

View File

@ -92,7 +92,8 @@
f2("", "other4", OTHER, COUNT_CUMULATIVE, 888)
];
var fakeMultiReporters = [
{ collectReports: function(cbObj, closure) {
{ name: "fake1",
collectReports: function(cbObj, closure) {
function f(p, k, u, a) { cbObj.callback("", p, k, u, a, "(desc)", closure); }
f("explicit/c/d", NONHEAP, BYTES, 13 * MB),
f("explicit/c/d", NONHEAP, BYTES, 10 * MB), // dup
@ -105,7 +106,8 @@
},
explicitNonHeap: (100 + 13 + 10)*MB + (499 + 100)*KB
},
{ collectReports: function(cbObj, closure) {
{ name: "fake2",
collectReports: function(cbObj, closure) {
function f(p, k, u, a) { cbObj.callback("", p, k, u, a, "(desc)", closure); }
f("other3", OTHER, COUNT, 777);
f("other2", OTHER, BYTES, 222 * MB);
@ -114,16 +116,17 @@
},
explicitNonHeap: 0
},
{ collectReports: function(cbObj, closure) {
{ name: "smaps",
collectReports: function(cbObj, closure) {
// The amounts are given in pages, so multiply here by 4kb.
function f(p, a) { cbObj.callback("", p, NONHEAP, BYTES, a * 4 * KB, "(desc)", closure); }
f("map/vsize/a", 24);
f("map/swap/a", 1);
f("map/swap/a", 2);
f("map/vsize/a", 19);
f("map/swap/b/c", 10);
f("map/resident/a", 42);
f("map/pss/a", 43);
f("smaps/vsize/a", 24);
f("smaps/swap/a", 1);
f("smaps/swap/a", 2);
f("smaps/vsize/a", 19);
f("smaps/swap/b/c", 10);
f("smaps/resident/a", 42);
f("smaps/pss/a", 43);
},
explicitNonHeap: 0
}
@ -197,10 +200,28 @@
f("5th", "explicit/a/neg1", NONHEAP, -20 * KB),
f("5th", "explicit/a/neg2", NONHEAP, -10 * KB)
];
var fakeMultiReporters2 = [
// Because this multi-reporter is in a child process, the fact that we
// skip the "smaps" multi-reporter in the parent process won't cause
// these to be skipped; the fall-back skipping will be hit instead.
{ name: "smaps",
collectReports: function(cbObj, closure) {
// The amounts are given in pages, so multiply here by 4kb.
function f(p, a) { cbObj.callback("2nd", p, NONHEAP, BYTES, a * 4 * KB, "(desc)", closure); }
f("smaps/vsize/a", 24);
f("smaps/vsize/b", 24);
},
explicitNonHeap: 0
}
];
for (var i = 0; i < fakeReporters2.length; i++) {
mgr.registerReporter(fakeReporters2[i]);
}
for (var i = 0; i < fakeMultiReporters2.length; i++) {
mgr.registerMultiReporter(fakeMultiReporters2[i]);
}
fakeReporters = fakeReporters.concat(fakeReporters2);
fakeMultiReporters = fakeMultiReporters.concat(fakeMultiReporters2);
]]>
</script>
@ -393,6 +414,9 @@ Explicit Allocations\n\
├────209,715,200 B (20.00%) ── compartment(compartment-url)\n\
└────105,906,176 B (10.10%) ── heap-unclassified\n\
\n\
Virtual Size Breakdown\n\
196,608 B (100.0%) ++ vsize\n\
\n\
Other Measurements\n\
698,351,616 B ── danger<script>window.alert(1)</script>\n\
1,048,576,000 B ── heap-allocated\n\

View File

@ -63,6 +63,7 @@ MOZ_UTILS_PROGRAM_LDFLAGS =
LIBS += \
../../mozapps/update/common/$(LIB_PREFIX)updatecommon.$(LIB_SUFFIX) \
../../mozapps/readstrings/$(LIB_PREFIX)readstrings.$(LIB_SUFFIX) \
$(NULL)
USE_STATIC_LIBS = 1
@ -96,4 +97,5 @@ endif
# Pick up nsWindowsRestart.cpp
LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre \
-I$(topsrcdir)/toolkit/mozapps/update/common \
-I$(topsrcdir)/toolkit/mozapps/readstrings \
$(NULL)

View File

@ -38,6 +38,7 @@
#include <windows.h>
#include <aclapi.h>
#include <stdlib.h>
#include <shlwapi.h>
// Used for DNLEN and UNLEN
#include <lm.h>
@ -50,9 +51,38 @@
#include "servicebase.h"
#include "updatehelper.h"
#include "shellapi.h"
#include "readstrings.h"
#include "errors.h"
#pragma comment(lib, "version.lib")
/**
* A wrapper function to read strings for the maintenance service.
*
* @param path The path of the ini file to read from
* @param results The maintenance service strings that were read
* @return OK on success
*/
static int
ReadMaintenanceServiceStrings(LPCWSTR path,
MaintenanceServiceStringTable *results)
{
// Read in the maintenance service description string if specified.
const unsigned int kNumStrings = 1;
const char *kServiceKeys = "ServiceDescription\0";
char serviceStrings[kNumStrings][MAX_TEXT_LEN];
int result = ReadStrings(path, kServiceKeys,
kNumStrings, serviceStrings,
"MaintenanceServiceStrings");
if (result != OK) {
serviceStrings[0][0] = '\0';
}
strncpy(results->serviceDescription,
serviceStrings[0], MAX_TEXT_LEN - 1);
results->serviceDescription[MAX_TEXT_LEN - 1] = '\0';
return result;
}
/**
* Obtains the version number from the specified PE file's version information
* Version Format: A.B.C.D (Example 10.0.0.300)
@ -94,6 +124,76 @@ GetVersionNumberFromPath(LPWSTR path, DWORD &A, DWORD &B,
return TRUE;
}
/**
* Updates the service description with what is stored in updater.ini
* at the same path as the currently executing module binary.
*
* @param serviceHandle A handle to an opened service with
* SERVICE_CHANGE_CONFIG access right
* @param TRUE on succcess.
*/
BOOL
UpdateServiceDescription(SC_HANDLE serviceHandle)
{
WCHAR updaterINIPath[MAX_PATH + 1];
if (!GetModuleFileNameW(NULL, updaterINIPath,
sizeof(updaterINIPath) /
sizeof(updaterINIPath[0]))) {
LOG(("Could not obtain module filename when attempting to "
"modify service description. (%d)\n", GetLastError()));
return FALSE;
}
if (!PathRemoveFileSpecW(updaterINIPath)) {
LOG(("Could not remove file spec when attempting to "
"modify service description. (%d)\n", GetLastError()));
return FALSE;
}
if (!PathAppendSafe(updaterINIPath, L"updater.ini")) {
LOG(("Could not append updater.ini filename when attempting to "
"modify service description. (%d)\n", GetLastError()));
return FALSE;
}
if (GetFileAttributesW(updaterINIPath) == INVALID_FILE_ATTRIBUTES) {
LOG(("updater.ini file does not exist, will not modify "
"service description. (%d)\n", GetLastError()));
return FALSE;
}
MaintenanceServiceStringTable serviceStrings;
int rv = ReadMaintenanceServiceStrings(updaterINIPath, &serviceStrings);
if (rv != OK || !strlen(serviceStrings.serviceDescription)) {
LOG(("updater.ini file does not contain a maintenance "
"service description.\n"));
return FALSE;
}
WCHAR serviceDescription[MAX_TEXT_LEN];
if (!MultiByteToWideChar(CP_UTF8, 0,
serviceStrings.serviceDescription, -1,
serviceDescription,
sizeof(serviceDescription) /
sizeof(serviceDescription[0]))) {
LOG(("Could not convert description to wide string format (%d)\n",
GetLastError()));
return FALSE;
}
SERVICE_DESCRIPTIONW descriptionConfig;
descriptionConfig.lpDescription = serviceDescription;
if (!ChangeServiceConfig2W(serviceHandle,
SERVICE_CONFIG_DESCRIPTION,
&descriptionConfig)) {
LOG(("Could not change service config (%d)\n", GetLastError()));
return FALSE;
}
LOG(("The service description was updated successfully.\n"));
return TRUE;
}
/**
* Installs or upgrades the SVC_NAME service.
* If an existing service is already installed, we replace it with the
@ -182,8 +282,6 @@ SvcInstall(SvcInstallAction action)
return FALSE;
}
schService.reset(); //Explicitly close the handle so we can delete it
// Check if we need to replace the old binary with the new one
// If we couldn't get the old version info then we assume we should
// replace it.
@ -195,6 +293,11 @@ SvcInstall(SvcInstallAction action)
existingC < newC) ||
(existingA == newA && existingB == newB &&
existingC == newC && existingD < newD)) {
// We have a newer updater, so update the description from the INI file.
UpdateServiceDescription(schService);
schService.reset();
if (!StopService()) {
return FALSE;
}
@ -322,6 +425,8 @@ SvcInstall(SvcInstallAction action)
GetLastError()));
}
UpdateServiceDescription(schService);
return TRUE;
}

View File

@ -35,6 +35,8 @@
*
* ***** END LICENSE BLOCK ***** */
#include "readstrings.h"
#define SVC_DISPLAY_NAME L"Mozilla Maintenance Service"
enum SvcInstallAction { UpgradeSvc, InstallSvc, ForceInstallSvc };
@ -44,3 +46,9 @@ BOOL StopService();
BOOL SetUserAccessServiceDACL(SC_HANDLE hService);
DWORD SetUserAccessServiceDACL(SC_HANDLE hService, PACL &pNewAcl,
PSECURITY_DESCRIPTOR psd);
struct MaintenanceServiceStringTable
{
char serviceDescription[MAX_TEXT_LEN];
};

View File

@ -315,6 +315,7 @@ HISTOGRAM(THUNDERBIRD_INDEXING_RATE_MSG_PER_S, 1, 100, 20, LINEAR, "Gloda: index
HISTOGRAM(FX_TAB_ANIM_OPEN_MS, 1, 3000, 10, EXPONENTIAL, "Firefox: Time taken by the tab opening animation in milliseconds")
HISTOGRAM(FX_TAB_ANIM_CLOSE_MS, 1, 3000, 10, EXPONENTIAL, "Firefox: Time taken by the tab closing animation in milliseconds")
HISTOGRAM_BOOLEAN(FX_CONTEXT_SEARCH_AND_TAB_SELECT, "Firefox: Background tab was selected within 5 seconds of searching from the context menu")
HISTOGRAM_BOOLEAN(FX_KEYWORD_URL_USERSET, "Firefox: keyword.URL has a user-set value")
HISTOGRAM(FX_IDENTITY_POPUP_OPEN_MS, 1, 1000, 10, EXPONENTIAL, "Firefox: Time taken by the identity popup to open in milliseconds")
HISTOGRAM(FX_APP_MENU_OPEN_MS, 1, 1000, 10, EXPONENTIAL, "Firefox: Time taken by the app-menu opening in milliseconds")

View File

@ -1,39 +1,11 @@
#
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is
# Benjamin Smedberg <benjamin@smedbergs.us>
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
# Contributor(s):
# Shawn Wilsher <me@shawnwilsher.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either of the GNU General Public License Version 2 or later (the "GPL"),
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ../..
@ -573,6 +545,9 @@ EXTRA_DSO_LDOPTS += \
-DELAYLOAD:comdlg32.dll \
-DELAYLOAD:winspool.drv \
$(NULL)
ifdef ACCESSIBILITY
EXTRA_DSO_LDOPTS += -DELAYLOAD:oleacc.dll
endif
endif
endif # WINNT

View File

@ -241,7 +241,7 @@ ReadStrings(const NS_tchar *path,
if (keyIndex >= 0 && (unsigned int)keyIndex < numStrings)
{
strncpy(results[keyIndex], token, MAX_TEXT_LEN - 1);
results[keyIndex][MAX_TEXT_LEN - 1] = 0;
results[keyIndex][MAX_TEXT_LEN - 1] = '\0';
read++;
}
}
@ -261,9 +261,9 @@ ReadStrings(const NS_tchar *path, StringTable *results)
int result = ReadStrings(path, kUpdaterKeys, kNumStrings, updater_strings);
strncpy(results->title, updater_strings[0], MAX_TEXT_LEN - 1);
results->title[MAX_TEXT_LEN - 1] = 0;
results->title[MAX_TEXT_LEN - 1] = '\0';
strncpy(results->info, updater_strings[1], MAX_TEXT_LEN - 1);
results->info[MAX_TEXT_LEN - 1] = 0;
results->info[MAX_TEXT_LEN - 1] = '\0';
return result;
}

View File

@ -40,7 +40,7 @@
#ifndef READSTRINGS_H__
#define READSTRINGS_H__
#define MAX_TEXT_LEN 400
#define MAX_TEXT_LEN 600
#ifdef XP_WIN
# include <windows.h>
@ -49,7 +49,8 @@
typedef char NS_tchar;
#endif
struct StringTable {
struct StringTable
{
char title[MAX_TEXT_LEN];
char info[MAX_TEXT_LEN];
};

View File

@ -1330,7 +1330,8 @@ DumpHelp()
" -P <profile> Start with <profile>.\n"
" -migration Start with migration wizard.\n"
" -ProfileManager Start with ProfileManager.\n"
" -no-remote Open new instance, not a new window in running instance.\n"
" -no-remote Do not accept or send remote commands; implies -new-instance.\n"
" -new-instance Open new instance, not a new window in running instance.\n"
" -UILocale <locale> Start with <locale> resources as UI Locale.\n"
" -safe-mode Disables extensions and themes for this session.\n", gAppData->name);
@ -2906,15 +2907,23 @@ XRE_main(int argc, char* argv[], const nsXREAppData* aAppData)
gSafeMode = true;
#endif
// Handle -no-remote command line argument. Setup the environment to
// better accommodate other components and various restart scenarios.
// Handle -no-remote and -new-instance command line arguments. Setup
// the environment to better accommodate other components and various
// restart scenarios.
ar = CheckArg("no-remote", true);
if (ar == ARG_BAD) {
PR_fprintf(PR_STDERR, "Error: argument -a requires an application name\n");
PR_fprintf(PR_STDERR, "Error: argument -no-remote is invalid when argument -osint is specified\n");
return 1;
} else if (ar == ARG_FOUND) {
SaveToEnv("MOZ_NO_REMOTE=1");
}
ar = CheckArg("new-instance", true);
if (ar == ARG_BAD) {
PR_fprintf(PR_STDERR, "Error: argument -new-instance is invalid when argument -osint is specified\n");
return 1;
} else if (ar == ARG_FOUND) {
SaveToEnv("MOZ_NEW_INSTANCE=1");
}
// Handle -help and -version command line arguments.
// They should return quickly, so we deal with them here.
@ -3035,10 +3044,16 @@ XRE_main(int argc, char* argv[], const nsXREAppData* aAppData)
#ifdef MOZ_ENABLE_XREMOTE
// handle -remote now that xpcom is fired up
bool disableRemote = false;
bool disableRemote, newInstance;
{
char *e = PR_GetEnv("MOZ_NO_REMOTE");
disableRemote = (e && *e);
if (disableRemote) {
newInstance = true;
} else {
e = PR_GetEnv("MOZ_NEW_INSTANCE");
newInstance = (e && *e);
}
}
const char* xremotearg;
@ -3053,7 +3068,7 @@ XRE_main(int argc, char* argv[], const nsXREAppData* aAppData)
return HandleRemoteArgument(xremotearg, desktopStartupIDPtr);
}
if (!disableRemote) {
if (!newInstance) {
// Try to remote the entire command line. If this fails, start up normally.
RemoteResult rr = RemoteCommandLine(desktopStartupIDPtr);
if (rr == REMOTE_FOUND)

View File

@ -323,17 +323,15 @@ nsDragService::InvokeDragSession(nsIDOMNode *aDOMNode,
if (aActionType & DRAGDROP_ACTION_LINK)
action = (GdkDragAction)(action | GDK_ACTION_LINK);
// Create a fake event for the drag so we can pass the time
// (so to speak.) If we don't do this the drag can end as a
// result of a button release that is actually _earlier_ than
// CurrentTime. So we use the time on the last button press
// event, as that will always be older than the button release
// that ends any drag.
// Create a fake event for the drag so we can pass the time (so to speak).
// If we don't do this, then, when the timestamp for the pending button
// release event is used for the ungrab, the ungrab can fail due to the
// timestamp being _earlier_ than CurrentTime.
GdkEvent event;
memset(&event, 0, sizeof(GdkEvent));
event.type = GDK_BUTTON_PRESS;
event.button.window = mHiddenWidget->window;
event.button.time = nsWindow::sLastButtonPressTime;
event.button.time = nsWindow::GetCurrentEventTime();
// start our drag.
GdkDragContext *context = gtk_drag_begin(mHiddenWidget,
@ -345,6 +343,8 @@ nsDragService::InvokeDragSession(nsIDOMNode *aDOMNode,
mSourceRegion = nsnull;
if (context) {
StartDragSession();
// GTK uses another hidden window for receiving mouse events.
mGrabWidget = gtk_grab_get_current();
if (mGrabWidget) {
@ -361,8 +361,6 @@ nsDragService::InvokeDragSession(nsIDOMNode *aDOMNode,
gtk_target_list_unref(sourceList);
StartDragSession();
return rv;
}

View File

@ -160,8 +160,7 @@ using mozilla::layers::LayerManagerOGL;
#define MAX_RECTS_IN_REGION 100
/* utility functions */
static bool check_for_rollup(GdkWindow *aWindow,
gdouble aMouseX, gdouble aMouseY,
static bool check_for_rollup(gdouble aMouseX, gdouble aMouseY,
bool aIsWheel, bool aAlwaysRollup);
static bool is_mouse_in_window(GdkWindow* aWindow,
gdouble aMouseX, gdouble aMouseY);
@ -296,12 +295,10 @@ UpdateLastInputEventTime()
nsWindow *nsWindow::sLastDragMotionWindow = NULL;
bool nsWindow::sIsDraggingOutOf = false;
// This is the time of the last button press event. The drag service
// uses it as the time to start drags.
guint32 nsWindow::sLastButtonPressTime = 0;
// Time of the last button release event. We use it to detect when the
// drag ended before we could properly setup drag and drop.
guint32 nsWindow::sLastButtonReleaseTime = 0;
static guint32 sRetryGrabTime;
static NS_DEFINE_IID(kCDragServiceCID, NS_DRAGSERVICE_CID);
@ -1429,6 +1426,31 @@ SetUserTimeAndStartupIDForActivatedWindow(GtkWidget* aWindow)
GTKToolkit->SetDesktopStartupID(EmptyCString());
}
/* static */ guint32
nsWindow::GetCurrentEventTime()
{
static guint32 sLastCurrentEventTime = GDK_CURRENT_TIME;
guint32 timestamp = gtk_get_current_event_time();
if (timestamp == GDK_CURRENT_TIME) {
timestamp = gdk_x11_display_get_user_time(gdk_display_get_default());
// The user_time is not updated on all user events, so check that we
// haven't returned a more recent timestamp. If so, use the more
// recent timestamp to ensure that subsequent requests will override
// previous requests. Timestamps are just the least significant bits
// of a monotonically increasing function, and so the use of unsigned
// overflow arithmetic.
if (sLastCurrentEventTime != GDK_CURRENT_TIME &&
sLastCurrentEventTime - timestamp <= G_MAXUINT32/2)
return sLastCurrentEventTime;
}
sLastCurrentEventTime = timestamp;
return timestamp;
}
NS_IMETHODIMP
nsWindow::SetFocus(bool aRaise)
{
@ -1882,7 +1904,7 @@ nsWindow::CaptureMouse(bool aCapture)
if (aCapture) {
gtk_grab_add(widget);
GrabPointer();
GrabPointer(GetCurrentEventTime());
}
else {
ReleaseGrabs();
@ -1914,7 +1936,7 @@ nsWindow::CaptureRollupEvents(nsIRollupListener *aListener,
// real grab is only done when there is no dragging
if (!nsWindow::DragInProgress()) {
gtk_grab_add(widget);
GrabPointer();
GrabPointer(GetCurrentEventTime());
}
}
else {
@ -2357,7 +2379,7 @@ nsWindow::OnConfigureEvent(GtkWidget *aWidget, GdkEventConfigure *aEvent)
// Cygwin/X (bug 672103).
if (mBounds.x != screenBounds.x ||
mBounds.y != screenBounds.y) {
check_for_rollup(aEvent->window, 0, 0, false, true);
check_for_rollup(0, 0, false, true);
}
}
@ -2740,8 +2762,7 @@ nsWindow::OnButtonPressEvent(GtkWidget *aWidget, GdkEventButton *aEvent)
return;
}
// Always save the time of this event
sLastButtonPressTime = aEvent->time;
// We haven't received the corresponding release event yet.
sLastButtonReleaseTime = 0;
nsWindow *containerWindow = GetContainerWindow();
@ -2750,8 +2771,8 @@ nsWindow::OnButtonPressEvent(GtkWidget *aWidget, GdkEventButton *aEvent)
}
// check to see if we should rollup
bool rolledUp = check_for_rollup(aEvent->window, aEvent->x_root,
aEvent->y_root, false, false);
bool rolledUp =
check_for_rollup(aEvent->x_root, aEvent->y_root, false, false);
if (gConsumeRollupEvent && rolledUp)
return;
@ -2915,7 +2936,7 @@ nsWindow::OnContainerFocusOutEvent(GtkWidget *aWidget, GdkEventFocus *aEvent)
}
if (shouldRollup) {
check_for_rollup(aEvent->window, 0, 0, false, true);
check_for_rollup(0, 0, false, true);
}
}
@ -3274,8 +3295,8 @@ void
nsWindow::OnScrollEvent(GtkWidget *aWidget, GdkEventScroll *aEvent)
{
// check to see if we should rollup
bool rolledUp = check_for_rollup(aEvent->window, aEvent->x_root,
aEvent->y_root, true, false);
bool rolledUp =
check_for_rollup(aEvent->x_root, aEvent->y_root, true, false);
if (gConsumeRollupEvent && rolledUp)
return;
@ -3389,10 +3410,12 @@ nsWindow::OnWindowStateEvent(GtkWidget *aWidget, GdkEventWindowState *aEvent)
nsSizeModeEvent event(true, NS_SIZEMODE, this);
// We don't care about anything but changes in the maximized/icon
// We don't care about anything but changes in the maximized/icon/fullscreen
// states
if ((aEvent->changed_mask
& (GDK_WINDOW_STATE_ICONIFIED|GDK_WINDOW_STATE_MAXIMIZED)) == 0) {
& (GDK_WINDOW_STATE_ICONIFIED |
GDK_WINDOW_STATE_MAXIMIZED |
GDK_WINDOW_STATE_FULLSCREEN)) == 0) {
return;
}
@ -3404,6 +3427,11 @@ nsWindow::OnWindowStateEvent(GtkWidget *aWidget, GdkEventWindowState *aEvent)
DispatchMinimizeEventAccessible();
#endif //ACCESSIBILITY
}
else if (aEvent->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) {
LOG(("\tFullscreen\n"));
event.mSizeMode = nsSizeMode_Fullscreen;
mSizeState = nsSizeMode_Fullscreen;
}
else if (aEvent->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) {
LOG(("\tMaximized\n"));
event.mSizeMode = nsSizeMode_Maximized;
@ -3412,11 +3440,6 @@ nsWindow::OnWindowStateEvent(GtkWidget *aWidget, GdkEventWindowState *aEvent)
DispatchMaximizeEventAccessible();
#endif //ACCESSIBILITY
}
else if (aEvent->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) {
LOG(("\tFullscreen\n"));
event.mSizeMode = nsSizeMode_Fullscreen;
mSizeState = nsSizeMode_Fullscreen;
}
else {
LOG(("\tNormal\n"));
event.mSizeMode = nsSizeMode_Normal;
@ -4493,7 +4516,7 @@ void
nsWindow::EnsureGrabs(void)
{
if (mRetryPointerGrab)
GrabPointer();
GrabPointer(sRetryGrabTime);
}
void
@ -4882,7 +4905,7 @@ nsWindow::UpdateTranslucentWindowAlphaInternal(const nsIntRect& aRect,
}
void
nsWindow::GrabPointer(void)
nsWindow::GrabPointer(guint32 aTime)
{
LOG(("GrabPointer %d\n", mRetryPointerGrab));
@ -4910,11 +4933,18 @@ nsWindow::GrabPointer(void)
GDK_POINTER_MOTION_HINT_MASK |
#endif
GDK_POINTER_MOTION_MASK),
(GdkWindow *)NULL, NULL, GDK_CURRENT_TIME);
(GdkWindow *)NULL, NULL, aTime);
if (retval != GDK_GRAB_SUCCESS) {
LOG(("GrabPointer: pointer grab failed\n"));
if (retval == GDK_GRAB_NOT_VIEWABLE) {
LOG(("GrabPointer: window not viewable; will retry\n"));
mRetryPointerGrab = true;
sRetryGrabTime = aTime;
} else if (retval != GDK_GRAB_SUCCESS) {
LOG(("GrabPointer: pointer grab failed: %i\n", retval));
// A failed grab indicates that another app has grabbed the pointer.
// Check for rollup now, because, without the grab, we likely won't
// get subsequent button press events.
check_for_rollup(0, 0, false, true);
}
}
@ -5223,7 +5253,7 @@ nsWindow::HideWindowChrome(bool aShouldHide)
}
static bool
check_for_rollup(GdkWindow *aWindow, gdouble aMouseX, gdouble aMouseY,
check_for_rollup(gdouble aMouseX, gdouble aMouseY,
bool aIsWheel, bool aAlwaysRollup)
{
bool retVal = false;

Some files were not shown because too many files have changed in this diff Show More