diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 000000000..550fbda3f
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,6 @@
+lib/espruinotools.js
+lib/imageconverter.js
+lib/qrcode.min.js
+lib/heatshrink.js
+lib/marked.min.js
+apps/animclk/V29.LBM.js
diff --git a/.gitignore b/.gitignore
index b83632eaa..757619ec5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
.htaccess
node_modules
package-lock.json
+.DS_Store
+*.js.bak
+appdates.csv
+.vscode
diff --git a/Bangle.js.svg b/Bangle.js.svg
new file mode 100644
index 000000000..90c908c9b
--- /dev/null
+++ b/Bangle.js.svg
@@ -0,0 +1,478 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 000000000..649773838
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,27 @@
+App Loader ChangeLog
+====================
+
+Changed for individual apps are listed in `apps/appname/ChangeLog`
+
+* `Remove All Apps` now doesn't perform a reset before erase - fixes inability to update firmware if settings are wrong
+* Added optional `README.md` file for apps
+* Remove 2v04 version warning, add links in About to official/developer versions
+* Fix issue removing an app that was just installed (fix #253)
+* Add `Favourite` functionality
+* Version number now clickable even when you're at the latest version (fix #291)
+* Rewrite 'getInstalledApps' to minimize RAM usage
+* Added code to handle Settings
+* Added espruinotools.js for pretokenisation
+* Included image and compression tools in repo
+* Added better upload of large files (incl. compression)
+* URL fetch is now async
+* Adding '#search' after the URL (when not the name of a 'filter' chip) will set up search for that term
+* If `bin/pre-publish.sh` has been run and recent.csv created, add 'Sort By' chip
+* New 'espruinotools' which fixes pretokenise issue when ID follows ID (fix #416)
+* Improve upload of binary files
+* App description can now be markdown
+* Fix `marked is not defined` error (and include in repo, just in case)
+* Fix error in 'Install Default Apps' if Flash storage is full enough that erasing takes a while
+* Fixed animated progress bar on app removal
+* Added ability to specify dependencies (used for `notify` at the moment)
+* Fixed Promise-based bug in removeApp
diff --git a/README.md b/README.md
index 0fcb78608..c0e225894 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,10 @@ Bangle.js App Loader (and Apps)
* Try the **release version** at [banglejs.com/apps](https://banglejs.com/apps)
* Try the **development version** at [github.io](https://espruino.github.io/BangleApps/)
+**All software (including apps) in this repository is MIT Licensed - see [LICENSE](LICENSE)** By
+submitting code to this repository you confirm that you are happy with it being MIT licensed,
+and that it is not licensed in another way that would make this impossible.
+
## How does it work?
* A list of apps is in `apps.json`
@@ -25,13 +29,15 @@ Check out:
## What filenames are used
-Filenames in storage are limited to 8 characters. To
+Filenames in storage are limited to 28 characters. To
easily distinguish between file types, we use the following:
* `stuff.info` is JSON that describes an app - this is auto-generated by the App Loader
* `stuff.img` is an image
-* `stuff.app.js` is JS code
+* `stuff.app.js` is JS code for applications
* `stuff.wid.js` is JS code for widgets
+* `stuff.settings.js` is JS code for the settings menu
+* `stuff.boot.js` is JS code that automatically gets run at boot time
* `stuff.json` is used for JSON settings for an app
## Developing your own app
@@ -191,11 +197,17 @@ and which gives information about the app for the Launcher.
"type":"widget/clock/app", // optional, default "app"
// if this is 'widget' then it's not displayed in the menu
// if it's 'clock' then it'll be loaded by default at boot time
+ "dependencies" : { "notify":"type" } // optional, app 'types' we depend on
"version":"1.23",
// added by BangleApps loader on upload based on apps.json
"files:"file1,file2,file3",
// added by BangleApps loader on upload - lists all files
// that belong to the app so it can be deleted
+ "data":"appid.data.json,appid.data?.json;appidStorageFile,appidStorageFile*"
+ // added by BangleApps loader on upload - lists files that
+ // the app might write, so they can be deleted on uninstall
+ // typically these files are not uploaded, but created by the app
+ // these can include '*' or '?' wildcards
}
```
@@ -206,10 +218,14 @@ and which gives information about the app for the Launcher.
"name": "Readable name", // readable name
"shortName": "Short name", // short name for launcher
"icon": "icon.png", // icon in apps/
- "description": "...", // long description
+ "description": "...", // long description (can contain markdown)
"type":"...", // optional(if app) - 'app'/'widget'/'launch'/'bootloader'
"tags": "", // comma separated tag list for searching
+ "readme": "README.md", // if supplied, a link to a markdown-style text file
+ // that contains more information about this app (usage, etc)
+ // A 'Read more...' link will be added under the app
+
"custom": "custom.html", // if supplied, apps/custom.html is loaded in an
// iframe, and it must post back an 'app' structure
// like this one with 'storage','name' and 'id' set up
@@ -230,16 +246,24 @@ and which gives information about the app for the Launcher.
"evaluate":true // if supplied, data isn't quoted into a String before upload
// (eg it's evaluated as JS)
},
+ ]
+ "data": [ // list of files the app writes to
+ {"name":"appid.data.json", // filename used in storage
+ "storageFile":true // if supplied, file is treated as storageFile
+ },
+ {"wildcard":"appid.data.*" // wildcard of filenames used in storage
+ }, // this is mutually exclusive with using "name"
+ ],
"sortorder" : 0, // optional - choose where in the list this goes.
// this should only really be used to put system
// stuff at the top
- ]
}
```
* name, icon and description present the app in the app loader.
* tags is used for grouping apps in the library, separate multiple entries by comma. Known tags are `tool`, `system`, `clock`, `game`, `sound`, `gps`, `widget`, `launcher` or empty.
* storage is used to identify the app files and how to handle them
+* data is used to clean up files when the app is uninstalled
### `apps.json`: `custom` element
@@ -313,6 +337,52 @@ the data you require from Bangle.js.
See [apps/gpsrec/interface.html](the GPS Recorder) for a full example.
+### Adding configuration to the "Settings" menu
+
+Apps (or widgets) can add their own settings to the "Settings" menu under "App/widget settings".
+To do so, the app needs to include a `settings.js` file, containing a single function
+that handles configuring the app.
+When the app settings are opened, this function is called with one
+argument, `back`: a callback to return to the settings menu.
+
+Usually it will save any information in `app.json` where `app` is the name
+of your app - so you should change the example accordingly.
+
+Example `settings.js`
+```js
+// make sure to enclose the function in parentheses
+(function(back) {
+ let settings = require('Storage').readJSON('app.json',1)||{};
+ function save(key, value) {
+ settings[key] = value;
+ require('Storage').write('app.json',settings);
+ }
+ const appMenu = {
+ '': {'title': 'App Settings'},
+ '< Back': back,
+ 'Monkeys': {
+ value: settings.monkeys||12,
+ onchange: (m) => {save('monkeys', m)}
+ }
+ };
+ E.showMenu(appMenu)
+})
+```
+In this example the app needs to add `app.settings.js` to `storage` in `apps.json`.
+It should also add `app.json` to `data`, to make sure it is cleaned up when the app is uninstalled.
+```json
+ { "id": "app",
+ ...
+ "storage": [
+ ...
+ {"name":"app.settings.js","url":"settings.js"},
+ ],
+ "data": [
+ {"name":"app.json"}
+ ]
+ },
+```
+
## Coding hints
- use `g.setFont(.., size)` to multiply the font size, eg ("6x8",3) : "18x24"
@@ -333,8 +403,6 @@ See [apps/gpsrec/interface.html](the GPS Recorder) for a full example.
- Need to save state? Use the `E.on('kill',...)` event to save JSON to a file called `7chname.json`, then load it at startup.
-- 'Welcome' apps define a file called `welcome.js` which the booloader picks up. This then chain-loads the welcome app itself.
-
- 'Alarm' apps define a file called `alarm.js` which handles the actual alarm window.
- Locale is handled by `require("locale")`. An app may create a `locale` file in Storage which is
diff --git a/appinfo.js b/appinfo.js
deleted file mode 100644
index 151227f45..000000000
--- a/appinfo.js
+++ /dev/null
@@ -1,75 +0,0 @@
-function toJS(txt) {
- return JSON.stringify(txt);
-}
-
-var AppInfo = {
- getFiles : (app,fileGetter) => {
- return new Promise((resolve,reject) => {
- // Load all files
- Promise.all(app.storage.map(storageFile => {
- if (storageFile.content)
- return Promise.resolve(storageFile);
- else if (storageFile.url)
- return fileGetter(`apps/${app.id}/${storageFile.url}`).then(content => {
- return {
- name : storageFile.name,
- content : content,
- evaluate : storageFile.evaluate
- }});
- else return Promise.resolve();
- })).then(fileContents => { // now we just have a list of files + contents...
- // filter out empty files
- fileContents = fileContents.filter(x=>x!==undefined);
- // What about minification?
- // Add app's info JSON
- return AppInfo.createAppJSON(app, fileContents);
- }).then(fileContents => {
- // then map each file to a command to load into storage
- fileContents.forEach(storageFile => {
- // format ready for Espruino
- var js;
- if (storageFile.evaluate) {
- js = storageFile.content.trim();
- if (js.endsWith(";"))
- js = js.slice(0,-1);
- } else
- js = toJS(storageFile.content);
- storageFile.cmd = `\x10require('Storage').write(${toJS(storageFile.name)},${js});`;
- });
- resolve(fileContents);
- }).catch(err => reject(err));
- });
- },
- createAppJSON : (app, fileContents) => {
- return new Promise((resolve,reject) => {
- var appJSONName = app.id+".info";
- // Check we don't already have a JSON file!
- var appJSONFile = fileContents.find(f=>f.name==appJSONName);
- if (appJSONFile) reject("App JSON file explicitly specified!");
- // Now actually create the app JSON
- var json = {
- id : app.id
- };
- if (app.shortName) json.name = app.shortName;
- else json.name = app.name;
- if (app.type && app.type!="app") json.type = app.type;
- if (fileContents.find(f=>f.name==app.id+".app.js"))
- json.src = app.id+".app.js";
- if (fileContents.find(f=>f.name==app.id+".img"))
- json.icon = app.id+".img";
- if (app.sortorder) json.sortorder = app.sortorder;
- if (app.version) json.version = app.version;
- var fileList = fileContents.map(storageFile=>storageFile.name);
- fileList.unshift(appJSONName); // do we want this? makes life easier!
- json.files = fileList.join(",");
- fileContents.push({
- name : appJSONName,
- content : JSON.stringify(json)
- });
- resolve(fileContents);
- });
- }
-};
-
-if ("undefined"!=typeof module)
- module.exports = AppInfo;
diff --git a/apps.json b/apps.json
index cb0a1bf79..da3b04799 100644
--- a/apps.json
+++ b/apps.json
@@ -2,7 +2,7 @@
{ "id": "boot",
"name": "Bootloader",
"icon": "bootloader.png",
- "version":"0.11",
+ "version":"0.19",
"description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings",
"tags": "tool,system",
"type":"bootloader",
@@ -12,11 +12,36 @@
],
"sortorder" : -10
},
+ { "id": "moonphase",
+ "name": "Moonphase",
+ "icon": "app.png",
+ "version":"0.02",
+ "description": "Shows current moon phase. Now with GPS function.",
+ "tags": "",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"moonphase.app.js","url":"app.js"},
+ {"name":"moonphase.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "daysl",
+ "name": "Days left",
+ "icon": "app.png",
+ "version":"0.03",
+ "description": "Shows you the days left until a certain date. Date can be set with a settings app and is written to a file.",
+ "tags": "",
+ "allow_emulator":false,
+ "storage": [
+ {"name":"daysl.app.js","url":"app.js"},
+ {"name":"daysl.img","url":"app-icon.js","evaluate":true},
+ {"name":"daysl.wid.js","url":"widget.js"}
+ ]
+ },
{ "id": "launch",
- "name": "Default Launcher",
+ "name": "Launcher (Default)",
"shortName":"Launcher",
"icon": "app.png",
- "version":"0.01",
+ "version":"0.04",
"description": "This is needed by Bangle.js to display a menu allowing you to choose your own applications. You can replace this with a customised launcher.",
"tags": "tool,system,launcher",
"type":"launch",
@@ -28,7 +53,7 @@
{ "id": "about",
"name": "About",
"icon": "app.png",
- "version":"0.04",
+ "version":"0.06",
"description": "Bangle.js About page - showing software version, stats, and a collaborative mural from the Bangle.js KickStarter backers",
"tags": "tool,system",
"allow_emulator":true,
@@ -40,45 +65,80 @@
{ "id": "locale",
"name": "Languages",
"icon": "locale.png",
- "version":"0.04",
+ "version":"0.07",
"description": "Translations for different countries",
"tags": "tool,system,locale,translate",
"type": "locale",
"custom":"locale.html",
+ "readme": "README.md",
"storage": [
{"name":"locale"}
],
"sortorder" : -10
},
+ { "id": "notify",
+ "name": "Notifications (default)",
+ "shortName":"Notifications",
+ "icon": "notify.png",
+ "version":"0.01",
+ "description": "A handler for displaying notifications that displays them in a bar at the top of the screen",
+ "tags": "widget",
+ "type": "notify",
+ "readme": "README.md",
+ "storage": [
+ {"name":"notify","url":"notify.js"}
+ ]
+ },
+ { "id": "notifyfs",
+ "name": "Fullscreen Notifications",
+ "shortName":"Notifications",
+ "icon": "notify.png",
+ "version":"0.01",
+ "description": "A handler for displaying notifications that displays them fullscreen. This may not fully restore the screen after on some apps. See `Notifications (default)` for more information about the notifications library.",
+ "tags": "widget",
+ "type": "notify",
+ "storage": [
+ {"name":"notify","url":"notify.js"}
+ ]
+ },
{ "id": "welcome",
"name": "Welcome",
"icon": "app.png",
- "version":"0.04",
+ "version":"0.09",
"description": "Appears at first boot and explains how to use Bangle.js",
"tags": "start,welcome",
"allow_emulator":true,
"storage": [
- {"name":"welcome.js","url":"welcome.js"},
+ {"name":"welcome.boot.js","url":"boot.js"},
{"name":"welcome.app.js","url":"app.js"},
+ {"name":"welcome.settings.js","url":"settings.js"},
{"name":"welcome.img","url":"app-icon.js","evaluate":true}
+ ],
+ "data": [
+ {"name":"welcome.json"}
]
},
{ "id": "gbridge",
"name": "Gadgetbridge",
"icon": "app.png",
- "version":"0.04",
+ "version":"0.15",
"description": "The default notification handler for Gadgetbridge notifications from Android",
"tags": "tool,system,android,widget",
+ "type":"widget",
+ "dependencies": { "notify":"type" },
"storage": [
- {"name":"gbridge.app.js","url":"app.js"},
+ {"name":"gbridge.settings.js","url":"settings.js"},
{"name":"gbridge.img","url":"app-icon.js","evaluate":true},
{"name":"gbridge.wid.js","url":"widget.js"}
+ ],
+ "data": [
+ {"name":"gbridge.json"}
]
},
{ "id": "mclock",
"name": "Morphing Clock",
"icon": "clock-morphing.png",
- "version":"0.03",
+ "version":"0.06",
"description": "7 segment clock that morphs between minutes and hours",
"tags": "clock",
"type":"clock",
@@ -92,12 +152,13 @@
{ "id": "setting",
"name": "Settings",
"icon": "settings.png",
- "version":"0.07",
+ "version":"0.20",
"description": "A menu for setting up Bangle.js",
"tags": "tool,system",
+ "readme": "README.md",
"storage": [
{"name":"setting.app.js","url":"settings.js"},
- {"name":"setting.json","url":"settings-default.json","evaluate":true},
+ {"name":"setting.boot.js","url":"boot.js"},
{"name":"setting.img","url":"settings-icon.js","evaluate":true}
],
"sortorder" : -2
@@ -106,15 +167,18 @@
"name": "Default Alarm",
"shortName":"Alarms",
"icon": "app.png",
- "version":"0.04",
+ "version":"0.10",
"description": "Set and respond to alarms",
"tags": "tool,alarm,widget",
"storage": [
{"name":"alarm.app.js","url":"app.js"},
+ {"name":"alarm.boot.js","url":"boot.js"},
{"name":"alarm.js","url":"alarm.js"},
- {"name":"alarm.json","content":"[]"},
{"name":"alarm.img","url":"app-icon.js","evaluate":true},
{"name":"alarm.wid.js","url":"widget.js"}
+ ],
+ "data": [
+ {"name":"alarm.json"}
]
},
{ "id": "wclock",
@@ -130,10 +194,40 @@
{"name":"wclock.img","url":"clock-word-icon.js","evaluate":true}
]
},
+ { "id": "imgclock",
+ "name": "Image background clock",
+ "shortName":"Image Clock",
+ "icon": "app.png",
+ "version":"0.07",
+ "description": "A clock with an image as a background",
+ "tags": "clock",
+ "type" : "clock",
+ "custom": "custom.html",
+ "storage": [
+ {"name":"imgclock.app.js","url":"app.js"},
+ {"name":"imgclock.img","url":"app-icon.js","evaluate":true},
+ {"name":"imgclock.face.img"},
+ {"name":"imgclock.face.json"},
+ {"name":"imgclock.face.bg","content":""}
+ ]
+ },
+ { "id": "impwclock",
+ "name": "Imprecise Word Clock",
+ "icon": "clock-impword.png",
+ "version":"0.02",
+ "description": "Imprecise word clock for vacations, weekends, and those who never need accurate time.",
+ "tags": "clock",
+ "type":"clock",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"impwclock.app.js","url":"clock-impword.js"},
+ {"name":"impwclock.img","url":"clock-impword-icon.js","evaluate":true}
+ ]
+ },
{ "id": "aclock",
"name": "Analog Clock",
"icon": "clock-analog.png",
- "version":"0.02",
+ "version": "0.13",
"description": "An Analog Clock",
"tags": "clock",
"type":"clock",
@@ -159,7 +253,7 @@
{ "id": "trex",
"name": "T-Rex",
"icon": "trex.png",
- "version":"0.01",
+ "version":"0.02",
"description": "T-Rex game in the style of Chrome's offline game",
"tags": "game",
"allow_emulator":true,
@@ -171,7 +265,7 @@
{ "id": "astroid",
"name": "Asteroids!",
"icon": "asteroids.png",
- "version":"0.01",
+ "version":"0.02",
"description": "Retro asteroids game",
"tags": "game",
"allow_emulator":true,
@@ -205,7 +299,7 @@
{ "id": "compass",
"name": "Compass",
"icon": "compass.png",
- "version":"0.01",
+ "version":"0.03",
"description": "Simple compass that points North",
"tags": "tool,outdoors",
"storage": [
@@ -216,7 +310,7 @@
{ "id": "gpstime",
"name": "GPS Time",
"icon": "gpstime.png",
- "version":"0.03",
+ "version":"0.04",
"description": "Update the Bangle.js's clock based on the time from the GPS receiver",
"tags": "tool,gps",
"storage": [
@@ -239,7 +333,7 @@
{ "id": "speedo",
"name": "Speedo",
"icon": "speedo.png",
- "version":"0.01",
+ "version":"0.04",
"description": "Show the current speed according to the GPS",
"tags": "tool,outdoors,gps",
"storage": [
@@ -250,29 +344,49 @@
{ "id": "gpsrec",
"name": "GPS Recorder",
"icon": "app.png",
- "version":"0.06",
+ "version":"0.11",
"interface": "interface.html",
"description": "Application that allows you to record a GPS track. Can run in background",
"tags": "tool,outdoors,gps,widget",
"storage": [
{"name":"gpsrec.app.js","url":"app.js"},
- {"name":"gpsrec.json","url":"app-settings.json","evaluate":true},
{"name":"gpsrec.img","url":"app-icon.js","evaluate":true},
{"name":"gpsrec.wid.js","url":"widget.js"}
+ ],
+ "data": [
+ {"name":"gpsrec.json"},
+ {"wildcard":".gpsrc?","storageFile": true}
+ ]
+ },
+ { "id": "gpsnav",
+ "name": "GPS Navigation",
+ "icon": "icon.png",
+ "version":"0.03",
+ "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording, now with waypoint editor",
+ "tags": "tool,outdoors,gps",
+ "readme": "README.md",
+ "interface":"waypoints.html",
+ "storage": [
+ {"name":"gpsnav.app.js","url":"app.js"},
+ {"name":"waypoints.json","url":"waypoints.json","evaluate":false},
+ {"name":"gpsnav.img","url":"app-icon.js","evaluate":true}
]
},
{ "id": "heart",
"name": "Heart Rate Recorder",
"icon": "app.png",
- "version":"0.01",
+ "version":"0.02",
"interface": "interface.html",
"description": "Application that allows you to record your heart rate. Can run in background",
"tags": "tool,health,widget",
"storage": [
{"name":"heart.app.js","url":"app.js"},
- {"name":"heart.json","url":"app-settings.json","evaluate":true},
{"name":"heart.img","url":"app-icon.js","evaluate":true},
{"name":"heart.wid.js","url":"widget.js"}
+ ],
+ "data": [
+ {"name":"heart.json"},
+ {"wildcard":".heart?","storageFile": true}
]
},
{ "id": "slevel",
@@ -289,18 +403,36 @@
{ "id": "files",
"name": "App Manager",
"icon": "files.png",
- "version":"0.01",
+ "version":"0.06",
"description": "Show currently installed apps, free space, and allow their deletion from the watch",
- "tags": "tool,system",
+ "tags": "tool,system,files",
"storage": [
{"name":"files.app.js","url":"files.js"},
{"name":"files.img","url":"files-icon.js","evaluate":true}
]
},
+ { "id": "weather",
+ "name": "Weather",
+ "icon": "icon.png",
+ "version":"0.03",
+ "description": "Show Gadgetbridge weather report",
+ "readme": "readme.md",
+ "tags": "widget,outdoors",
+ "storage": [
+ {"name":"weather.app.js","url":"app.js"},
+ {"name":"weather.wid.js","url":"widget.js"},
+ {"name":"weather","url":"lib.js"},
+ {"name":"weather.img","url":"icon.js","evaluate":true},
+ {"name":"weather.settings.js","url":"settings.js"}
+ ],
+ "data": [
+ {"name": "weather.json"}
+ ]
+ },
{ "id": "widbat",
"name": "Battery Level Widget",
"icon": "widget.png",
- "version":"0.04",
+ "version":"0.05",
"description": "Show the current battery level and charging status in the top right of the clock",
"tags": "widget,battery",
"type":"widget",
@@ -308,10 +440,26 @@
{"name":"widbat.wid.js","url":"widget.js"}
]
},
+ { "id": "widbatpc",
+ "name": "Battery Level Widget (with percentage)",
+ "shortName": "Battery Widget",
+ "icon": "widget.png",
+ "version":"0.11",
+ "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage",
+ "tags": "widget,battery",
+ "type":"widget",
+ "storage": [
+ {"name":"widbatpc.wid.js","url":"widget.js"},
+ {"name":"widbatpc.settings.js","url":"settings.js"}
+ ],
+ "data": [
+ {"name":"widbatpc.json"}
+ ]
+ },
{ "id": "widbt",
"name": "Bluetooth Widget",
"icon": "widget.png",
- "version":"0.03",
+ "version":"0.04",
"description": "Show the current Bluetooth connection status in the top right of the clock",
"tags": "widget,bluetooth",
"type":"widget",
@@ -319,6 +467,18 @@
{"name":"widbt.wid.js","url":"widget.js"}
]
},
+ { "id": "widram",
+ "name": "RAM Widget",
+ "shortName":"RAM Widget",
+ "icon": "widget.png",
+ "version":"0.01",
+ "description": "Display your Bangle's available RAM percentage in a widget",
+ "tags": "widget",
+ "type": "widget",
+ "storage": [
+ {"name":"widram.wid.js","url":"widget.js"}
+ ]
+ },
{ "id": "hrm",
"name": "Heart Rate Monitor",
"icon": "heartrate.png",
@@ -355,10 +515,12 @@
{ "id": "swatch",
"name": "Stopwatch",
"icon": "stopwatch.png",
- "version":"0.01",
- "description": "Simple stopwatch with Lap Time recording",
+ "version":"0.07",
+ "interface": "interface.html",
+ "description": "Simple stopwatch with Lap Time logging to a JSON file",
"tags": "health",
"allow_emulator":true,
+ "readme": "README.md",
"storage": [
{"name":"swatch.app.js","url":"stopwatch.js"},
{"name":"swatch.img","url":"stopwatch-icon.js","evaluate":true}
@@ -368,7 +530,7 @@
"name": "Bluetooth Music Controls",
"shortName": "Music Control",
"icon": "hid-music.png",
- "version":"0.01",
+ "version":"0.02",
"description": "Enable HID in settings, pair with your phone, then use this app to control music from your watch!",
"tags": "bluetooth",
"storage": [
@@ -380,7 +542,7 @@
"name": "Bluetooth Keyboard",
"shortName": "Bluetooth Kbd",
"icon": "hid-keyboard.png",
- "version":"0.01",
+ "version":"0.02",
"description": "Enable HID in settings, pair with your phone/PC, then use this app to control other apps",
"tags": "bluetooth",
"storage": [
@@ -392,7 +554,7 @@
"name": "Binary Bluetooth Keyboard",
"shortName": "Binary BT Kbd",
"icon": "hid-binary-keyboard.png",
- "version":"0.01",
+ "version":"0.02",
"description": "Enable HID in settings, pair with your phone/PC, then type messages using the onscreen keyboard by tapping repeatedly on the key you want",
"tags": "bluetooth",
"storage": [
@@ -421,56 +583,60 @@
},
{ "id": "qrcode",
"name": "Custom QR Code",
- "icon": "qrcode.png",
- "version":"0.01",
+ "icon": "app.png",
+ "version":"0.02",
"description": "Use this to upload a customised QR code to Bangle.js",
- "tags": "",
- "custom": "qrcode.html",
+ "tags": "qrcode",
+ "custom": "custom.html",
"storage": [
{"name":"qrcode.app.js"},
- {"name":"qrcode.img"}
+ {"name":"qrcode.img","url":"app-icon.js","evaluate":true}
]
},
{ "id": "beer",
"name": "Beer Compass",
- "icon": "beercompass.png",
+ "icon": "app.png",
"version":"0.01",
"description": "Uploads all the pubs in an area onto your watch, so it can always point you at the nearest one",
"tags": "",
- "custom": "beercompass.html",
+ "custom": "custom.html",
"storage": [
{"name":"beer.app.js"},
- {"name":"beer.img"}
+ {"name":"beer.img","url":"app-icon.js","evaluate":true}
]
},
{ "id": "route",
"name": "Route Viewer",
- "icon": "route.png",
+ "icon": "app.png",
"version":"0.01",
"description": "Upload a KML file of a route, and have your watch display a map with how far around it you are",
"tags": "",
- "custom": "route.html",
+ "custom": "custom.html",
"storage": [
{"name":"route.app.js"},
- {"name":"route.img"}
+ {"name":"route.img","url":"app-icon.js","evaluate":true}
]
},
{
"id": "ncstart",
"name": "NCEU Startup",
"icon": "start.png",
- "version":"0.02",
+ "version":"0.06",
"description": "NodeConfEU 2019 'First Start' Sequence",
"tags": "start,welcome",
"storage": [
- {"name":"welcome.js","url":"welcome.js"},
{"name":"ncstart.app.js","url":"start.js"},
+ {"name":"ncstart.boot.js","url":"boot.js"},
+ {"name":"ncstart.settings.js","url":"settings.js"},
{"name":"ncstart.img","url":"start-icon.js","evaluate":true},
{"name":"nc-bangle.img","url":"start-bangle.js","evaluate":true},
{"name":"nc-nceu.img","url":"start-nceu.js","evaluate":true},
{"name":"nc-nfr.img","url":"start-nfr.js","evaluate":true},
{"name":"nc-nodew.img","url":"start-nodew.js","evaluate":true},
{"name":"nc-tf.img","url":"start-tf.js","evaluate":true}
+ ],
+ "data": [
+ {"name":"ncstart.json"}
]
},
{ "id": "ncfrun",
@@ -508,6 +674,32 @@
{"name":"sclock.img","url":"clock-simple-icon.js","evaluate":true}
]
},
+ { "id": "svclock",
+ "name": "Simple V-Clock",
+ "icon": "vclock-simple.png",
+ "version":"0.01",
+ "description": "Modification of Simple Clock 0.04 to use Vectorfont",
+ "tags": "clock",
+ "type":"clock",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"svclock.app.js","url":"vclock-simple.js"},
+ {"name":"svclock.img","url":"vclock-simple-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "dclock",
+ "name": "Dev Clock",
+ "icon": "clock-dev.png",
+ "version":"0.09",
+ "description": "A Digital Clock including timestamp (tst), beats(@), days in current month (dm) and days since new moon (l)",
+ "tags": "clock",
+ "type":"clock",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"dclock.app.js","url":"clock-dev.js"},
+ {"name":"dclock.img","url":"clock-dev-icon.js","evaluate":true}
+ ]
+ },
{ "id": "gesture",
"name": "Gesture Test",
"icon": "gesture.png",
@@ -611,7 +803,7 @@
{ "id": "miclock",
"name": "Mixed Clock",
"icon": "clock-mixed.png",
- "version":"0.03",
+ "version":"0.04",
"description": "A mix of analog and digital Clock",
"tags": "clock",
"type":"clock",
@@ -650,7 +842,7 @@
{ "id": "flappy",
"name": "Flappy Bird",
"icon": "app.png",
- "version":"0.03",
+ "version":"0.04",
"description": "A Flappy Bird game clone",
"tags": "game",
"allow_emulator":true,
@@ -663,7 +855,7 @@
"id": "gpsinfo",
"name": "GPS Info",
"icon": "gps-info.png",
- "version":"0.02",
+ "version":"0.03",
"description": "An application that displays information about altitude, lat/lon, satellites and time",
"tags": "gps",
"type": "app",
@@ -690,7 +882,7 @@
"name": "Large Digit Blob Clock",
"shortName" : "Blob Clock",
"icon": "clock-blob.png",
- "version":"0.03",
+ "version":"0.04",
"description": "A clock with big digits",
"tags": "clock",
"type":"clock",
@@ -703,7 +895,7 @@
{ "id": "boldclk",
"name": "Bold Clock",
"icon": "bold_clock.png",
- "version":"0.02",
+ "version":"0.03",
"description": "Simple, readable and practical clock",
"tags": "clock",
"type":"clock",
@@ -716,7 +908,7 @@
{ "id": "widclk",
"name": "Digital clock widget",
"icon": "widget.png",
- "version":"0.03",
+ "version":"0.04",
"description": "A simple digital clock widget",
"tags": "widget,clock",
"type":"widget",
@@ -727,18 +919,19 @@
{ "id": "widpedom",
"name": "Pedometer widget",
"icon": "widget.png",
- "version":"0.08",
+ "version":"0.10",
"description": "Daily pedometer widget",
"tags": "widget",
"type":"widget",
"storage": [
- {"name":"widpedom.wid.js","url":"widget.js"}
+ {"name":"widpedom.wid.js","url":"widget.js"},
+ {"name":"widpedom.settings.js","url":"settings.js"}
]
},
{ "id": "berlinc",
"name": "Berlin Clock",
"icon": "berlin-clock.png",
- "version":"0.02",
+ "version":"0.03",
"description": "Berlin Clock (see https://en.wikipedia.org/wiki/Mengenlehreuhr)",
"tags": "clock",
"type":"clock",
@@ -779,6 +972,7 @@
"name": "Espruino Flag Raiser",
"icon": "app.png",
"version":"0.01",
+ "readme": "README.md",
"description": "App to send a command to another Espruino to cause it to raise a flag",
"tags": "",
"storage": [
@@ -790,7 +984,7 @@
"id": "pipboy",
"name": "Pipboy",
"icon": "app.png",
- "version": "0.01",
+ "version": "0.03",
"description": "Pipboy themed clock",
"tags": "clock",
"type":"clock",
@@ -804,8 +998,8 @@
"name": "Torch",
"shortName":"Torch",
"icon": "app.png",
- "version":"0.01",
- "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN3 four times in quick succession to start when in normal clock mode",
+ "version":"0.02",
+ "description": "Turns screen white to help you see in the dark. Select from the launcher or press BTN1,BTN3,BTN1,BTN3 quickly to start when in any app that shows widgets",
"tags": "tool,torch",
"storage": [
{"name":"torch.app.js","url":"app.js"},
@@ -813,6 +1007,20 @@
{"name":"torch.img","url":"app-icon.js","evaluate":true}
]
},
+ { "id": "wohrm",
+ "name": "Workout HRM",
+ "icon": "app.png",
+ "version":"0.07",
+ "readme": "README.md",
+ "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.",
+ "tags": "hrm,workout",
+ "type": "app",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"wohrm.app.js","url":"app.js"},
+ {"name":"wohrm.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
{ "id": "widid",
"name": "Bluetooth ID Widget",
"icon": "widget.png",
@@ -823,5 +1031,1045 @@
"storage": [
{"name":"widid.wid.js","url":"widget.js"}
]
+ },
+ {
+ "id": "grocery",
+ "name": "Grocery",
+ "icon": "grocery.png",
+ "version":"0.01",
+ "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.",
+ "tags": "tool,outdoors,shopping,list",
+ "type": "app",
+ "custom":"grocery.html",
+ "storage": [
+ {"name":"grocery"},
+ {"name":"grocery.app.js"},
+ {"name":"grocery.img","url":"grocery-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "marioclock",
+ "name": "Mario Clock",
+ "icon": "marioclock.png",
+ "version":"0.13",
+ "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.",
+ "tags": "clock,mario,retro",
+ "type": "clock",
+ "allow_emulator":false,
+ "readme": "README.md",
+ "storage": [
+ {"name":"marioclock.app.js","url":"marioclock-app.js"},
+ {"name":"marioclock.img","url":"marioclock-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "cliock",
+ "name": "Commandline-Clock",
+ "shortName":"CLI-Clock",
+ "icon": "app.png",
+ "version":"0.08",
+ "description": "Simple CLI-Styled Clock",
+ "tags": "clock,cli,command,bash,shell",
+ "type":"clock",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"cliock.app.js","url":"app.js"},
+ {"name":"cliock.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "widver",
+ "name": "Firmware Version Widget",
+ "icon": "widget.png",
+ "version":"0.01",
+ "description": "Display the version of the installed firmware in the top widget section.",
+ "tags": "widget,tool,system",
+ "type":"widget",
+ "storage": [
+ {"name":"widver.wid.js","url":"widget.js"}
+ ]
+ },
+ { "id": "barclock",
+ "name": "Bar Clock",
+ "icon": "clock-bar.png",
+ "version":"0.05",
+ "description": "A simple digital clock showing seconds as a bar",
+ "tags": "clock",
+ "type":"clock",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"barclock.app.js","url":"clock-bar.js"},
+ {"name":"barclock.img","url":"clock-bar-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "dotclock",
+ "name": "Dot Clock",
+ "icon": "clock-dot.png",
+ "version":"0.01",
+ "description": "A Minimal Dot Analog Clock",
+ "tags": "clock",
+ "type":"clock",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"dotclock.app.js","url":"clock-dot.js"},
+ {"name":"dotclock.img","url":"clock-dot-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "widtbat",
+ "name": "Tiny Battery Widget",
+ "icon": "widget.png",
+ "version":"0.01",
+ "description": "Tiny blueish battery widget, vibs and changes level color when charging",
+ "tags": "widget,tool,system",
+ "type":"widget",
+ "storage": [
+ {"name":"widtbat.wid.js","url":"widget.js"}
+ ]
+ },
+ { "id": "chrono",
+ "name": "Chrono",
+ "shortName":"Chrono",
+ "icon": "chrono.png",
+ "version":"0.01",
+ "description": "Single click BTN1 to add 5 minutes. Single click BTN2 to add 30 seconds. Single click BTN3 to add 5 seconds. Tap to pause or play to timer. Double click BTN1 to reset. When timer finishes the watch vibrates.",
+ "tags": "Tools",
+ "storage": [
+ {"name":"chrono.app.js","url":"chrono.js"},
+ {"name":"chrono.img","url":"chrono-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "astrocalc",
+ "name": "Astrocalc",
+ "icon": "astrocalc.png",
+ "version":"0.02",
+ "description": "Calculates interesting information on the sun and moon cycles for the current day based on your location.",
+ "tags": "app,sun,moon,cycles,tool,outdoors",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"astrocalc.app.js","url":"astrocalc-app.js"},
+ {"name":"suncalc.js","url":"suncalc.js"},
+ {"name":"astrocalc.img","url":"astrocalc-icon.js","evaluate":true},
+ {"name":"first-quarter.img","url":"first-quarter-icon.js","evaluate":true},
+ {"name":"last-quarter.img","url":"last-quarter-icon.js","evaluate":true},
+ {"name":"waning-crescent.img","url":"waning-crescent-icon.js","evaluate":true},
+ {"name":"waning-gibbous.img","url":"waning-gibbous-icon.js","evaluate":true},
+ {"name":"full.img","url":"full-icon.js","evaluate":true},
+ {"name":"new.img","url":"new-icon.js","evaluate":true},
+ {"name":"waxing-gibbous.img","url":"waxing-gibbous-icon.js","evaluate":true},
+ {"name":"waxing-crescent.img","url":"waxing-crescent-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "widhwt",
+ "name": "Hand Wash Timer",
+ "icon": "widget.png",
+ "version":"0.01",
+ "description": "Swipe your wrist over the watch face to start your personal Bangle.js hand wash timer for 35 sec. Start washing after the short buzz and stop after the long buzz.",
+ "tags": "widget,tool",
+ "type":"widget",
+ "storage": [
+ {"name":"widhwt.wid.js","url":"widget.js"}
+ ]
+ },
+ { "id": "toucher",
+ "name": "Touch Launcher",
+ "shortName":"Toucher",
+ "icon": "app.png",
+ "version":"0.06",
+ "description": "Touch enable left to right launcher.",
+ "tags": "tool,system,launcher",
+ "type":"launch",
+ "data": [
+ {"name":"toucher.json"}
+ ],
+ "storage": [
+ {"name":"toucher.app.js","url":"app.js"},
+ {"name":"toucher.settings.js","url":"settings.js"}
+ ],
+ "sortorder" : -10
+ },
+ {
+ "id": "balltastic",
+ "name": "Balltastic",
+ "icon": "app.png",
+ "version": "0.01",
+ "description": "Simple but fun ball eats dots game.",
+ "tags": "game,fun",
+ "type": "app",
+ "storage": [
+ {"name":"balltastic.app.js","url":"app.js"},
+ {"name":"balltastic.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "rpgdice",
+ "name": "RPG dice",
+ "icon": "rpgdice.png",
+ "version": "0.01",
+ "description": "Simple RPG dice rolling app.",
+ "tags": "game,fun",
+ "type": "app",
+ "allow_emulator": true,
+ "storage": [
+ {"name":"rpgdice.app.js","url": "app.js"},
+ {"name":"rpgdice.img","url": "app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "widmp",
+ "name": "Moon Phase Widget",
+ "icon": "widget.png",
+ "version":"0.01",
+ "description": "Display the current moon phase in blueish for the northern hemisphere in eight phases",
+ "tags": "widget,tools",
+ "type":"widget",
+ "storage": [
+ {"name":"widmp.wid.js","url":"widget.js"}
+ ]
+ },
+ { "id": "minionclk",
+ "name": "Minion clock",
+ "icon": "minionclk.png",
+ "version": "0.02",
+ "description": "Minion themed clock.",
+ "tags": "clock,minion",
+ "type": "clock",
+ "allow_emulator": true,
+ "storage": [
+ {"name":"minionclk.app.js","url":"app.js"},
+ {"name":"minionclk.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "openstmap",
+ "name": "OpenStreetMap",
+ "shortName":"OpenStMap",
+ "icon": "app.png",
+ "version":"0.03",
+ "description": "[BETA] Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are",
+ "tags": "outdoors,gps",
+ "custom": "custom.html",
+ "storage": [
+ {"name":"openstmap.app.js","url":"app.js"},
+ {"name":"openstmap.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "activepedom",
+ "name": "Active Pedometer",
+ "shortName":"Active Pedometer",
+ "icon": "app.png",
+ "version":"0.04",
+ "description": "Pedometer that filters out arm movement and displays a step goal progress. Steps are saved to a daily file and can be viewed as graph.",
+ "tags": "outdoors,widget",
+ "readme": "README.md",
+ "storage": [
+ {"name":"activepedom.wid.js","url":"widget.js"},
+ {"name":"activepedom.settings.js","url":"settings.js"},
+ {"name":"activepedom.img","url":"app-icon.js","evaluate":true},
+ {"name":"activepedom.app.js","url":"app.js"}
+ ]
+ },
+ { "id": "chronowid",
+ "name": "Chrono Widget",
+ "shortName":"Chrono Widget",
+ "icon": "app.png",
+ "version":"0.03",
+ "description": "Chronometer (timer) which runs as widget.",
+ "tags": "tools,widget",
+ "readme": "README.md",
+ "storage": [
+ {"name":"chronowid.wid.js","url":"widget.js"},
+ {"name":"chronowid.app.js","url":"app.js"},
+ {"name":"chronowid.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "tabata",
+ "name": "Tabata",
+ "shortName": "Tabata - Control High-Intensity Interval Training",
+ "icon": "tabata.png",
+ "version":"0.01",
+ "description": "Control high-intensity interval training (according to tabata: https://en.wikipedia.org/wiki/Tabata_method).",
+ "tags": "workout,health",
+ "storage": [
+ {"name":"tabata.app.js","url":"tabata.js"},
+ {"name":"tabata.img","url":"tabata-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "custom",
+ "name": "Custom Boot Code ",
+ "icon": "custom.png",
+ "version":"0.01",
+ "description": "Add code you want to run at boot time",
+ "tags": "tool,system",
+ "type": "bootloader",
+ "custom":"custom.html",
+ "storage": [
+ {"name":"custom"}
+ ]
+ },
+ { "id": "devstopwatch",
+ "name": "Dev Stopwatch",
+ "shortName":"Dev Stopwatch",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "Stopwatch with 5 laps supported (cyclically replaced)",
+ "tags": "stopwatch, chrono, timer, chronometer",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"devstopwatch.app.js","url":"app.js"},
+ {"name":"devstopwatch.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "batchart",
+ "name": "Battery Chart",
+ "shortName":"Battery Chart",
+ "icon": "app.png",
+ "version":"0.10",
+ "readme": "README.md",
+ "description": "A widget and an app for recording and visualizing battery percentage over time.",
+ "tags": "app,widget,battery,time,record,chart,tool",
+ "storage": [
+ {"name":"batchart.wid.js","url":"widget.js"},
+ {"name":"batchart.app.js","url":"app.js"},
+ {"name":"batchart.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "nato",
+ "name": "NATO Alphabet",
+ "shortName" : "NATOAlphabet",
+ "icon": "nato.png",
+ "version":"0.01",
+ "type": "app",
+ "description": "Learn the NATO Phonetic alphabet plus some numbers.",
+ "tags": "app,learn,visual",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"nato.app.js","url":"nato.js"},
+ {"name":"nato.img","url":"nato-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "numerals",
+ "name": "Numerals Clock",
+ "shortName": "Numerals Clock",
+ "icon": "numerals.png",
+ "version":"0.08",
+ "description": "A simple big numerals clock",
+ "tags": "numerals,clock",
+ "type":"clock",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"numerals.app.js","url":"numerals.app.js"},
+ {"name":"numerals.img","url":"numerals-icon.js","evaluate":true},
+ {"name":"numerals.settings.js","url":"numerals.settings.js"}
+ ],
+ "data":[
+ {"name":"numerals.json"}
+ ]
+ },
+ { "id": "bledetect",
+ "name": "BLE Detector",
+ "shortName":"BLE Detector",
+ "icon": "bledetect.png",
+ "version":"0.02",
+ "description": "Detect BLE devices and show some informations.",
+ "tags": "app,bluetooth,tool",
+ "readme": "README.md",
+ "storage": [
+ {"name":"bledetect.app.js","url":"bledetect.js"},
+ {"name":"bledetect.img","url":"bledetect-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "snake",
+ "name": "Snake",
+ "shortName":"Snake",
+ "icon": "snake.png",
+ "version":"0.02",
+ "description": "The classic snake game. Eat apples and don't bite your tail.",
+ "tags": "game,fun",
+ "readme": "README.md",
+ "storage": [
+ {"name":"snake.app.js","url":"snake.js"},
+ {"name":"snake.img","url":"snake-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "calculator",
+ "name": "Calculator",
+ "shortName":"Calculator",
+ "icon": "calculator.png",
+ "version":"0.02",
+ "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.",
+ "tags": "app,tool",
+ "storage": [
+ {"name":"calculator.app.js","url":"app.js"},
+ {"name":"calculator.img","url":"calculator-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "dane",
+ "name": "Digital Assistant, not EDITH",
+ "shortName": "DANE",
+ "icon": "app.png",
+ "version": "0.07",
+ "description": "A Watchface inspired by Tony Stark's EDITH",
+ "tags": "clock",
+ "type": "clock",
+ "allow_emulator": true,
+ "storage": [
+ {
+ "name": "dane.app.js",
+ "url": "app.js"
+ },
+ {
+ "name": "dane.img",
+ "url": "app-icon.js",
+ "evaluate": true
+ }
+ ]
+ },
+ {
+ "id": "buffgym",
+ "name": "BuffGym",
+ "icon": "buffgym.png",
+ "version":"0.02",
+ "description": "BuffGym is the famous 5x5 workout program for the BangleJS",
+ "tags": "tool,outdoors,gym,exercise",
+ "type": "app",
+ "interface": "buffgym.html",
+ "allow_emulator": false,
+ "readme": "README.md",
+ "storage": [
+ {"name":"buffgym.app.js", "url": "buffgym.app.js"},
+ {"name":"buffgym-set.js","url":"buffgym-set.js"},
+ {"name":"buffgym-exercise.js","url":"buffgym-exercise.js"},
+ {"name":"buffgym-workout.js","url":"buffgym-workout.js"},
+ {"name":"buffgym-workout-a.json","url":"buffgym-workout-a.json"},
+ {"name":"buffgym-workout-b.json","url":"buffgym-workout-b.json"},
+ {"name":"buffgym-workout-index.json","url":"buffgym-workout-index.json"},
+ {"name":"buffgym.img","url":"buffgym-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "banglerun",
+ "name": "BangleRun",
+ "shortName": "BangleRun",
+ "icon": "banglerun.png",
+ "version": "0.02",
+ "description": "An app for running sessions.",
+ "tags": "run,running,fitness,outdoors",
+ "allow_emulator": false,
+ "storage": [
+ {
+ "name": "banglerun.app.js",
+ "url": "app.js"
+ },
+ {
+ "name": "banglerun.img",
+ "url": "app-icon.js",
+ "evaluate": true
+ }
+ ]
+ },
+ {
+ "id": "metronome",
+ "name": "Metronome",
+ "icon": "metronome_icon.png",
+ "version": "0.06",
+ "readme": "README.md",
+ "description": "Makes the watch blinking and vibrating with a given rate",
+ "tags": "tool",
+ "allow_emulator": true,
+ "storage": [
+ {
+ "name": "metronome.app.js",
+ "url": "metronome.js"
+ },
+ {
+ "name": "metronome.img",
+ "url": "metronome-icon.js",
+ "evaluate": true
+ },
+ {"name":"metronome.settings.js","url":"settings.js"}
+ ]
+ },
+ { "id": "blackjack",
+ "name": "Black Jack game",
+ "shortName":"Black Jack game",
+ "icon": "blackjack.png",
+ "version":"0.01",
+ "description": "Simple implementation of card game Black Jack",
+ "tags": "game",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"blackjack.app.js","url":"blackjack.app.js"},
+ {"name":"blackjack.img","url":"blackjack-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "hidcam",
+ "name": "Camera shutter",
+ "shortName":"Cam shutter",
+ "icon": "app.png",
+ "version":"0.03",
+ "description": "Enable HID, connect to your phone, start your camera and trigger the shot on your Bangle",
+ "readme": "README.md",
+ "tags": "bluetooth,tool",
+ "storage": [
+ {"name":"hidcam.app.js","url":"app.js"},
+ {"name":"hidcam.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "rclock",
+ "name": "Round clock with seconds, minutes and date",
+ "shortName":"Round Clock",
+ "icon": "app.png",
+ "version":"0.03",
+ "description": "Designed round clock with ticks for minutes and seconds and heart rate indication",
+ "tags": "clock",
+ "type": "clock",
+ "storage": [
+ {"name":"rclock.app.js","url":"rclock.app.js"},
+ {"name":"rclock.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "hamloc",
+ "name": "QTH Locator / Maidenhead Locator System",
+ "shortName": "QTH Locator",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "Convert your current GPS location to the Maidenhead locator system used by HAM amateur radio operators",
+ "tags": "tool,outdoors,gps",
+ "readme": "README.md",
+ "storage": [
+ {"name":"hamloc.app.js","url":"app.js"},
+ {"name":"hamloc.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "osmpoi",
+ "name": "POI Compass",
+ "icon": "app.png",
+ "version":"0.03",
+ "description": "Uploads all the points of interest in an area onto your watch, same as Beer Compass with more p.o.i.",
+ "tags": "tool,outdoors,gps",
+ "readme": "README.md",
+ "custom": "custom.html",
+ "storage": [
+ {"name":"osmpoi.app.js"},
+ {"name":"osmpoi.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "pong",
+ "name": "Pong",
+ "shortName": "Pong",
+ "icon": "pong.png",
+ "version": "0.03",
+ "description": "A clone of the Atari game Pong",
+ "tags": "game",
+ "type": "app",
+ "allow_emulator": true,
+ "readme": "README.md",
+ "storage": [
+ {"name":"pong.app.js","url":"app.js"},
+ {"name":"pong.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "ballmaze",
+ "name": "Ball Maze",
+ "icon": "icon.png",
+ "version": "0.01",
+ "description": "Navigate a ball through a maze by tilting your watch.",
+ "readme": "README.md",
+ "tags": "game",
+ "type": "app",
+ "storage": [
+ {"name": "ballmaze.app.js","url":"app.js"},
+ {"name": "ballmaze.img","url":"icon.js","evaluate": true}
+ ],
+ "data": [
+ {"name": "ballmaze.json"}
+ ]
+ },
+ {
+ "id": "calendar",
+ "name": "Calendar",
+ "icon": "calendar.png",
+ "version": "0.01",
+ "description": "Simple calendar",
+ "tags": "calendar",
+ "readme": "README.md",
+ "allow_emulator": true,
+ "storage": [
+ {
+ "name": "calendar.app.js",
+ "url": "calendar.js"
+ },
+ {
+ "name": "calendar.img",
+ "url": "calendar-icon.js",
+ "evaluate": true
+ }
+ ]
+ },
+ { "id": "hidjoystick",
+ "name": "Bluetooth Joystick",
+ "shortName": "Joystick",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "Emulates a 2 axis/5 button Joystick using the accelerometer as stick input and buttons 1-3, touch left as button 4 and touch right as button 5.",
+ "tags": "bluetooth",
+ "storage": [
+ {"name":"hidjoystick.app.js","url":"app.js"},
+ {"name":"hidjoystick.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "largeclock",
+ "name": "Large Clock",
+ "icon": "largeclock.png",
+ "version": "0.06",
+ "description": "A readable and informational digital watch, with date, seconds and moon phase",
+ "readme": "README.md",
+ "tags": "clock",
+ "type": "clock",
+ "allow_emulator": true,
+ "storage": [
+ {
+ "name": "largeclock.app.js",
+ "url": "largeclock.js"
+ },
+ {
+ "name": "largeclock.img",
+ "url": "largeclock-icon.js",
+ "evaluate": true
+ },
+ {
+ "name": "largeclock.settings.js",
+ "url": "settings.js"
+ }
+ ],
+ "data": [
+ {"name":"largeclock.json"}
+ ]
+ },
+ { "id": "smtswch",
+ "name": "Smart Switch",
+ "shortName":"Smart Switch",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "Using EspruinoHub, control your smart devices on and off via Bluetooth Low Energy!",
+ "tags": "bluetooth,btle,smart,switch",
+ "type": "app",
+ "readme": "README.md",
+ "storage": [
+ {"name":"smtswch.app.js","url":"app.js"},
+ {"name":"smtswch.img","url":"app-icon.js","evaluate":true},
+ {"name":"light-on.img","url":"light-on.js","evaluate":true},
+ {"name":"light-off.img","url":"light-off.js","evaluate":true},
+ {"name":"switch-on.img","url":"switch-on.js","evaluate":true},
+ {"name":"switch-off.img","url":"switch-off.js","evaluate":true}
+ ]
+ },
+ { "id": "miplant",
+ "name": "Xiaomi Plant Sensor",
+ "shortName":"Mi Plant",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "Reads and displays data from Xiaomi bluetooth plant moisture sensors",
+ "tags": "xiaomi,mi,plant,ble,bluetooth",
+ "storage": [
+ {"name":"miplant.app.js","url":"app.js"},
+ {"name":"miplant.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "simpletimer",
+ "name": "Timer",
+ "icon": "app.png",
+ "version": "0.04",
+ "description": "Simple timer, useful when playing board games or cooking",
+ "tags": "timer",
+ "readme": "README.md",
+ "allow_emulator": true,
+ "storage": [
+ {
+ "name": "simpletimer.app.js",
+ "url": "app.js"
+ },
+ {
+ "name": ".tfnames",
+ "url": "gesture-tfnames.js",
+ "evaluate": true
+ },
+ {
+ "name": ".tfmodel",
+ "url": "gesture-tfmodel.js",
+ "evaluate": true
+ },
+ {
+ "name": "simpletimer.img",
+ "url": "app-icon.js",
+ "evaluate": true
+ }
+ ],
+ "data": [
+ {
+ "name": "simpletimer.json"
+ }
+ ]
+ },
+ {
+ "id": "beebclock",
+ "name": "Beeb Clock",
+ "icon": "beebclock.png",
+ "version":"0.02",
+ "description": "Clock face that may be coincidentally familiar to BBC viewers",
+ "tags": "clock",
+ "type": "clock",
+ "allow_emulator": true,
+ "storage": [
+ {"name":"beebclock.app.js","url":"beebclock.js"},
+ {"name":"beebclock.img","url":"beebclock-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "findphone",
+ "name": "Find Phone",
+ "shortName":"Find Phone",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "Find your phone via Gadgetbridge. Click any button to let your phone ring. 📳",
+ "tags": "tool,android",
+ "readme": "README.md",
+ "allow_emulator": true,
+ "storage": [
+ {"name":"findphone.app.js","url":"app.js"},
+ {"name":"findphone.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "getup",
+ "name": "Get Up",
+ "shortName":"Get Up",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "Reminds you to getup every x minutes. Sitting to long is dangerous!",
+ "tags": "tools,health",
+ "readme": "README.md",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"getup.app.js","url":"app.js"},
+ {"name":"getup.settings.js","url":"settings.js"},
+ {"name":"getup.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "gallifr",
+ "name": "Time Traveller's Chronometer",
+ "shortName": "Time Travel Clock",
+ "icon": "gallifr.png",
+ "version": "0.01",
+ "description": "A clock for time travellers. The light pie segment shows the minutes, the black circle, the hour. The dial itself reads 'time' just in case you forget.",
+ "tags": "clock",
+ "readme": "README.md",
+ "type": "clock",
+ "allow_emulator":true,
+ "storage": [
+ { "name": "gallifr.app.js", "url": "app.js" },
+ { "name": "gallifr.img", "url": "app-icon.js", "evaluate": true },
+ { "name": "gallifr.settings.js", "url": "settings.js" }
+ ],
+ "data": [
+ {"name":"gallifr.json"}
+ ]
+ },
+ { "id": "rndmclk",
+ "name": "Random Clock Loader",
+ "icon": "rndmclk.png",
+ "version":"0.03",
+ "description": "Load a different clock whenever the LCD is switched on.",
+ "readme": "README.md",
+ "tags": "widget,clock",
+ "type":"widget",
+ "storage": [
+ {"name":"rndmclk.wid.js","url":"widget.js"}
+ ]
+ },
+ { "id": "dotmatrixclock",
+ "name": "Dotmatrix Clock",
+ "icon": "dotmatrixclock.png",
+ "version":"0.01",
+ "description": "A clear white-on-blue dotmatrix simulated clock",
+ "tags": "clock,dotmatrix,retro",
+ "type": "clock",
+ "allow_emulator":true,
+ "readme": "README.md",
+ "storage": [
+ {"name":"dotmatrixclock.app.js","url":"app.js"},
+ {"name":"dotmatrixclock.img","url":"dotmatrixclock-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "jbm8b",
+ "name": "Magic 8 Ball",
+ "shortName": "Magic 8 Ball",
+ "icon": "app.png",
+ "description": "A simple fortune telling app",
+ "tags": "game",
+ "version": "0.03",
+ "storage": [
+ { "name": "jbm8b.app.js", "url": "app.js" },
+ { "name": "jbm8b.img", "url": "app-icon.js", "evaluate": true }
+ ]
+ },
+ { "id": "BLEcontroller",
+ "name": "BLE Customisable Controller with Joystick",
+ "shortName": "BLE Controller",
+ "icon": "BLEcontroller.png",
+ "version": "0.01",
+ "description": "A configurable controller for BLE devices and robots, with a basic four direction joystick. Designed to be easy to customise so you can add your own menus.",
+ "tags": "tool,bluetooth",
+ "readme": "README.md",
+ "allow_emulator":false,
+ "storage": [
+ { "name": "BLEcontroller.app.js", "url": "app.js" },
+ { "name": "BLEcontroller.img", "url": "app-icon.js", "evaluate": true }
+ ]
+ },
+ { "id": "widviz",
+ "name": "Widget Visibility Widget",
+ "shortName":"Viz Widget",
+ "icon": "eye.png",
+ "version":"0.02",
+ "description": "Swipe left to hide top bar widgets, swipe right to redisplay.",
+ "tags": "widget",
+ "type": "widget",
+ "storage": [
+ {"name":"widviz.wid.js","url":"widget.js"}
+ ]
+ },
+ { "id": "binclock",
+ "name": "Binary Clock",
+ "shortName":"Binary Clock",
+ "icon": "app.png",
+ "version":"0.02",
+ "description": "A binary clock with hours and minutes. BTN1 toggles a digital clock.",
+ "tags": "clock,binary",
+ "type": "clock",
+ "storage": [
+ {"name":"binclock.app.js","url":"app.js"},
+ {"name":"binclock.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "pizzatimer",
+ "name": "Pizza Timer",
+ "shortName":"Pizza Timer",
+ "icon": "pizza.png",
+ "version":"0.01",
+ "description": "A timer app for when you cook Pizza. Some say it can also time other things",
+ "tags": "timer,tool,pizza",
+ "readme": "README.md",
+ "storage": [
+ {"name":"pizzatimer.app.js","url":"app.js"},
+ {"name":"pizzatimer.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "animclk",
+ "name": "Animated Clock",
+ "shortName":"Anim Clock",
+ "icon": "app.png",
+ "version":"0.02",
+ "description": "An animated clock face using Mark Ferrari's amazing 8 bit game art and palette cycling: http://www.markferrari.com/art/8bit-game-art",
+ "tags": "clock,animated",
+ "type": "clock",
+ "storage": [
+ {"name":"animclk.app.js","url":"app.js"},
+ {"name":"animclk.pixels1","url":"animclk.pixels1"},
+ {"name":"animclk.pixels2","url":"animclk.pixels2"},
+ {"name":"animclk.pal","url":"animclk.pal"},
+ {"name":"animclk.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "analogimgclk",
+ "name": "Analog Clock (Image background)",
+ "shortName":"Analog Clock",
+ "icon": "app.png",
+ "version":"0.02",
+ "description": "An analog clock with an image background",
+ "tags": "clock",
+ "type": "clock",
+ "storage": [
+ {"name":"analogimgclk.app.js","url":"app.js"},
+ {"name":"analogimgclk.bg.img","url":"bg.img"},
+ {"name":"analogimgclk.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "verticalface",
+ "name": "Vertical watch face",
+ "shortName":"Vertical Face",
+ "icon": "app.png",
+ "version":"0.05",
+ "description": "A simple vertical watch face with the date.",
+ "tags": "clock",
+ "type":"clock",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"verticalface.app.js","url":"app.js"},
+ {"name":"verticalface.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "sleepphasealarm",
+ "name": "SleepPhaseAlarm",
+ "shortName":"SleepPhaseAlarm",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "Uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments (ESS, see https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en). This app will read the next alarm from the alarm application and will wake you up to 30 minutes early at the best guessed time when you are almost already awake.",
+ "tags": "alarm",
+ "storage": [
+ {"name":"sleepphasealarm.app.js","url":"app.js"},
+ {"name":"sleepphasealarm.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "life",
+ "name": "Game of Life",
+ "icon": "life.png",
+ "version":"0.04",
+ "description": "Conway's Game of Life - 16x16 board",
+ "tags": "game",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"life.app.js","url":"life.min.js"},
+ {"name":"life.img","url":"life-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "magnav",
+ "name": "Navigation Compass",
+ "icon": "magnav.png",
+ "version":"0.03",
+ "description": "Compass with linear display as for GPSNAV. Has Tilt compensation and remembers calibration.",
+ "readme": "README.md",
+ "tags": "tool,outdoors",
+ "storage": [
+ {"name":"magnav.app.js","url":"magnav.min.js"},
+ {"name":"magnav.img","url":"magnav-icon.js","evaluate":true}
+ ],
+ "data":[{"name":"magnav.json"}]
+ },
+ { "id": "gpspoilog",
+ "name": "GPS POI Logger",
+ "shortName":"GPS POI Log",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "A simple app to log points of interest with their GPS coordinates and read them back onto your PC. Based on the https://www.espruino.com/Bangle.js+Storage tutorial",
+ "tags": "outdoors",
+ "interface": "interface.html",
+ "storage": [
+ {"name":"gpspoilog.app.js","url":"app.js"},
+ {"name":"gpspoilog.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "miclock2",
+ "name": "Mixed Clock 2",
+ "icon": "clock-mixed.png",
+ "version":"0.01",
+ "description": "White color variant of the Mixed Clock with thicker clock hands for better readability in the bright sunlight, extra space under the clock for widgets and seconds in the digital clock.",
+ "tags": "clock",
+ "type":"clock",
+ "allow_emulator":true,
+ "storage": [
+ {"name":"miclock2.app.js","url":"clock-mixed.js"},
+ {"name":"miclock2.img","url":"clock-mixed-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "1button",
+ "name": "One-Button-Tracker",
+ "icon": "widget.png",
+ "version":"0.01",
+ "interface": "interface.html",
+ "description": "A widget that turns BTN1 into a tracker, records time of button press/release.",
+ "tags": "tool,quantifiedself,widget",
+ "type": "widget",
+ "readme": "README.md",
+ "storage": [
+ {"name":"1button.wid.js","url":"widget.js"}
+ ],
+ "data": [
+ {"name":"one_button_presses.csv","storageFile": true}
+ ]
+ },
+ { "id": "gpsautotime",
+ "name": "GPS auto time",
+ "shortName":"GPS auto time",
+ "icon": "widget.png",
+ "version":"0.01",
+ "description": "A widget that automatically updates the Bangle.js time to the GPS time whenever there is a valid GPS fix.",
+ "tags": "widget,gps",
+ "type": "widget",
+ "storage": [
+ {"name":"gpsautotime.wid.js","url":"widget.js"}
+ ]
+ },
+ { "id": "espruinoctrl",
+ "name": "Espruino Control",
+ "shortName":"Espruino Ctrl",
+ "icon": "app.png",
+ "version":"0.01",
+ "description": "Send commands to other Espruino devices via the Bluetooth UART interface. Customisable commands!",
+ "tags": "",
+ "readme": "README.md",
+ "custom": "custom.html",
+ "storage": [
+ {"name":"espruinoctrl.app.js"},
+ {"name":"espruinoctrl.img","url":"app-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "multiclock",
+ "name": "Multi Clock",
+ "icon": "multiclock.png",
+ "version":"0.06",
+ "description": "Clock with multiple faces - Big, Analogue, Digital, Text.\n Switch between faces with BT1 & BTN3",
+ "readme": "README.md",
+ "tags": "clock",
+ "type":"clock",
+ "allow_emulator":false,
+ "storage": [
+ {"name":"multiclock.app.js","url":"clock.min.js"},
+ {"name":"big.face.js","url":"big.min.js"},
+ {"name":"ana.face.js","url":"ana.min.js"},
+ {"name":"digi.face.js","url":"digi.min.js"},
+ {"name":"txt.face.js","url":"txt.min.js"},
+ {"name":"multiclock.img","url":"multiclock-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "widancs",
+ "name": "Apple Notification Widget",
+ "shortName":"ANCS Widget",
+ "icon": "widget.png",
+ "version":"0.06",
+ "description": "Displays call, message etc notifications from a paired iPhone. Read README before installation as it only works with compatible apps",
+ "readme": "README.md",
+ "tags": "widget",
+ "type": "widget",
+ "storage": [
+ {"name":"widancs.wid.js","url":"ancs.min.js"},
+ {"name":"widancs.settings.js","url":"settings.js"}
+ ]
+ },
+ {
+ "id": "cprassist",
+ "name":"CPR Assist",
+ "icon":"cprassist-icon.png",
+ "version": "0.01",
+ "readme": "README.md",
+ "description": "Provides assistance while performing a CPR",
+ "tags": "tool,firstaid",
+ "allow_emulator": true,
+ "storage": [
+ {
+ "name": "cprassist.app.js",
+ "url": "cprassist.js"
+ },
+ {
+ "name": "cprassist.img",
+ "url": "cprassist-icon.js",
+ "evaluate": true
+ },
+ {
+ "name": "cprassist.settings.js",
+ "url": "settings.js"
+ }
+ ]
}
]
diff --git a/apps/.eslintrc.json b/apps/.eslintrc.json
new file mode 100644
index 000000000..b8c5408e3
--- /dev/null
+++ b/apps/.eslintrc.json
@@ -0,0 +1,159 @@
+{
+ "env": {
+ // TODO: "espruino": false
+ // TODO: "banglejs": false
+ },
+ "extends": "eslint:recommended",
+ "globals": {
+ // Methods and Fields at https://banglejs.com/reference
+ "Array": "readonly",
+ "ArrayBuffer": "readonly",
+ "ArrayBufferView": "readonly",
+ "Bangle": "readonly",
+ "BluetoothDevice": "readonly",
+ "BluetoothRemoteGATTCharacteristic": "readonly",
+ "BluetoothRemoteGATTServer": "readonly",
+ "BluetoothRemoteGATTService": "readonly",
+ "Boolean": "readonly",
+ "console": "readonly",
+ "DataView": "readonly",
+ "Date": "readonly",
+ "E": "readonly",
+ "Error": "readonly",
+ "Flash": "readonly",
+ "Float32Array": "readonly",
+ "Float64Array": "readonly",
+ "fs": "readonly",
+ "Function": "readonly",
+ "Graphics": "readonly",
+ "heatshrink": "readonly",
+ "I2C": "readonly",
+ "Int16Array": "readonly",
+ "Int32Array": "readonly",
+ "Int8Array": "readonly",
+ "InternalError": "readonly",
+ "JSON": "readonly",
+ "Math": "readonly",
+ "Modules": "readonly",
+ "NRF": "readonly",
+ "Number": "readonly",
+ "Object": "readonly",
+ "OneWire": "readonly",
+ "Pin": "readonly",
+ "process": "readonly",
+ "Promise": "readonly",
+ "ReferenceError": "readonly",
+ "RegExp": "readonly",
+ "Serial": "readonly",
+ "SPI": "readonly",
+ "Storage": "readonly",
+ "StorageFile": "readonly",
+ "String": "readonly",
+ "SyntaxError": "readonly",
+ "tensorflow": "readonly",
+ "TFMicroInterpreter": "readonly",
+ "TypeError": "readonly",
+ "Uint16Array": "readonly",
+ "Uint24Array": "readonly",
+ "Uint32Array": "readonly",
+ "Uint8Array": "readonly",
+ "Uint8ClampedArray": "readonly",
+ "Waveform": "readonly",
+ // Methods and Fields at https://banglejs.com/reference
+ "analogRead": "readonly",
+ "analogWrite": "readonly",
+ "arguments": "readonly",
+ "atob": "readonly",
+ "Bluetooth": "readonly",
+ "BTN": "readonly",
+ "BTN1": "readonly",
+ "BTN2": "readonly",
+ "BTN3": "readonly",
+ "BTN4": "readonly",
+ "BTN5": "readonly",
+ "btoa": "readonly",
+ "changeInterval": "readonly",
+ "clearInterval": "readonly",
+ "clearTimeout": "readonly",
+ "clearWatch": "readonly",
+ "decodeURIComponent": "readonly",
+ "digitalPulse": "readonly",
+ "digitalRead": "readonly",
+ "digitalWrite": "readonly",
+ "dump": "readonly",
+ "echo": "readonly",
+ "edit": "readonly",
+ "encodeURIComponent": "readonly",
+ "eval": "readonly",
+ "getPinMode": "readonly",
+ "getSerial": "readonly",
+ "getTime": "readonly",
+ "global": "readonly",
+ "HIGH": "readonly",
+ "I2C1": "readonly",
+ "Infinity": "readonly",
+ "isFinite": "readonly",
+ "isNaN": "readonly",
+ "LED": "readonly",
+ "LED1": "readonly",
+ "LED2": "readonly",
+ "load": "readonly",
+ "LoopbackA": "readonly",
+ "LoopbackB": "readonly",
+ "LOW": "readonly",
+ "NaN": "readonly",
+ "parseFloat": "readonly",
+ "parseInt": "readonly",
+ "peek16": "readonly",
+ "peek32": "readonly",
+ "peek8": "readonly",
+ "pinMode": "readonly",
+ "poke16": "readonly",
+ "poke32": "readonly",
+ "poke8": "readonly",
+ "print": "readonly",
+ "require": "readonly",
+ "reset": "readonly",
+ "save": "readonly",
+ "Serial1": "readonly",
+ "setBusyIndicator": "readonly",
+ "setInterval": "readonly",
+ "setSleepIndicator": "readonly",
+ "setTime": "readonly",
+ "setTimeout": "readonly",
+ "setWatch": "readonly",
+ "shiftOut": "readonly",
+ "SPI1": "readonly",
+ "Terminal": "readonly",
+ "trace": "readonly",
+ "VIBRATE": "readonly",
+ // Aliases and not defined at https://banglejs.com/reference
+ "g": "readonly",
+ "WIDGETS": "readonly"
+ },
+ "parserOptions": {
+ "ecmaVersion": 11
+ },
+ "rules": {
+ "indent": [
+ "warn",
+ 2,
+ {
+ "SwitchCase": 1
+ }
+ ],
+ "no-case-declarations": "off",
+ "no-constant-condition": "off",
+ "no-delete-var": "off",
+ "no-empty": "off",
+ "no-global-assign": "off",
+ "no-inner-declarations": "off",
+ "no-octal": "off",
+ "no-prototype-builtins": "off",
+ "no-redeclare": "off",
+ // TODO: "no-undef": "warn",
+ "no-undef": "off",
+ "no-unused-vars": "off",
+ "no-useless-escape": "off"
+ }
+}
diff --git a/apps/1button/ChangeLog b/apps/1button/ChangeLog
new file mode 100644
index 000000000..4c21f3ace
--- /dev/null
+++ b/apps/1button/ChangeLog
@@ -0,0 +1 @@
+0.01: New Widget!
diff --git a/apps/1button/README.md b/apps/1button/README.md
new file mode 100644
index 000000000..13a2724c0
--- /dev/null
+++ b/apps/1button/README.md
@@ -0,0 +1,31 @@
+# The One Button tracker
+
+A simple widget that turns the `BTN1` of your Bangle.js into a one-button-tracker that can be used right from the clock face and everywhere else. Record when you're sneezing, yawning, eating, or whatever you think the button should track for you.
+
+
+
+## Usage
+
+Every time you press & release the `BTN1` from the clockface this widget will record the time you pressed & released. While you press the button the Bangle will briefly vibrate and the green LED in the display will light up while you're keeping the button pressed.
+
+Once you release `BTN1` both the start & end time of your button press will be saved in 2-column `one_button_presses.csv` CSV file on your _Bangle.js_. The CSV file can [be downloaded from the _My Apps_ tab on the Bangle.js app store](https://banglejs.com/apps/).
+
+To not interfere with alternative usages of `BTN1` (eg when using it for menu navigation) you need to keep the button pressed for at least 130 milliseconds before it triggers a recording (the vibration & LED will inform you about having triggered it).
+
+## Features
+
+- Track whatever events you want with a simple button press on your wrist
+- Track multiple things with a single button by using different length of button presses
+- Easily export the data to visualize your presses in a tool of your choice
+
+## Controls
+
+Only makes use of `BTN1` (the top one) right now.
+
+## Requests
+
+[Reach out to Bastian](https://www.github.com/gedankenstuecke) if you have feature requests or notice bugs.
+
+## Creator
+
+Made by [Bastian Greshake Tzovaras](https://tzovar.as), inspired by the one-button tracker project by Thomas Blomseth Christiansen and Jakob Eg Larsen.
diff --git a/apps/1button/interface.html b/apps/1button/interface.html
new file mode 100644
index 000000000..04c7dfdb9
--- /dev/null
+++ b/apps/1button/interface.html
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/1button/one-button.GIF b/apps/1button/one-button.GIF
new file mode 100644
index 000000000..a6adfdb8a
Binary files /dev/null and b/apps/1button/one-button.GIF differ
diff --git a/apps/1button/widget.js b/apps/1button/widget.js
new file mode 100644
index 000000000..cce099309
--- /dev/null
+++ b/apps/1button/widget.js
@@ -0,0 +1,36 @@
+(() => {
+ var press_time = new Date();
+
+ // set widget text
+ function draw() {
+ g.reset(); // reset the graphics context to defaults (color/font/etc)
+ // add your code
+ g.fillCircle(this.x+6,this.y+6,4);
+ g.drawString("1BUTTON", this.x+13, this.y+4);
+ }
+
+ // listen to button press to get start time
+ setWatch(function(e) {
+ console.log("Button pressed");
+ digitalWrite(LED2,1);
+ press_time = new Date();
+ Bangle.buzz();
+ }, BTN1, { repeat: true, edge: 'rising', debounce: 130 });
+
+ // listen to button go to get end time & write data
+ setWatch(function(e) {
+ console.log("Button let go");
+ digitalWrite(LED2,0);
+ var unpress_time = new Date();
+ recFile = require("Storage").open("one_button_presses.csv","a");
+ recFile.write([press_time.getTime(),unpress_time.getTime()].join(",")+"\n");
+ }, BTN1, { repeat: true, edge: 'falling', debounce: 50 });
+
+
+ // add your widget
+ WIDGETS["1button"]={
+ area:"tl", // tl (top left), tr (top right), bl (bottom left), br (bottom right)
+ width: 100, // how wide is the widget? You can change this and call Bangle.drawWidgets() to re-layout
+ draw:draw // called to draw the widget
+ };
+})()
diff --git a/apps/1button/widget.png b/apps/1button/widget.png
new file mode 100644
index 000000000..6a827c392
Binary files /dev/null and b/apps/1button/widget.png differ
diff --git a/apps/BLEcontroller/BLEcontroller.png b/apps/BLEcontroller/BLEcontroller.png
new file mode 100644
index 000000000..3fa8575f3
Binary files /dev/null and b/apps/BLEcontroller/BLEcontroller.png differ
diff --git a/apps/BLEcontroller/README.md b/apps/BLEcontroller/README.md
new file mode 100644
index 000000000..c02e29543
--- /dev/null
+++ b/apps/BLEcontroller/README.md
@@ -0,0 +1,50 @@
+# BLE Customisable Controller with Joystick
+
+A highly customisable state machine driven user interface that will communicate with another BLE device. The controller uses the three buttons and the left and right hand side of the watch to provide a flexible and attractive BLE interface.
+
+Amaze your friends by controlling your robot, your house or any other BLE device from your watch!
+
+VIDEO
+
+To keep the messages small, commands are sent from the Controller to the BLE target in a text string. This is made up of a comma delimited string of the following elements:
+* message number (up to the least significant four digits)
+* screen name (up to four characters)
+* object name (up to four characters)
+* value/status (up to four characters)
+
+The combination of these variables will uniquely identify the status change requested from the watch to the target device that can then be programmed to respond appropriately.
+
+Gordon Williams' EspruinoHub is an excellent way to transform thse BLE advertisements into MQTT messages for further processing. They can be subscribed to via the following MQTT topic (change the watchaddress, to the MAC address of your Bangle.js)
+/ble/advertise/wa:tc:ha:dd:re:ss/espruino/#
+
+## Usage
+
+The application can be configured at will by changing the definitions of the screens, events, icons and buttons.
+
+Most changes are possible via data, rather than code change.
+
+## Features
+
+The default package contains three configurations:
+* a simple home light and sockets controller UI (app.js)
+* a robot controller UI with joystick (app-joy.js)
+* a simple static assistant controller (app-ex2.js)
+
+You can try out the other configurations by deleting app.js and renaming the file you want to try as app.js.
+
+I have tested out the application to as many as eight screens without problems, but four screens are usually enough for most situations.
+
+## Controls
+
+The controls will vary by screen, but I suggest a convention of using BTN3 (the bottom button) for moving backwards up the menu stack.
+
+I have used the convention of red/green for buttons that are switches and blue buttons that provide single function operation (such as navigating a menu or executing a on-off activity)
+
+## Requests
+
+In the first instance, please consult my blog post on this application [here](https://k9-build.blogspot.com/2020/05/controlling-k9-using-bluetooth-ble-from.html)
+
+## Creator
+
+Richard Hopkins, FIET CEng
+May 2020
diff --git a/apps/BLEcontroller/app-ex2.js b/apps/BLEcontroller/app-ex2.js
new file mode 100644
index 000000000..27e629d5d
--- /dev/null
+++ b/apps/BLEcontroller/app-ex2.js
@@ -0,0 +1,450 @@
+/*
+==========================================================
+Simple event based robot controller that enables robot
+to switch into automatic or manual control modes. Behaviours
+are controlled via a simple finite state machine.
+In automatic mode the
+robot will look after itself. In manual mode, the watch
+will provide simple forward, back, left and right commands.
+The messages will be transmitted to a partner BLE Espruino
+using BLE
+Written by Richard Hopkins, May 2020
+==========================================================
+declare global variables for watch button statuses */
+top_btn = false;
+middle_btn = false;
+left_btn= false; // the left side of the touch screen
+right_btn = false; // the right side of the touch screen
+bottom_btn = false;
+
+msgNum = 0; // message number
+
+/*
+CONFIGURATION AREA - STATE VARIABLES
+declare global variables for the toggle button
+statuses; if you add an additional toggle button
+you should declare it and initiase it here */
+
+var status_spk = {value: true};
+var status_face = {value: true};
+var status_iris_light = {value: false};
+var status_iris = {value: false};
+var status_hover = {value: false};
+var status_dome = {value: false};
+
+/* trsnsmit message
+where
+s = first character of state,
+o = first three character of object name
+v = value of state.object
+*/
+
+const transmit = (state,object,status) => {
+ msgNum ++;
+ msg = {
+ n: msgNum.toString().slice(-4),
+ s: state.substr(0,4),
+ o: object.substr(0,4),
+ v: status.substr(0,4),
+ };
+ message= msg.n + "," + msg.s + "," + msg.o + "," + msg.v;
+ NRF.setAdvertising({},{
+ showName: false,
+ manufacturer: 0x0590,
+ manufacturerData: JSON.stringify(message)});
+};
+
+/*
+CONFIGURATION AREA - ICON DEFINITIONS
+Retrieve 30px PNG icons from:
+https://icons8.com/icon/set/speak/ios-glyphs
+Create icons using:
+https://www.espruino.com/Image+Converter
+Use compression: true
+Transparency: true
+Diffusion: flat
+Colours: 16bit RGB
+Ouput as: Image Object
+Add an additional element to the icons array
+with a unique name and the data from the Image Object
+*/
+const icons = [
+ {
+ name: "back",
+ data: "gEBAP4B/AP4B/AKgADHPI71HP45/HP45/HP45/HP45/Hf49/Hv49/Hv49/Hv49/Hv497He4B/AP4B/AJAA=="
+ },
+ {
+ name: "spk_on",
+ data: "gEBAP4B/AP4Bic/YAFPP4v1HrYZRVJo7ZDKp5jMJYvZHaYAHVL4LHACZrhADLBTJKI7dPLI7/Hf47/HeZBVFqZHZRJp1lAJ47LOtZTnHbIZDKLpHNAL69ZANp1tQbY5/AP4B/ANQ"
+ },
+ {
+ name: "spk_off",
+ data: "gEBAPhB7P/o9rFKI9pFKY9tXNYZNHrZXfMaoAHPOZhNF7LdXHpKpZEJpvPDZK1ZAB49NPLo9jHdI9NHd49PHebvxEJY9NI6I7dHpaDXcKqfPHLKjZHcpTjHbIZDKa73JHa4BXGY45xe5Y7zV+o9/Hv49JHe4BEA="
+ },
+ {
+ name: "facerecog",
+ data: "gEBAP4BSLuozNH9YpTHsolXPsYfdDraZhELIZhHeLtJELY1VC4Y7HHqoXJABYdNHa5bJDrLvfHfbrPZJI7nGZpdVNJ4lRIpaznRqp1hCq55ZC6IRPd8oPjW8Y5jSr45dEJppNHcIjLHZY5ja6rrhFK45pVqI5rGI4AHHNpx3ANA="
+ },
+ {
+ name: "sleep",
+ data: "gEBAP4B/AP4B2ACY7/Quq95HP45/HP4APOdY7fACZfnHcaZZAL45/HP45/E7YAHCaZFZHfbh/HP45/HOoAHHf4B/AP4B/AP4BIA="
+ },
+ {
+ name: "awake",
+ data: "gEBAP4B/AKyb7HfIAFHPI77Ov451Hf453Hf453HdoAbHf45/Hf5HrHNY7NHNo7/HO47/HO47HHPJ1/Heo51HfoB/ALg="
+ },
+ {
+ name: "happy",
+ data: "gEBAP4B/AP4BKa+oAXHNITfHK4ZtD5JZfHOojZaMYlXHMYnXHfI5nFaYPLaaIRNHf47/d/47/HtInTCZrfZHa4vNABYlVKLI3PbLrzfD7qTXDLaphHMIpLAB45hIKY1pAP4B/AMA"
+ },
+ {
+ name: "sad",
+ data: "gEBAP4B/AP4BKa+oAXHNITfHK4ZtD5JZfHOojZaMYlXHMYnXHfI5nFaYPLaaIRNHf47/d/47/CK4njCZ4APHcIVJBbbdTecYjZHr4fdSa4ZbEZ4lNCaY9dAB45hIKY1pAP4B/AMA"
+ },
+ {
+ name: "hover",
+ data: "gEBAP4B/AP7NedL4fZK7ojNHeJ35DJI7vC5Y7tVMI7XHNYnNYro7hHKI7lAK47/HdoAhHPI7/Hf47/Hf4AtHPI7/Hf47/Hd45LAP4B/ANwA="
+ },
+ {
+ name: "light",
+ data: "gEBAP4B/APi/Na67lfACZ/nNaI9lE6o9jEbI9hD7Y7dDsJZ3D6YRJHdIJHHfaz7Hf5Z/Hf4hZHMIjFEqIVVHsY5hDpI7TEqL1jVsqlTdM55THOJvHOuY7/HfI9JHOI9HHOoBgA=="
+ },
+ {
+ name: "speak",
+ data: "gEBAP4B/AP4BIbO4AXG+4/hAEY55HqoArHPI9PHfIAzHf47/Hf47/HeY9xHJI79Hto5NHtY5RHc45THco5VHcI3XHJpHRG7I7LEro5ZG+IB/AP4BwA=="
+ },
+ {
+ name: "dalek",
+ data: "gEBAP4B/AP4B/AJMQwQBBGucIoMAkADBhFhAoZBcAAQfJhEgB45BCHYMBjGiB4ZLCK5APDFpphBC5AbEJosY0YfCG4IAEJIYdGFYR5LHJYlEAI0Y4cY8YXMOpQBFlNFlMkOZA7MKII7JOAXkE4T1UERKtFHoxJBABY5QiGiD5kANYTnCiFiWIJVOgDZCOra3FoKxFDKI7hADQ7PkEIaoIHEaKYfJAoKPFAJcIGYIJHkI7UgMY8ZFHC5rVDKIZTCDIJhBA4ILBBoYFHC4QBEBogpBjHDdsJJEAoYAHKoTxWWb5tNWZOiHZRbBHbwtLF5ynBL7wtLjHjd6oAZkHkI5JJKAAZ3TkAjJhALBsJ5K0a/KkLvfkMEFpVhO8hrIU4QLGG4QAzkCdVAP4B/AP4Bb"
+ }
+ ];
+
+/* finds icon data by name in the icon array and returns an image object*/
+const drawIcon = (name) => {
+ for (var icon of icons) {
+ if (icon.name == name) {
+ image = {
+ width : 30, height : 30, bpp : 16,
+ transparent : 1,
+ buffer: require("heatshrink").decompress(atob(icon.data))
+ };
+ return image;}
+ }
+};
+
+/*
+CONFIGURATION AREA - BUTTON DEFINITIONS
+for a simple button, just define a primary colour
+and an icon name from the icon array and
+the text to display beneath the button
+for toggle buttons, additionally provide secondary
+colours, icon name and text. Also provide a reference
+to a global variable for the value of the button.
+The global variable should be declared at the start of
+the program and it may be adviable to use the 'status_name'
+format to ensure it is clear.
+*/
+
+var happyBtn = {
+ primary_colour: 0x653E,
+ primary_text: 'Speak',
+ primary_icon: 'happy',
+ };
+
+var sadBtn = {
+ primary_colour: 0x33F9,
+ primary_text: 'Speak',
+ primary_icon: 'sad',
+ };
+
+var speakBtn = {
+ primary_colour: 0x33F9,
+ primary_text: 'Speak',
+ primary_icon: 'speak',
+ };
+
+var faceBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Off',
+ primary_icon: 'facerecog',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'On',
+ secondary_icon : 'facerecog',
+ value: status_face
+ };
+
+var irisLightBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Off',
+ primary_icon: 'light',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'On',
+ secondary_icon : 'light',
+ value: status_iris_light
+ };
+
+var irisBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Closed',
+ primary_icon: 'sleep',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'Open',
+ secondary_icon : 'awake',
+ value: status_iris
+ };
+
+var hoverBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Off',
+ primary_icon: 'hover',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'On',
+ secondary_icon : 'hover',
+ value: status_hover
+ };
+
+ var domeBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Off',
+ primary_icon: 'dalek',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'On',
+ secondary_icon : 'dalek',
+ value: status_dome
+ };
+
+/*
+CONFIGURATION AREA - SCREEN DEFINITIONS
+a screen can have a button (as defined above)
+on the left and/or the right of the screen.
+in adddition a screen can optionally have
+an icon for each of the three buttons on
+the left hand side of the screen. These
+are defined as btn1, bt2 and bt3. The
+values are names from the icon array.
+*/
+
+const menuScreen = {
+ left: faceBtn,
+ right: speakBtn,
+ btn1: "hover",
+ btn2: "light",
+};
+
+const speakScreen = {
+ left: happyBtn,
+ right: sadBtn,
+ btn3: "back"
+};
+
+const irisScreen = {
+ left: irisBtn,
+ right: irisLightBtn,
+ btn3: "back"
+};
+
+const lightsScreen = {
+ left: hoverBtn,
+ right: domeBtn,
+ btn3: "back"
+};
+
+/* base state definition
+Each of the screens correspond to a state;
+this class provides a constuctor for each
+of the states
+*/
+class State {
+ constructor(params) {
+ this.state = params.state;
+ this.events = params.events;
+ this.screen = params.screen;
+ }
+}
+
+/*
+CONFIGURATION AREA - BUTTON BEHAVIOURS/STATE TRANSITIONS
+This area defines how each screen behaves.
+Each screen corresponds to a different State of the
+state machine. This makes it much easier to isolate
+behaviours between screens.
+The state value is transmitted whenever a button is pressed
+to provide context (so the receiving device, knows which
+button was pressed on which screen).
+The screens are defined above.
+The events section identifies if a particular button has been
+pressed and released on the screen and an action can then be taken.
+The events function receives a notification from a mySetWatch which
+provides an event object that identifies which button and whether
+it has been pressed down or released. Actions can then be taken.
+The events function will always return a State object.
+If the events function returns different State from the current
+one, then the state machine will change to that new State and redrsw
+the screen appropriately.
+To add in additional capabilities for button presses, simply add
+an additional 'if' statement.
+For toggle buttons, the value of the sppropiate status object is
+inversed and the new value transmitted.
+*/
+
+/* The Home State/Page is where the application beings */
+
+const Home = new State({
+ state: "DalekMenu",
+ screen: menuScreen,
+ events: (event) => {
+ if ((event.object == "top") && (event.status == "end")) {
+ return Lights;
+ }
+ if ((event.object == "middle") && (event.status == "end")) {
+ return Iris;
+ }
+ if ((event.object == "right") && (event.status == "end")) {
+ return Speak;
+ }
+ if ((event.object == "left") && (event.status == "end")) {
+ status_face.value = !status_face.value;
+ transmit(this.state, "face", onOff(status_face.value));
+ return this;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+const Speak = new State({
+ state: "Speak",
+ screen: speakScreen,
+ events: (event) => {
+ if ((event.object == "bottom") && (event.status == "end")) {
+ return Home;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+const Iris = new State({
+ state: "Iris",
+ screen: irisScreen,
+ events: (event) => {
+ if ((event.object == "bottom") && (event.status == "end")) {
+ return Home;
+ }
+ if ((event.object == "right") && (event.status == "end")) {
+ status_iris_light.value = !status_iris_light.value;
+ transmit(this.state, "light", onOff(status_iris_light.value));
+ return this;
+ }
+ if ((event.object == "left") && (event.status == "end")) {
+ status_iris.value = !status_iris.value;
+ transmit(this.state, "servo", onOff(status_iris.value));
+ return this;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+const Lights = new State({
+ state: "Lights",
+ screen: lightsScreen,
+ events: (event) => {
+ if ((event.object == "bottom") && (event.status == "end")) {
+ return Home;
+ }
+ if ((event.object == "right") && (event.status == "end")) {
+ status_dome.value = !status_dome.value;
+ transmit(this.state, "dome", onOff(status_dome.value));
+ return this;
+ }
+ if ((event.object == "left") && (event.status == "end")) {
+ status_hover.value = !status_hover.value;
+ transmit(this.state, "hover", onOff(status_hover.value));
+ return this;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+/* translate button status into english */
+const startEnd = status => status ? "start" : "end";
+
+/* translate status into english */
+const onOff= status => status ? "on" : "off";
+
+
+/* create watching functions that will change the global
+button status when pressed or released
+This is actuslly the hesrt of the program. When a button
+is not being pressed, nothing is happening (no loops).
+This makes the progrsm more battery efficient.
+When a setWatch event is raised, the custom callbacks defined
+here will be called. These then fired as events to the current
+state/screen of the state mschine.
+Some events, will result in the stste of the state machine
+chsnging, which is why the screen is redrswn after each
+button press.
+*/
+const setMyWatch = (params) => {
+ setWatch(() => {
+ params.bool=!params.bool;
+ machine = machine.events({object: params.label, status: startEnd(params.bool)});
+ drawScreen(machine.screen);
+ }, params.btn, {repeat:true, edge:"both"});
+};
+
+/* object array used to set up the watching functions
+*/
+const buttons = [
+ {bool : bottom_btn, label : "bottom",btn : BTN3},
+ {bool : middle_btn, label : "middle",btn : BTN2},
+ {bool : top_btn, label : "top",btn : BTN1},
+ {bool : left_btn, label : "left",btn : BTN4},
+ {bool : right_btn, label : "right",btn : BTN5}
+ ];
+
+/* set up watchers for buttons */
+for (var button of buttons)
+ {setMyWatch(button);}
+
+/* Draw various kinds of buttons */
+const drawButton = (params,side) => {
+ g.setFontAlign(0,1);
+ icon = drawIcon(params.primary_icon);
+ text = params.primary_text;
+ g.setColor(params.primary_colour);
+ const x = (side == "left") ? 0 : 120;
+ if ((params.toggle) && (params.value.value)) {
+ g.setColor(params.secondary_colour);
+ text = params.secondary_text;
+ icon = drawIcon(params.secondary_icon);
+ }
+ g.fillRect(0+x,24,119+x, 239);
+ g.setColor(0x000);
+ g.setFont("Vector",15);
+ g.setFontAlign(0,0.0);
+ g.drawString(text,60+x,160);
+ options = {rotate: 0, scale:2};
+ g.drawImage(icon,x+60,120,options);
+};
+
+/* Draw the pages corresponding to the states */
+const drawScreen = (params) => {
+ drawButton(params.left,'left');
+ drawButton(params.right,'right');
+ g.setColor(0x000);
+ if (params.btn1) {g.drawImage(drawIcon(params.btn1),210,40);}
+ if (params.btn2) {g.drawImage(drawIcon(params.btn2),210,125);}
+ if (params.btn3) {g.drawImage(drawIcon(params.btn3),210,195);}
+};
+
+machine = Home; // instantiate the state machine at Home
+Bangle.drawWidgets(); // draw active widgets
+drawScreen(machine.screen); // draw the screen
diff --git a/apps/BLEcontroller/app-icon.js b/apps/BLEcontroller/app-icon.js
new file mode 100644
index 000000000..662f43c5c
--- /dev/null
+++ b/apps/BLEcontroller/app-icon.js
@@ -0,0 +1 @@
+E.toArrayBuffer(atob("MDCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAABERIQAAAAAAAAAAAAAAAAAAAAAAAAABERIRpiEQAAAAAAAAAAAAAAAAAAAAAAEREhOiImEqYAAAAAAAAAAAAAAAAAAAABESP///8zOFEQAAAAAAAAAAAAAAAAAAARI//////z8zp6AAAAAAAAAAAAAAAAAAES////////PzOFEAAAAAAAAAAAAAAAABEv////////8/MyGgAAAAAAAAAAAAAAARI//////////z8zIRAAAAAAAAAAAAAAARP/////8/P///M/IRAAAAAAAAAAAAAAES/////zgzM///M/OFEAAAAAAAAAAAAAET////84/zMzP/8z8hEAAAAAAAAAAAAAEf////M///gzP/8/MyEAAAAAAAAAAAABEv///zP/8zjzM/8/M4UQAAAAAAAAAAABEv///zP/M48zj//zPyEQAAAAAAAAAAABE////zP/ODMzj//zPyEQAAAAAAAAAAABE////zMzjyM48//zPyEQAAAAAAAAAAABE/////ODMzOPP/8/M4QQAAAAAAAAAAABE/////MzjzOD///zPyEQAAAAAAAAAAABE/////8zOPMz///zMzEQAAAAAAAAAAABEj//////PzP///8/MxhQAAAAAAAAAAARES////////////8/MRpyAAAAAAAAAAASMRP////////////zMRMhAAAAAAAAAAARMR////////////8/IRMhAAAAAAAAAAARES/////////////zMhp6AAAAAAAAAAEREv////////////8/MyEacAAAAAAAABERIv/////////////zPyERGAAAAAAAABEBE//////////////zPyEQEQAAAAAAAREBE//////////////zPyEQERAAAAABERABE//////////////zPyEQAREQAAEREgABE//////////////zPyEQABERIAESESABE//////////////zPyEQARESEAEfIRABE//////////////zPyEQAREBEAEREgABE//////z//////8/MzEQABERIAAREQABE/8/8z/zPz/z8/M/MzGAABERAAABEQABE/8/8/8/Pz/z8/PzPyEQABEQAAAAEQABE//////////////zPyEQABEAAAAAERAAETMzMzMzMjMzMzODIxEAAREAAAAAARAAEREhGmIRGhESaiYRKmEAARAAAAAAEREgABERIaYhEaERJqEmEQABERIAAAABERIaAAAAAAEREhGmIREAAAARESGgAAABEAARAAAAAAEREhGmIRGgAAARAAEQAAABEAARAAABERIRpiERoREgAAARAAEQAAAAAAAAAAABERIRpiERoREgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="))
diff --git a/apps/BLEcontroller/app-joy.js b/apps/BLEcontroller/app-joy.js
new file mode 100644
index 000000000..0735aeee6
--- /dev/null
+++ b/apps/BLEcontroller/app-joy.js
@@ -0,0 +1,446 @@
+/*
+==========================================================
+Simple event based robot controller that enables robot
+to switch into automatic or manual control modes. Behaviours
+are controlled via a simple finite state machine.
+In automatic mode the
+robot will look after itself. In manual mode, the watch
+will provide simple forward, back, left and right commands.
+The messages will be transmitted to a partner BLE Espruino
+using BLE
+Written by Richard Hopkins, May 2020
+==========================================================
+declare global variables for watch button statuses */
+top_btn = false;
+middle_btn = false;
+left_btn= false; // the left side of the touch screen
+right_btn = false; // the right side of the touch screen
+bottom_btn = false;
+
+msgNum = 0; // message number
+
+NRF.setConnectionInterval(100);
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+/*
+CONFIGURATION AREA - STATE VARIABLES
+declare global variables for the toggle button
+statuses; if you add an additional toggle button
+you should declare it and initiase it here */
+
+var status_auto = {value: false};
+var status_chess = {value: false};
+var status_wake = {value: false};
+
+/* trsnsmit message
+where
+s = first character of state,
+o = first three character of object name
+v = value of state.object
+*/
+
+const transmit = (state,object,status) => {
+ msgNum ++;
+ msg = {
+ n: msgNum.toString().slice(-4),
+ s: state.substr(0,4),
+ o: object.substr(0,4),
+ v: status.substr(0,4),
+ };
+ message= msg.n + "," + msg.s + "," + msg.o + "," + msg.v;
+ NRF.setAdvertising({},{
+ showName: false,
+ manufacturer: 0x0590,
+ manufacturerData: JSON.stringify(message)});
+};
+
+/*
+CONFIGURATION AREA - ICON DEFINITIONS
+Retrieve 30px PNG icons from:
+https://icons8.com/icon/set/speak/ios-glyphs
+Create icons using:
+https://www.espruino.com/Image+Converter
+Use compression: true
+Transparency: true
+Diffusion: flat
+Colours: 16bit RGB
+Ouput as: Image Object
+Add an additional element to the icons array
+with a unique name and the data from the Image Object
+*/
+const icons = [
+ {
+ name: "walk",
+ data: "gEBAP4B/ALyh7b/YALHfY9tACY55HfYdNHto7pHpIbXbL5fXAD6VlHuYAjHf47/Hf47tHK47LDa45zHc4NHHeILJHeonTO9o9rHf47/eOoB/ANg="
+ },
+ {
+ name: "sit",
+ data: "gEBAP4B/AP4BacO4ANHPI/rACp1/Hf49rGtI5/He7n3ACY55HcYAZHf45/Hf45rHe4XHGbI7/Va47zZZrpbHfbtXD5Y/vHcYB/AP4BmA"
+ },
+ {
+ name: "joystick",
+ data: "gEBAP4B/AP4BMavIALHPI9vHf47/eP45vHpY5xHo451Hf47/FuYAHHNItHABa33AP6xpAD455HqY7/Hf47/Hd49pHKIB/AP4B/AMwA=="
+ },
+ {
+ name: "left",
+ data: "gEBAP4B/AP4BKa9ojHAC5pfHJKDTUsYdZHb6ZfO+I9dABabdLbIBdHf473PP47NJdY7/ePIB/RJop5Ys7t/AP6PvD7o7fP8Y1zTZoHPf/4B/AP4B+A=="
+ },
+ {
+ name: "right",
+ data: "gEBAP4B/AP4BKa+oAXDo45hCaqFbUbLBfbbo7bHMojTR7Y5LHa51ZALo75Ov47/FeY77AP4B5WdbF3dv4B/R94fdHb5/jGuabNA57//AP4B/APw="
+ },
+ {
+ name: "forward",
+ data: "gEBAP4B/AKSX5avIALHPI9tACY55HsoAbHPI9fHfZFVGMo7/Hf47/Hf47/Hf47/Hf47/Hf47/Hf47/Hf49XHOIB/ALw="
+ },
+ {
+ name: "backward",
+ data: "gEBAP4B/AKCZ5a/Y7/Hf47/Hf47/Hf47/Hf47/Hf47/Hf47/HfIAfHf491W/L15HMo9THNI9PHNo9LHOI9HHOoB/ALg="
+ },
+ {
+ name: "back",
+ data: "gEBAP4B/AP4B/AKgADHPI71HP45/HP45/HP45/HP45/Hf49/Hv49/Hv49/Hv49/Hv497He4B/AP4B/AJAA=="
+ },
+ {
+ name: "mic_on",
+ data: "gEBAP4B/AKCZ5a/Y7/Hf47/Hf47/Hf47/GbY7TIcY7/Hf47/Hf47/HdY9NCpp5lCb57fOdYvNeJo91HNrlvHf7tVIdY77AP4BiA="
+ },
+ {
+ name: "comms",
+ data: "gEBAP4B+QvbF7ABo7/He49tACI7/Hf47zHtI7jJq47lRqoAVEqY7nHsoAZGJo71HrKxfQaY7bdKo7/Hdqz5B5Y7zHK47RD55FRHao3XHKo7JG7L1NHeJTbHboB/AP4BG"
+ },
+ {
+ name: "pawn",
+ data: "gEBAP4B/AP4B/AP4BEAA455HuY7/Hf47xAB47/PuI1xPZY7/Hf47/G9Y/zHfIATHPI9nHfYB/AOYAfHf4B/AP4B/APA="
+ },
+ {
+ name: "sleep",
+ data: "gEBAP4B/AP4B2ACY7/Quq95HP45/HP4APOdY7fACZfnHcaZZAL45/HP45/E7YAHCaZFZHfbh/HP45/HOoAHHf4B/AP4B/AP4BIA="
+ },
+ {
+ name: "awake",
+ data: "gEBAP4B/AKyb7HfIAFHPI77Ov451Hf453Hf453HdoAbHf45/Hf5HrHNY7NHNo7/HO47/HO47HHPJ1/Heo51HfoB/ALg="
+ },
+ {
+ name: "wag_h",
+ data: "gEBAP4B/AP4B/AP4B/AP4B/AMwADD+oAFHb4hTHMIlXHMopTHNItPAG47/WfY9tFKY9lEq49hELY7ja8YB/AP4B/AP4B/AP4B/AP4BCA"
+ },
+ {
+ name: "wag_v",
+ data: "gEBAP4B/AP4BOafIAHHPI9xAB45vd449rFZIHLHsonJBKa7rGNo7/Hf47/Hf47/Hf47/Hf4xlBKY7hFIoHLQM4rHApK7rAB71xHOo9LHOI9HHOoB/AP4BYA="
+ }
+ ];
+
+/* finds icon data by name in the icon array and returns an image object*/
+const drawIcon = (name) => {
+ for (var icon of icons) {
+ if (icon.name == name) {
+ image = {
+ width : 30, height : 30, bpp : 16,
+ transparent : 1,
+ buffer: require("heatshrink").decompress(atob(icon.data))
+ };
+ return image;}
+ }
+};
+
+/*
+CONFIGURATION AREA - BUTTON DEFINITIONS
+for a simple button, just define a primary colour
+and an icon name from the icon array and
+the text to display beneath the button
+for toggle buttons, additionally provide secondary
+colours, icon name and text. Also provide a reference
+to a global variable for the value of the button.
+The global variable should be declared at the start of
+the program and it may be adviable to use the 'status_name'
+format to ensure it is clear.
+*/
+
+var joystickBtn = {
+ primary_colour: 0x653E,
+ primary_icon: 'joystick',
+ primary_text: 'Joystick',
+ };
+
+var turnLeftBtn = {
+ primary_colour: 0x653E,
+ primary_text: 'Left',
+ primary_icon: 'left',
+ };
+
+var turnRightBtn = {
+ primary_colour: 0x33F9,
+ primary_text: 'Right',
+ primary_icon: 'right',
+ };
+
+var tailHBtn = {
+ primary_colour: 0x653E,
+ primary_text: 'Wag Tail',
+ primary_icon: 'wag_h',
+ };
+
+var tailVBtn = {
+ primary_colour: 0x33F9,
+ primary_text: 'Wag Tail',
+ primary_icon: 'wag_v',
+ };
+
+var chessBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Off',
+ primary_icon: 'pawn',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'On',
+ secondary_icon : 'pawn',
+ value: status_chess
+ };
+
+var wakeBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Sleeping',
+ primary_icon: 'sleep',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'Awake',
+ secondary_icon : 'awake',
+ value: status_wake
+ };
+
+var autoBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Stop',
+ primary_icon: 'sit',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'Move',
+ secondary_icon : 'walk',
+ value: status_auto
+ };
+
+/*
+CONFIGURATION AREA - SCREEN DEFINITIONS
+a screen can have a button (as defined above)
+on the left and/or the right of the screen.
+in adddition a screen can optionally have
+an icon for each of the three buttons on
+the left hand side of the screen. These
+are defined as btn1, bt2 and bt3. The
+values are names from the icon array.
+*/
+const menuScreen = {
+ left: wakeBtn,
+ right: joystickBtn,
+ btn1: "pawn",
+ btn2: "wag_v",
+};
+
+const joystickScreen = {
+ left: turnLeftBtn,
+ right: turnRightBtn,
+ btn1: "forward",
+ btn2: "backward",
+ btn3: "back"
+};
+
+const tailScreen = {
+ left: tailHBtn,
+ right: tailVBtn,
+ btn3: "back"
+};
+
+const chessScreen = {
+ left: chessBtn,
+ right: autoBtn,
+ btn3: "back"
+};
+
+
+/* base state definition
+Each of the screens correspond to a state;
+this class provides a constuctor for each
+of the states
+*/
+class State {
+ constructor(params) {
+ this.state = params.state;
+ this.events = params.events;
+ this.screen = params.screen;
+ }
+}
+
+/*
+CONFIGURATION AREA - BUTTON BEHAVIOURS/STATE TRANSITIONS
+This area defines how each screen behaves.
+Each screen corresponds to a different State of the
+state machine. This makes it much easier to isolate
+behaviours between screens.
+The state value is transmitted whenever a button is pressed
+to provide context (so the receiving device, knows which
+button was pressed on which screen).
+The screens are defined above.
+The events section identifies if a particular button has been
+pressed and released on the screen and an action can then be taken.
+The events function receives a notification from a mySetWatch which
+provides an event object that identifies which button and whether
+it has been pressed down or released. Actions can then be taken.
+The events function will always return a State object.
+If the events function returns different State from the current
+one, then the state machine will change to that new State and redrsw
+the screen appropriately.
+To add in additional capabilities for button presses, simply add
+an additional 'if' statement.
+For toggle buttons, the value of the appropiate status object is
+inversed and the new value transmitted.
+*/
+
+/* The Home State/Page is where the application beings */
+
+const Home = new State({
+ state: "K9Menu",
+ screen: menuScreen,
+ events: (event) => {
+ if ((event.object == "top") && (event.status == "end")) {
+ return Chess;
+ }
+ if ((event.object == "middle") && (event.status == "end")) {
+ return Tail;
+ }
+ if ((event.object == "right") && (event.status == "end")) {
+ return Joystick;
+ }
+ if ((event.object == "left") && (event.status == "end")) {
+ status_wake.value = !status_wake.value;
+ transmit(this.state, "wake", onOff(status_wake.value));
+ return this;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+const Chess = new State({
+ state: "Chess",
+ screen: chessScreen,
+ events: (event) => {
+ if ((event.object == "bottom") && (event.status == "end")) {
+ return Home;
+ }
+ if ((event.object == "right") && (event.status == "end")) {
+ status_auto.value = !status_auto.value;
+ transmit(this.state, "follow", onOff(status_auto.value));
+ return this;
+ }
+ if ((event.object == "left") && (event.status == "end")) {
+ status_chess.value = !status_chess.value;
+ transmit(this.state, "chess", onOff(status_chess.value));
+ return this;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+const Tail = new State({
+ state: "Tail",
+ screen: tailScreen,
+ events: (event) => {
+ if ((event.object == "bottom") && (event.status == "end")) {
+ return Home;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+/* Joystick page state */
+const Joystick = new State({
+ state: "Joystick",
+ screen: joystickScreen,
+ events: (event) => {
+ if ((event.object == "bottom") && (event.status == "end")) {
+ transmit("Joystick", "joystick", "off");
+ return Home;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+/* translate button status into english */
+const startEnd = status => status ? "start" : "end";
+
+/* translate status into english */
+const onOff= status => status ? "on" : "off";
+
+
+/* create watching functions that will change the global
+button status when pressed or released
+This is actuslly the hesrt of the program. When a button
+is not being pressed, nothing is happening (no loops).
+This makes the progrsm more battery efficient.
+When a setWatch event is raised, the custom callbacks defined
+here will be called. These then fired as events to the current
+state/screen of the state mschine.
+Some events, will result in the stste of the state machine
+chsnging, which is why the screen is redrswn after each
+button press.
+*/
+const setMyWatch = (params) => {
+ setWatch(() => {
+ params.bool=!params.bool;
+ machine = machine.events({object: params.label, status: startEnd(params.bool)});
+ drawScreen(machine.screen);
+ }, params.btn, {repeat:true, edge:"both"});
+};
+
+/* object array used to set up the watching functions
+*/
+const buttons = [
+ {bool : bottom_btn, label : "bottom",btn : BTN3},
+ {bool : middle_btn, label : "middle",btn : BTN2},
+ {bool : top_btn, label : "top",btn : BTN1},
+ {bool : left_btn, label : "left",btn : BTN4},
+ {bool : right_btn, label : "right",btn : BTN5}
+ ];
+
+/* set up watchers for buttons */
+for (var button of buttons)
+ {setMyWatch(button);}
+
+/* Draw various kinds of buttons */
+const drawButton = (params,side) => {
+ g.setFontAlign(0,1);
+ icon = drawIcon(params.primary_icon);
+ text = params.primary_text;
+ g.setColor(params.primary_colour);
+ const x = (side == "left") ? 0 : 120;
+ if ((params.toggle) && (params.value.value)) {
+ g.setColor(params.secondary_colour);
+ text = params.secondary_text;
+ icon = drawIcon(params.secondary_icon);
+ }
+ g.fillRect(0+x,28,119+x, 239);
+ g.setColor(0x000);
+ g.setFont("Vector",15);
+ g.setFontAlign(0,0.0);
+ g.drawString(text,60+x,160);
+ options = {rotate: 0, scale:2};
+ g.drawImage(icon,x+60,120,options);
+};
+
+/* Draw the pages corresponding to the states */
+const drawScreen = (params) => {
+ drawButton(params.left,'left');
+ drawButton(params.right,'right');
+ g.setColor(0x000);
+ if (params.btn1) {g.drawImage(drawIcon(params.btn1),210,40);}
+ if (params.btn2) {g.drawImage(drawIcon(params.btn2),210,125);}
+ if (params.btn3) {g.drawImage(drawIcon(params.btn3),210,195);}
+};
+
+machine = Home; // instantiate the state machine at Home
+Bangle.drawWidgets(); // draw active widgets
+drawScreen(machine.screen); // draw the screen
diff --git a/apps/BLEcontroller/app.js b/apps/BLEcontroller/app.js
new file mode 100644
index 000000000..c8217988c
--- /dev/null
+++ b/apps/BLEcontroller/app.js
@@ -0,0 +1,368 @@
+/*
+==========================================================
+Simple event based robot controller that enables robot
+to switch into automatic or manual control modes. Behaviours
+are controlled via a simple finite state machine.
+In automatic mode the
+robot will look after itself. In manual mode, the watch
+will provide simple forward, back, left and right commands.
+The messages will be transmitted to a partner BLE Espruino
+using BLE
+Written by Richard Hopkins, May 2020
+==========================================================
+declare global variables for watch button statuses */
+top_btn = false;
+middle_btn = false;
+left_btn= false; // the left side of the touch screen
+right_btn = false; // the right side of the touch screen
+bottom_btn = false;
+
+msgNum = 0; // message number
+
+NRF.setConnectionInterval(100);
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+/*
+CONFIGURATION AREA - STATE VARIABLES
+declare global variables for the toggle button
+statuses; if you add an additional toggle button
+you should declare it and initiase it here */
+
+var status_printer = {value: false};
+var status_tv = {value: false};
+var status_light_hall = {value: false};
+var status_light_study = {value: false};
+
+/* trsnsmit message
+where
+s = first character of state,
+o = first three character of object name
+v = value of state.object
+*/
+
+const transmit = (state,object,status) => {
+ msgNum ++;
+ msg = {
+ n: msgNum.toString().slice(-4),
+ s: state.substr(0,4),
+ o: object.substr(0,4),
+ v: status.substr(0,4),
+ };
+ message= msg.n + "," + msg.s + "," + msg.o + "," + msg.v;
+ NRF.setAdvertising({},{
+ showName: false,
+ manufacturer: 0x0590,
+ manufacturerData: JSON.stringify(message)});
+};
+
+/*
+CONFIGURATION AREA - ICON DEFINITIONS
+Retrieve 30px PNG icons from:
+https://icons8.com/icon/set/speak/ios-glyphs
+Create icons using:
+https://www.espruino.com/Image+Converter
+Use compression: true
+Transparency: true
+Diffusion: flat
+Colours: 16bit RGB
+Ouput as: Image Object
+Add an additional element to the icons array
+with a unique name and the data from the Image Object
+*/
+const icons = [
+ {
+ name: "switch",
+ data: "gEBAP4B/AP4B/AP4B/AMgA3HPJdlVvI7/Hf47/Hf47/Hf47/Hf47/Hf4AvIPKRXAP4B/AP4B/AP4B/AJgA=="
+ },
+ {
+ name: "light",
+ data: "gEBAP4B/APi/Na67lfACZ/nNaI9lE6o9jEbI9hD7Y7dDsJZ3D6YRJHdIJHHfaz7Hf5Z/Hf4hZHMIjFEqIVVHsY5hDpI7TEqL1jVsqlTdM55THOJvHOuY7/HfI9JHOI9HHOoBgA=="
+ },
+ {
+ name: "back",
+ data: "gEBAP4B/AP4B/AKgADHPI71HP45/HP45/HP45/HP45/Hf49/Hv49/Hv49/Hv49/Hv497He4B/AP4B/AJAA=="
+ }
+ ];
+
+/* finds icon data by name in the icon array and returns an image object*/
+const drawIcon = (name) => {
+ for (var icon of icons) {
+ if (icon.name == name) {
+ image = {
+ width : 30, height : 30, bpp : 16,
+ transparent : 1,
+ buffer: require("heatshrink").decompress(atob(icon.data))
+ };
+ return image;}
+ }
+};
+
+/*
+CONFIGURATION AREA - BUTTON DEFINITIONS
+for a simple button, just define a primary colour
+and an icon name from the icon array and
+the text to display beneath the button
+for toggle buttons, additionally provide secondary
+colours, icon name and text. Also provide a reference
+to a global variable for the value of the button.
+The global variable should be declared at the start of
+the program and it may be adviable to use the 'status_name'
+format to ensure it is clear.
+*/
+
+var lightBtn = {
+ primary_colour: 0x653E,
+ primary_text: 'Lights',
+ primary_icon: 'light',
+ };
+
+var socketsBtn = {
+ primary_colour: 0x33F9,
+ primary_text: 'Sockets',
+ primary_icon: 'switch',
+ };
+
+var lightHallBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Hall Off',
+ primary_icon: 'light',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'Hall On',
+ secondary_icon : 'light',
+ value: status_light_hall
+ };
+
+var lightStudyBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Study Off',
+ primary_icon: 'light',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'Study On',
+ secondary_icon : 'light',
+ value: status_light_study
+};
+
+var socketTVBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'TV Off',
+ primary_icon: 'switch',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'TV On',
+ secondary_icon : 'switch',
+ value: status_tv
+ };
+
+var socketPrinterBtn = {
+ primary_colour: 0xE9C7,
+ primary_text: 'Printer Off',
+ primary_icon: 'switch',
+ toggle: true,
+ secondary_colour: 0x3F48,
+ secondary_text: 'Printer On',
+ secondary_icon : 'switch',
+ value: status_printer
+};
+
+/*
+CONFIGURATION AREA - SCREEN DEFINITIONS
+a screen can have a button (as defined above)
+on the left and/or the right of the screen.
+in adddition a screen can optionally have
+an icon for each of the three buttons on
+the left hand side of the screen. These
+are defined as btn1, bt2 and bt3. The
+values are names from the icon array.
+*/
+const homeScreen = {
+ left: lightBtn,
+ right: socketsBtn,
+};
+
+const lightsScreen = {
+ left: lightHallBtn,
+ right: lightStudyBtn,
+ btn3: "back"
+};
+
+const socketsScreen = {
+ left: socketTVBtn,
+ right: socketPrinterBtn,
+ btn3: "back"
+};
+
+/* base state definition
+Each of the screens correspond to a state;
+this class provides a constuctor for each
+of the states
+*/
+class State {
+ constructor(params) {
+ this.state = params.state;
+ this.events = params.events;
+ this.screen = params.screen;
+ }
+}
+
+/*
+CONFIGURATION AREA - BUTTON BEHAVIOURS/STATE TRANSITIONS
+This area defines how each screen behaves.
+Each screen corresponds to a different State of the
+state machine. This makes it much easier to isolate
+behaviours between screens.
+The state value is transmitted whenever a button is pressed
+to provide context (so the receiving device, knows which
+button was pressed on which screen).
+The screens are defined above.
+The events section identifies if a particular button has been
+pressed and released on the screen and an action can then be taken.
+The events function receives a notification from a mySetWatch which
+provides an event object that identifies which button and whether
+it has been pressed down or released. Actions can then be taken.
+The events function will always return a State object.
+If the events function returns different State from the current
+one, then the state machine will change to that new State and redrsw
+the screen appropriately.
+To add in additional capabilities for button presses, simply add
+an additional 'if' statement.
+For toggle buttons, the value of the appropiate status object is
+inversed and the new value transmitted.
+*/
+
+/* The Home State/Page is where the application beings */
+const Home = new State({
+ state: "Home",
+ screen: homeScreen,
+ events: (event) => {
+ if ((event.object == "right") && (event.status == "end")) {
+ return SocketsMenu;
+ }
+ if ((event.object == "left") && (event.status == "end")) {
+ return LightsMenu;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+const LightsMenu = new State({
+ state: "LightsMenu",
+ screen: lightsScreen,
+ events: (event) => {
+ if ((event.object == "bottom") && (event.status == "end")) {
+ return Home;
+ }
+ if ((event.object == "right") && (event.status == "end")) {
+ status_light_study.value = !status_light_study.value;
+ transmit(this.state, "study", onOff(status_light_study.value));
+ return this;
+ }
+ if ((event.object == "left") && (event.status == "end")) {
+ status_light_hall.value = !status_light_hall.value;
+ transmit(this.state, "hall", onOff(status_light_hall.value));
+ return this;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+const SocketsMenu = new State({
+ state: "SocketsMenu",
+ screen: socketsScreen,
+ events: (event) => {
+ if ((event.object == "bottom") && (event.status == "end")) {
+ return Home;
+ }
+ if ((event.object == "right") && (event.status == "end")) {
+ status_printer.value = !status_printer.value;
+ transmit(this.state, "printer", onOff(status_printer.value));
+ return this;
+ }
+ if ((event.object == "left") && (event.status == "end")) {
+ status_tv.value = !status_tv.value;
+ transmit(this.state, "tv", onOff(status_tv.value));
+ return this;
+ }
+ transmit(this.state, event.object, event.status);
+ return this;
+ }
+});
+
+/* translate button status into english */
+const startEnd = status => status ? "start" : "end";
+
+/* translate status into english */
+const onOff= status => status ? "on" : "off";
+
+
+/* create watching functions that will change the global
+button status when pressed or released
+This is actuslly the hesrt of the program. When a button
+is not being pressed, nothing is happening (no loops).
+This makes the progrsm more battery efficient.
+When a setWatch event is raised, the custom callbacks defined
+here will be called. These then fired as events to the current
+state/screen of the state mschine.
+Some events, will result in the stste of the state machine
+chsnging, which is why the screen is redrswn after each
+button press.
+*/
+const setMyWatch = (params) => {
+ setWatch(() => {
+ params.bool=!params.bool;
+ machine = machine.events({object: params.label, status: startEnd(params.bool)});
+ drawScreen(machine.screen);
+ }, params.btn, {repeat:true, edge:"both"});
+};
+
+/* object array used to set up the watching functions
+*/
+const buttons = [
+ {bool : bottom_btn, label : "bottom",btn : BTN3},
+ {bool : middle_btn, label : "middle",btn : BTN2},
+ {bool : top_btn, label : "top",btn : BTN1},
+ {bool : left_btn, label : "left",btn : BTN4},
+ {bool : right_btn, label : "right",btn : BTN5}
+ ];
+
+/* set up watchers for buttons */
+for (var button of buttons)
+ {setMyWatch(button);}
+
+/* Draw various kinds of buttons */
+const drawButton = (params,side) => {
+ g.setFontAlign(0,1);
+ icon = drawIcon(params.primary_icon);
+ text = params.primary_text;
+ g.setColor(params.primary_colour);
+ const x = (side == "left") ? 0 : 120;
+ if ((params.toggle) && (params.value.value)) {
+ g.setColor(params.secondary_colour);
+ text = params.secondary_text;
+ icon = drawIcon(params.secondary_icon);
+ }
+ g.fillRect(0+x,28,119+x, 239);
+ g.setColor(0x000);
+ g.setFont("Vector",15);
+ g.setFontAlign(0,0.0);
+ g.drawString(text,60+x,160);
+ options = {rotate: 0, scale:2};
+ g.drawImage(icon,x+60,120,options);
+};
+
+/* Draw the pages corresponding to the states */
+const drawScreen = (params) => {
+ drawButton(params.left,'left');
+ drawButton(params.right,'right');
+ g.setColor(0x000);
+ if (params.btn1) {g.drawImage(drawIcon(params.btn1),210,40);}
+ if (params.btn2) {g.drawImage(drawIcon(params.btn2),210,125);}
+ if (params.btn3) {g.drawImage(drawIcon(params.btn3),210,195);}
+};
+
+machine = Home; // instantiate the state machine at Home
+Bangle.drawWidgets(); // draw active widgets
+drawScreen(machine.screen); // draw the screen
diff --git a/apps/_example_app/README.md b/apps/_example_app/README.md
new file mode 100644
index 000000000..dc139bc9a
--- /dev/null
+++ b/apps/_example_app/README.md
@@ -0,0 +1,25 @@
+# App Name
+
+Describe the app...
+
+Add screen shots (if possible) to the app folder and link then into this file with 
+
+## Usage
+
+Describe how to use it
+
+## Features
+
+Name the function
+
+## Controls
+
+Name the buttons and what they are used for
+
+## Requests
+
+Name who should be contacted for support/update requests
+
+## Creator
+
+Your name
diff --git a/apps/_example_app/add_to_apps.json b/apps/_example_app/add_to_apps.json
index ca75a7bd8..1585ab73d 100644
--- a/apps/_example_app/add_to_apps.json
+++ b/apps/_example_app/add_to_apps.json
@@ -6,8 +6,9 @@
"version":"0.01",
"description": "A detailed description of my great app",
"tags": "",
+ "readme": "README.md",
"storage": [
{"name":"7chname.app.js","url":"app.js"},
{"name":"7chname.img","url":"app-icon.js","evaluate":true}
]
-}
+}
\ No newline at end of file
diff --git a/apps/_example_widget/README.md b/apps/_example_widget/README.md
new file mode 100644
index 000000000..a909e9e7e
--- /dev/null
+++ b/apps/_example_widget/README.md
@@ -0,0 +1,25 @@
+# Widget Name
+
+Describe the app...
+
+Add screen shots (if possible) to the app folder and link then into this file with 
+
+## Usage
+
+Describe how to use it
+
+## Features
+
+Name the function
+
+## Controls
+
+Name the buttons and what they are used for
+
+## Requests
+
+Name who should be contacted for support/update requests
+
+## Creator
+
+Your name
diff --git a/apps/_example_widget/add_to_apps.json b/apps/_example_widget/add_to_apps.json
index 5d0057960..527c698a0 100644
--- a/apps/_example_widget/add_to_apps.json
+++ b/apps/_example_widget/add_to_apps.json
@@ -7,6 +7,7 @@
"description": "A detailed description of my great widget",
"tags": "widget",
"type": "widget",
+ "readme": "README.md",
"storage": [
{"name":"7chname.wid.js","url":"widget.js"}
]
diff --git a/apps/_example_widget/widget.js b/apps/_example_widget/widget.js
index 3893e3096..f7aed6991 100644
--- a/apps/_example_widget/widget.js
+++ b/apps/_example_widget/widget.js
@@ -3,7 +3,7 @@ currently-running apps */
(() => {
function draw() {
g.reset(); // reset the graphics context to defaults (color/font/etc)
- // add your code
+ // add your code
g.drawString("X", this.x, this.y);
}
diff --git a/apps/about/ChangeLog b/apps/about/ChangeLog
index 2c81c0537..2a050c91e 100644
--- a/apps/about/ChangeLog
+++ b/apps/about/ChangeLog
@@ -2,3 +2,5 @@
0.02: Update version checker for new filename type
0.03: Actual pixels as of 5 Mar 2020
0.04: Actual pixels as of 9 Mar 2020
+0.05: Actual pixels as of 27 Apr 2020
+0.06: Actual pixels as of 12 Jun 2020
diff --git a/apps/about/app.js b/apps/about/app.js
index dc7b0cad8..4b4589262 100644
--- a/apps/about/app.js
+++ b/apps/about/app.js
@@ -29,5 +29,5 @@ g.drawString(NRF.getAddress(),120,232);
g.flip();
// Pixel chooser image
-g.drawImage(require("heatshrink").decompress(atob("+FQgl+xnu8AIBwGQgHuAoN3gF/hcLgEHu943G3gHdhvdDwIBCAAV3uEAhoBBhsO90OgHgoACBh0IhP5AAQZD8Hw+GwAwXn4AECxGAh0MEAOeJAMP3+/Lw0GswGEHgMM9gCBAIX//5PBhvQ7gJBxAAB9ng8vs5nMDgOg8HnOwIBBgBHDAAfQNAJBBgBQDgF4HQfd7veKoKbBO4Pr30IEAhgBAIIAG3oJDx+AQwLBBYgR3JsABCzOQzOeO4cP4HPc4QCBPoPN4HNO4QoB9wAByDvBO4L2COwZ4Gd4UP/7vEf4LvGKoUAooDB9x3FgEQI4TwBgEIN4NpwEMXILvBO4bvD/Y3BO46eDgGdO4n8CoXw+cQh/w/kNd4fodoXJhLvCKYJ4Dhe7AYJXFwBHBUAgABewMPhvQd4bwB8FQqDvHO4YADhH4B4XM9nABQTsCAAf/awbXBO4Vmd4xED57vD+EwFgOIBoUNxv/1////5zOAy8AvPN6AQCbQIiCOIIKB7EILwZIEO4YACKYlFoB3CHIZ2CAIJHBEAToCMwLvBAArvCAAnAAALvDAIIPByA5BEQUM/n8O4TzCAAQtBhvd/X8d4YYBvwOBO4bBFO4b2D4ASELoP/d4IbGABMBiINLV4YAD9LyFO5bvCYYfPCARKBmAcDh3ud4Wt7vdDgONwF8O4Q8Bh5jCBAOPO4o0BgFAAoLcB/4UBLIgBDAAPI5DeKIQIDChcLL4IABGIOAJITvHAAkGs0HgG7AAO99p3Dhi2N43N7rLCxGHgF56AHCRwUwAYIlBhsNGoR3CqALCh54CFAXHAIg/CRAIDBIgtHGIR3D3ZhCWwXQwA1CAAMP5/M/nPMhp3BwAJGWIQ7Dgczt1pzIHCa4IABhpkBOgQACD4ZRCs1m4AyEO4IBBABUMXYYZDgEEvoRFd4TwBO5IAJ5nAFAMNTYZEBGgRiD7p0CO4nM43JmZABAIICBAAOA+HwgUgkEiGxFsAQOwGQLeBhPpz2QChEO8AoCd4R5CdwZpCNgdVqq0B7vQ7vdMQWIbYJkFAAIjBEoR3DCoOA8A3CYAOvh/wgH/d4hVBd4VAgn/eIYAGX4cAgw2DNQ2e9I0DBgxIBxGAWgS1DAAZrBLAi2DeAJwDOoLcFNQOA5jbCd4gACO4OgAgMHu4aBDokKgGIZ4LtBogABBgXw4HwhnL5lwEQRmJb4bvBO4/uIAfQKAJ3Gh7sC6/XcgR3NDwR3DA4K4CAQJ3GV4JrBCoZuBAIMK1Wg4eAhwRB91AdpENdwbwEAAkHP5D8DPoIrBQ4LvMNYICDO4z7Bd5HM5jvD4DxBd4PQGwIBCHIMAeAQAEhQIC4GIboTfGT4JcBO4TvINQV2sDvCAAw6DRZIcB+APEhoxDACJ3BBZPwAAIsDhTwDXwbvFO5LvQhnMu1wNQoABBAMOM4RqDuFwY4IUEGpKUCcYPwAQIXEAAnu9wbJBQPg+ArCcoIBBhkMMoqCBO4IVBEYfuNYsNLISHDZYkM/93CgmIOwJtBh3uAIPuNQZ3BLwsOSYuIAIOABYPex2P9+JxncZAJcCO5VgXYRPCWQQzF4AABDohHB5gACBYPeSAYAHdwcJQYfc/OQIAQZBwB2BABQMBhiBBcQcP///AoLkBgH4+DvI1GKxGoFRVmXYThFAAwNFh0PawUNxoDC95fBDAsP+AnFFox3B9vtO4LvBG47/CcofOPoYABWIJ3Cd4jYBB4NwgwFBd4LxCIoQuGdwJIBdAoAHBoixBAQMJhvdBALuBBAJ3Gh/ADQkNLwboBAQLvDZAMP54ACMoJcCsAYC5nOV4OXcgQADd4QADs8HsF2g1QSwQAE+AcGRILhD/5cHMAgEFg2AzuNV4bvFhp3C5igN73u6DQBMwIAC/4/BcgaQDhwtBy8A3ewEAjvBAAdQgoCEDYbHCLgRIBeAwMCQoKdDwEMg6XBBgIXDO4WJhuNHQyOF+DvFAAwLB9vdVg7vJAAeXhYjHhGAAIKpL6CoBd4UDgbvDO44gDAYMHW4bCECIWdOoI2FKA0A0AABAwfu9oOFOwPgPI4ABWAICBE4p3KAARaBJQQDCAgJ3DdYLsEdwm3FwP/dwRiCd4nwQoYfDxEN7uIVxh3B1R3Bh0ONo/u93gAIIfMbozvY7oFELoMwA4h3CAAMJzOQAgOIO4LvG6ENAQP4xCjDAAiBBh6aBgEKd4139xNFd4SEBAAY6BhgHExAuG3ewO4zxCTBgnBAAMAgZKCEoo9EO4QAEdAIBBO4mPx5eBuCTDCYWfh/P6AeFNgVwg53EfITvC4BIB4B3HMgv/Vw3d7p3CFIPgHAwAMG4IAROwR1BAIWI/GAhm3gHMLAUAg1md4Q/Fh3uRgN3d4o+CPQPAAAWQ/7GB5nMH48DO4xDCF4YFCP4OAwD4GJgQCBhkJJQquGAwvAAQZsBAALvChfLuAICTKGIwBSDhoEB9yEBNwMM4GfgH8hnPO4wuBmB3ChYfFTYivBhAwBfAQABuA/GVAKKCADH4xHwhm8RYSICAALNIO4vQfgZfB8Hgd5H//gqBeYIrB5fLF4gAC6ENzIQBd453FYoUPO4ZUBCQMP/5SLuHwSg5UBAoggBxCiEJoe8714zUQCYbvBO4pDFXwRPBd4UOfwIzB5e7O44ABzP/LYp3CPAIHCu4XGhgiBBwR3IRQcP54ECyEJzJ3DkYUDGIIABRQTvJhvcZghFCu4XBZgRKGbQQAEO4m7hewGIIAEEJJjIKASKDNwh3Id4cJhJ5BOoMOgE9mAQCxGAd4jBHDAMN3p2Dd4Z+FSYThHhYDCnm8AgWwPAIVB/nM9nDO5kP//wBZD+DF4kPOoIBBC4rtCLwMO8EAgchd4w6JzwYBhHdegYkBO4oMDJwxKEgcAQgZ3D5//53Onk8O4a+BAIO62DbJwEJKIMIZoa1D+AABR4X/O4jvDO4PHyEQu0GfoIADegIAB5vmwGrd4YADSYMGy2WO4jODd4j5EAA52BMwLvB53uO4MNTIUBgIRB1WgCwXuEZYABg4EDHYI9CXAK6FLQcOO4IFBsACBGoMRgGHO4mJO4IAChkKyENNoTvFKwLGHhh5BhnMPoQEDBAnM5jvB4YIBFQUQ+EQd4vgV4LuDAAI0F6DUDO5eZzIFDO4TvDGYIBBd4OHw53BxR3E4GqyHA2ArBgwJBhe7XRH/O4UAhzONAAp3Bh8B+KWBAAnu8CRCAAVVgtQAoULeAq3GABOOSwp3DBIMICg0LW4MJyEIBoTvC38vYgeQyGZBYI3BfAx/DO5wcBSoLsDEILuBhn8BQdA+FAeIw/DBAbuDuEHf4adDbgQBB4IiF2ELbwQBBAwIMDEAuy+R3DOgJ4BO4vQIwfMGQJdB5nM55rELYo4CAAXvO4cIxDdEbw5MDO4n/PAMHAAQJCg/ud4UMAAYMCzOIwB3CEwWwO4oABJQbvFAAg3BHAPgFIKpDO4TgB//5RYIABjUAhUQeAYABxAeC7qWDABJXDOwYABBAsHu7vEAwIbD5h3FhKCBd45qD7ACB1StDBwK4CXY7vGO4cJzOZznMKgoUBO4g/BLYp5MO4sNO4UODYbuCKITvB54TBd453Fd48NhADBZwSnD/7aBh7KBOYZNNhx9CAAQoCO4uIOCIbCAAaiBI4Xg8AUGaoLvB4HwO4bzB34MBhI3BhZxBd4YGBd4t3agRCI7sNAAJsDAQMMN4oKB5jvEAAUNSIhkBh7tDAIcADQuIAALMBd4YBCh0JeAZ3G93Ah7RDAAO7+EJd4QAKd4IOB9x3LOwoADOwxJB5wgBhZHEAYq3B+Hw/8AuAIBAQScBDQQBBd4RtBF4OQAALvOzJ2DRATvCzJ3McQh3BhIfCZghrH7Z3CPAZEC+P4ZwwAHh7vBh/wg4ABTgpRBAIPuEwXteAhlEAAkL3YEC/PwAgW5VoYAGFIYACJ4nMRYIxCc4vMNgUJm4MBIoR3DhxFC/8QDAYiBu7cBRIdwUwLvBAAp3DdwYlBNga3LAA7vHLIZmBBQYMEhGIAodVDwQfB7sNHAf/JgUJMIML7wGBMogACiMf/4VBhKZBuFwhgODuHQE4LwBgDvFCIO7hbNCYokNAgMLXYUPAAp4G+xPCd4vHvgSGPIbvEAAKVCGITwDUAcJ06uHEQSsFhZ3Cd4ZBCO4bqCuAJCO4ULhZ4Bd4Y7C4AqCCQQAK+B9B/9gIQ53FwBxEhAFB5ncDYIsMAA5CD8DCBAQQADd5AFB7ruCh7sBAIaQCAARMBhAzGd52ZzMAsx3CYAZFB5nMTQTMFBgOAJQPQBghYCAQJBBO5wAKIQNwg7vBO4buBABewAAK+DGime9L0DNoI2BeQXAWoZ2Ef4Z3ILAMJyG5IQKoD9wABgHN8F5f5wAGcgJ3GdocAgjuDABLvCdQcGAoh3Fh/vdIJ3CcQLbFPAgAD5ncgEKAIPdRoMJCoJCD/4CBEYIaB4HguGgKBYDGTAKBKfIYQBCQnwaoICCd49gsDKGzLvHKYQADxAIC8HuAQINDd4Wg0HQ5j4ByAaEHoTvFO4OwMouYmcwh//AIIKDhByGZgZ3Bg7dBgxoFCAWACYjoDh7uBgwGDBocN5YfFhz1Bg4GCxOAd5B3BOILwBd4PMZJQAOxEwRoJFCqACBxw3DAASEEd4I7BAwQ4Sd46OCLQIAHO4cIH4R2BPAwAHgYIHhpODO55qBMwMI9HoeYZBC5kM4DvEZ4XAxGAg93zLeC3ew2DwFdwIFEO4kJFoRxDFoQFDBwMA8B2ChjrBAAaAFyBeBAA3QzOZOxQrBUoLvDVYXdSIR3DhnMAALvC6Hgd4YQCIAXwgELfCMPqAcCuF3O4l3AwgAF4AABIQJ3HyYCB1MK7gOCYwOQB4cMNYP/WoYMByDtBBAQHBhv9/p3FOwXMeAK6ChKMCKYV5U4Z3Bd4bqDAAZ3F81wdA14KQggEd4ZlBhn8Qg7vCyGQ6EMgF3O4LvLhQEDxEIMAOgO4MPDQJ3G553DABC4EO4zvM8HgFoQAB+CiBHoIgCAQbwFPQcAgjvHSgPQCINwvvQgEJhe7AAIbBhIWCGARrCwACBKoPd+H9DQJ3DGgPMVwfHyBwEO4ziDWoLvJCgXw9wDBO4f/gHcSYcMDwT0CAAgJDolANAPpeQgfBDQNwuDvD2CaC4HACALuEd4iRB7vzO4MIhEHJITwCZIMMvLYIgf/+RwBaoLWBAYQAHhwLBd4YACqHwAILlFAILyHPAUEAAIkBTIQAGO4QXDO4wAJdQMN7vddwOIg93XIXMhxRBdwIcJ+Hw/7iChnsBgkNhsMHoUOCAJ3BegQABgtVNQwzBAYMLWYIADO4VAOwNAd4oAEKwR3GgEJWwaREVAS6EAA4PCOA7KEO4QDBAIIjBSIPMDYxyDhaCBb4zvJ9wAE2C4CO4IAGFQPgLoVt5nODoJ3B3YTGWQhnIBQkMQoSGMAAwXCh///5/BNgJtC7q9D2HQ2G9BAT/BhLDChgfCCYYADSwZ3I93gAIJ3FABMO7wECCoJmMhkN7o2ChOQzOQcgQAD3ewKYJVFg93u9wEgp3Dd4R6CVYXA2GQgyLCfhTvHyBZCO5vvvaVBD4QkE9wRE/5mDAQR3BhoWCOgIBBAA2q0D3Md4IOMABBPDO5DvGO47YIh8O+65GNAQRF/7dFgHMd4mIwABBQoISEBAMOAAUA8DjDAA/MAYRAF7rxCABsPd5oAN995Z4mAwHM4AQF/+IO4wAGyDvFepB3BgBhCNYNwg93hGIgHAGoUHCwibDoAeDagQXBAIIRCC4h3EgxRLXQQLIhDUBO4cIhZ3Bd44AFzJxDCIMM/IxEd4kNDIsHg8IAgJ3DeAt3AoJiBRIUO9zFDJwIAB2BIJ8C2JIogMJwBBEAAMwaQoAQHBYAChruBd4QHB5iBECgzaCN4MMCQTvF35mGQYR3Ex2wAYP8O4gvG9ns8GIwEMO4cLeAQlCO4hNHAAS4CHAQaBhgACd4sOuHnd4RdDdwYBBCwK+GRIOIJALuBSQUPIQV3DIIABhGZwB3EP4UGRAjXEhp9CdQruI9x4BDIPgEwUA3YABNwQAC4GQHIOwV4QAUUIRpBAwUGKwLvCxjvGVgVwTYIfDBgJvExx3Cd4gBCAAPdpxjCHwigBhLwCBQnuUoVQHARqBAARCDhn5DQIABDIUEYAbnFABDuCAAIJEDIUM5iPKO4tAgGQMIbvGhwACdwR/Dd4MHu48Bh5oCAAkOd4cwbogEBdwgABdwLvJIAJCCdxjvEP4NgB4mIDpF3AAJBCHoZ3EBQTvDc4TwDBIh1BO4X/O44FEfgLvEO4JuHQIQoBd4Z3Gh8Pdw4ABdwqWGS5LuEADp3CBQ/uCpLvH5n5eASQBSIuIaIsP+BCOMoUIDwcIhGIO6DFDABpLEuAhC/4ABDJpXBhe7gG7dw4AC8AABaAjPIAAmgdZoDCAoX8ShIJEzOZXAetFZTDFX4f/FZHP/ieQFQgrFO4g2HTQOqEBLpBeAPAPonAAwTNBKwnvd5Pb6ADB9wACFALDBIALEGAA71C4EMVBAAMFIcLO4o0EKgMPhcz9zEKOIMMHYI8DXAcHg8AxApCIwIHBAAzvEOIUAu9wO40IO5EJzIoBd4p3Fh3dAwg7Eh6TCuDFEhxRDd4uu3QFBokEoEA9RHCY4J1BhnMHYbvCuGAvAPBeoZlBH4V3GYOOXgsOFAJNBO4YSB+/3MgPMhJLBJoUJ/JvFgcAmAHE93QOoZtBAQSKDhcIeAKHIgHA53u93qeAVAAAJWB1wRDd4wAEsEIO4MGs1mu4ABHQQCBhHIO4wDB2GwG4Pu8BRBv9/CwMM/ON6ABBd4h3KhzvEOgMHAQKeBO4TvGIwQAD5nA8Hg92u1R3BAITwEd4Z3Hg0GgGIgB2BO4d2IITvJO4ZDEKQKRCd40P/+QGwsiAwsOd4hnCOAQbBKYLuLMoJFB9w=")),0,135);
+g.drawImage(require("heatshrink").decompress(atob("+FQgl+xnu8AIBwGQgHuAoN3gF/hcLgEHu943G3hwUCDwIBCAAV3uEAhoBBhsO90OgHgoACBh0IhP5AAQXBg8H8Hw+GwEAXn4AECxGAh0MEAOeJAMP3+/huIG4cMg1mMog8BhnsAQIBC///J4MN6HcBIOIAAPs8Hl9nM5gcB0Hg852BAIMAI4YACIIIACh8AKAcAvA6D7vd7wTBTYJ3B9e+hEAhA4CyHuy8HXw29NgIABx+ASQKsBYgR3DgHQCIXMsEAAIOZyGZzx3Dh/A57IDPoXN4HNHwQoB9wAByDvBO4LhDOwR4Fd4cP/4oB0DWCd45VCgFFAYPuO4QACgEed4PweAILBN4NpwEMXILvBO4bvD/f/d4cPCYJ1BAAKSCzp3E/hNBJwPziEP+H8hrvD9DtC5MJd4RTBGoLvBhe7BQJSBAAeAI4IoCO4T2Ch8N6DvDeAPgqFQd48MiB3BE4cI/AvC5ns4AKCdgQAD//wUwMMhhgBO4Nmd4xED57vD+EwFgKTCYoON/+v////OZwGXgF55vQI4TaBEQRxB6Hw7DRCAAPgO44ACKYlFoB3CHIcAiEAi93I4JpCdARmBd4IAFd4QAE4HA5//hh1BAIIPByA5BEQUM/n8O4TzCAAQtBhvd/X8d4YYBvwOBO4LvBYIoKBh/YewfA6B3DLoP/d4JXGABMBiKkEAAwKH9LyFO4fwOoR3Dd4TDD5/AJQcwDgcO9zvC1vd7ocBxuAvh3CuEHh5jCEoOPgHf/53CGgMAoGgbgX/CgJZEAIYAB5HIbxRCBAYULhZfBAAMA/GA/47Bd44ABh4CBg1mg8A3YAB3vtO4cMWxvG5vdZYWIw8AvPQd4NwRwUwAYIlBhsNGoR3CqB3BIAR4BFAXHAIg/CRAIDBIgtHHIR3D3ZhCZYXwwBrCOAXP5n855kNO4OABIyxCHYcDmdutOZA4VAAYUNqB0DAAQfDKIVms3AAgJ3BhBMBJwgAHhi7DDIQABgl9CIrvCeAJ3JABPM4AoBhqbDIgI0CMQfdOgR3E5nG5MzIAIBBAQIABwA5BgUgkEiEAe7hwECtgCB2B3BbwMJ9OeyBLIh3gFATvCPITuDhoCEgFVqq0B//w///MQWIbYJkFAAIjBEoR3DCoOA8A3CYAOvh/wE4LvEKoLvCoEE/7xDAAy/C2G+gw2DNQ2e9I0DBgxIBxGAWgS1DAAfd7pYE6BrBWwUIh2OAwLcGNQOA5jbCd4gACO4OgAgMHu4aBDokKgGIZ4LtBogABBgXw4HwhnL5lwEQXgd4V3BAIdBb4jvBO4/uIAfQKAJ3Gh7sC6/X7ogBUIL0BCwJ3ChHoO4QeCO4YHBXAQCBO4xQBJoYVBNwIBBhWq0HDwEOCIPuoDtIH4LuCAAOwMIR3BUATnIfgZ9BFYKHBd5nQKwICBBYWAPoJ3B///d5HM5jvD4DxBd4PQGwIBCHIMAeAQAEhQIC4GIboQABB4ifBW4ZeCAAO+EwJyBNQV2sDvCAAw6DAAaLFDgPwB4kNGIUJ5I3CcooAHO4OZzILH+AABFgcKeAa+Dd4p3Jd4+Ld4juChnMuz0DNQQABBAMOM4RqDuFwY4IUEGpLwB8DjB+ACBC4kJyAEC93uyAABDoxLB8HwFYTlBAIMMFIJlEQQJ3BCoIYBDgULCIpZCQ4YGBu5pBhn/u4UExB2BNoMO9wBB9xqDO4JeEEQKTFxABBwHJh3ex2P9+JxncZAJcBhMJO4mZO4dgXYRPCWQQzF4AABRIhHB5gACBYPeSAcAxOAAYICCdwK0CQYfc/I6BNYeAOwIAKBgMMQIIHC8EP///AoLkBgH4+AMCd4uoxWI1B3EAAOQzIDBswCBcIwAGBosOh7dChuNAYXvL4IPChGYgEP+AnFFox3B9vtO4LvBG47/CcofOPoYABWIIzCd4bYCB4NwgwFBd4IBBhI0Bh64CdwIHBdwJIBdAq7BEgTwDAgaxBAQMJhvdBALuBBAIQDeAMPh/ADQOH2+IhpeDfgbvDZAMP54ACMoJcCsAYC5nOV4OXcgQADd4QADs8HsF2g1QSwQAE+AcGRILhD/5cDE4ySDAgcGwGdxqvDd4j3BCIMP5iSCvfQcA6SB9wLBxBmBAAX/H4LkDSAcOFoOXgG72AgEd4IADqEFAQkL93rhzHCLgRIBCwbwCBgSFBOoLvBwEMg6XBBgIXDO4WJhuNHQyOF+DvCu+w2/QHoQACBYPt7qsCAAPgOQLvJAAeXhYdCZYIBBKYOAAII/I3yMB6CoBd4UDgbvDO44gBPIQ+BW4YADD4TvBOoI2FKA0A0AABAwfu9oOFOwPgAQLgBDoqwBAQIJFO5QACJIP/JQIDC+AVCO4LrBdgjuE24uB/7uFd4nwQob0DxEN7uIVxJ3E1R3Bh0ONoZ+E93gAIIPCVQ7fDgENAwRhC8AWBE4LvNAAXdaQsAmAHEO4QABhOZyB6BxB3BIg3QH4PQ/GIEIIAGQIMPTQMAhTuB1DaE9xNCAQTvCLgQACyDcDAAWIFARbD3ew9ycEKILvCABkMAAMAgZKCAAYlBHog8BAArqDO4mPx5bBuCTDCYWfh/P6AeFNgVwg7FEaITvC4BIB4B3HMgXdEwP/VwyCBO4QpB8A4GABiUCACB2COoIBCxH4wEM28A5hYCgEGszvC6F3NojKBuF3O4g+DPQPAAAWQ/7GB5nMH48D+AsCAAZDBF4YFCP4OAwD4GJgQCBhkJBYg8BBQJeBCgoABBAQCBNgIABd4UL5dwBASZQxGAKQcNAgPuQgJuBhnAz8A/kM553GFwMwO4PPhYfFTYjvBhAwBfAQABuA/GVAKKCTgxdR/GI+EM3gXCSIZeBg8Au7vEO4vQJgIAB+BTB8DvI//8FQLzBFYPL5YDBKQvQd5Z3FYoUPO4ZUBCQOf/5YDVoIFDIwNw+CUHBgQADEAOIUQnHg9wg+8714zUQCYbvBO4pDFXwRPBd4UOfwIzB5e7U4gAMO4R4BA4S4HhgiBO452DRQcP54ECyEJzJ3DkYXDGIIABRQTvCVoI0EhvcZghFCu4QBaQhKEdYIIFO4m7hewGIIRFEJAAFMYRQCRQZ3FXYUOCYXgd4cJhJ5BBIMOgE9mAYCxGAd4kAdwJ3DzIYBhu9OwbvDPwqTCcI8LAYU83gEC2B4BCoP85ns4Z6BO5UP/5lCAAz+DF4kPOoIBBC4eggGpdoJeBh3ggEDkLvGHROeDAMI7rFETYLVB3ew6AMDJwxKEgcAQgZ3D5//53Onk8O4a+BAIO62DvIKQMJKIMIZofQh3uOQIABR4X/BgLtBd4h3B4+QiF2gzjCeggAB5vmwGrd4YADSYMGy2Wd4jODd4j5EAA52BMwLvB53uO4MNTIUBgIRB1TOBAAJlBABkHJAXgHYI9CXAK6Cbwvghx3BAoNgAQI1BiMAw53ExJ3BAAUMhWQhptCd4T3DNwzGBhh5BhnMPoQEDBAnM5jvB4YIBFQUQ+EQd4plBFYZLCGgvQuDvCO4/gdoWZzIWDO4TvDGYIBBxGLw+HO4OKO4nA1WQ4GwFYMGBIML3a6I/53CgEOZxoAFO4MPgPxSwIAE93gSIQACqsFqEMF4MLeAbjFW4UA0ABCAAmOSwp3Dxe7hAiGha3BhOQhANCd4W/l7EDyGQzILBG4L4GP4Z3ODgKVBLgYhBL4MM/kA/LcBoHwoCAF6HueALdBh3+eAQABuEHcgKdFbgQBB4JtD3YAGgGwUoIiDAYTdB2Xy2DiCOgJ4BO4vQPYfMGQJdB5nM55rELYg9CA4fvO4cIxEAzJoBh4uBO4sLH4QOBC4X/PAMHAAQSCg/ud4UMAAYMCzOIwB2GO4oABJQbvFAAg3BHAPgFIKpDO4TgB//5zML1cAjUAhUQeAYABxAeC7qWDAALvCAAfAK4bbB92QAAJCFg93d4gGBAgSVBO4sJxbvI2EIBwPYAQOqVoYOBXAICDbI5YDO4cJzOZznMhQiCKYXQO4PMCQLCBLYorIABGQhp3CewTvDKIbvB54TBd453Hd4sNPQWZGITnDbQMPX4jLFABEONQMK3QGBFAR3Cg8Gd4JwRDYRwDUQJHC8HgCg2wd4XA+B3DeYO/BgMJxDvHhYMBd4l3agRCI7sNAAJEEFgLtCJ4nM5gbGhqRBg9gMgUPdoYBDfwIaExAABwDvEAIUOhIBBQAMJAYJ3D93Ah7RDAAO7+ARBEQgADBAbvBAoPuO48OW4R2FAAZ2GCoPOEAMLX4gDCNYTvB+Hw/8AuAIBAQScBDQQBBG4SoBF4OQAALvDO4ZQCd4eZOwbDCd4WZwEPGwQAL7p3BhOQDALMBQQPgNY/bO4R4DCAXx/DOGAAZnBAAMPd4JCBg4ABTgo4BAIPuEwXteAhlDJgOQd4UL3YMC/PwAgW52EJ/grDh//O4IpDeQ0A5iLBGIOwc4ZBB5nAG4OZm71BIoR3DhyrC/8QEgYiBu50BRIdwUwLvBAAp3DdwYlBEwS3CACLvGO4fM5h3CBQIpDgEIxAFDqoeCD4PdhvQRYOA//w8CsBMIML7zaCMoYACiMfF4PwX4OQuFwdgZ3B6BgBeAMAd4oRB3cLVgLFFhoEBha7Ch8PhAABAgJ4G+ycCd4vHvjBBVIZ5Ed4gABSoQxChsIdYWQ8HphOnVw4iCT4hQBO4TvDMYR3DdQVwBIR3ChcLPALvDHwXAFQQSCABXwPoP/sBCHO4SMCwBxEhAFB5ncDYIsMEoKFCa4YDC8DCBAQOZ5nMBILvIAoPdH4UPdgIBDSAQACJgMIHYzvDdoQADBweZzMAsx3CKgZIBIofAMAoMBwBKB6AMELAQCBIIIAKXRGZ/6YDIQNwg7vBO4buBABewAAK+DGh4AEz3pegZtBGwLyC4C1DOwj/DO5BYBhOQ3JCBh7LBgHuAAMA5vgvI9HVAKpCABDkBO4ztDgEEdwYAJd4TqDgwFEO4sP95ABO4TiBbYp4EKoncgEKAIPdRoMJCoJCDbYQjBDQPA8Fw0BQLAYyYBAAuIwAABg75DCAISE+DVBAQTvHsFgZQ2Zd45TCGwgIC8HuAQINDd4Wg0HQ5j4ByAaEHoTvFO4OwMouYmcwh//AIIKDYgYADh4IBPIMHg7dBgxoFCAMAwACBEIgACdwMGAwYWDhvLD4sOeoMHAwWJwDvIO4JxBeALvB5jdKABf4RAOImCNBKoVQAQOOG4YAC/5UBd4Y7BBYQ4Sd4sPj6OCLQIAHO4cIH4R2BPAwAChcOXYMMgYNHhpODAA7XBO4rvBMwMI9HoeYZBC5kM4AGBd4TPC4D5Cu+Zh5iB3ew2HP5nAdAbwBAocP+J3ChItCOIYtCAoYOBgHgOwUMdYIADBIOw8Fw6GQLwIAG6GZzLvKFYJ6Bd4arC7qRCO4cM5gABAwIyB8DvDCARKC+C8BAgP//4GBABEBiJ3BqAcCuF3O4l3AwgAF4AABIQJ3Ch7wDyYIB1MK7gOCYwOQDgcMNYP/NwQMCyDtBBAQHBhv9/p3FOwTZBXQcJx3ugF3uEHvKnDO4LvDdQYADL4kP81wdA14KQmwcoq3CAQP8BYfweATvCyGQ6EMI4J3Bd5UAhQEDxEIdoOgO4MPDQJ3GMIPILQhEB8BXCJQR3EGpIAFh/g8AtCLwQlBHoIgCAQbwFPQcAggLEd4SUB6ARBuF96EAhML3YABDYMJCwQwCNYWAAQJVB7vw/oaBO4Y0B5iuD4+Qhx3Kh4DCWoIGBh7tCAgIUE+HuAYJ3D/8A7iTDhgeCegQAEBIdEoBoB9IIDO4PcDQNwuDvD2CaC4HACALuEd4iRB7vzO4JTBg5JCeAXohEMvLvGAgMD//yOALVBBgIDCAA8OBYLvDAAVQ+ABBcooBBeQ54CggABEgKZCQYgABO4QXDO4wAJdQMN7vddwOIg93XIXMh3gwDuBLgQ3CNoJdB+Hw/7iChnsFIkNhsMHoUOCAJ3BegQABgtVNQwnBAYMLWYIADNgVAOwNAd4UN5pfFKwR3GgEJgBkBLIX/VoKoCXQgAHB4QAFOAPwLYIBBO4QDBAIIjBSIPMDYxyDhaCBb4zvJ9wAE2C4BeAKlFO40AtvM5wdBO4O7fgg+BH4JJCM5ByEhjjEAA4KBBg4XCh//UoRsBNoXdPIWw2HQ2G9BAIYBhcJYYIFBD4TRCAAiWDO4sAyALCUgZ3DAA94vEO70AzOQK4JmH6BfEhvdFAUDmEzmDkCAAe72BTBKosHu93VYIAENwKOBd4R6CVYXA2GQgyLCfhTvHLYJ3Bd5IAD997SoNwhCJDEgPuCIn/MwItBAQR3BhoWCOgIBBAA2q0BaBKRLvCGggABCZTqEAwsIDojvGaYTvGAA0Ph33uELg94BYjKECIP/boMNAwPe6HMd4Q8BxGAAIKFBeAgIBh2OMoXgcYIAJ5jvCfQvdeIQANh7vLGRbvEvOQW4JeBwGA5jLG/+IMgXtOwImHmDvFyB5ExAkCIQIbCNYNwg93hGIgHA4CIBg4gETYdAA4SHBEAIXBAIIRCC4h3EgyOKhi6CBIsIaIICCO4cIQYP/d4S8B9x3HmZ4BIIcM/IMDd4sNDIsHg6uBO4QJCeAl3AoJiBRIUO9wLBYoJOBAAOwPAoAD8C2EAAY8BVIJEC7oPHwBBEbwQmEaYXnSgwAGHAojFHwbuBd4QHB5iBEGwzaCN4MMCQTvF34qFhyDCO4MJ/kAx2wBAP8hvQ5h2CPoLXD9ns8GIwEMKYcLeAR2EJooAHXAR3CDQMMAATvFh1w87vCLobuDAIJ3EXwaJBxBIBdwKSCh5CCu4ZBAAMIzOAO4h/CgxxBPAJ2BL4XQhoGBYxI/F9x4BDIPgEwUA3YABNwToDyB4B2CvCACihGg8GKwLvCxjvGVgVwTYIYDBgIYBd4Z3Cd4JxBOALwD7tOMYQ3EUAMJeAQKE9ylCqA4CNQIACIQcM/IaBAAIZCgjADJANgAIQAIuEDmEwmZPBDIsM5iPKO4tAgGQMIbvEAAMOAATuCBATvCg93uB3BNAQAEhzvDmDdEAgLuEAALuBd5JABwFng53JdwsIWINwCYuIMAQACQAV3AAJBCHoZ3EBQTvB7vQc4UOhqlDd4R1BO4X/O44FEfgLvEO4JuHQIQoBd4Z3Du5jBh8PdwwDCmDBB8BKEDwYfCA4bNBSQ+IhMJhSWBACp3CAoSfBIoXuCpLvH5n5eASQBSIuIaIMPvIGBh/wE5J3Bd4RlCLoeIBQOIO5sIO4WoFQ7xBdgICBhrdFuAhC/4ABA4IABDotm5nMgBXBhe7gG7dwSrH8AABaAgBBg6gBABGgAwruEdYQDCAoX8HgJ3CAAnwd4qLD1orGAAbDFAAUP/4rBP4J3E5/8s3uO4IAIwB7CFQgrFO4QoBGw6aB1QoJbIKiBNwR3C4HAhhABJYkP94UB6GQD4vbTgXuAATJC8BABYgwAHeoI1Bhh3DQwIABoBNDhbwINAZ3EGgpUBh8LmfuYhRxBhg7BhgIC/gDCg8HgGIFIRGBA4IAGd4hxCgF3uB3GhB3IhOZFALvC5h3DoFPgjkB7sA2AcCHYkPSYVwYokOKIbvF126AoNEgigB9RHCUAJ1BdARsCewVwwF4WAYvBMoI/Cu4zBxwGB3cL2BxBFAJNBO4v3+/wVAOQJYJNChP5c4sDgEwgGEwB3B93QJoUHNoICCXYb7BeAIADYYvA53u93qeAVAAAJWB1wRDd4wAEsEIHIMGs1mu4ABHQQCBhHIAoOwAALvDAoI3B9x3Cv9/CwPPyGN6ABBd4h3HppOBhzvCMoR2BAQKxBO4TvGIwQAD5nA8Hg92u1QuCAILwEd4Z3Hg0GgGIgB2BO4d2sw+Bd4mwAIJ3FEQqRCd48P/+QO4kAkQFCojGCRQLdDGwJwCDYJTBdxZlBgB2BA==")),0,135);
g.flip();
diff --git a/apps/aclock/ChangeLog b/apps/aclock/ChangeLog
index 7819dbe2a..9687bc58f 100644
--- a/apps/aclock/ChangeLog
+++ b/apps/aclock/ChangeLog
@@ -1 +1,10 @@
0.02: Modified for use with new bootloader and firmware
+0.03: add hour ticks, remove timers
+0.04: add day-date display
+0.07: make date and face bigger
+0.08: make dots bigger and date more readable
+0.09: center date, remove box around it, internal refactor to remove redundant code.
+0.10: remove debug, refactor seconds to show elapsed secs each time app is displayed
+0.11: shift face down for widget area, maximize face size, 0 pad single digit date, use locale for date
+0.12: Fix regression after 0.11
+0.13: Fix broken date padding (fix #376)
diff --git a/apps/aclock/clock-analog.js b/apps/aclock/clock-analog.js
index 67061af52..951145c4e 100644
--- a/apps/aclock/clock-analog.js
+++ b/apps/aclock/clock-analog.js
@@ -1,94 +1,147 @@
-const p = Math.PI/2;
-const PRad = Math.PI/180;
+// http://forum.espruino.com/conversations/345155/#comment15172813
+const locale = require('locale');
+const p = Math.PI / 2;
+const pRad = Math.PI / 180;
+const faceWidth = 100; // watch face radius (240/2 - 24px for widget area)
+const widgetHeight=24+1;
+let timer = null;
+let currentDate = new Date();
+const centerX = g.getWidth() / 2;
+const centerY = (g.getWidth() / 2) + widgetHeight/2;
-let intervalRefMin = null;
-let intervalRefSec = null;
-let minuteDate = new Date();
-let secondDate = new Date();
+const seconds = (angle) => {
+ const a = angle * pRad;
+ const x = centerX + Math.sin(a) * faceWidth;
+ const y = centerY - Math.cos(a) * faceWidth;
-function seconds(angle, r) {
- const a = angle*PRad;
- const x = 120+Math.sin(a)*r;
- const y = 120-Math.cos(a)*r;
- g.fillRect(x-1,y-1,x+1,y+1);
-}
-function hand(angle, r1,r2) {
- const a = angle*PRad;
+ // if 15 degrees, make hour marker larger
+ const radius = (angle % 15) ? 2 : 4;
+ g.fillCircle(x, y, radius);
+};
+
+const hand = (angle, r1, r2) => {
+ const a = angle * pRad;
const r3 = 3;
- g.fillPoly([
- 120+Math.sin(a)*r1,
- 120-Math.cos(a)*r1,
- 120+Math.sin(a+p)*r3,
- 120-Math.cos(a+p)*r3,
- 120+Math.sin(a)*r2,
- 120-Math.cos(a)*r2,
- 120+Math.sin(a-p)*r3,
- 120-Math.cos(a-p)*r3]);
-}
-function drawAll() {
+ g.fillPoly([
+ Math.round(centerX + Math.sin(a) * r1),
+ Math.round(centerY - Math.cos(a) * r1),
+ Math.round(centerX + Math.sin(a + p) * r3),
+ Math.round(centerY - Math.cos(a + p) * r3),
+ Math.round(centerX + Math.sin(a) * r2),
+ Math.round(centerY - Math.cos(a) * r2),
+ Math.round(centerX + Math.sin(a - p) * r3),
+ Math.round(centerY - Math.cos(a - p) * r3)
+ ]);
+};
+
+const drawAll = () => {
g.clear();
- secondDate = minuteDate = new Date();
+ currentDate = new Date();
// draw hands first
onMinute();
// draw seconds
- g.setColor(0,0,0.6);
- for (let i=0;i<60;i++)
- seconds(360*i/60, 90);
+ const currentSec = currentDate.getSeconds();
+ // draw all secs
+
+ for (let i = 0; i < 60; i++) {
+ if (i > currentSec) {
+ g.setColor(0, 0, 0.6);
+ } else {
+ g.setColor(0.3, 0.3, 1);
+ }
+ seconds((360 * i) / 60);
+ }
onSecond();
-}
-function onSecond() {
- g.setColor(0,0,0.6);
- seconds(360*secondDate.getSeconds()/60, 90);
- g.setColor(1,0,0);
- secondDate = new Date();
- seconds(360*secondDate.getSeconds()/60, 90);
- g.setColor(1,1,1);
+};
-}
+const resetSeconds = () => {
+ g.setColor(0, 0, 0.6);
+ for (let i = 0; i < 60; i++) {
+ seconds((360 * i) / 60);
+ }
+};
-function onMinute() {
- g.setColor(0,0,0);
- hand(360*(minuteDate.getHours() + (minuteDate.getMinutes()/60))/12, -10, 50);
- hand(360*minuteDate.getMinutes()/60, -10, 82);
- minuteDate = new Date();
- g.setColor(1,1,1);
- hand(360*(minuteDate.getHours() + (minuteDate.getMinutes()/60))/12, -10, 50);
- hand(360*minuteDate.getMinutes()/60, -10, 82);
- if(minuteDate.getHours() >= 0 && minuteDate.getMinutes() === 0) {
+const onSecond = () => {
+ g.setColor(0.3, 0.3, 1);
+ seconds((360 * currentDate.getSeconds()) / 60);
+ if (currentDate.getSeconds() === 59) {
+ resetSeconds();
+ onMinute();
+ }
+ g.setColor(1, 0.7, 0.2);
+ currentDate = new Date();
+ seconds((360 * currentDate.getSeconds()) / 60);
+ g.setColor(1, 1, 1);
+};
+
+const drawDate = () => {
+ g.reset();
+ g.setColor(1, 0, 0);
+ g.setFont('6x8', 2);
+
+ const dayString = locale.dow(currentDate, true);
+ // pad left date
+ const dateString = ("0"+currentDate.getDate().toString()).substr(-2);
+ const dateDisplay = `${dayString}-${dateString}`;
+ // console.log(`${dayString}|${dateString}`);
+ // center date
+ const l = (g.getWidth() - g.stringWidth(dateDisplay)) / 2;
+ const t = centerY + 37;
+ g.drawString(dateDisplay, l, t, true);
+ // console.log(l, t);
+};
+const onMinute = () => {
+ if (currentDate.getHours() === 0 && currentDate.getMinutes() === 0) {
+ g.clear();
+ resetSeconds();
+ }
+ // clear existing hands
+ g.setColor(0, 0, 0);
+ // Hour
+ hand((360 * (currentDate.getHours() + currentDate.getMinutes() / 60)) / 12, -8, faceWidth - 35);
+ // Minute
+ hand((360 * currentDate.getMinutes()) / 60, -8, faceWidth - 10);
+
+ // get new date, then draw new hands
+ currentDate = new Date();
+ g.setColor(1, 0.9, 0.9);
+ // Hour
+ hand((360 * (currentDate.getHours() + currentDate.getMinutes() / 60)) / 12, -8, faceWidth - 35);
+ g.setColor(1, 1, 0.9);
+ // Minute
+ hand((360 * currentDate.getMinutes()) / 60, -8, faceWidth - 10);
+ if (currentDate.getHours() >= 0 && currentDate.getMinutes() === 0) {
Bangle.buzz();
}
-}
+ drawDate();
+};
-function clearTimers() {
- if(intervalRefMin) {clearInterval(intervalRefMin);}
- if(intervalRefSec) {clearInterval(intervalRefSec);}
-}
+const startTimers = () => {
+ timer = setInterval(onSecond, 1000);
+};
-function startTimers() {
- minuteDate = new Date();
- secondDate = new Date();
- intervalRefSec = setInterval(onSecond,1000);
- intervalRefMin = setInterval(onMinute,60*1000);
- drawAll();
-}
-
-Bangle.on('lcdPower',function(on) {
+Bangle.on('lcdPower', (on) => {
if (on) {
- g.clear();
- Bangle.drawWidgets();
+ // g.clear();
+ drawAll();
startTimers();
- }else {
- clearTimers();
+ Bangle.drawWidgets();
+ } else {
+ if (timer) {
+ clearInterval(timer);
+ }
}
});
g.clear();
+resetSeconds();
+startTimers();
+drawAll();
Bangle.loadWidgets();
Bangle.drawWidgets();
-drawAll();
-startTimers();
+
// Show launcher when middle button pressed
-setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
+setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" });
diff --git a/apps/activepedom/10600.png b/apps/activepedom/10600.png
new file mode 100644
index 000000000..36de436df
Binary files /dev/null and b/apps/activepedom/10600.png differ
diff --git a/apps/activepedom/1600.png b/apps/activepedom/1600.png
new file mode 100644
index 000000000..fb11f999a
Binary files /dev/null and b/apps/activepedom/1600.png differ
diff --git a/apps/activepedom/600.png b/apps/activepedom/600.png
new file mode 100644
index 000000000..4d2c625c7
Binary files /dev/null and b/apps/activepedom/600.png differ
diff --git a/apps/activepedom/ChangeLog b/apps/activepedom/ChangeLog
new file mode 100644
index 000000000..ca26a648a
--- /dev/null
+++ b/apps/activepedom/ChangeLog
@@ -0,0 +1,4 @@
+0.01: New Widget!
+0.02: Distance calculation and display
+0.03: Data logging and display
+0.04: Steps are set to 0 in log on new day
\ No newline at end of file
diff --git a/apps/activepedom/README.md b/apps/activepedom/README.md
new file mode 100644
index 000000000..a2a351a12
--- /dev/null
+++ b/apps/activepedom/README.md
@@ -0,0 +1,72 @@
+# Active Pedometer
+Pedometer that filters out arm movement and displays a step goal progress.
+
+I changed the step counting algorithm completely.
+Now every step is counted when in status 'active', if the time difference between two steps is not too short or too long.
+To get in 'active' mode, you have to reach the step threshold before the active timer runs out.
+When you reach the step threshold, the steps needed to reach the threshold are counted as well.
+
+Steps are saved to a datafile every 5 minutes. You can watch a graph using the app.
+
+## Screenshots
+* 600 steps
+
+
+* 1600 steps
+
+
+* 10600 steps
+
+
+## Features Widget
+
+* Two line display
+* Can display distance (in km) or steps in each line
+* Large number for good readability
+* Small number with the exact steps counted or more exact distance
+* Large number is displayed in green when status is 'active'
+* Progress bar for step goal
+* Counts steps only if they are reached in a certain time
+* Filters out steps where time between two steps is too long or too short
+* Step detection sensitivity from firmware can be configured
+* Steps are saved to a file and read-in at start (to not lose step progress)
+* Settings can be changed in Settings - App/widget settings - Active Pedometer
+
+## Features App
+
+* The app accesses the data stored for the current day
+* Timespan is choseable (1h, 4h, 8h, 12h, 16h, 20, 24h), standard is 24h, the whole current day
+
+## Data storage
+
+* Data is stored to a file named activepedomYYYYMMDD.data (activepedom20200427.data)
+* One file is created for each day
+* Format: now,stepsCounted,active,stepsTooShort,stepsTooLong,stepsOutsideTime
+* 'now' is UNIX timestamp in ms
+* You can use the app to watch a steps graph
+* You can import the file into Excel
+* The file does not include a header
+* You can convert UNIX timestamp to a date in Excel using this formula: =DATUM(1970;1;1)+(LINKS(A2;10)/86400)
+* You have to format the cell with the formula to a date cell. Example: JJJJ-MM-TT-hh-mm-ss
+
+## Settings
+
+* Max time (ms): Maximum time between two steps in milliseconds, steps will not be counted if exceeded. Standard: 1100
+* Min time (ms): Minimum time between two steps in milliseconds, steps will not be counted if fallen below. Standard: 240
+* Step threshold: How many steps are needed to reach 'active' mode. If you do not reach the threshold in the 'Active Reset' time, the steps are not counted. Standard: 30
+* Act.Res. (ms): Active Reset. After how many miliseconds will the 'active mode' reset. You have to reach the step threshold in this time, otherwise the steps are not counted. Standard: 30000
+* Step sens.: Step Sensitivity. How sensitive should the sted detection be? This changes sensitivity in step detection in the firmware. Standard in firmware: 80
+* Step goal: This is your daily step goal. Standard: 10000
+* Step length: Length of one step in cm. Standard: 75
+* Line One: What to display in line one, steps or distance. Standard: steps
+* Line Two: What to display in line two, steps or distance. Standard: distance
+
+## Releases
+
+* Offifical app loader: https://github.com/espruino/BangleApps/tree/master/apps/activepedom (https://banglejs.com/apps)
+* Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/activepedom (https://purple-tentacle.github.io/BangleApps/#widget)
+* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/pedometer
+
+## Requests
+
+If you have any feature requests, please post in this forum thread: http://forum.espruino.com/conversations/345754/
\ No newline at end of file
diff --git a/apps/activepedom/app-icon.js b/apps/activepedom/app-icon.js
new file mode 100644
index 000000000..82e786c7f
--- /dev/null
+++ b/apps/activepedom/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwIGDvAEDgP+ApMD/4FVEZY1FABcP8AFDn/wAod/AocB//4AoUHAokPAokf5/8AocfAoc+j5HDvgFEvEf7+AAoP4AoJCC+E/54qCsE/wYkDn+AAos8AohZDj/AAohrEp4FEs5xEuJfDgF5Aon4GgYFBGgZOBnyJD+EeYgfgj4FEh6VD4AFDh+AAIJMCBoIFFLQQtBgYFCHIIFDjA3BC4I="))
\ No newline at end of file
diff --git a/apps/activepedom/app.js b/apps/activepedom/app.js
new file mode 100644
index 000000000..ec9b1237f
--- /dev/null
+++ b/apps/activepedom/app.js
@@ -0,0 +1,165 @@
+(() => {
+
+ //Graph module, as long as modules are not added by the app loader
+ Modules.addCached("graph",function(){exports.drawAxes=function(b,c,a){function h(a){return e+m*(a-t)/x}function l(a){return f+g-g*(a-n)/u}var k=a.padx||0,d=a.pady||0,t=-k,w=c.length+k-1,n=(void 0!==a.miny?a.miny:a.miny=c.reduce(function(a,b){return Math.min(a,b)},c[0]))-d;c=(void 0!==a.maxy?a.maxy:a.maxy=c.reduce(function(a,b){return Math.max(a,b)},c[0]))+d;a.gridy&&(d=a.gridy,n=d*Math.floor(n/d),c=d*Math.ceil(c/d));var e=a.x||0,f=a.y||0,m=a.width||b.getWidth()-(e+1),g=a.height||b.getHeight()-(f+1);a.axes&&(null!==a.ylabel&&
+ (e+=6,m-=6),null!==a.xlabel&&(g-=6));a.title&&(f+=6,g-=6);a.axes&&(b.drawLine(e,f,e,f+g),b.drawLine(e,f+g,e+m,f+g));a.title&&(b.setFontAlign(0,-1),b.drawString(a.title,e+m/2,f-6));var x=w-t,u=c-n;u||(u=1);if(a.gridx){b.setFontAlign(0,-1,0);var v=a.gridx;for(d=Math.ceil((t+k)/v)*v;d<=w-k;d+=v){var r=h(d),p=a.xlabel?a.xlabel(d):d;b.setPixel(r,f+g-1);var q=b.stringWidth(p)/2;null!==a.xlabel&&r>q&&b.getWidth()>r+q&&b.drawString(p,r,f+g+2)}}if(a.gridy)for(b.setFontAlign(0,0,1),d=n;d<=c;d+=a.gridy)k=l(d),
+ p=a.ylabel?a.ylabel(d):d,b.setPixel(e+1,k),q=b.stringWidth(p)/2,null!==a.ylabel&&k>q&&b.getHeight()>k+q&&b.drawString(p,e-5,k+1);b.setFontAlign(-1,-1,0);return{x:e,y:f,w:m,h:g,getx:h,gety:l}};exports.drawLine=function(b,c,a){a=a||{};a=exports.drawAxes(b,c,a);var h=!0,l;for(l in c)h?b.moveTo(a.getx(l),a.gety(c[l])):b.lineTo(a.getx(l),a.gety(c[l])),h=!1;return a};exports.drawBar=function(b,c,a){a=a||{};a.padx=1;a=exports.drawAxes(b,c,a);for(var h in c)b.fillRect(a.getx(h-.5)+1,a.gety(c[h]),a.getx(h+
+ .5)-1,a.gety(0));return a}});
+
+ const storage = require("Storage");
+ const SETTINGS_FILE = 'activepedom.settings.json';
+ var history = 86400000; // 28800000=8h 43200000=12h //86400000=24h
+
+ //return setting
+ function setting(key) {
+ //define default settings
+ const DEFAULTS = {
+ 'cMaxTime' : 1100,
+ 'cMinTime' : 240,
+ 'stepThreshold' : 30,
+ 'intervalResetActive' : 30000,
+ 'stepSensitivity' : 80,
+ 'stepGoal' : 10000,
+ 'stepLength' : 75,
+ };
+ if (!settings) { loadSettings(); }
+ return (key in settings) ? settings[key] : DEFAULTS[key];
+ }
+
+ //Convert ms to time
+ function getTime(t) {
+ date = new Date(t);
+ offset = date.getTimezoneOffset() / 60;
+ //var milliseconds = parseInt((t % 1000) / 100),
+ seconds = Math.floor((t / 1000) % 60);
+ minutes = Math.floor((t / (1000 * 60)) % 60);
+ hours = Math.floor((t / (1000 * 60 * 60)) % 24);
+ hours = hours - offset;
+ hours = (hours < 10) ? "0" + hours : hours;
+ minutes = (minutes < 10) ? "0" + minutes : minutes;
+ seconds = (seconds < 10) ? "0" + seconds : seconds;
+ return hours + ":" + minutes + ":" + seconds;
+ }
+
+ function getDate(t) {
+ date = new Date(t*1);
+ year = date.getFullYear();
+ month = date.getMonth()+1; //month is zero-based
+ day = date.getDate();
+ month = (month < 10) ? "0" + month : month;
+ day = (day < 10) ? "0" + day : day;
+ return year + "-" + month + "-" + day;
+ }
+
+ //columns: 0=time, 1=stepsCounted, 2=active, 3=stepsTooShort, 4=stepsTooLong, 5=stepsOutsideTime
+ function getArrayFromCSV(file, column) {
+ i = 0;
+ array = [];
+ now = new Date();
+ while ((nextLine = file.readLine())) { //as long as there is a next line
+ if(nextLine) {
+ dataSplitted = nextLine.split(','); //split line,
+ diff = now - dataSplitted[0]; //calculate difference between now and stored time
+ if (diff <= history) { //only entries from the last x ms
+ array.push(dataSplitted[column]);
+ }
+ }
+ i++;
+ }
+ return array;
+ }
+
+ function drawGraph() {
+ //times
+ // actives = getArrayFromCSV(csvFile, 2);
+ // shorts = getArrayFromCSV(csvFile, 3);
+ // longs = getArrayFromCSV(csvFile, 4);
+ // outsides = getArrayFromCSV(csvFile, 5); //array.push(dataSplitted[5].slice(0,-1));
+ now = new Date();
+ month = now.getMonth() + 1;
+ if (month < 10) month = "0" + month;
+ filename = filename = "activepedom" + now.getFullYear() + month + now.getDate() + ".data";
+ var csvFile = storage.open(filename, "r");
+ times = getArrayFromCSV(csvFile, 0);
+ first = getDate(times[0]) + " " + getTime(times[0]); //first entry in datafile
+ last = getDate (times[times.length-1]) + " " + getTime(times[times.length-1]); //last entry in datafile
+ //free memory
+ csvFile = undefined;
+ times = undefined;
+
+ //steps
+ var csvFile = storage.open(filename, "r");
+ steps = getArrayFromCSV(csvFile, 1);
+ first = first + " " + steps[0] + "/" + setting('stepGoal');
+ last = last + " " + steps[steps.length-1] + "/" + setting('stepGoal');
+
+ //define y-axis grid labels
+ stepsLastEntry = steps[steps.length-1];
+ if (stepsLastEntry < 1000) gridyValue = 100;
+ if (stepsLastEntry >= 1000 && stepsLastEntry < 10000) gridyValue = 1000;
+ if (stepsLastEntry > 10000) gridyValue = 5000;
+
+ //draw
+ drawMenu();
+ g.drawString("First: " + first, 10, 30);
+ g.drawString(" Last: " + last, 10, 40);
+ require("graph").drawLine(g, steps, {
+ //title: "Steps Counted",
+ axes : true,
+ gridy : gridyValue,
+ y : 60, //offset on screen
+ x : 5, //offset on screen
+ });
+ //free memory from big variables
+ allData = undefined;
+ allDataFile = undefined;
+ csvFile = undefined;
+ times = undefined;
+ }
+
+ function drawMenu () {
+ g.clear();
+ g.setFont("6x8", 1);
+ g.drawString("BTN1:Timespan | BTN2:Draw", 20, 10);
+ g.drawString("Timespan: " + history/1000/60/60 + " hours", 20, 20);
+ }
+
+ setWatch(function() { //BTN1
+ switch(history) {
+ case 3600000 : //1h
+ history = 14400000; //4h
+ break;
+ case 86400000 : //24
+ history = 3600000; //1h
+ break;
+ default :
+ history = history + 14400000; //4h
+ break;
+ }
+ drawMenu();
+ }, BTN1, {edge:"rising", debounce:50, repeat:true});
+
+ setWatch(function() { //BTN2
+ g.setFont("6x8", 2);
+ g.drawString ("Drawing...",30,60);
+ drawGraph();
+ }, BTN2, {edge:"rising", debounce:50, repeat:true});
+
+ setWatch(function() { //BTN3
+ }, BTN3, {edge:"rising", debounce:50, repeat:true});
+
+ setWatch(function() { //BTN4
+ }, BTN4, {edge:"rising", debounce:50, repeat:true});
+
+ setWatch(function() { //BTN5
+ }, BTN5, {edge:"rising", debounce:50, repeat:true});
+
+ //load settings
+ let settings;
+ function loadSettings() {
+ settings = storage.readJSON(SETTINGS_FILE, 1) || {};
+ }
+
+ drawMenu();
+
+})();
\ No newline at end of file
diff --git a/apps/activepedom/app.png b/apps/activepedom/app.png
new file mode 100644
index 000000000..6fccf4308
Binary files /dev/null and b/apps/activepedom/app.png differ
diff --git a/apps/activepedom/settings.js b/apps/activepedom/settings.js
new file mode 100644
index 000000000..94ae435d2
--- /dev/null
+++ b/apps/activepedom/settings.js
@@ -0,0 +1,112 @@
+// This file should contain exactly one function, which shows the app's settings
+/**
+ * @param {function} back Use back() to return to settings menu
+ */
+(function(back) {
+ const SETTINGS_FILE = 'activepedom.settings.json';
+ const LINES = ['Steps', 'Distance'];
+
+ // initialize with default settings...
+ let s = {
+ 'cMaxTime' : 1100,
+ 'cMinTime' : 240,
+ 'stepThreshold' : 30,
+ 'intervalResetActive' : 30000,
+ 'stepSensitivity' : 80,
+ 'stepGoal' : 10000,
+ 'stepLength' : 75,
+ 'lineOne': LINES[0],
+ 'lineTwo': LINES[1],
+ };
+ // ...and overwrite them with any saved values
+ // This way saved values are preserved if a new version adds more settings
+ const storage = require('Storage');
+ const saved = storage.readJSON(SETTINGS_FILE, 1) || {};
+ for (const key in saved) {
+ s[key] = saved[key];
+ }
+
+ // creates a function to safe a specific setting, e.g. save('color')(1)
+ function save(key) {
+ return function (value) {
+ s[key] = value;
+ storage.write(SETTINGS_FILE, s);
+ //WIDGETS["activepedom"].draw();
+ };
+ }
+
+ const menu = {
+ '': { 'title': 'Active Pedometer' },
+ '< Back': back,
+ 'Max time (ms)': {
+ value: s.cMaxTime,
+ min: 0,
+ max: 10000,
+ step: 100,
+ onchange: save('cMaxTime'),
+ },
+ 'Min time (ms)': {
+ value: s.cMinTime,
+ min: 0,
+ max: 500,
+ step: 10,
+ onchange: save('cMinTime'),
+ },
+ 'Step threshold': {
+ value: s.stepThreshold,
+ min: 0,
+ max: 100,
+ step: 1,
+ onchange: save('stepThreshold'),
+ },
+ 'Act.Res. (ms)': {
+ value: s.intervalResetActive,
+ min: 100,
+ max: 100000,
+ step: 1000,
+ onchange: save('intervalResetActive'),
+ },
+ 'Step sens.': {
+ value: s.stepSensitivity,
+ min: 0,
+ max: 1000,
+ step: 10,
+ onchange: save('stepSensitivity'),
+ },
+ 'Step goal': {
+ value: s.stepGoal,
+ min: 1000,
+ max: 100000,
+ step: 1000,
+ onchange: save('stepGoal'),
+ },
+ 'Step length (cm)': {
+ value: s.stepLength,
+ min: 1,
+ max: 150,
+ step: 1,
+ onchange: save('stepLength'),
+ },
+ 'Line One': {
+ format: () => s.lineOne,
+ onchange: function () {
+ // cycles through options
+ const oldIndex = LINES.indexOf(s.lineOne)
+ const newIndex = (oldIndex + 1) % LINES.length
+ s.lineOne = LINES[newIndex]
+ save('lineOne')(s.lineOne)
+ },
+ },
+ 'Line Two': {
+ format: () => s.lineTwo,
+ onchange: function () {
+ // cycles through options
+ const oldIndex = LINES.indexOf(s.lineTwo)
+ const newIndex = (oldIndex + 1) % LINES.length
+ s.lineTwo = LINES[newIndex]
+ save('lineTwo')(s.lineTwo)
+ },
+ },
+ };
+ E.showMenu(menu);
+});
\ No newline at end of file
diff --git a/apps/activepedom/widget.js b/apps/activepedom/widget.js
new file mode 100644
index 000000000..ed91a4cfd
--- /dev/null
+++ b/apps/activepedom/widget.js
@@ -0,0 +1,232 @@
+(() => {
+ var stepTimeDiff = 9999; //Time difference between two steps
+ var startTimeStep = new Date(); //set start time
+ var stopTimeStep = 0; //Time after one step
+ var timerResetActive = 0; //timer to reset active
+ var timerStoreData = 0; //timer to store data
+ var steps = 0; //steps taken
+ var stepsCounted = 0; //active steps counted
+ var active = 0; //x steps in y seconds achieved
+ var stepGoalPercent = 0; //percentage of step goal
+ var stepGoalBarLength = 0; //length og progress bar
+ var lastUpdate = new Date(); //used to reset counted steps on new day
+ var width = 46; //width of widget
+
+ //used for statistics and debugging
+ var stepsTooShort = 0;
+ var stepsTooLong = 0;
+ var stepsOutsideTime = 0;
+
+ var distance = 0; //distance travelled
+
+ const s = require('Storage');
+ const SETTINGS_FILE = 'activepedom.settings.json';
+ const PEDOMFILE = "activepedom.steps.json";
+ var dataFile;
+ var storeDataInterval = 5*60*1000; //ms
+
+ let settings;
+ //load settings
+ function loadSettings() {
+ settings = s.readJSON(SETTINGS_FILE, 1) || {};
+ }
+
+ function storeData() {
+ now = new Date();
+ month = now.getMonth() + 1; //month is 0-based
+ if (month < 10) month = "0" + month; //leading 0
+ filename = filename = "activepedom" + now.getFullYear() + month + now.getDate() + ".data"; //new file for each day
+ dataFile = s.open(filename,"a");
+ if (dataFile) { //check if filen already exists
+ if (dataFile.getLength() == 0) {
+ //new day, set steps to 0
+ stepsCounted = 0;
+ stepsTooShort = 0;
+ stepsTooLong = 0;
+ stepsOutsideTime = 0;
+ }
+ dataFile.write([
+ now.getTime(),
+ stepsCounted,
+ active,
+ stepsTooShort,
+ stepsTooLong,
+ stepsOutsideTime,
+ ].join(",")+"\n");
+ }
+ dataFile = undefined; //save memory
+ }
+
+ //return setting
+ function setting(key) {
+ //define default settings
+ const DEFAULTS = {
+ 'cMaxTime' : 1100,
+ 'cMinTime' : 240,
+ 'stepThreshold' : 30,
+ 'intervalResetActive' : 30000,
+ 'stepSensitivity' : 80,
+ 'stepGoal' : 10000,
+ 'stepLength' : 75,
+ };
+ if (!settings) { loadSettings(); }
+ return (key in settings) ? settings[key] : DEFAULTS[key];
+ }
+
+ function setStepSensitivity(s) {
+ function sqr(x) { return x*x; }
+ var X=sqr(8192-s);
+ var Y=sqr(8192+s);
+ Bangle.setOptions({stepCounterThresholdLow:X,stepCounterThresholdHigh:Y});
+ }
+
+ //format number to make them shorter
+ function kFormatterSteps(num) {
+ if (num <= 999) return num; //smaller 1.000, return 600 as 600
+ if (num >= 1000 && num < 10000) { //between 1.000 and 10.000
+ num = Math.floor(num/100)*100;
+ return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; //return 1600 as 1.6k
+ }
+ if (num >= 10000) { //greater 10.000
+ num = Math.floor(num/1000)*1000;
+ return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; //return 10.600 as 10k
+ }
+ }
+
+ //Set Active to 0
+ function resetActive() {
+ active = 0;
+ steps = 0;
+ if (Bangle.isLCDOn()) WIDGETS["activepedom"].draw();
+ }
+
+ function calcSteps() {
+ stopTimeStep = new Date(); //stop time after each step
+ stepTimeDiff = stopTimeStep - startTimeStep; //time between steps in milliseconds
+ startTimeStep = new Date(); //start time again
+
+ //Remove step if time between first and second step is too long
+ if (stepTimeDiff >= setting('cMaxTime')) { //milliseconds
+ stepsTooLong++; //count steps which are not counted, because time too long
+ steps--;
+ }
+ //Remove step if time between first and second step is too short
+ if (stepTimeDiff <= setting('cMinTime')) { //milliseconds
+ stepsTooShort++; //count steps which are not counted, because time too short
+ steps--;
+ }
+
+ //Step threshold reached
+ if (steps >= setting('stepThreshold')) {
+ if (active == 0) {
+ stepsCounted = stepsCounted + (setting('stepThreshold') -1) ; //count steps needed to reach active status, last step is counted anyway, so treshold -1
+ stepsOutsideTime = stepsOutsideTime - 10; //substract steps needed to reach active status
+ }
+ active = 1;
+ clearInterval(timerResetActive); //stop timer which resets active
+ timerResetActive = setInterval(resetActive, setting('intervalResetActive')); //reset active after timer runs out
+ steps = 0;
+ }
+
+ if (active == 1) {
+ stepsCounted++; //count steps
+ }
+ else {
+ stepsOutsideTime++;
+ }
+ settings = 0; //reset settings to save memory
+ }
+
+ function draw() {
+ var height = 23; //width is deined globally
+ distance = (stepsCounted * setting('stepLength')) / 100 /1000; //distance in km
+
+ //Check if same day
+ let date = new Date();
+ if (lastUpdate.getDate() == date.getDate()){ //if same day
+ }
+ else { //different day, set all steps to 0
+ stepsCounted = 0;
+ stepsTooShort = 0;
+ stepsTooLong = 0;
+ stepsOutsideTime = 0;
+ }
+ lastUpdate = date;
+
+ g.reset();
+ g.clearRect(this.x, this.y, this.x+width, this.y+height);
+
+ //draw numbers
+ if (active == 1) g.setColor(0x07E0); //green
+ else g.setColor(0xFFFF); //white
+ g.setFont("6x8", 2);
+
+ if (setting('lineOne') == 'Steps') {
+ g.drawString(kFormatterSteps(stepsCounted),this.x+1,this.y); //first line, big number, steps
+ }
+ if (setting('lineOne') == 'Distance') {
+ g.drawString(distance.toFixed(2),this.x+1,this.y); //first line, big number, distance
+ }
+ g.setFont("6x8", 1);
+ g.setColor(0xFFFF); //white
+ if (setting('lineTwo') == 'Steps') {
+ g.drawString(stepsCounted,this.x+1,this.y+14); //second line, small number, steps
+ }
+ if (setting('lineTwo') == 'Distance') {
+ g.drawString(distance.toFixed(3) + "km",this.x+1,this.y+14); //second line, small number, distance
+ }
+
+ //draw step goal bar
+ stepGoalPercent = (stepsCounted / setting('stepGoal')) * 100;
+ stepGoalBarLength = width / 100 * stepGoalPercent;
+ if (stepGoalBarLength > width) stepGoalBarLength = width; //do not draw across width of widget
+ g.setColor(0x7BEF); //grey
+ g.fillRect(this.x, this.y+height, this.x+width, this.y+height); // draw background bar
+ g.setColor(0xFFFF); //white
+ g.fillRect(this.x, this.y+height, this.x+1, this.y+height-1); //draw start of bar
+ g.fillRect(this.x+width, this.y+height, this.x+width-1, this.y+height-1); //draw end of bar
+ g.fillRect(this.x, this.y+height, this.x+stepGoalBarLength, this.y+height); // draw progress bar
+
+ settings = 0; //reset settings to save memory
+ }
+
+ //This event is called just before the device shuts down for commands such as reset(), load(), save(), E.reboot() or Bangle.off()
+ E.on('kill', () => {
+ let d = { //define array to write to file
+ lastUpdate : lastUpdate.toISOString(),
+ stepsToday : stepsCounted,
+ stepsTooShort : stepsTooShort,
+ stepsTooLong : stepsTooLong,
+ stepsOutsideTime : stepsOutsideTime
+ };
+ s.write(PEDOMFILE,d); //write array to file
+ });
+
+ //When Step is registered by firmware
+ Bangle.on('step', (up) => {
+ steps++; //increase step count
+ calcSteps();
+ if (Bangle.isLCDOn()) WIDGETS["activepedom"].draw();
+ });
+
+ // redraw when the LCD turns on
+ Bangle.on('lcdPower', function(on) {
+ if (on) WIDGETS["activepedom"].draw();
+ });
+
+ //Read data from file and set variables
+ let pedomData = s.readJSON(PEDOMFILE,1);
+ if (pedomData) {
+ if (pedomData.lastUpdate) lastUpdate = new Date(pedomData.lastUpdate);
+ stepsCounted = pedomData.stepsToday|0;
+ stepsTooShort = pedomData.stepsTooShort;
+ stepsTooLong = pedomData.stepsTooLong;
+ stepsOutsideTime = pedomData.stepsOutsideTime;
+ }
+ pedomdata = 0; //reset pedomdata to save memory
+
+ setStepSensitivity(setting('stepSensitivity')); //set step sensitivity (80 is standard, 400 is muss less sensitive)
+ timerStoreData = setInterval(storeData, storeDataInterval); //store data regularly
+ //Add widget
+ WIDGETS["activepedom"]={area:"tl",width:width,draw:draw};
+})();
\ No newline at end of file
diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog
index 67feb024f..23b8ee562 100644
--- a/apps/alarm/ChangeLog
+++ b/apps/alarm/ChangeLog
@@ -2,3 +2,9 @@
0.02: Fix issues with alarm scheduling
0.03: More alarm scheduling issues
0.04: Tweaks for variable size widget system
+0.05: Add alarm.boot.js and move code from the bootloader
+0.06: Change 'New Alarm' to 'Save', allow Deletion of Alarms
+0.07: Don't overwrite existing settings on app update
+0.08: Make alarm scheduling more reliable
+0.09: Add per alarm auto-snooze option
+0.10: Fix auto-snooze option (this stopped new alarms being added) (fix #506)
diff --git a/apps/alarm/alarm.js b/apps/alarm/alarm.js
index 7f0027bc8..28261110a 100644
--- a/apps/alarm/alarm.js
+++ b/apps/alarm/alarm.js
@@ -24,9 +24,14 @@ function showAlarm(alarm) {
}).then(function(sleep) {
buzzCount = 0;
if (sleep) {
+ if(alarm.ohr===undefined) alarm.ohr = alarm.hr;
alarm.hr += 10/60; // 10 minutes
} else {
alarm.last = (new Date()).getDate();
+ if (alarm.ohr!==undefined) {
+ alarm.hr = alarm.ohr;
+ delete alarm.ohr;
+ }
if (!alarm.rp) alarm.on = false;
}
require("Storage").write("alarm.json",JSON.stringify(alarms));
@@ -38,6 +43,10 @@ function showAlarm(alarm) {
Bangle.buzz(100).then(function() {
if (buzzCount--)
setTimeout(buzz, 3000);
+ else if(alarm.as) { // auto-snooze
+ buzzCount = 10;
+ setTimeout(buzz, 600000);
+ }
});
},100);
});
diff --git a/apps/alarm/app.js b/apps/alarm/app.js
index 6dd0debb1..b6019ca08 100644
--- a/apps/alarm/app.js
+++ b/apps/alarm/app.js
@@ -8,6 +8,7 @@ var alarms = require("Storage").readJSON("alarm.json",1)||[];
msg : "Eat chocolate",
last : 0, // last day of the month we alarmed on - so we don't alarm twice in one day!
rp : true, // repeat
+ as : false, // auto snooze
}
];*/
@@ -44,12 +45,14 @@ function editAlarm(alarmIndex) {
var mins = 0;
var en = true;
var repeat = true;
+ var as = false;
if (!newAlarm) {
var a = alarms[alarmIndex];
hrs = 0|a.hr;
mins = Math.round((a.hr-hrs)*60);
en = a.on;
repeat = a.rp;
+ as = a.as;
}
const menu = {
'': { 'title': 'Alarms' },
@@ -70,6 +73,11 @@ function editAlarm(alarmIndex) {
value: en,
format: v=>v?"Yes":"No",
onchange: v=>repeat=v
+ },
+ 'Auto snooze': {
+ value: as,
+ format: v=>v?"Yes":"No",
+ onchange: v=>as=v
}
};
function getAlarm() {
@@ -81,18 +89,18 @@ function editAlarm(alarmIndex) {
// Save alarm
return {
on : en, hr : hr,
- last : day, rp : repeat
+ last : day, rp : repeat, as: as
};
}
- if (newAlarm) {
- menu["> New Alarm"] = function() {
- alarms.push(getAlarm());
- require("Storage").write("alarm.json",JSON.stringify(alarms));
- showMainMenu();
- };
- } else {
- menu["> Save"] = function() {
- alarms[alarmIndex] = getAlarm();
+ menu["> Save"] = function() {
+ if (newAlarm) alarms.push(getAlarm());
+ else alarms[alarmIndex] = getAlarm();
+ require("Storage").write("alarm.json",JSON.stringify(alarms));
+ showMainMenu();
+ };
+ if (!newAlarm) {
+ menu["> Delete"] = function() {
+ alarms.splice(alarmIndex,1);
require("Storage").write("alarm.json",JSON.stringify(alarms));
showMainMenu();
};
diff --git a/apps/alarm/boot.js b/apps/alarm/boot.js
new file mode 100644
index 000000000..47dae5361
--- /dev/null
+++ b/apps/alarm/boot.js
@@ -0,0 +1,25 @@
+// check for alarms
+(function() {
+ var alarms = require('Storage').readJSON('alarm.json',1)||[];
+ var time = new Date();
+ var active = alarms.filter(a=>a.on);
+ if (active.length) {
+ active = active.sort((a,b)=>(a.hr-b.hr)+(a.last-b.last)*24);
+ var hr = time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600);
+ if (!require('Storage').read("alarm.js")) {
+ console.log("No alarm app!");
+ require('Storage').write('alarm.json',"[]");
+ } else {
+ var t = 3600000*(active[0].hr-hr);
+ if (active[0].last == time.getDate() || t < 0) t += 86400000;
+ if (t<1000) t=1000;
+ /* execute alarm at the correct time. We avoid execing immediately
+ since this code will get called AGAIN when alarm.js is loaded. alarm.js
+ will then clearInterval() to get rid of this call so it can proceed
+ normally. */
+ setTimeout(function() {
+ load("alarm.js");
+ },t);
+ }
+ }
+})();
diff --git a/apps/analogimgclk/ChangeLog b/apps/analogimgclk/ChangeLog
new file mode 100644
index 000000000..864afc91e
--- /dev/null
+++ b/apps/analogimgclk/ChangeLog
@@ -0,0 +1,2 @@
+0.01: New App!
+0.02: Add BTN2 -> launcher
diff --git a/apps/analogimgclk/app-icon.js b/apps/analogimgclk/app-icon.js
new file mode 100644
index 000000000..e9c28da6b
--- /dev/null
+++ b/apps/analogimgclk/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwkGswA/AFEiAAMoCqcykWEDQQWW0YYNsQXCn8//8zDgMiwwWNmf/CwICCDAUmIpYWD+YYFkIuKkYTBCogGCmUhGBAuBn4QBF4wJBiR6IFwYRCFoYBCVZBGBRQIYFFwaUBkUWFw4XKBIUhGAwXBEwYXFmcTBIMxC4pGBUgQXCLYc/kMvAgKqBSIheGGInyiQGCn8SC43zCwouDHQfzF4x2DFAgFCCwbaBSAi9CAAPxiMTRIcvEQIYCeQIXI+chiMSn8zGgJeDn8yiQXHBoMzDAMRiEzCwgXBF5IPCCwMQCoZUDYAhHFCQUBgIHFF5YRDkMDCwpfKAAn074UDC5QOHC48xL4jvDF5kznFGC4ovOmciwwXFWwIACB4M0C48hC4x4EC44kB+UYI4h4DGIhHEBIUyjAWEC4JIEF4VPF4shlAXFJAYQD+gXBEAcziReEGAg/F74ECBIIuHC4UhCAIZC+UzOokhkIXHJAMTDAQCGmOEkwXHGASSDAQk4oUSCxAwCiUjC4sooUhFxIYCkMilEzCwMymIgBRg5JGiUiwoDBlUijFCCxgYDIQIXCRZAAJJQIWBCqIA/AC4="))
diff --git a/apps/analogimgclk/app.js b/apps/analogimgclk/app.js
new file mode 100644
index 000000000..99dace78e
--- /dev/null
+++ b/apps/analogimgclk/app.js
@@ -0,0 +1,118 @@
+var bgimg = require("Storage").read("analogimgclk.bg.img");
+
+function getImg(g, col) {
+ return {
+ width:g.getWidth(),
+ height:g.getHeight(),
+ bpp:1,transparent:0,
+ buffer:g.buffer,
+ palette:new Uint16Array([0,col])};
+}
+
+var handSizeMin = 90;
+var handSizeHr = 60;
+var handSizeSec = 96;
+var gmin = Graphics.createArrayBuffer(12,handSizeMin*2,1,{msb:true});
+var gminimg = getImg(gmin, 0xFFFF);
+var ghr = Graphics.createArrayBuffer(16,handSizeHr*2,1,{msb:true});
+var ghrimg = getImg(ghr, g.setColor("#E0E0E0").getColor());
+var gsec = Graphics.createArrayBuffer(6,handSizeSec*2,1,{msb:true});
+var gsecimg = getImg(gsec, g.setColor("#FF0000").getColor());
+
+// create hand images
+var c = gmin.getHeight()/2;
+var o = 16; // overhang
+gmin.fillCircle(6,6,6);
+gmin.fillCircle(6,c+o,6);
+gmin.fillRect(0,6,11,c+o);
+c = ghr.getHeight()/2;
+ghr.fillCircle(8,8,8);
+ghr.fillCircle(8,c+o,8);
+ghr.fillRect(0,8,15,c+o);
+c = gsec.getHeight()/2;
+gsec.fillCircle(3,3,3);
+gsec.fillCircle(3,c+o,3);
+gsec.fillRect(0,3,5,c+o);
+
+// last positions of hands (in radians)
+var lastrmin=0, lastrhr=0, lastrsec=0;
+
+// draw hands - just the bit of the image that changed
+function drawHands(full) {
+ var d = new Date();
+ var rsec = d.getSeconds()*Math.PI/30;
+ var rmin = d.getMinutes()*Math.PI/30;
+ // hack so hour hand only moves every 10 minutes
+ var rhr = (d.getHours() + Math.round(d.getMinutes()/10)/6)*Math.PI/6;
+ var bounds = {};
+ if (!full) { // work out the bounds of the hands
+ var x1 = (g.getWidth()/2)-10;
+ var y1 = (g.getHeight()/2)-10;
+ var x2 = (g.getWidth()/2)+10;
+ var y2 = (g.getHeight()/2)+10;
+ function addPt(ang, r, ry) {
+ var x = (g.getWidth()/2) + Math.sin(ang)*r + Math.cos(ang)*ry;
+ var y = (g.getHeight()/2) - Math.cos(ang)*r + Math.sin(ang)*ry;
+ //g.setColor("#ff0000").fillRect(x-2,y-2,x+2,y+2);
+ if (xx2)x2=x;
+ if (y>y2)y2=y;
+ }
+ function addSec(r) {
+ addPt(r,handSizeSec,5);addPt(r,handSizeSec,-5);
+ addPt(r,-(o+8),5);addPt(r,-(o+8),-5);
+ }
+ function addMin(r) {
+ addPt(r,handSizeMin,8);addPt(r,handSizeMin,-8);
+ addPt(r,-(o+8),8);addPt(r,-(o+8),-8);
+ }
+ function addHr(r) {
+ addPt(r,handSizeHr,8);addPt(r,handSizeHr,-8);
+ addPt(r,-(o+8),8);addPt(r,-(o+8),-8);
+ }
+ if (rsec!=lastrsec) {
+ addSec(rsec);addSec(lastrsec);
+ }
+ if (rmin!=lastrmin) {
+ addMin(rmin);addMin(lastrmin);
+ }
+ if (rhr!=lastrhr) {
+ addHr(rhr);addHr(lastrhr);
+ }
+ bounds = {x:x1,y:y1,width:1+x2-x1,height:1+y2-y1};
+ }
+
+ g.drawImages([
+ {image:bgimg,x:24,y:24},
+ {image:ghrimg,x:120,y:120,center:true,rotate:rhr},
+ {image:gminimg,x:120,y:120,center:true,rotate:rmin},
+ {image:gsecimg,x:120,y:120,center:true,rotate:rsec}
+ ],bounds);
+ lastrsec = rsec;
+ lastrmin = rmin;
+ lastrhr = rhr;
+}
+
+if (g.drawImages) {
+ var secondInterval = setInterval(drawHands,1000);
+ // handle display switch on/off
+ Bangle.on('lcdPower', (on) => {
+ if (secondInterval) {
+ clearInterval(secondInterval);
+ secondInterval = undefined;
+ }
+ if (on) {
+ drawHands();
+ secondInterval = setInterval(drawHands,1000);
+ }
+ });
+
+ g.clear();
+ drawHands(true);
+} else {
+ E.showMessage("Please update\nBangle.js firmware\nto use this clock","analogimgclk");
+}
+
+// Show launcher when middle button pressed
+setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" });
diff --git a/apps/analogimgclk/app.png b/apps/analogimgclk/app.png
new file mode 100644
index 000000000..d234b54d4
Binary files /dev/null and b/apps/analogimgclk/app.png differ
diff --git a/apps/analogimgclk/bg.img b/apps/analogimgclk/bg.img
new file mode 100644
index 000000000..821ff709e
Binary files /dev/null and b/apps/analogimgclk/bg.img differ
diff --git a/apps/animclk/ChangeLog b/apps/animclk/ChangeLog
new file mode 100644
index 000000000..7852105a0
--- /dev/null
+++ b/apps/animclk/ChangeLog
@@ -0,0 +1,2 @@
+0.01: New App!
+0.02: Fix bug if image clock wasn't installed
diff --git a/apps/animclk/V29.LBM.js b/apps/animclk/V29.LBM.js
new file mode 100644
index 000000000..5b986d77d
--- /dev/null
+++ b/apps/animclk/V29.LBM.js
@@ -0,0 +1,482 @@
+CanvasCycle.processImage({filename:'V29.LBM',width:640,height:480,colors:[[0,0,0],[219,247,255],[203,243,255],[175,235,255],[155,231,255],[131,223,255],[95,223,255],[95,215,255],[63,215,255],[47,207,255],[0,199,255],[23,191,255],[11,183,255],[31,175,255],[47,163,247],[47,151,239],[59,139,231],[63,127,219],[71,115,203],[147,203,255],[103,171,223],[67,123,143],[199,171,159],[179,215,171],[191,215,223],[183,223,239],[175,235,255],[155,211,231],[135,187,207],[151,207,167],[195,207,171],[199,171,159],[95,151,179],[95,151,179],[83,135,159],[71,119,139],[63,107,123],[59,103,115],[31,91,115],[47,99,119],[63,107,123],[67,123,143],[67,123,143],[67,127,147],[71,127,151],[71,131,151],[71,131,155],[75,135,159],[159,199,215],[31,103,123],[7,75,95],[0,71,87],[0,67,83],[0,67,83],[0,67,83],[0,71,91],[15,91,111],[31,103,127],[51,123,143],[63,131,151],[75,139,159],[87,151,167],[123,175,187],[163,199,207],[255,255,255],[255,255,255],[131,175,191],[111,155,175],[119,167,183],[139,179,195],[163,199,207],[191,215,223],[167,203,215],[191,215,223],[207,227,235],[215,231,239],[191,215,227],[231,243,247],[215,231,239],[231,243,247],[179,203,219],[167,191,207],[155,183,199],[143,175,191],[135,167,183],[123,159,175],[115,151,167],[119,155,171],[123,159,175],[127,163,179],[131,167,183],[139,171,187],[155,187,203],[179,203,219],[199,219,235],[223,239,255],[79,147,171],[59,131,155],[43,119,143],[31,107,131],[43,119,143],[59,131,159],[79,147,171],[99,163,187],[119,83,79],[211,159,135],[87,55,55],[55,31,31],[23,15,11],[115,71,63],[175,127,115],[231,179,155],[115,107,135],[159,139,155],[143,127,151],[191,167,187],[143,127,151],[115,107,135],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[247,247,251],[231,227,247],[207,215,243],[187,219,243],[195,211,231],[187,207,203],[91,91,91],[75,59,51],[75,59,51],[75,59,51],[79,71,71],[79,91,103],[99,107,123],[119,131,143],[143,151,163],[171,175,183],[179,191,195],[187,207,203],[187,207,203],[187,207,203],[187,207,203],[147,143,171],[183,151,175],[131,127,159],[131,127,159],[131,127,159],[159,147,179],[195,175,191],[111,95,115],[111,95,115],[123,103,123],[151,127,151],[111,95,115],[151,123,135],[203,167,175],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,239,231],[243,223,239],[231,199,223],[207,179,219],[187,171,211],[171,159,211],[155,151,215],[151,151,215],[155,159,219],[163,171,227],[175,191,247],[255,255,255],[255,255,255],[207,167,143],[147,103,95],[91,63,63],[71,51,51],[139,119,103],[91,71,63],[23,15,11],[215,171,155],[143,111,103],[119,91,83],[219,175,155],[143,111,103],[103,79,79],[79,59,59],[95,71,83],[111,91,111],[59,47,47],[99,75,67],[135,119,107],[63,51,51],[51,43,51],[95,71,83],[111,91,111],[79,59,59],[143,111,103],[203,175,163],[183,155,147],[255,239,227],[243,227,215],[235,215,203],[207,183,171],[179,155,143],[255,227,199],[243,211,183],[231,195,167],[219,179,151],[211,163,135],[199,147,123],[187,131,111],[179,119,99],[107,103,131],[215,171,155],[143,111,103],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[255,255,255],[11,11,11],[107,103,131],[219,219,235],[255,255,255]],cycles:[{reverse:0,rate:0,low:59,high:63},{reverse:0,rate:0,low:7,high:13},{reverse:0,rate:0,low:13,high:17},{reverse:0,rate:1227,low:32,high:47},{reverse:0,rate:1689,low:48,high:63},{reverse:0,rate:1689,low:64,high:79},{reverse:0,rate:1227,low:80,high:95},{reverse:0,rate:921,low:96,high:103},{reverse:0,rate:1689,low:128,high:143},{reverse:0,rate:1536,low:22,high:31},{reverse:0,rate:0,low:138,high:142},{reverse:0,rate:0,low:0,high:0},{reverse:0,rate:0,low:0,high:0},{reverse:0,rate:0,low:0,high:0},{reverse:0,rate:0,low:0,high:0},{reverse:0,rate:0,low:0,high:0}],pixels:[
+252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,108,108,108,252,252,109,109,109,109,109,109,252,252,252,252,252,252,252,252,252,108,108,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,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,252,110,109,110,252,110,252,110,252,110,252,110,252,252,252,109,252,252,252,252,252,252,252,109,252,109,109,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,107,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,108,109,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,109,108,252,108,252,109,252,109,109,109,252,109,252,109,252,109,252,109,252,109,108,108,108,108,108,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,18,18,18,18,18,18,18,18,18,18,18,18,18,252,110,109,110,252,110,252,110,109,110,252,110,252,110,252,110,252,110,252,110,252,110,252,110,252,109,252,109,252,109,252,252,252,109,252,109,252,109,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,109,252,252,252,107,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,108,109,108,109,108,109,108,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,108,108,109,109,109,109,252,109,109,109,109,109,109,109,109,109,252,109,252,252,252,108,108,108,108,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,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,110,252,252,252,110,109,110,109,110,109,110,109,110,109,110,252,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,109,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,110,252,110,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,252,109,108,108,109,109,252,109,252,109,252,109,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,108,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,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,252,110,252,110,252,110,252,110,109,110,252,110,252,110,252,110,252,110,252,110,252,110,252,252,252,252,252,109,252,109,252,109,252,110,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,110,252,110,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,108,109,108,109,109,109,108,109,252,109,109,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,109,109,109,252,109,109,109,109,109,109,109,252,109,252,109,252,108,108,108,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,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,110,252,110,109,110,109,110,109,110,252,110,109,110,252,110,252,110,252,252,252,110,252,252,252,252,252,252,252,109,252,109,252,110,252,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,110,252,252,252,110,252,252,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,110,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,109,109,252,109,109,109,252,109,252,109,252,109,252,109,252,109,109,109,252,109,252,109,252,109,108,109,108,109,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,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,110,252,110,252,110,252,110,109,110,252,110,252,110,252,110,252,110,252,110,252,110,252,109,252,252,252,109,252,109,252,109,252,110,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,108,109,109,109,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,108,109,109,108,109,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,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,109,110,109,110,109,110,109,110,109,110,109,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,109,252,110,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,109,252,109,252,110,252,110,252,110,252,110,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,109,109,109,109,109,252,109,109,109,252,109,252,109,252,109,252,109,109,109,109,109,108,109,108,108,108,109,108,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,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,110,252,110,252,110,109,110,252,110,252,110,252,110,252,110,252,110,252,252,252,110,252,110,252,109,252,109,252,110,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,110,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,108,109,108,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,108,109,109,109,109,109,252,109,109,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,252,109,109,109,109,109,108,109,108,109,109,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,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,110,252,110,109,110,109,110,252,110,109,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,109,252,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,109,252,109,252,109,252,110,252,110,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,108,109,252,109,252,109,252,109,252,252,252,109,252,252,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,109,109,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,109,109,252,109,109,109,252,109,109,109,252,109,252,108,108,108,108,108,108,109,108,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,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,110,18,110,252,110,109,110,109,110,109,110,252,110,252,110,252,252,252,252,252,110,252,109,252,109,252,109,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,109,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,108,109,108,109,108,109,252,109,252,109,252,252,252,252,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,109,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,109,109,108,109,109,109,109,108,108,108,108,109,109,109,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,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,252,110,109,110,109,110,109,110,109,110,252,110,252,110,252,252,252,252,252,252,252,109,252,109,252,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,109,252,109,252,109,252,109,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,109,252,109,252,109,252,109,252,109,252,109,252,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,108,108,108,109,109,252,108,108,108,108,108,108,109,108,109,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,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,110,109,110,109,110,109,110,109,110,252,110,252,110,252,252,252,110,252,110,252,109,252,109,252,109,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,109,108,109,109,109,108,109,252,109,109,109,109,109,109,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,109,109,108,109,252,109,109,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,252,109,109,109,109,109,109,109,108,108,108,108,109,108,109,109,109,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,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,110,109,110,109,110,109,110,109,110,109,110,109,252,252,252,252,110,252,110,109,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,109,252,109,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,108,109,109,109,252,109,252,109,252,109,109,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,108,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,109,109,109,252,109,252,109,108,108,108,108,108,109,108,109,108,109,109,109,108,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,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,18,109,110,252,110,109,110,109,110,252,110,252,110,252,110,109,110,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,109,108,109,108,252,108,252,109,109,109,109,109,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,109,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,252,108,108,108,108,109,109,109,109,108,109,109,109,109,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,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,18,18,18,18,18,18,110,109,110,109,110,109,110,252,110,252,110,252,252,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,110,252,110,252,110,252,252,252,252,252,252,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,108,109,252,109,252,109,252,109,252,109,252,252,109,109,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,108,109,108,252,108,108,109,108,109,108,108,108,109,108,108,108,108,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,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,18,18,18,18,18,18,18,18,18,18,18,18,18,18,252,110,109,110,109,110,109,110,252,110,252,110,109,110,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,252,107,252,107,252,252,252,252,252,252,252,252,109,110,109,110,109,110,110,110,110,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,252,109,252,109,252,109,252,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,108,109,108,109,108,109,108,109,108,109,252,252,108,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,108,252,252,108,252,108,108,108,108,108,109,108,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,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,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,110,109,110,109,110,109,110,252,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,109,107,109,107,252,252,252,107,252,107,252,107,109,252,109,252,109,252,109,110,109,109,109,109,109,110,110,110,109,252,252,252,252,252,252,252,252,252,109,252,109,252,110,252,110,252,110,252,252,252,110,252,252,252,252,109,252,109,109,109,109,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,109,252,109,252,109,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,107,252,109,109,108,109,252,109,252,109,252,109,252,109,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,108,109,108,108,108,252,108,252,108,252,108,108,108,108,108,108,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,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,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,109,110,252,110,109,110,109,109,109,109,109,110,109,109,109,110,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,252,109,107,107,252,107,252,107,252,107,252,107,252,107,252,107,107,106,106,106,18,18,18,252,109,110,109,110,109,110,109,109,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,108,252,108,109,108,109,108,109,108,109,108,109,252,109,108,109,109,109,109,109,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,252,252,252,252,109,108,108,108,108,108,108,108,108,108,108,252,108,252,108,252,252,108,252,18,18,18,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,110,109,110,109,110,109,109,109,109,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,107,107,107,107,107,107,252,107,252,107,252,252,252,107,107,106,106,106,18,18,17,18,18,18,17,18,18,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,252,252,252,110,252,252,109,252,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,109,252,109,109,109,109,109,109,110,109,110,252,252,252,252,252,252,252,252,109,252,109,252,109,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,107,252,108,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,252,108,109,108,109,252,109,109,108,252,108,252,108,252,108,252,108,252,108,252,108,252,252,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,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,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,252,110,109,110,109,109,109,109,109,109,109,110,109,110,252,252,252,252,252,252,252,252,252,252,109,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,107,252,107,252,107,252,107,252,107,109,107,109,107,106,106,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,109,110,109,110,109,110,109,110,109,110,109,110,252,110,109,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,109,108,109,108,109,108,109,108,109,108,109,108,109,252,109,108,109,109,109,108,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,108,108,108,108,108,108,108,108,108,252,108,108,108,252,109,252,108,252,252,252,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,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,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,110,109,110,109,109,109,109,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,109,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,107,107,107,107,107,107,252,107,252,107,109,252,106,106,106,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,252,110,252,109,252,109,252,252,252,252,252,109,252,252,252,252,109,252,109,109,109,109,109,110,110,110,110,252,252,252,252,109,252,252,252,109,252,109,252,110,252,110,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,108,109,108,109,252,109,108,109,252,109,108,109,252,109,108,109,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,109,107,109,107,252,107,109,107,252,107,252,109,252,107,252,109,252,107,252,252,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,109,110,109,109,109,109,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,107,252,107,252,107,252,107,109,106,106,106,106,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,110,109,110,109,110,109,110,109,110,109,110,252,110,110,110,252,110,109,252,109,252,252,252,252,252,109,252,252,252,252,109,252,109,252,109,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,109,107,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,107,252,252,109,109,109,109,109,109,109,109,109,109,109,109,109,109,252,109,252,252,252,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,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,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,109,110,109,109,109,109,109,110,109,110,109,110,109,252,252,252,252,252,252,252,109,110,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,109,107,107,107,107,107,107,252,107,106,106,106,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,109,110,109,110,109,110,109,110,109,110,109,109,109,110,109,252,109,252,252,252,252,252,109,252,252,252,252,109,252,109,109,109,109,109,109,110,110,110,109,252,252,252,109,252,109,252,109,252,110,252,110,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,108,109,108,109,108,109,252,109,252,109,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,108,252,108,252,107,252,107,252,107,109,107,109,107,252,107,109,107,252,107,252,107,252,107,109,109,109,252,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,110,109,109,109,109,109,110,109,110,109,110,109,252,252,252,252,252,252,252,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,252,107,252,107,252,106,106,106,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,110,109,110,109,110,109,110,109,110,252,110,109,252,252,252,252,252,252,252,109,252,252,109,252,109,252,109,109,109,109,110,109,110,109,110,252,252,109,252,252,252,252,109,252,109,252,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,252,108,252,252,252,108,252,252,252,108,108,252,108,252,108,252,108,252,108,252,109,109,107,252,252,252,107,252,252,109,107,109,109,109,107,109,109,109,109,109,109,109,109,109,109,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,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,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,109,109,109,109,109,110,109,110,109,110,109,252,252,252,252,252,252,252,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,107,107,107,107,106,106,106,107,106,106,106,106,106,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,110,109,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,109,252,109,252,109,109,109,109,109,109,109,109,110,110,110,110,109,252,109,252,109,252,252,252,252,109,109,109,109,252,109,110,109,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,107,109,108,109,108,109,252,109,108,109,252,109,108,109,252,109,252,109,252,109,109,109,252,109,252,109,252,109,252,252,252,108,252,108,252,108,252,108,252,108,252,108,252,108,109,108,252,107,252,107,252,107,252,107,109,107,109,107,252,107,109,107,252,107,109,109,109,109,109,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,107,107,252,107,252,252,107,106,106,106,107,106,107,106,106,106,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,109,109,252,109,252,109,109,109,109,110,109,110,110,110,252,252,252,252,109,109,252,109,252,109,252,109,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,108,109,108,109,108,109,107,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,252,108,252,108,108,252,108,108,108,252,108,252,108,252,108,109,108,109,108,109,107,252,109,109,107,252,109,109,109,109,109,109,109,109,109,109,109,109,109,109,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,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,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,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,107,107,107,252,252,252,252,252,252,252,106,106,106,106,106,106,106,106,106,106,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,109,110,109,110,109,110,252,252,252,252,252,252,109,252,109,109,109,109,109,109,109,110,109,110,110,110,109,110,252,252,109,252,109,252,109,109,109,109,109,109,109,110,109,110,252,252,252,252,252,252,252,252,252,252,109,252,109,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,107,109,108,109,108,109,108,109,252,109,108,109,252,109,252,109,252,109,109,109,252,109,252,109,252,109,252,252,252,108,252,108,252,108,109,108,109,108,109,108,252,107,252,107,252,107,252,107,252,107,252,107,109,107,109,107,109,107,109,107,252,109,109,109,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,110,109,110,109,110,109,110,252,252,252,252,252,252,252,110,109,110,109,110,109,110,109,107,109,107,252,107,107,107,252,107,252,107,252,107,252,107,252,252,252,106,107,106,106,106,106,106,106,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,18,18,18,17,18,17,18,17,109,110,109,110,109,110,252,252,252,252,252,109,252,109,252,109,109,109,109,110,109,110,109,110,110,110,109,252,252,252,252,109,252,109,252,109,109,109,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,109,107,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,109,108,252,252,252,108,108,252,108,108,108,109,108,109,108,109,108,109,107,109,109,109,107,252,109,109,107,252,109,109,107,109,109,109,107,109,109,109,109,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,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,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,18,18,18,18,109,110,109,110,109,110,109,252,252,252,252,252,252,252,109,107,109,107,109,107,109,107,109,107,109,107,107,107,252,107,252,107,252,252,252,252,252,252,252,106,106,106,106,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,18,18,18,18,110,109,110,109,110,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,110,110,110,110,110,109,252,252,252,252,252,109,109,109,109,109,109,109,110,109,110,109,110,252,252,252,252,109,252,252,252,109,252,109,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,107,109,252,109,108,109,252,109,108,109,252,109,108,109,252,109,252,109,109,109,252,109,252,109,252,252,252,108,252,108,109,108,109,108,252,108,109,108,252,107,109,107,252,107,252,107,252,107,252,107,109,107,109,107,252,109,109,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,110,109,110,109,110,109,252,252,252,252,252,252,110,109,107,109,107,107,107,107,107,107,107,252,107,252,107,252,107,252,107,252,107,252,252,252,107,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,109,110,109,110,252,110,252,252,252,109,252,109,252,109,109,110,109,110,109,110,109,110,109,110,252,252,252,109,252,109,252,109,252,109,109,109,110,110,109,110,109,252,252,252,252,252,252,252,252,252,109,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,109,108,109,107,109,108,109,108,109,107,109,108,109,108,252,108,252,108,252,108,252,108,252,108,108,252,108,108,108,109,108,109,108,109,108,109,107,109,107,109,107,109,109,109,107,109,109,109,109,109,109,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,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,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,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,110,109,110,109,110,109,110,252,252,252,252,252,107,107,107,107,107,107,107,107,107,107,107,252,107,252,107,252,252,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,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,109,110,109,110,109,252,252,252,252,109,109,109,109,109,109,110,109,110,109,110,109,110,109,252,252,252,252,252,252,109,252,109,109,109,109,109,110,110,109,110,109,252,252,252,252,252,109,252,109,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,108,109,108,109,252,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,108,252,108,109,108,109,108,109,108,109,108,252,108,109,107,252,107,252,107,252,107,252,107,106,107,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,109,110,109,110,109,110,109,252,107,107,107,107,107,107,252,107,252,107,252,107,252,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,110,109,110,109,252,252,109,252,109,252,109,109,110,109,110,109,110,110,110,109,110,109,252,252,109,252,109,252,109,252,109,252,109,252,109,109,109,109,110,252,252,252,252,252,252,252,252,252,252,109,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,107,109,108,109,108,109,108,109,108,109,108,109,108,109,108,252,108,252,108,252,108,252,252,252,108,108,252,107,108,108,109,108,109,108,109,108,109,107,109,109,109,107,109,109,109,107,109,106,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,110,109,110,109,110,110,107,107,107,107,107,107,107,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,18,18,17,18,110,109,110,109,252,109,109,252,109,109,109,109,109,109,110,109,110,109,110,109,110,252,252,252,252,252,109,252,109,109,109,252,109,109,109,109,109,109,110,252,252,109,252,109,252,109,252,109,252,109,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,252,109,107,109,252,109,108,109,252,109,108,109,252,109,108,109,252,109,252,252,252,109,252,252,252,107,252,108,109,108,109,108,109,108,252,107,252,107,252,107,252,107,252,107,252,106,106,106,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,109,110,109,110,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,110,110,110,109,252,109,109,252,109,109,109,109,110,109,110,109,110,109,110,109,252,252,252,252,109,252,109,252,109,252,109,252,109,109,109,109,110,109,252,252,252,252,252,252,252,109,252,252,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,109,107,109,107,109,107,109,108,109,108,109,252,252,252,252,252,252,108,252,252,252,108,252,252,108,252,108,109,108,109,108,109,109,109,107,252,109,252,252,252,107,107,107,106,106,106,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,110,110,109,110,109,252,109,109,109,109,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,109,252,109,109,109,109,109,109,109,109,110,252,252,252,252,109,252,109,252,109,252,109,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,108,109,252,109,108,109,108,109,252,109,252,109,252,109,252,109,252,252,252,109,252,107,252,107,252,252,252,108,109,108,109,108,252,108,252,107,252,107,252,107,107,107,107,107,107,106,106,106,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,110,109,110,109,110,252,109,109,110,109,110,110,110,109,110,109,110,252,252,252,252,252,109,252,109,252,109,252,109,252,109,109,109,109,110,252,252,252,252,252,252,252,252,252,252,252,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,109,108,109,108,109,252,109,252,109,252,252,252,252,252,252,108,252,108,107,108,107,252,252,252,109,109,109,109,108,109,109,109,109,252,109,109,106,107,107,107,107,107,107,106,106,106,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,109,110,109,110,109,109,109,110,109,110,110,110,109,110,109,252,252,252,252,252,252,252,252,109,252,109,109,109,109,109,109,109,109,110,109,252,252,252,109,252,109,252,109,252,109,252,109,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,109,107,109,108,109,252,109,252,109,252,109,252,252,252,252,252,109,109,109,108,107,252,107,252,252,109,108,109,108,252,108,109,109,252,108,252,109,107,106,107,106,107,106,107,107,107,106,106,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,110,109,110,109,110,109,110,110,110,109,110,109,110,252,252,252,109,252,252,252,109,252,109,252,109,252,109,252,109,109,109,109,110,109,252,252,252,252,252,252,252,109,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,109,108,109,108,109,252,109,252,252,252,252,252,109,252,252,252,109,109,107,252,252,109,109,109,109,109,109,109,109,109,109,109,109,108,106,107,106,107,107,107,107,107,107,107,107,106,106,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,109,110,109,109,109,110,109,110,109,110,109,252,252,252,252,252,252,252,252,109,252,109,252,109,109,109,109,109,109,110,109,110,109,252,109,252,109,252,109,252,109,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,109,107,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,107,252,107,252,107,109,109,109,109,109,109,252,109,252,109,252,106,108,106,107,106,107,106,107,106,107,107,107,107,107,106,106,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,18,17,109,110,109,110,109,110,109,110,109,110,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,109,109,109,109,110,109,110,252,252,252,252,252,252,252,252,109,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,109,107,109,108,109,108,109,109,109,109,109,252,109,252,109,252,252,252,109,252,252,252,109,109,109,109,109,109,109,109,109,109,109,106,106,108,106,106,106,107,107,107,106,107,107,107,107,107,106,106,106,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,109,252,109,109,109,109,109,109,109,109,109,109,110,109,252,109,252,252,252,109,252,109,252,109,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,109,107,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,109,109,109,109,109,109,252,109,106,106,107,106,107,106,107,106,107,106,107,106,107,107,107,106,107,107,106,106,106,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,17,18,17,17,110,109,110,109,110,252,110,109,110,252,252,252,252,252,109,252,109,252,109,252,109,252,109,109,109,109,109,109,110,109,252,252,252,252,252,252,252,252,252,109,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,109,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,109,107,109,108,109,109,109,109,109,252,109,252,109,252,109,252,109,252,252,252,252,109,109,109,109,109,109,109,108,106,106,106,106,106,106,106,106,107,106,107,106,107,107,107,107,107,107,106,106,106,106,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,110,109,110,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,109,110,109,252,109,252,109,252,109,252,109,252,109,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,109,107,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,109,109,109,109,109,109,107,107,109,106,106,106,106,106,107,106,107,106,107,106,107,106,107,106,107,107,107,106,106,106,106,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,17,18,17,17,17,17,17,17,110,110,110,109,110,109,110,109,252,252,252,109,252,252,109,252,109,252,109,252,109,252,109,109,109,109,110,109,110,109,252,252,252,252,252,252,252,252,252,109,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,108,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,109,107,109,107,109,109,109,109,109,252,109,252,109,252,252,252,109,252,252,252,252,252,109,109,109,109,107,107,107,107,107,106,106,106,106,106,106,107,106,107,106,107,107,107,107,107,107,107,106,106,106,106,106,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,110,110,110,109,110,109,110,252,252,252,252,109,252,252,252,252,109,252,109,109,109,109,109,109,109,109,110,109,110,109,252,109,252,252,252,109,252,109,252,109,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,107,109,252,109,252,109,252,109,252,109,252,109,252,109,252,107,252,109,252,109,252,252,109,107,107,107,252,107,107,107,252,106,106,106,107,106,107,106,107,106,107,106,107,106,107,107,107,106,106,106,106,106,106,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,110,110,110,109,110,252,110,109,252,252,110,252,252,252,109,252,109,252,109,109,109,252,109,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,109,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,109,107,109,107,109,109,109,109,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,109,107,107,107,252,107,109,109,107,107,106,106,106,106,106,106,107,106,107,107,107,107,107,107,107,106,106,106,106,106,106,106,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,110,110,110,110,109,110,109,252,109,110,109,252,252,252,252,109,109,109,252,109,109,109,110,110,109,110,109,110,252,252,109,252,109,252,109,252,109,252,109,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,109,107,109,252,109,252,109,252,109,252,109,252,109,252,109,252,107,252,109,252,109,252,252,107,107,109,107,252,107,252,107,252,107,252,106,106,106,107,106,107,106,107,106,107,106,107,107,107,106,106,106,106,106,106,106,106,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,17,16,17,17,17,17,17,17,110,110,110,110,110,110,109,110,109,110,109,110,252,109,252,109,252,109,109,109,109,110,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,109,107,109,107,109,252,109,107,109,252,109,252,109,252,252,252,109,252,252,252,252,107,107,107,107,109,109,109,109,252,109,252,107,109,252,106,106,106,106,106,106,107,107,107,107,107,107,107,106,107,106,106,106,106,106,106,106,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,110,110,110,109,110,109,110,109,110,109,110,109,252,252,109,109,109,109,110,110,110,109,110,109,110,252,252,252,252,252,252,252,252,109,252,109,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,107,109,252,109,252,109,252,109,252,109,252,109,252,109,252,107,252,252,252,109,107,107,252,107,252,107,252,107,109,109,252,109,109,107,252,107,106,106,107,106,107,106,107,106,107,107,107,106,107,106,106,106,106,106,106,106,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,110,110,110,109,110,109,110,109,110,109,110,109,252,109,252,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,109,107,109,107,109,107,109,252,109,252,109,252,252,252,252,252,252,252,107,107,107,107,107,252,107,252,107,252,252,252,252,252,252,109,109,252,106,106,106,106,106,107,107,107,107,107,106,107,106,107,106,106,106,106,106,106,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,110,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,252,109,110,109,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,107,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,107,107,107,252,107,252,107,252,107,252,107,252,107,252,252,252,107,109,107,106,106,107,106,107,106,107,107,107,106,107,106,107,106,106,106,107,106,106,106,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,110,110,110,109,110,109,110,252,110,109,110,109,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,109,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,109,109,109,109,109,109,109,107,109,252,109,252,109,252,252,252,252,252,252,252,107,107,107,107,107,252,107,107,107,252,252,252,252,252,252,252,252,252,252,109,109,106,106,106,106,107,107,107,106,107,106,107,106,107,106,106,106,106,106,106,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,17,16,17,17,110,110,109,110,109,110,109,110,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,110,252,110,252,109,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,107,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,252,252,107,109,109,106,106,107,107,107,106,107,106,107,106,107,106,106,106,106,106,106,106,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,109,110,109,110,109,110,109,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,109,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,109,108,109,109,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,107,252,107,252,107,252,252,252,252,252,252,252,252,252,252,109,106,252,106,107,106,107,106,107,106,107,106,107,106,106,106,106,106,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,109,110,109,110,109,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,109,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,252,109,252,252,107,252,107,252,109,107,106,107,106,106,107,107,106,107,106,106,106,106,106,106,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,110,109,110,109,110,109,110,109,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,252,109,109,109,109,109,109,109,109,252,109,252,109,252,252,252,109,252,252,252,252,107,107,107,107,107,107,107,107,252,107,252,107,252,252,252,252,252,109,109,109,252,252,252,252,252,252,252,107,107,106,107,106,107,107,107,106,106,106,106,106,106,106,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,109,110,109,110,109,110,109,110,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,109,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,110,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,109,109,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,107,107,252,107,107,107,252,107,252,107,252,107,252,107,252,107,252,109,252,107,252,252,252,107,252,252,252,252,252,106,107,106,106,107,107,106,107,106,107,106,106,106,106,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,109,110,109,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,252,107,109,107,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,107,252,107,252,107,252,107,252,252,109,109,109,109,252,252,252,252,252,252,252,252,252,107,107,106,107,106,107,106,107,106,106,106,106,106,106,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,110,109,110,109,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,107,107,107,107,107,252,107,252,107,252,107,252,107,252,107,107,107,252,107,252,109,252,109,252,107,252,107,252,252,252,107,107,106,107,106,107,106,106,106,106,106,107,106,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,109,110,109,110,109,110,109,110,252,109,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,109,109,107,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,107,107,107,107,107,107,107,107,107,107,252,107,107,107,109,109,109,109,252,109,252,109,252,252,107,107,252,252,252,107,107,107,107,106,107,106,107,106,106,106,106,106,106,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,109,110,109,110,109,110,109,110,109,109,109,109,252,110,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,110,252,110,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,107,107,107,107,252,107,252,107,252,107,107,107,252,107,109,107,252,107,252,109,252,107,252,109,252,107,252,107,252,252,252,107,107,252,107,106,107,106,106,106,107,106,106,106,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,16,17,110,109,110,109,110,109,110,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,109,107,109,109,109,252,109,252,109,252,252,252,252,252,252,252,107,107,107,107,107,107,107,107,107,107,107,252,107,109,109,109,109,109,109,252,109,252,252,252,252,107,107,252,107,252,252,252,107,107,107,107,106,107,106,106,106,106,106,106,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,110,109,110,109,110,109,110,109,109,109,109,109,109,109,109,252,252,252,252,252,252,110,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,109,109,252,109,107,109,252,109,252,109,252,109,252,109,252,109,252,252,252,107,107,107,252,107,107,252,252,252,252,252,109,109,109,109,252,109,107,107,252,107,252,109,252,109,252,252,107,107,252,107,252,252,252,107,252,107,107,106,106,106,106,106,106,106,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,16,17,16,17,16,16,16,17,110,109,110,109,110,109,110,252,110,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,107,252,252,252,252,252,252,252,109,109,109,109,109,109,107,109,252,109,252,252,252,252,252,252,252,252,252,252,107,252,107,252,107,252,252,109,109,109,109,109,109,109,252,109,107,107,252,252,252,109,252,252,252,107,107,107,107,107,252,252,252,107,252,107,107,106,106,106,106,106,106,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,110,109,110,109,110,109,110,109,110,109,110,252,109,109,109,252,109,109,252,252,252,109,252,252,252,252,252,252,252,110,252,109,252,109,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,108,109,252,252,252,252,252,252,252,107,252,252,252,252,252,252,252,252,109,109,252,109,109,109,252,109,252,109,252,109,252,107,252,109,252,252,252,109,252,107,252,107,252,107,252,107,109,109,109,107,107,106,106,106,106,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,16,16,17,16,109,110,109,110,109,110,252,110,252,110,252,110,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,109,252,252,252,252,252,252,107,252,252,252,107,252,107,252,107,109,109,109,109,109,109,109,109,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,107,107,107,107,107,109,107,109,107,109,109,107,106,107,106,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,252,110,110,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,109,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,107,252,252,252,252,109,252,109,108,109,252,252,252,252,107,252,252,252,107,252,252,252,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,107,107,107,109,107,109,107,109,107,109,109,107,106,107,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,109,110,109,110,109,110,252,110,252,110,252,110,252,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,252,107,252,107,109,107,109,109,109,109,109,109,109,109,109,252,109,109,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,109,109,109,109,106,107,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,109,110,109,110,109,110,109,110,109,110,109,110,252,110,109,110,252,110,110,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,252,252,109,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,109,109,109,109,109,109,109,109,109,109,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,110,109,110,109,110,109,110,252,110,252,110,252,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,109,109,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,252,109,109,109,109,109,109,109,109,109,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,109,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,252,252,110,252,110,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,109,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,109,109,109,109,109,109,109,109,109,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,109,110,109,110,109,110,252,110,252,110,252,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,108,252,252,252,252,252,252,252,252,252,109,109,108,109,252,109,109,109,252,252,252,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,109,109,252,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,109,110,109,110,109,110,109,110,109,110,252,110,109,110,252,252,109,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,252,109,252,109,252,109,252,109,252,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,252,109,109,109,109,109,109,109,109,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,110,109,110,109,110,109,110,109,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,15,16,16,16,16,16,16,16,110,109,110,109,110,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,109,109,109,109,109,109,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,110,109,110,109,110,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,252,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,109,252,109,109,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,16,15,16,16,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,109,109,109,109,109,109,109,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,109,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,110,109,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,109,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,109,109,109,109,109,109,109,109,109,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,108,109,252,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,108,108,109,109,109,109,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,109,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,109,252,109,252,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,109,108,109,108,109,109,109,109,109,109,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,109,110,109,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,109,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,109,109,109,109,109,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,109,110,109,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,109,109,109,252,109,252,109,252,252,252,252,252,252,252,108,107,107,109,107,109,107,109,109,109,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,15,16,110,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,252,109,252,252,252,252,252,252,252,108,108,107,107,107,109,109,109,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,110,109,110,109,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,109,252,252,252,252,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,108,108,108,109,107,109,107,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,109,110,109,110,109,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,252,252,252,252,252,252,108,108,108,108,108,109,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,109,252,252,252,252,252,252,107,107,109,107,109,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,110,109,110,109,110,109,110,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,109,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,252,252,252,252,252,108,108,107,107,107,107,107,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,110,109,110,109,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,109,252,108,252,108,252,107,109,107,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,15,15,15,14,15,15,15,15,109,110,109,110,252,110,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,252,109,252,252,252,107,107,107,107,107,107,107,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,109,252,107,107,107,252,107,252,107,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,14,15,15,15,14,15,14,15,110,109,110,109,109,252,109,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,252,107,107,107,107,107,107,107,252,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,107,107,107,107,107,107,107,252,106,107,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,109,110,252,109,252,109,252,252,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,107,107,107,107,107,107,107,106,107,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,252,252,109,109,109,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,252,107,252,107,252,106,107,106,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,110,110,109,109,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,107,106,107,107,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,15,15,15,14,110,110,109,109,109,109,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,107,252,107,252,107,106,106,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,15,252,110,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,107,107,107,107,107,107,107,107,106,106,107,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,110,109,110,109,109,109,109,252,110,252,109,110,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,252,109,107,107,107,107,109,107,107,109,252,106,107,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,109,110,252,110,252,109,252,109,109,110,252,110,110,110,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,109,109,109,107,107,107,107,107,107,109,107,109,106,106,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,15,14,14,14,14,110,109,110,109,110,109,109,252,252,109,109,109,110,110,110,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,109,107,107,109,107,107,107,109,107,109,107,106,106,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,252,110,109,110,252,109,252,109,252,109,109,110,109,110,110,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,109,109,109,109,107,107,107,107,107,107,107,107,107,106,106,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,110,110,109,110,109,110,109,252,252,109,109,109,110,110,110,110,252,109,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,109,109,107,107,107,107,107,109,107,109,107,109,106,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,14,15,110,109,110,252,110,252,252,252,109,252,109,109,110,110,110,252,109,109,109,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,109,109,109,107,107,107,107,107,107,107,107,107,107,106,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,110,110,109,110,109,252,252,252,252,109,109,109,109,110,110,109,252,109,109,109,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,109,109,109,107,107,107,109,107,107,107,109,107,106,106,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,14,14,15,14,15,14,15,14,110,110,252,110,252,110,252,109,252,109,252,109,109,109,109,110,252,109,252,109,252,109,109,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,109,109,109,109,107,107,107,107,107,107,107,107,107,109,106,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,110,109,110,109,110,109,252,252,252,252,109,109,109,109,110,110,110,252,109,109,109,109,109,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,109,109,109,109,107,107,109,107,107,107,109,107,109,107,106,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,15,14,14,14,110,110,252,110,252,110,252,109,252,109,252,109,252,109,110,110,252,109,252,109,109,109,109,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,109,109,109,109,107,107,107,107,107,107,107,109,106,106,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,110,109,110,109,110,252,252,252,109,252,109,109,109,109,110,252,110,252,109,109,109,109,109,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,109,109,109,109,109,109,107,107,107,107,109,107,109,106,106,106,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,110,110,252,110,252,110,252,252,252,109,252,109,252,109,109,110,252,110,252,109,109,109,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,109,109,109,109,109,107,107,107,107,107,107,107,106,106,106,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,110,109,110,109,110,109,110,252,252,252,109,252,109,109,109,110,110,109,110,109,109,109,109,109,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,109,107,109,109,109,109,109,107,107,107,109,107,109,106,107,106,106,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,110,252,110,252,110,252,110,252,252,252,109,252,109,252,109,109,110,110,110,252,110,252,109,109,109,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,109,109,109,109,109,109,109,107,107,107,107,107,106,106,106,106,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,110,110,109,110,109,110,252,110,109,252,252,109,252,109,109,109,109,110,252,110,109,110,109,109,109,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,109,107,109,109,109,109,109,109,109,107,109,107,107,106,107,106,106,106,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,110,109,110,252,110,252,110,252,252,252,109,109,109,252,109,252,109,110,110,252,110,252,110,252,109,109
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,109,108,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,109,109,109,109,109,109,109,109,109,107,107,107,106,106,106,106,106,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,110,109,110,109,110,109,110,109,252,109,109,109,109,252,252,252,109,109,109,252,110,252,252,109,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,109,107,109,109,109,109,109,109,109,109,109,107,107,106,107,106,107,106,106,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,109,110,109,110,109,110,252,110,252,109,252,109,109,110,109,252,252,109,109,252,252,252,252,252,109,252,109
+,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,109,109,109,109,109,109,109,109,109,109,109,107,107,106,106,106,106,106,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,14,14,13,14,110,109,110,109,110,109,110,109,252,109,109,109,109,110,110,109,110,110,252,252,252,252,252,252,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,107,109,107,109,107,109,109,109,109,109,109,109,109,109,109,106,106,106,106,106,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,109,110,109,110,252,110,109,252,252,109,252,109,109,110,110,252,252,252,252,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,108,108,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,109,109,109,109,109,109,109,109,109,109,109,109,109,109,107,106,106,106,106,106,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,13,14,14,14,13,14,13,14,110,109,110,109,110,109,252,109,252,109,109,109,109,110,110,110,252,252,252,252,252,109,252,252,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,108,252,108,252,108,252,252,252,252,252,108,252,108,252,108,252,252,252,252,107,107,252,107,109,107,109,107,109,107,109,109,109,109,109,109,107,107,109,109,109,107,106,106,106,106,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,110,109,110,109,110,252,109,252,109,252,109,109,109,110,252,252,252,252,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,108,252,108,252,108,108,108,108,108,252,108,108,108,252,252,252,107,252,252,107,107,107,107,107,107,109,109,109,109,109,109,109,109,107,107,107,107,109,107,107,107,106,106,106,106,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,110,109,110,109,252,109,252,109,252,109,110,110,252,252,252,252,252,252,252,109,252,109,252,109,252
+,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,108,252,108,252,108,108,108,252,108,108,108,252,107,252,107,252,107,252,107,107,107,107,107,109,107,109,107,109,107,109,109,109,109,107,107,109,107,109,107,109,107,109,106,106,106,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,110,252,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,252,252,108,108,108,108,108,108,108,108,107,107,252,107,252,107,252,107,107,107,107,107,107,107,109,107,109,109,109,109,109,109,109,107,107,107,109,107,107,107,107,106,106,106,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,13,14,13,13,13,14,13,14,110,109,110,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,108,108,108,108,108,252,108,252,108,252,107,252,107,252,107,252,107,252,107,252,107,109,107,109,107,109,107,109,107,109,109,109,107,109,107,109,107,109,107,109,107,106,106,106,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,108,108,108,108,108,108,108,108,108,107,107,252,107,107,107,252,107,252,107,252,252,107,107,107,107,107,107,109,109,109,109,109,109,107,107,109,107,107,107,107,107,106,106,106,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252
+,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,252,108,108,108,252,107,252,107,252,107,252,107,252,107,252,107,252,107,107,107,109,107,109,107,109,107,109,109,109,109,109,107,109,107,107,107,106,106,106,106,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,109,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109
+,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,108,108,108,108,108,108,107,107,107,107,107,252,107,252,107,252,107,252,107,252,109,109,109,109,109,107,107,109,109,109,109,109,109,107,107,107,107,107,106,106,106,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,110,109,110,109,110,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252
+,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,108,108,108,108,252,108,252,108,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,109,107,109,107,109,107,109,107,109,109,109,109,109,109,109,106,109,106,106,106,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,13,14,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,252,109,252,108,108,108,108,108,108,108,108,108,107,107,107,107,252,107,107,107,252,107,252,107,252,252,252,109,109,109,109,109,109,109,109,109,109,109,109,109,108,106,108,106,106,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,109,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,109,252,252,252
+,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,252,108,252,252,108,108,108,108,108,108,252,108,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,109,107,109,107,109,109,109,107,109,109,109,109,107,106,107,106,106,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,14,13,13,13,109,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,109,252,252
+,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,108,108,252,252,252,108,108,108,108,108,108,108,108,107,107,107,107,107,252,107,252,107,252,107,252,252,252,109,109,109,109,109,109,109,109,109,109,109,109,107,107,107,107,106,106,106,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,109,108,252,108,252,108,252,252,108,108,108,108,252,108,252,108,252,107,252,107,252,107,252,107,252,107,252,107,252,107,109,107,109,107,109,109,109,109,109,109,107,107,107,107,107,106,107,106,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,110,109,110,252,110,252,252,252,252,252,252,252,252,252,252,109,252,252
+,252,252,252,252,108,252,109,252,252,252,252,252,109,252,109,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,108,108,109,108,252,252,252,108,108,108,108,108,108,108,107,107,252,107,107,107,252,107,252,107,252,252,109,107,109,109,109,109,109,109,109,109,109,109,109,107,107,107,107,107,106,106,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,109,110,109,110,109,110,252,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,108,108,252,108,252,108,252,109,252,252,108,108,252,108,108,108,252,107,252,107,252,107,252,107,252,107,252,107,109,107,109,107,109,107,109,109,109,109,109,109,107,107,107,107,107,107,106,106,106,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,109,110,252,110,252,110,252,252,252,252,252,252,252,252,252,252,252
+,252,252,252,252,108,252,252,252,252,252,252,252,109,252,109,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,252,108,109,109,252,252,252,108,108,108,108,108,107,107,107,107,107,107,252,107,109,107,109,107,109,109,109,109,109,109,109,109,109,109,109,109,109,109,107,107,107,107,107,106,106,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,110,109,110,252,110,252,110,252,252,252,252,252,252,109,252,252,252
+,252,252,252,108,252,252,252,252,252,252,252,109,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,108,108,252,108,252,108,109,108,252,109,252,252,108,108,108,107,252,107,252,107,252,107,252,107,109,107,109,107,109,107,109,107,109,107,109,109,109,109,109,109,109,109,107,107,107,106,107,106,106,106,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,110,109,110,252,110,252,110,252,252,252,252,252,252,252,252,252
+,252,252,108,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,108,108,108,109,109,109,109,252,252,252,108,108,108,107,107,107,107,107,107,252,107,107,107,109,109,109,107,109,109,109,109,109,109,109,109,109,109,109,109,109,107,107,106,107,106,106,106,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,110,109,110,252,110,252,110,252,252,252,252,252,252,252,252
+,252,252,252,108,252,252,252,252,252,252,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,108,108,252,108,109,108,252,108,252,252,252,252,108,108,252,107,107,107,252,107,252,107,109,107,109,107,109,107,109,107,109,107,109,109,109,107,109,109,109,109,109,107,107,106,107,106,106,106,106,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,110,252,110,252,110,252,110,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,108,108,109,109,109,109,252,252,252,252,252,108,108,108,107,107,107,107,107,107,107,107,109,107,109,107,109,109,109,109,109,109,109,109,109,109,109,109,109,107,107,106,107,106,106,106,106,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,12,13,13,13,13,13,109,252,110,252,110,252,252,252,252,252,252,252,252
+,252,252,252,108,252,252,252,252,252,252,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,109,252,252,252,108,252,108,252,109,252,252,252,252,108,108,108,107,252,107,252,107,109,107,109,107,109,107,109,107,109,107,109,107,109,109,109,109,109,109,109,107,107,106,107,106,107,106,106,106,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,109,252,110,252,110,252,109,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,108,252,108,109,108,109,252,109,109,108,252,252,252,252,252,252,252,108,108,108,107,107,107,107,107,107,109,107,109,107,109,109,109,107,109,109,109,109,109,109,109,109,109,107,107,106,107,106,107,106,106,106,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,13,13,12,13,109,252,110,252,252,252,252,252,252,252,252
+,252,252,252,108,252,252,252,252,252,252,252,109,252,252,252,108,252,252,252,252,252,252,109,252,252,252,109,252,252,252,252,252,252,108,252,108,252,109,109,252,109,252,108,252,108,252,108,252,252,252,252,252,108,252,107,107,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,109,109,109,106,107,109,106,107,106,107,106,106,106,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,252,110,252,110,252,110,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,109,252,252,109,108,252,109,252,252,252,252,252,252,252,252,108,108,107,107,107,107,107,107,107,107,109,107,109,107,109,109,109,109,109,109,109,107,109,107,107,106,107,106,107,106,106,106,106,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,252,110,252,252,252,252,252,252,252,252
+,252,252,252,108,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,252,252,109,252,108,252,108,252,252,252,252,252,252,252,108,108,107,252,107,109,107,109,107,109,107,109,107,109,107,109,107,109,109,109,107,109,107,107,106,107,106,107,106,106,106,106,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,252,110,252,109,252,109,252,252,109
+,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,108,107,107,107,107,107,107,107,109,107,109,107,106,107,106,107,109,107,109,107,109,107,109,107,107,106,107,106,106,106,106,106,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,110,252,252,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,109,109,252,109,252,109,252,108,252,252,252,108,252,252,252,252,252,107,107,107,107,107,109,107,109,107,107,107,107,107,109,107,109,107,109,107,109,107,109,107,107,106,107,106,106,106,106,106,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,109,110,252,110,252,252,252,109,252
+,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,109,109,107,109,107,107,107,107,107,106,107,109,107,109,107,109,107,107,109,107,106,107,106,106,106,106,106,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,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,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,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,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,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,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,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,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,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,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,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,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,109,110,252,252,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,252,109,252,109,252,109,252,109,252,109,252,107,252,252,252,252,252,252,107,107,252,107,109,109,109,107,107,107,109,107,109,107,109,107,109,107,109,107,107,107,107,106,107,106,106,106,106,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,13,12,252,110,252,109,252,252,252
+,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,109,109,107,107,107,107,107,107,107,109,107,109,107,109,107,106,106,107,107,107,106,106,106,106,106,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,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,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,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,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,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,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,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,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,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,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,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,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,252,110,252,252,252,252
+,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,107,107,252,107,109,109,107,107,107,107,109,107,109,107,109,107,109,107,107,106,107,107,107,107,107,106,106,106,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,12,12,13,12,252,110,252,109,252
+,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,109,109,107,107,107,107,107,109,107,109,107,109,107,106,106,107,107,107,107,107,106,106,106,106,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,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,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,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,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,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,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,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,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,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,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,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,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,110,252,252,252,252
+,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,107,252,107,109,107,109,109,107,107,109,107,109,107,109,107,109,107,107,106,107,106,107,107,107,107,106,106,106,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,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,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,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,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,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,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,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,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,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,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,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,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,214,214,201,201,216,12,12,12,12,12,12,12,12,12,12,110,252,252,252
+,252,252,108,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,108,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,109,109,107,107,107,109,107,109,107,109,107,106,106,107,106,107,106,107,107,107,106,106,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,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,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,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,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,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,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,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,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,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,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,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,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,202,202,202,214,201,201,216,216,216,216,216,216,216,12,12,12,12,12,252,252,252
+,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,108,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,107,107,107,252,107,107,107,109,107,109,107,109,107,109,107,109,107,109,107,109,106,107,106,107,106,107,107,107,107,106,106,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,202,202,202,202,203,214,201,201,201,216,216,216,216,216,216,216,216,216,12,252,110,252
+,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,107,107,109,107,106,107,109,107,109,107,109,107,109,106,107,106,107,107,107,107,107,106,107,106,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,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,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,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,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,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,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,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,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,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,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,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,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,202,202,202,202,202,203,202,202,214,214,201,201,216,216,216,216,216,216,216,216,216,216,252,252
+,252,108,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,107,252,107,109,107,107,107,109,107,106,107,109,107,109,107,109,107,109,106,107,106,107,106,107,106,107,107,107,106,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,202,202,202,202,202,203,202,202,202,203,202,214,201,201,216,216,216,216,216,216,216,216,216,216,252
+,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,108,109,108,109,108,109,252,252,252,109,252,252,252,252,252,252,252,252,252,107,252,107,109,109,109,109,109,107,106,107,106,107,109,107,109,107,109,106,107,106,107,106,107,107,107,107,107,106,106,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,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,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,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,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,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,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,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,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,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,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,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,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,202,202,202,202,202,203,202,202,202,203,202,203,203,214,201,216,216,216,216,216,216,216,216,216,216,252
+,252,108,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,107,252,107,109,107,109,109,106,107,109,107,109,107,109,107,109,106,107,106,107,106,107,107,107,107,107,106,106,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,202,202,202,202,202,202,203,202,202,202,203,202,203,203,203,214,201,201,216,201,216,216,216,216,216,216,216,216
+,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,108,252,252,252,108,109,108,109,108,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,252,109,109,109,109,109,106,107,106,107,109,107,109,107,109,106,106,106,107,106,107,107,107,107,106,106,106,106,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,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,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,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,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,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,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,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,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,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,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,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,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,202,202,202,202,203,203,203,203,202,202,202,202,203,202,203,202,214,201,201,216,214,201,216,201,216,216,216,216,216
+,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,108,252,252,252,252,252,108,109,108,109,108,109,252,109,252,109,252,109,252,109,252,252,252,252,252,107,252,252,252,109,109,107,109,109,109,107,109,107,109,107,109,107,107,106,107,106,107,106,107,107,107,107,106,106,106,106,106,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,202,202,202,202,203,203,202,202,203,202,202,202,202,203,203,203,203,202,202,214,201,216,214,214,201,216,201,216,216,216,216
+,108,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,108,252,252,252,252,252,252,252,108,109,108,109,109,109,109,109,252,252,252,252,252,252,252,252,252,252,107,107,106,107,109,107,109,106,106,106,106,107,109,107,109,106,106,106,107,106,107,106,107,107,107,107,106,106,106,106,106,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,11,202,203,203,203,202,202,202,202,203,203,203,202,202,202,203,203,203,202,202,202,214,201,214,214,214,214,201,216,201,216,216,216
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,109,108,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,107,107,107,109,107,109,107,107,106,107,107,109,107,109,106,106,106,107,106,107,106,107,107,107,107,107,106,106,106,106,106,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,202,202,202,203,202,202,202,203,202,203,202,203,202,202,202,203,202,203,202,203,202,203,214,201,214,204,203,214,201,201,216,201,216,216
+,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,108,252,252,252,252,252,252,252,108,109,109,109,109,109,252,109,252,252,252,252,252,252,252,252,107,107,252,107,109,107,109,107,109,106,107,106,107,106,107,107,107,107,107,106,106,106,107,107,107,106,107,106,106,106,106,106,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,203,202,203,203,202,202,202,202,202,202,203,203,202,202,202,202,203,202,203,203,202,202,203,202,203,214,214,203,204,204,214,201,201,216,201,216
+,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,108,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,109,252,252,252,252,252,252,107,107,252,107,109,107,109,107,109,107,107,106,107,106,107,106,107,106,107,106,107,106,107,106,107,106,107,106,106,106,106,106,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,203,202,203,202,202,202,202,202,203,202,203,202,203,202,202,204,203,202,203,202,203,203,203,202,203,202,203,202,214,203,204,203,204,214,201,216,201,216,201
+,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,252,109,252,109,252,252,252,252,252,252,107,107,107,107,107,107,109,107,109,107,109,106,106,106,107,107,107,106,107,107,107,107,106,107,107,106,107,106,106,106,106,106,106,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,12,11,12,12,202,202,203,202,202,202,202,202,202,202,203,202,203,202,203,203,202,202,202,202,203,202,203,203,203,202,202,202,202,202,203,203,203,203,204,204,214,201,201,216,201,216
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,252,252,252,252,107,107,107,109,107,109,107,109,107,109,107,107,106,107,106,107,106,107,106,107,106,107,107,107,107,107,106,107,106,106,106,106,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,203,202,202,202,203,202,203,202,203,202,203,202,203,202,203,202,203,203,202,202,202,202,203,202,203,203,203,203,202,202,203,202,203,202,203,203,204,203,204,214,201,201,201,216,201
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,108,252,252,109,109,109,252,252,252,252,252,252,252,107,252,107,107,107,107,107,109,107,109,107,109,106,107,106,107,106,107,107,107,107,107,107,107,107,107,106,107,106,106,106,106,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,202,202,202,202,202,202,202,202,202,203,202,203,202,203,203,203,203,203,203,202,202,202,202,202,202,203,203,203,204,204,202,202,202,203,203,203,203,204,204,204,204,204,214,214,201,201,216
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,252,252,252,252,107,107,107,109,107,109,107,109,107,109,107,107,106,107,106,107,106,107,106,107,107,107,107,107,106,107,106,106,106,106,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,202,203,202,203,202,202,202,202,202,203,202,203,202,203,202,203,202,203,203,202,202,202,214,214,214,201,202,203,203,203,214,214,214,202,202,203,202,203,203,204,203,204,203,204,204,214,214,214,201,201
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,109,107,109,107,107,107,107,107,107,107,107,106,107,106,107,106,107,106,106,106,106,106,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,202,202,202,202,202,202,202,202,202,202,202,202,203,203,203,203,203,203,202,202,202,202,203,214,214,214,214,214,203,203,214,201,201,201,214,202,202,202,203,203,203,204,203,203,204,204,204,204,214,214,201,201
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,108,252,252,109,252,109,252,252,252,252,252,252,252,107,107,107,109,107,109,107,109,107,109,107,107,106,107,107,107,106,107,106,107,106,107,106,107,106,106,106,106,106,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,202,202,203,202,202,202,203,202,203,202,203,202,203,202,203,202,202,202,203,202,202,202,203,202,204,203,204,203,204,203,204,214,214,201,216,201,214,202,203,202,203,204,204,203,204,203,204,204,204,204,214,214,201
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,109,252,252,252,252,252,252,109,252,252,107,107,107,109,107,109,107,109,107,109,107,107,107,107,106,107,106,107,106,107,106,107,106,107,106,106,106,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,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,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,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,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,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,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,11,11,11,11,11,11,11,11,11,202,202,202,202,202,202,202,202,202,202,202,202,203,202,202,202,202,202,202,202,202,202,203,203,203,204,204,203,204,204,204,202,214,201,214,216,201,214,202,202,203,204,204,204,203,203,204,204,204,204,204,214,214,214
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,107,107,107,109,107,109,107,109,107,109,107,107,106,107,106,107,106,107,106,107,106,107,106,107,106,106,106,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,12,11,202,202,203,202,202,202,202,202,203,202,203,202,203,202,202,202,203,202,203,202,203,202,203,202,203,203,204,204,204,203,204,202,203,202,214,214,201,216,201,202,204,203,204,203,204,203,204,203,204,203,204,204,204,214,214
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,252,252,107,106,107,106,107,109,107,109,107,107,106,107,106,107,106,107,106,106,106,107,106,107,106,106,106,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,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,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,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,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,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,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,11,11,11,11,11,11,11,11,11,202,202,202,202,202,202,202,202,202,202,202,202,203,202,202,202,203,203,203,202,203,203,202,202,203,203,203,203,204,204,204,203,202,202,203,203,214,214,214,201,214,203,203,203,204,204,203,203,204,204,204,204,204,204,204,214
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,252,109,252,107,106,107,252,107,109,107,109,107,109,106,107,106,107,106,107,106,107,106,107,106,106,106,107,106,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,11,12,11,11,202,203,202,202,202,203,202,202,202,203,202,203,202,203,202,202,203,204,202,203,202,202,202,203,203,204,203,204,204,204,203,202,202,203,202,203,203,214,214,214,201,214,203,204,203,204,204,203,204,204,203,204,203,204,204,214
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,109,109,252,109,106,107,106,107,109,107,109,107,109,106,107,106,107,106,107,106,106,106,106,106,107,107,107,106,106,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,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,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,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,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,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,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,11,11,11,11,11,11,11,11,11,11,202,202,202,202,202,202,202,202,202,202,202,202,202,202,203,203,204,204,202,202,202,202,203,203,203,203,204,204,204,203,203,202,202,202,203,203,203,203,203,214,214,201,214,203,203,204,204,204,204,204,204,204,204,204,204,204
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,109,107,252,107,252,107,252,107,252,107,109,107,109,106,107,106,107,106,107,106,106,106,107,106,107,106,107,106,106,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,202,202,202,202,203,202,202,202,203,202,202,202,203,202,203,203,204,204,202,202,202,202,203,203,204,203,204,204,204,203,204,202,203,202,203,202,203,203,203,203,204,203,214,214,214,203,204,204,204,204,204,203,204,203,204,204,204
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,109,109,109,252,252,252,107,106,107,109,107,109,107,107,106,107,106,107,106,106,106,106,106,107,107,107,106,106,106,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,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,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,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,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,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,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,11,11,11,11,11,11,11,11,11,11,202,202,202,202,202,202,202,202,202,202,202,202,202,203,203,202,202,204,204,203,202,202,203,203,203,204,204,204,204,203,203,202,202,203,202,203,203,203,203,203,203,204,204,204,214,214,203,204,204,204,203,204,204,204,201,201,201
+,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,252,107,252,107,252,107,252,107,106,107,252,107,109,107,107,106,107,106,107,106,106,106,107,106,107,106,107,106,106,106,106,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,12,11,11,11,11,202,202,202,203,202,203,202,203,202,202,202,202,202,203,202,202,202,203,203,204,204,203,202,203,203,204,204,204,203,204,202,202,202,203,202,203,202,203,203,203,203,204,203,204,203,204,204,204,204,204,214,214,201,201,201,201,216,216
+,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,107,109,107,109,109,109,109,252,252,106,107,252,107,109,106,107,106,107,106,107,106,106,106,106,106,107,107,106,106,106,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,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,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,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,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,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,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,11,11,11,11,11,11,11,11,11,11,202,202,202,202,202,202,202,202,202,202,202,202,202,202,203,202,203,203,203,203,204,203,202,202,203,203,204,204,204,202,202,202,202,202,203,202,203,203,203,203,203,203,204,203,204,204,204,204,203,214,201,201,201,216,216,216,216,216
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,252,107,109,107,252,107,252,107,252,109,252,107,252,107,252,106,107,107,107,106,107,106,106,106,107,106,107,106,106,106,106,106,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,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,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,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,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,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,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,11,11,11,11,11,11,11,11,11,202,202,203,202,202,202,203,202,202,202,203,202,202,202,203,202,203,202,203,203,204,204,204,203,204,203,202,204,204,204,202,202,202,202,203,202,203,202,203,203,203,204,204,203,204,204,204,203,202,214,201,201,201,216,201,216,216,216,216
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,107,107,109,107,109,107,109,109,109,109,252,109,252,109,106,107,106,106,107,107,107,107,107,106,106,106,107,106,107,107,106,106,106,106,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,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,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,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,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,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,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,11,11,11,11,11,11,11,11,202,202,202,202,202,202,202,202,202,202,202,202,202,202,204,202,202,202,202,203,203,204,204,204,202,204,204,204,204,204,204,204,202,202,202,202,202,203,202,203,203,203,203,204,204,204,204,204,204,204,214,214,214,214,201,201,216,201,216,216,216
+,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,107,252,107,109,107,252,107,252,109,252,109,252,107,252,106,107,106,107,106,107,106,107,106,107,106,107,106,106,106,106,106,106,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,202,202,202,203,202,203,202,203,202,203,202,203,202,202,202,204,202,202,202,203,202,203,203,204,202,204,203,204,203,204,204,204,204,202,202,203,202,203,202,204,203,203,203,204,203,204,204,204,203,204,203,202,202,203,214,214,201,201,216,201,216,216
+,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,109,107,109,107,252,109,109,109,109,109,109,109,252,252,106,106,106,106,107,106,107,107,107,107,107,107,106,107,107,106,106,106,106,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,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,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,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,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,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,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,11,11,11,11,11,11,11,11,202,202,202,202,202,202,202,202,203,202,202,202,202,202,203,204,202,202,203,203,203,203,204,204,202,203,204,204,204,204,204,204,204,202,202,202,203,202,203,204,203,203,203,203,204,204,204,204,204,203,202,202,203,203,203,203,214,201,201,216,201,216
+,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,108,108,108,108,108,252,107,109,107,252,107,252,107,109,107,109,107,252,107,252,109,252,109,107,106,107,106,107,106,107,106,107,107,107,106,107,106,106,106,106,106,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,202,202,202,203,202,203,202,203,202,202,202,202,202,202,203,204,202,203,202,203,203,204,203,204,202,203,204,204,204,204,204,204,202,202,202,202,202,203,203,204,203,203,203,204,203,204,204,204,203,202,202,203,202,203,203,204,214,201,201,216,216,201
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,108,109,107,107,107,109,107,109,107,109,109,109,109,252,109,252,109,109,106,107,106,107,107,107,107,107,106,107,106,107,106,106,106,106,106,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,202,202,202,202,202,202,203,202,202,202,202,202,202,202,204,204,202,202,203,203,203,203,204,204,202,203,204,204,204,204,204,204,202,202,203,202,203,203,204,204,202,203,203,203,204,204,204,204,203,202,202,202,203,203,203,203,203,214,201,201,201,216
+,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,108,108,108,252,108,107,107,252,107,109,107,252,107,109,107,252,107,252,109,252,107,109,109,252,106,107,107,107,106,107,106,107,106,107,106,106,106,106,106,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,203,202,202,202,203,202,203,202,203,202,202,202,203,202,203,203,204,202,203,202,203,203,204,204,204,202,204,203,204,203,204,204,203,202,202,202,202,202,203,203,204,203,204,203,204,203,204,204,204,202,203,203,204,202,203,203,204,203,214,214,201,201,201
+,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,108,108,108,108,108,107,107,107,109,107,109,107,109,107,109,109,109,109,109,109,109,109,109,109,107,106,107,106,107,106,107,106,107,106,106,106,106,106,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,10,11,11,11,202,202,202,202,202,203,203,202,202,202,202,202,202,202,203,203,204,203,203,203,203,203,203,204,202,203,204,204,204,204,204,204,202,202,202,202,202,203,202,204,204,203,203,203,203,204,204,204,203,202,202,203,202,203,204,204,204,204,214,214,214,201,201
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,109,107,109,107,252,107,252,107,109,107,252,107,252,107,109,109,252,109,252,109,107,106,107,106,107,106,106,106,106,106,106,106,106,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,202,202,203,202,202,202,203,202,202,202,202,202,203,202,203,203,204,202,203,202,203,203,204,203,202,203,204,203,204,204,204,204,202,202,202,202,202,202,204,202,203,203,204,203,204,204,204,204,204,202,203,202,202,202,203,203,204,204,204,204,214,214,201
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,107,107,107,107,107,107,109,107,109,107,109,109,109,107,109,109,109,109,109,109,109,109,107,106,107,106,106,106,106,106,106,106,106,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,11,11,10,11,202,202,202,202,202,203,203,203,202,202,202,202,202,203,203,204,202,203,203,203,203,203,203,202,203,203,204,204,204,204,204,204,202,202,202,203,202,203,204,203,203,203,203,204,204,204,204,204,203,202,202,203,202,203,203,204,204,204,204,204,204,214,214
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,107,107,107,252,107,109,107,252,107,252,107,252,107,252,107,252,107,109,109,252,109,252,106,107,106,106,106,107,106,106,106,106,106,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,203,202,202,202,203,202,203,202,202,202,202,202,202,202,203,203,204,202,203,203,204,203,202,202,203,203,204,203,204,203,204,204,202,202,203,202,203,203,204,203,203,203,204,203,204,204,204,204,204,202,202,202,202,202,203,203,204,203,204,204,204,204,204
+,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,107,107,107,107,107,107,107,109,107,109,107,109,109,109,109,109,109,109,109,109,106,107,106,106,106,106,106,106,106,106,106,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,202,202,202,202,202,203,203,202,202,202,202,202,202,203,203,204,202,203,203,203,203,204,202,203,203,204,204,204,204,204,204,202,202,202,202,203,203,203,203,204,203,204,203,204,204,204,204,204,202,203,203,204,202,203,203,204,204,204,204,204,204,204,204
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,107,109,107,252,107,252,107,252,107,109,107,109,107,109,109,252,109,252,106,107,106,106,106,107,106,106,106,106,106,106,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,202,202,202,202,203,202,203,202,202,202,202,202,203,203,204,204,203,202,203,203,204,202,202,202,204,204,204,203,204,204,204,202,202,202,203,202,203,203,204,203,204,203,204,203,204,203,204,202,203,202,204,203,204,202,204,204,204,203,204,204,204,204,204
+,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,107,107,252,108,108,108,107,107,107,107,109,107,107,107,252,109,109,109,109,109,109,109,109,109,107,106,106,106,106,106,106,106,106,106,106,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,202,202,202,202,202,202,203,203,203,202,202,202,202,202,203,203,204,204,202,202,204,202,203,204,202,204,204,203,204,204,204,204,202,202,202,202,203,203,203,203,203,203,204,204,204,202,202,202,203,203,203,203,204,204,204,203,204,204,204,204,203,204,204,204
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,252,252,108,108,107,109,107,109,107,252,107,252,107,252,107,109,107,252,107,109,109,252,106,106,106,107,106,106,106,106,106,106,106,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,202,203,202,203,202,203,202,203,202,202,202,202,202,203,203,204,203,204,204,202,202,203,203,204,202,204,203,204,203,204,203,204,202,203,202,203,203,203,203,203,203,204,203,204,204,202,202,203,202,203,203,204,203,204,204,204,204,204,203,204,204,204,204,204
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,107,252,252,252,252,109,108,107,107,107,107,107,107,109,107,252,107,109,109,109,109,109,109,109,109,106,106,106,106,106,106,106,106,106,106,106,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,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,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,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,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,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,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,202,202,202,202,202,202,203,203,202,202,202,202,202,202,204,203,203,203,202,202,203,203,204,203,202,203,204,204,204,204,204,204,202,202,203,203,203,203,203,203,204,203,204,204,204,202,202,202,203,203,203,203,204,204,204,204,204,204,204,204,203,204,204,204
+,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,108,108,252,107,252,252,109,109,107,108,107,107,252,107,252,107,252,107,252,107,109,107,109,109,252,109,107,106,106,106,106,106,106,106,106,106,106,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,10,11,202,202,202,203,202,203,203,203,202,202,202,203,202,203,202,203,203,202,202,203,203,204,204,204,202,204,203,204,203,204,204,202,202,203,202,203,203,204,203,204,203,204,204,204,202,203,202,202,202,204,204,204,203,204,204,204,203,204,203,204,204,204,204,204
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,107,252,252,109,109,252,252,107,107,107,107,109,107,107,107,252,109,109,109,109,109,109,109,107,106,106,106,106,106,106,106,106,106,106,106,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,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,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,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,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,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,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,202,202,202,202,203,203,203,202,202,202,202,202,202,202,203,203,203,202,202,203,203,204,204,203,204,203,204,203,204,204,202,202,203,202,203,203,203,203,203,203,204,204,204,204,202,202,202,203,203,204,204,204,204,204,204,204,204,204,204,204,203,204,204,204
+,252,252,252,252,252,108,252,252,252,252,252,252,252,252,108,108,108,252,107,109,109,252,109,252,107,252,107,107,107,252,107,252,107,109,107,109,109,252,109,107,106,107,106,106,106,106,106,106,106,106,106,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,202,203,202,203,202,203,203,203,202,202,202,202,202,203,202,203,203,202,202,203,203,204,204,204,203,204,203,204,203,204,203,202,202,203,202,203,203,203,203,204,203,204,203,204,202,202,202,203,203,204,204,204,203,204,204,204,203,204,203,204,204,203,204,204
+,252,252,252,252,108,252,252,252,252,252,252,252,252,252,108,107,108,107,109,109,109,109,252,252,252,107,107,107,107,107,252,107,252,109,109,109,109,109,109,106,106,106,106,106,106,106,106,106,106,106,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,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,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,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,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,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,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,202,202,202,202,203,203,203,202,202,202,202,202,202,202,203,203,204,202,203,203,204,204,203,203,204,203,204,204,204,204,202,202,203,203,203,203,204,203,203,203,204,204,204,204,202,202,203,203,203,204,204,204,204,204,204,204,204,199,199,199,203,204,204,204
+,252,252,252,252,252,252,252,252,252,252,252,252,252,108,107,252,108,109,109,252,109,252,109,252,252,252,107,107,107,252,107,252,107,109,107,109,109,252,109,106,106,106,106,106,106,106,106,106,106,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,11,10,10,10,202,202,202,202,203,202,203,203,203,202,202,202,202,202,203,203,204,203,202,202,203,203,204,203,204,203,204,203,204,203,204,202,203,202,203,203,203,203,204,203,204,203,204,204,204,202,203,203,204,203,204,204,204,203,204,204,199,199,233,233,201,201,201,201,201
+,252,252,252,252,108,252,252,252,252,252,252,252,252,107,108,108,252,109,109,109,252,109,252,252,252,252,107,107,107,107,107,107,252,109,109,109,109,109,109,106,106,106,106,106,106,106,106,106,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,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,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,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,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,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,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,202,202,202,202,202,203,203,203,202,202,202,202,203,203,203,203,203,202,202,203,203,204,204,203,203,204,204,204,204,204,202,202,202,203,203,203,203,204,203,203,203,204,204,204,204,202,203,203,203,204,204,204,204,204,199,199,233,233,233,200,200,200,200,200,200
+,252,252,252,252,252,252,252,252,252,252,252,252,107,252,108,252,108,252,109,252,109,252,109,252,252,107,107,252,107,252,107,252,107,252,107,109,109,252,106,106,106,107,106,106,106,106,106,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,11,10,10,10,10,10,202,202,202,202,203,202,203,203,203,202,202,202,203,202,203,202,203,202,203,202,204,203,204,203,204,203,204,203,204,202,203,203,203,203,203,203,204,203,204,203,204,204,204,204,204,202,203,203,204,203,204,204,199,199,233,233,200,200,200,200,200,201,201,201,201
+,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,109,109,109,109,252,109,252,252,107,107,107,107,107,107,252,252,109,109,109,109,109,109,107,106,106,106,106,106,106,106,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,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,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,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,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,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,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,202,202,202,202,202,203,203,203,202,202,202,203,203,202,202,203,203,202,202,203,203,204,204,203,203,204,203,204,204,204,202,203,203,203,203,204,204,204,204,204,204,204,204,204,204,203,203,203,203,204,199,199,233,233,233,233,200,200,200,194,194,234,234,234,234
+,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,108,252,109,252,109,252,109,252,107,107,107,252,107,252,107,252,107,109,109,252,109,107,106,106,106,106,106,106,106,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,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,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,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,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,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,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,202,202,202,202,203,202,203,202,202,202,202,202,203,203,204,202,204,202,203,203,204,204,204,203,204,203,204,203,204,202,203,203,203,203,204,203,204,203,204,203,204,203,204,204,203,202,203,203,199,199,199,233,233,233,200,200,200,233,234,234,233,201,201,201,201
+,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,109,109,109,109,252,252,252,252,107,107,107,107,252,252,252,252,109,109,109,109,109,106,107,106,106,106,106,106,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,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,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,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,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,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,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,202,202,202,202,202,203,203,202,202,202,202,203,203,203,203,202,204,204,202,203,203,204,204,203,203,204,204,204,204,202,203,203,203,203,203,203,203,204,204,204,204,204,204,204,202,203,199,199,199,233,233,233,233,200,200,200,233,234,234,233,200,200,200,200,233
+,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,109,252,109,252,109,252,109,252,107,252,107,252,107,252,107,109,109,252,109,109,106,107,106,107,106,106,106,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,202,202,202,202,203,203,203,202,202,202,202,202,203,202,202,203,204,203,202,202,204,204,204,203,204,203,204,203,202,203,204,203,203,203,204,203,204,203,204,204,204,204,204,199,199,199,234,234,233,233,234,233,200,200,200,233,234,234,233,200,200,233,234,233,233
+,252,252,252,252,252,252,252,252,252,252,252,108,108,108,109,109,109,109,252,109,252,252,252,252,107,107,107,107,109,109,109,109,109,109,109,109,107,106,252,106,106,106,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,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,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,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,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,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,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,202,202,202,202,202,202,203,203,202,202,202,202,203,202,202,202,203,203,204,203,202,204,204,204,204,203,204,203,204,204,203,203,203,203,203,203,204,203,204,204,204,204,199,199,234,234,234,233,233,233,234,233,200,233,233,233,234,233,233,200,200,234,234,234,233,233
+,252,252,252,252,252,252,252,252,252,252,252,108,108,109,108,252,108,252,109,252,109,252,252,252,107,252,107,109,107,109,109,109,109,109,109,252,106,252,106,106,106,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,202,202,202,202,202,203,202,203,202,202,202,202,203,202,202,203,203,204,204,203,203,204,203,204,204,204,203,204,203,203,203,203,203,204,204,204,203,204,203,204,204,199,234,234,234,233,233,234,233,234,233,200,233,234,192,234,233,200,200,200,200,200,233,233,234,234
+,252,252,252,252,252,252,252,252,252,252,108,108,108,108,109,109,252,109,252,109,252,252,252,107,107,107,252,107,109,109,109,109,109,109,109,107,107,106,106,106,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,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,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,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,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,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,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,202,202,202,202,202,202,203,202,202,202,202,202,202,202,203,203,203,203,204,203,203,203,204,204,204,203,204,204,204,203,203,203,203,203,204,203,204,203,204,199,234,234,234,199,234,234,234,234,234,234,234,234,234,234,234,233,200,233,200,200,200,234,233,234,234,234
+,252,252,252,252,252,252,252,252,252,108,108,109,108,252,108,252,109,252,109,252,109,252,109,107,107,252,107,109,109,252,109,107,109,107,107,107,106,107,106,106,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,202,202,202,202,202,203,203,202,202,202,202,202,202,202,202,203,203,204,203,204,203,204,203,204,204,204,203,204,203,203,203,204,203,204,204,204,203,204,199,192,199,192,192,199,192,193,192,192,193,193,234,234,234,234,234,234,234,200,234,233,234,233,234,234,234,233
+,252,252,252,252,252,252,252,252,108,108,108,108,109,108,109,109,252,109,252,252,252,252,107,107,107,107,252,109,109,107,107,106,107,106,107,106,107,106,106,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,10,10,10,10,10,10,10,9,202,202,202,202,203,203,203,202,202,202,202,202,202,202,202,202,203,203,204,204,204,204,204,204,204,203,204,204,204,203,203,203,204,204,204,203,204,199,192,199,192,192,199,199,192,192,193,192,193,193,193,234,200,192,234,234,234,234,234,234,233,234,234,194,234,233
+,252,252,252,252,252,252,252,108,108,109,108,252,108,252,109,252,109,252,109,252,252,252,107,252,107,252,252,109,107,109,106,107,107,107,106,107,106,106,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,202,202,203,202,202,203,202,202,202,202,202,203,202,202,202,203,203,204,203,204,203,204,203,204,203,204,203,204,203,203,203,204,203,204,204,204,203,199,192,192,192,193,199,192,192,193,192,193,193,193,192,234,234,200,233,234,234,234,234,234,234,234,194,234,233,233
+,252,252,252,252,252,252,108,108,108,108,108,108,252,109,252,109,252,252,252,252,252,252,107,107,252,252,252,107,106,106,107,107,107,106,107,106,107,106,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,10,9,10,10,202,202,203,202,203,203,202,202,202,202,202,202,202,202,203,203,203,203,204,204,204,203,204,204,203,203,204,204,204,203,203,203,204,204,204,203,199,192,199,192,192,192,199,192,192,192,193,193,193,192,192,192,234,234,234,234,234,234,234,234,234,194,194,234,233,233
+,252,252,252,252,252,252,108,108,108,252,108,252,109,252,109,252,109,252,109,252,252,252,252,107,107,252,107,106,107,106,107,107,107,107,106,107,106,107,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,202,202,203,202,203,202,203,202,203,202,202,202,203,202,203,202,203,203,204,203,204,203,204,204,204,203,204,203,204,203,203,203,204,203,204,204,204,199,192,192,193,192,192,199,193,192,193,193,193,192,192,192,192,192,192,192,234,192,193,193,234,193,194,194,234,234,233
+,252,252,252,252,252,252,108,108,108,108,109,109,252,109,252,252,252,252,252,252,252,252,252,107,252,107,106,107,106,107,109,109,107,106,107,106,106,106,106,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,202,202,202,203,203,203,203,202,202,202,202,202,202,202,202,203,203,203,203,204,204,204,204,202,203,204,203,204,204,203,203,203,203,204,204,204,199,192,199,192,192,193,199,199,192,193,193,193,193,192,192,192,192,192,192,193,192,193,193,193,193,194,194,194,194,194,234
+,252,252,252,252,252,252,108,252,108,252,108,252,108,252,109,252,252,252,252,252,252,252,109,252,252,106,107,106,107,107,107,252,107,107,106,107,106,106,106,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,202,202,203,202,203,202,203,202,202,202,202,202,202,202,203,202,203,203,204,204,204,203,202,204,204,203,204,203,204,203,204,203,204,203,204,199,192,199,193,192,192,199,193,192,192,192,193,192,193,192,193,192,192,192,193,192,193,192,193,193,194,193,194,194,194,194,194
+,252,252,252,252,252,108,108,108,109,108,109,109,252,252,252,252,252,252,252,252,252,107,107,107,106,109,109,107,106,107,252,109,107,107,107,106,106,106,106,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,202,202,202,203,203,203,202,202,202,202,202,202,202,202,202,203,203,203,204,204,204,202,203,204,203,203,203,204,204,203,203,204,203,204,204,199,192,192,192,199,199,199,192,193,193,193,192,192,192,193,192,192,193,192,192,192,192,192,192,193,193,194,194,194,194,194,194
+,252,252,252,252,252,108,108,109,108,252,108,252,109,252,109,252,252,252,107,107,107,106,106,252,107,109,107,107,107,107,107,252,107,107,106,106,106,106,106,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,202,202,203,202,203,203,202,202,203,202,202,202,202,202,203,203,204,203,204,204,202,202,204,204,204,203,204,203,204,203,203,203,204,203,199,192,199,199,193,199,193,192,193,192,193,192,192,192,193,192,192,192,193,192,193,192,193,193,194,193,194,194,194,194,194,194,194
+,252,252,252,252,252,108,252,108,108,108,109,252,252,252,252,252,108,107,107,107,107,107,252,107,109,109,252,106,107,107,252,252,107,107,106,106,106,106,106,106,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,202,202,202,203,203,203,202,202,202,202,202,202,202,203,203,203,203,204,204,204,202,203,203,204,203,204,203,204,204,203,203,203,203,204,199,192,192,193,192,192,192,193,192,193,193,192,192,192,192,193,192,192,192,192,192,193,193,193,193,194,194,194,194,194,194,194,194
+,252,108,108,252,108,252,108,252,108,109,108,252,109,108,108,252,108,252,107,252,107,252,107,109,107,252,109,107,107,252,107,109,107,107,106,106,106,106,106,106,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,10,9,202,202,203,202,203,203,202,202,202,202,202,202,203,202,203,203,204,203,204,202,203,203,204,204,204,203,204,203,204,203,204,203,204,199,192,192,199,192,193,192,193,192,193,193,193,192,192,192,193,192,193,192,192,192,193,193,194,193,194,193,194,194,194,194,194,194,194
+,108,108,108,108,252,252,108,108,252,108,109,109,252,108,108,108,252,107,107,107,252,252,252,109,109,109,109,106,107,106,252,109,107,107,106,106,106,106,106,106,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,202,202,202,202,203,203,203,202,202,202,202,202,202,204,203,203,203,203,204,204,202,202,203,203,204,203,203,203,204,204,203,203,204,199,192,199,192,192,192,192,193,192,193,194,193,193,192,192,192,192,192,192,193,192,192,192,193,193,194,193,194,194,194,194,194,194,194,194
+,108,252,108,252,252,252,108,108,108,252,108,252,108,252,108,252,108,252,107,109,107,252,107,109,109,252,107,107,106,252,107,109,107,107,106,106,106,106,106,106,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,202,202,202,203,202,203,203,202,202,203,202,202,202,204,202,203,203,204,203,202,202,203,203,204,204,204,203,204,203,204,203,204,203,199,192,192,192,192,192,193,192,193,193,194,193,192,192,193,192,193,192,193,192,193,192,193,193,194,193,194,194,194,194,194,194,194,194,194
+,108,108,252,252,108,108,252,252,109,108,108,108,108,108,108,108,108,107,109,107,109,109,109,109,109,109,252,106,107,106,252,109,107,106,106,106,106,106,106,106,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,202,202,203,203,203,202,202,202,202,202,202,202,202,204,203,203,203,203,204,202,202,203,203,204,204,203,204,203,204,204,203,203,199,192,199,192,192,192,193,194,193,193,193,193,194,192,192,192,192,193,193,192,192,192,193,193,193,193,194,194,194,194,194,194,194,194,194,194
+,108,252,108,252,108,252,108,109,109,108,108,252,108,252,108,252,108,109,107,252,107,109,107,252,107,252,109,107,106,252,107,252,106,107,106,106,106,106,106,106,106,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,9,9,9,10,202,202,202,203,203,202,202,203,202,203,202,203,202,203,204,204,203,204,202,203,202,203,203,204,204,204,203,204,203,204,203,204,199,192,192,192,192,193,193,194,193,194,194,194,192,192,192,192,192,193,192,193,192,193,192,193,193,194,193,194,194,194,194,194,194,194,194,194
+,108,108,252,108,252,108,252,109,109,108,108,108,108,108,108,108,252,107,109,107,252,109,109,109,252,109,252,107,107,106,252,106,107,106,107,106,106,106,106,106,106,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,202,202,203,203,203,202,202,203,202,202,202,202,202,203,204,203,204,204,202,202,203,203,204,204,203,203,203,203,204,204,203,199,192,199,192,192,193,193,193,193,193,193,194,194,194,192,192,192,192,192,193,193,192,192,193,193,193,193,194,194,194,194,194,194,194,193,194,194
+,252,108,108,252,108,252,108,252,109,108,108,108,108,252,108,252,108,109,107,252,107,109,107,109,109,252,109,107,106,107,106,107,106,107,106,106,106,106,106,106,106,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,9,9,9,9,9,10,9,9,202,203,203,202,202,202,202,203,202,203,202,202,202,203,204,203,203,204,202,203,203,204,203,204,203,204,203,204,203,204,203,199,192,192,192,192,192,193,192,193,193,194,193,194,194,192,192,192,192,193,192,192,192,193,192,193,193,194,193,194,194,194,193,194,194,194,194,194
+,252,108,108,108,252,108,252,252,109,109,108,108,108,108,108,108,109,107,109,109,252,109,109,109,109,109,252,107,107,106,107,106,107,106,107,106,106,106,106,106,106,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,202,203,202,202,202,202,202,202,203,202,202,202,202,203,204,204,203,203,202,202,203,203,204,204,203,203,204,203,204,204,203,199,192,192,192,192,192,192,193,193,193,193,194,194,192,192,192,192,192,192,193,192,192,192,193,193,193,194,194,194,194,194,194,193,194,194,194,194
+,252,108,108,252,108,252,108,252,252,109,108,108,108,252,108,252,108,109,107,252,107,109,107,252,109,252,109,252,106,107,106,107,106,107,106,107,106,106,106,106,106,106,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,202,202,203,202,203,202,202,202,203,203,202,202,203,202,203,203,204,203,202,202,203,203,204,203,204,203,204,203,204,203,204,203,199,192,193,193,194,193,194,192,193,193,194,193,194,192,193,192,193,192,193,192,192,192,193,192,193,193,194,193,194,193,194,194,193,194,194,194,194
+,252,108,108,108,252,252,252,252,252,252,109,108,108,108,108,108,109,107,107,107,252,109,109,109,252,109,252,109,107,252,252,109,107,106,107,106,106,106,106,106,106,106,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,202,203,203,202,202,202,202,202,203,202,204,202,202,203,203,204,204,204,202,202,202,203,203,204,204,204,203,204,203,204,204,199,192,192,192,193,193,193,193,194,194,193,193,194,193,192,192,192,192,193,193,192,192,192,192,193,193,193,193,194,194,194,194,194,193,194,193,194,194
+,108,252,108,252,108,252,108,252,252,252,252,109,108,252,108,108,108,252,107,252,107,109,107,252,107,252,107,107,107,252,252,109,109,107,106,107,106,106,106,106,106,106,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,202,202,203,202,202,202,202,202,202,203,204,202,202,202,203,203,204,203,202,202,203,203,204,204,204,203,204,203,204,204,204,199,192,192,193,192,194,193,194,193,194,193,194,194,194,192,192,192,193,192,193,193,192,193,194,192,193,193,194,193,194,193,194,193,194,194,194,194,194
+,108,108,108,108,252,252,252,252,252,252,252,252,109,108,108,108,108,107,107,107,252,107,109,109,109,109,252,107,107,252,252,109,109,109,107,106,107,106,106,106,106,106,106,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,202,202,202,202,202,202,202,202,202,203,204,202,202,203,203,204,204,204,202,203,203,203,203,204,203,204,203,204,204,204,204,199,192,192,192,192,193,192,194,193,194,194,194,194,194,192,192,192,192,193,193,192,192,193,194,194,193,193,193,194,194,194,193,194,194,194,193,194,194
+,108,108,108,252,108,252,108,252,252,252,108,252,252,109,108,108,108,109,107,252,107,252,107,252,107,252,109,107,107,252,252,109,109,107,109,107,106,107,106,106,106,106,106,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,202,202,202,202,202,203,202,202,202,202,203,204,202,202,202,203,203,204,202,202,202,203,203,204,204,204,203,204,203,204,204,204,199,193,192,193,192,192,193,193,193,193,194,194,194,193,192,193,192,193,192,193,192,193,193,194,193,194,193,194,194,194,193,194,193,194,193,194,194,194
+,108,108,108,108,252,252,252,252,252,108,252,252,252,108,109,109,108,107,107,107,252,107,252,107,109,109,252,109,107,252,109,109,107,107,109,109,107,106,107,106,106,106,106,106,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,202,202,202,202,202,202,203,202,202,202,203,204,202,202,203,203,204,203,203,202,202,203,203,204,204,203,204,204,204,204,204,203,199,192,193,192,192,193,192,193,193,194,193,194,194,193,192,192,192,192,193,193,192,192,193,193,194,194,194,194,194,194,194,194,194,194,194,193,194,194
+,108,252,108,252,108,252,108,252,252,252,108,252,108,252,252,109,109,107,107,107,107,252,107,252,107,252,107,252,107,252,109,109,107,252,107,109,107,107,106,107,106,107,106,106,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,202,202,202,202,203,202,202,202,202,202,202,203,204,202,202,202,204,204,203,202,203,202,203,203,204,203,204,203,204,203,204,203,204,199,192,192,192,192,192,193,193,193,193,194,194,194,193,192,193,192,193,192,193,192,193,192,193,193,194,194,194,194,194,193,194,193,194,193,194,195,194
+,108,108,108,108,252,108,252,252,252,108,252,108,108,252,252,252,109,107,107,107,109,109,252,252,109,109,252,107,107,109,109,109,107,107,109,109,109,109,107,106,107,106,106,106,106,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,9,9,9,9,8,9,9,9,202,202,202,203,202,202,202,202,202,202,202,203,204,202,202,203,203,204,203,202,202,203,203,204,204,204,204,204,204,204,204,203,199,199,192,193,192,192,193,192,193,193,194,194,194,194,192,192,192,192,192,193,193,192,192,193,193,194,194,194,194,194,194,193,193,194,193,194,194,194,194
+,108,108,108,252,108,252,108,252,252,108,108,252,108,252,108,252,252,109,107,252,107,252,107,252,109,252,107,252,107,109,109,109,109,107,107,252,107,109,109,107,106,107,106,106,106,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,202,202,202,202,203,203,202,203,202,202,202,202,204,202,202,203,203,204,202,203,202,203,203,204,204,204,203,204,203,204,204,204,203,199,199,193,192,192,193,193,193,193,194,193,194,194,193,192,192,193,192,193,193,193,192,193,193,194,193,194,194,194,194,194,193,194,193,194,193,194,195,194
+,108,108,108,108,252,252,252,252,252,108,108,108,108,108,252,252,252,252,107,107,252,109,252,252,252,252,107,107,107,107,109,107,109,109,107,107,109,109,109,107,107,106,107,106,106,106,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,9,9,9,8,202,202,202,202,203,202,202,202,203,202,202,202,204,204,202,202,204,204,203,202,203,203,203,203,204,204,204,204,204,204,204,204,204,199,192,192,192,193,192,193,192,193,193,194,193,194,192,192,192,192,193,193,193,193,192,192,193,193,194,194,194,194,194,193,193,194,194,194,194,194,194,194
+,108,252,108,252,108,252,108,252,252,252,108,108,108,252,252,252,252,252,107,107,107,252,107,252,252,107,107,109,107,109,107,109,107,252,107,109,107,109,107,109,109,107,106,107,106,106,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,202,202,203,202,203,203,203,202,203,202,203,202,202,204,204,202,203,203,204,202,202,202,203,203,204,204,204,203,204,204,204,203,204,203,199,192,193,192,192,192,192,193,193,193,193,194,194,192,192,192,193,192,193,192,193,192,193,192,194,193,194,194,194,194,194,193,195,194,194,193,194,195,194
+,108,108,108,108,252,252,252,252,252,252,252,108,108,107,252,252,252,252,107,107,107,107,252,252,252,107,107,107,107,109,109,109,109,109,107,109,107,107,109,109,109,109,107,106,107,106,106,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,202,202,202,202,202,202,203,202,202,202,202,202,202,204,204,202,202,203,203,204,202,202,203,203,204,204,204,204,204,204,204,204,204,204,204,199,192,192,192,193,192,193,193,194,193,194,194,194,192,192,192,192,193,192,193,193,192,192,193,194,194,194,194,194,194,194,194,194,195,194,194,195,195,194
+,108,108,108,252,108,252,108,252,252,252,252,252,108,252,252,252,107,252,107,252,107,252,107,252,107,252,107,107,107,109,107,109,107,109,109,107,109,107,107,109,107,109,109,107,106,107,106,106,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,202,202,202,202,202,203,203,203,202,203,202,202,202,204,204,202,202,202,203,204,202,202,202,203,203,204,203,204,203,204,204,204,204,204,199,199,192,192,192,192,193,193,193,193,194,194,194,194,192,192,192,193,192,193,193,194,193,192,193,194,193,194,193,194,195,195,194,195,194,194,194,195,194,194
+,108,108,108,108,252,252,109,252,252,252,252,252,252,252,108,107,252,252,252,107,107,107,252,107,252,109,109,107,109,109,107,107,109,109,109,109,109,107,107,107,109,109,109,109,109,106,107,106,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,153,154,154,154,154,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,202,202,202,202,202,202,202,203,203,202,202,202,202,203,203,204,202,203,202,204,203,203,202,203,203,204,204,204,204,204,204,204,204,204,203,199,192,192,193,192,193,192,193,193,194,193,194,193,194,194,192,192,192,193,193,193,193,193,193,194,194,194,194,194,194,194,194,194,194,195,194,194,194,195,194
+,252,108,108,252,108,252,108,252,252,252,109,252,252,252,109,252,107,252,252,108,107,109,107,252,107,252,107,252,109,109,107,109,107,252,107,109,109,109,107,107,107,109,107,109,109,107,106,106,106,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,153,153,153,153,153,153,154,154,154,153,154,154,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,202,202,202,202,203,202,203,203,203,202,202,202,203,203,204,204,202,203,203,203,203,203,202,202,203,203,204,203,204,203,204,204,204,204,204,199,192,192,192,193,193,193,193,193,193,193,193,194,194,194,193,192,193,192,193,193,193,193,194,193,194,194,194,194,194,195,194,194,195,193,194,194,195,195,194
+,109,108,108,108,109,108,252,252,252,252,252,252,252,252,252,252,108,107,252,107,108,107,252,107,109,109,109,109,252,109,107,107,109,107,109,109,109,109,109,107,107,109,109,109,109,107,107,106,106,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,153,153,153,153,152,152,152,152,152,153,153,154,153,154,154,154,154,154,154,153,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,202,202,202,202,202,202,203,203,203,203,203,202,203,203,204,204,202,203,204,203,203,203,202,202,203,203,204,204,204,204,204,204,204,204,204,203,199,192,192,193,192,193,192,193,192,194,193,194,193,194,194,192,193,192,193,193,193,193,193,193,194,194,194,194,194,193,194,194,194,194,195,194,195,194,195,194
+,252,108,108,252,108,252,252,252,252,252,109,252,109,252,252,252,107,252,107,108,107,252,107,109,107,252,107,252,109,252,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,107,106,106,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9,153,153,152,152,152,157,157,155,156,157,157,152,153,153,153,153,153,153,154,154,154,154,154,154,154,154,8,9,8,9,8,9,8,9,8,9,8,9,202,202,202,202,202,203,202,203,202,203,202,202,202,204,204,202,202,204,204,203,203,204,202,203,203,204,204,204,203,204,204,204,204,204,204,204,199,192,192,192,193,192,193,192,193,194,194,193,194,192,193,194,192,192,192,193,193,194,193,194,193,194,194,194,194,193,194,195,194,195,194,194,195,195,195,194
+,109,252,108,108,252,252,109,252,252,252,252,252,252,252,252,252,108,107,108,252,107,107,107,107,109,109,109,109,252,252,107,107,109,107,109,107,109,109,109,107,107,107,109,109,109,109,109,107,107,106,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,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,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,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,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,152,157,156,156,155,155,157,157,156,155,156,156,157,152,153,153,152,152,153,153,153,153,153,154,154,154,154,154,154,154,154,8,8,8,8,8,8,8,8,202,202,202,202,203,203,203,202,203,202,204,202,202,202,202,202,203,203,204,204,203,202,202,203,203,204,204,204,204,203,204,204,204,204,204,199,192,192,192,193,192,193,192,193,193,194,193,194,193,192,193,194,192,194,193,193,193,193,193,193,194,194,194,194,194,193,194,194,195,195,195,194,195,195,195,194
+,252,252,108,108,108,252,108,252,252,252,109,252,252,252,252,252,108,252,107,252,107,252,107,109,107,252,107,252,109,252,107,109,107,252,107,109,107,252,107,107,107,109,107,109,107,109,109,107,107,106,106,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,152,157,157,157,156,156,155,157,156,156,155,157,156,157,156,152,153,157,156,152,152,153,153,154,153,153,154,153,154,154,154,154,154,154,154,154,8,9,8,8,202,202,203,204,202,203,202,202,202,203,204,203,202,202,202,203,203,204,203,204,203,204,202,203,203,204,204,204,203,204,203,204,204,204,204,199,192,192,192,192,193,192,192,193,193,194,194,193,192,193,193,194,193,194,192,193,193,194,193,194,193,194,194,194,195,194,194,195,194,195,194,195,194,195,195,195
+,109,252,109,108,108,252,252,252,252,252,252,252,252,252,252,252,108,107,108,109,107,107,107,107,109,107,109,109,252,109,107,107,107,107,109,107,109,107,109,107,107,107,109,107,109,109,109,107,107,106,106,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,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,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,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,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,157,157,157,157,156,156,155,155,157,157,156,156,155,156,156,156,156,152,157,157,156,156,152,153,153,153,154,154,154,154,153,154,154,154,154,154,154,154,154,154,202,202,203,204,202,202,202,202,202,203,203,204,202,202,202,203,203,203,203,204,204,204,203,203,204,204,204,204,204,204,204,204,204,204,204,204,199,192,192,192,193,192,193,192,193,193,194,194,194,192,193,194,194,193,194,193,193,193,193,194,194,194,193,194,194,195,194,194,194,195,195,195,195,195,195,195,195
+,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,108,107,108,109,252,252,107,107,109,107,252,107,252,107,252,109,252,107,109,107,252,107,252,107,107,107,109,107,109,107,109,109,109,107,107,106,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,9,8,8,8,157,157,157,156,157,155,156,155,157,156,156,155,155,156,157,156,156,155,157,156,157,155,152,153,153,153,153,153,153,154,154,154,154,154,154,154,154,154,154,154,202,202,204,202,202,202,202,202,203,203,204,204,203,202,203,202,203,203,204,203,204,204,203,203,202,204,204,204,204,204,204,203,204,203,204,204,199,192,192,192,192,192,192,193,193,193,193,194,192,192,193,193,194,194,193,194,193,193,194,193,194,193,194,194,195,194,195,195,195,195,195,194,195,195,195,194,192
+,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,107,108,107,109,109,252,107,107,107,109,109,109,109,252,109,252,107,252,107,107,107,109,107,109,107,107,107,107,107,109,109,109,109,107,106,106,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,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,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,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,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,157,157,157,157,156,156,155,155,157,157,156,156,155,155,157,156,155,157,157,156,156,156,156,152,153,153,153,153,153,153,153,153,153,154,153,154,154,154,154,154,202,202,202,202,202,203,202,202,203,203,204,204,202,202,202,203,203,203,203,204,204,204,203,202,203,204,204,204,204,204,204,204,204,204,204,204,192,192,192,192,193,192,193,192,193,193,194,192,192,193,193,193,193,194,194,194,194,194,194,194,194,193,193,194,194,195,195,195,195,195,195,195,194,195,194,192,199
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,108,107,252,109,252,252,252,107,109,107,252,107,252,109,252,109,107,107,252,107,252,107,252,107,107,107,109,107,109,107,109,107,109,107,107,106,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,8,8,8,8,8,8,9,8,157,157,157,156,156,155,156,155,157,156,156,155,156,155,157,157,157,156,157,156,156,155,156,152,153,153,152,152,152,152,152,152,153,153,153,153,154,153,154,153,202,202,203,202,203,202,202,202,203,203,204,203,204,202,203,202,203,203,204,203,204,204,202,202,204,204,204,203,204,204,204,203,204,204,204,199,192,192,192,192,192,192,192,193,193,193,193,192,193,192,193,193,194,194,194,194,194,193,194,193,194,194,194,193,195,194,195,193,195,194,195,194,194,195,192,199,192
+,109,252,109,252,109,252,252,252,252,252,252,252,252,252,108,107,108,107,252,252,252,107,107,107,107,107,109,109,252,109,252,107,107,107,252,107,252,107,109,107,107,107,107,107,109,107,109,109,107,106,106,106,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,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,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,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,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,157,157,157,156,156,156,155,155,157,157,156,156,156,155,155,155,157,157,157,156,156,156,202,202,202,152,152,202,202,203,202,202,203,152,152,152,152,153,153,153,154,202,202,202,202,202,202,202,203,203,203,203,204,204,202,202,203,203,203,203,203,203,204,202,203,203,204,204,204,204,204,204,204,204,204,204,199,192,192,192,192,192,192,193,192,193,193,194,192,192,193,193,193,194,194,194,194,193,194,194,194,194,193,193,195,194,195,195,195,195,194,194,195,195,192,199,192,193
+,252,109,252,252,252,252,252,252,252,252,252,252,252,108,107,109,107,252,107,252,109,107,107,252,107,252,107,252,107,252,109,107,109,252,107,252,107,252,107,109,107,107,107,109,107,109,107,109,106,107,106,106,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,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,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,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,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,157,157,157,157,156,156,155,155,157,157,156,156,155,156,155,155,156,202,202,202,202,202,202,202,202,202,202,202,202,203,202,203,202,203,203,204,152,153,153,154,202,203,202,203,202,202,202,203,202,203,203,204,203,204,202,203,202,203,202,203,203,204,202,203,203,204,204,204,204,204,204,204,204,204,204,204,199,193,192,192,192,192,192,192,193,193,194,192,192,193,192,193,193,194,195,194,194,194,193,194,194,194,195,193,193,195,194,195,195,194,195,195,195,192,199,192,192,192
+,109,252,109,252,252,252,252,252,252,252,252,252,252,107,108,107,109,109,252,109,252,252,107,107,109,107,109,109,252,107,252,109,107,107,107,107,252,107,109,107,109,107,107,107,109,109,109,109,107,106,107,106,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,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,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,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,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,157,157,157,157,156,156,156,155,157,156,157,156,156,155,202,202,202,202,202,202,202,202,202,202,202,202,202,202,203,203,204,204,203,203,203,204,204,152,153,153,202,202,203,202,202,202,202,202,203,203,203,203,204,204,202,202,202,202,203,203,203,202,203,203,203,203,204,204,204,204,204,204,204,204,204,204,192,192,193,192,192,192,192,193,193,194,192,192,193,193,193,193,194,195,195,195,194,194,194,195,195,195,193,193,195,195,195,195,195,194,194,195,192,199,192,192,193,192
+,252,252,252,252,252,252,252,109,252,252,252,252,252,108,107,109,107,252,107,252,252,252,109,107,107,252,107,107,107,252,107,252,107,252,107,252,107,252,107,109,107,109,107,107,107,109,107,109,106,107,106,106,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,157,157,157,157,156,156,155,155,157,157,156,157,155,156,202,202,202,202,202,202,202,202,203,202,202,203,202,203,203,204,204,203,202,203,203,204,203,204,152,153,202,203,202,202,202,202,202,203,202,203,203,204,203,204,202,203,202,203,203,202,202,203,203,204,203,204,204,204,203,204,204,204,203,204,204,204,192,192,192,192,192,192,193,193,193,192,192,193,192,193,193,194,194,195,195,194,195,195,194,195,193,195,193,195,195,195,195,195,195,194,195,192,199,192,192,192,192,192
+,109,252,109,252,252,252,109,252,252,252,252,252,252,107,108,107,109,107,252,252,252,252,252,252,107,107,107,107,109,252,252,107,107,107,107,107,107,107,252,107,109,107,107,107,109,107,109,109,107,106,107,106,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,7,8,8,8,157,157,157,157,156,156,156,155,155,157,157,156,156,156,155,202,202,202,202,202,202,203,203,202,202,202,202,203,203,204,204,204,203,203,203,203,203,204,204,155,152,203,202,202,202,202,202,202,202,203,203,203,203,204,204,202,202,203,202,202,202,203,203,203,203,204,204,204,204,204,204,204,204,204,204,204,204,192,193,192,193,192,193,192,193,192,192,192,192,193,193,193,194,195,195,195,195,194,195,195,195,195,195,194,195,195,195,195,195,194,195,192,199,192,192,192,192,193,192
+,252,109,252,252,252,252,252,252,252,252,252,252,107,108,107,252,108,252,107,252,109,252,109,252,107,107,107,252,107,252,109,252,107,252,107,252,107,252,107,109,107,109,107,109,107,109,107,109,106,107,106,106,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,157,157,157,157,157,156,156,155,155,156,157,156,156,155,156,202,203,202,203,202,203,202,202,202,203,202,203,203,204,203,204,204,203,203,204,203,204,203,204,155,155,202,202,202,202,202,202,202,203,202,203,203,204,203,204,202,203,202,202,202,203,202,203,203,204,203,204,203,204,204,204,204,204,204,204,204,199,192,193,192,192,192,192,193,192,192,193,192,193,193,194,194,195,194,195,195,194,195,195,195,195,195,195,195,195,194,195,195,195,195,192,199,199,192,193,192,193,192,193
+,252,252,109,252,252,252,109,252,252,252,252,252,108,107,108,107,109,109,252,109,252,252,252,109,252,107,107,107,252,252,252,107,107,107,107,107,252,107,107,107,109,109,107,107,109,109,109,109,107,106,107,106,106,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,7,7,7,8,157,157,157,157,156,156,155,155,157,157,156,156,156,156,202,202,202,202,202,203,202,202,202,203,203,203,203,203,203,204,204,204,203,203,203,204,204,204,204,203,155,202,202,202,202,202,202,202,202,203,203,203,203,204,204,202,202,203,202,202,203,203,203,204,204,204,204,204,204,204,204,204,204,204,204,204,192,199,192,192,192,192,193,192,192,192,192,193,193,193,193,195,195,195,195,194,195,195,195,195,195,195,194,195,194,195,195,195,195,192,199,192,192,192,192,192,192,193,192
+,252,109,252,252,252,109,252,252,252,252,252,252,108,252,107,109,108,252,107,252,109,252,252,252,109,107,107,252,107,252,107,107,107,252,107,252,107,252,107,252,107,252,107,107,107,109,107,109,106,107,106,106,106,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,157,157,157,156,156,155,155,156,157,156,157,156,156,155,202,202,203,202,202,202,203,202,203,203,204,203,204,203,204,203,204,203,204,203,204,203,204,203,202,202,155,202,202,202,202,202,202,202,203,202,203,203,204,204,202,202,203,202,202,202,203,203,204,203,204,203,204,204,204,203,204,204,204,204,204,204,192,192,192,192,192,192,192,193,192,192,192,192,193,192,193,194,195,194,195,195,195,195,195,195,195,195,195,194,195,194,195,195,192,199,192,192,193,192,193,192,193,192,193
+,252,252,109,252,109,252,252,252,252,252,252,252,108,108,108,108,109,109,252,252,252,252,252,109,252,107,107,107,252,252,107,107,107,107,107,107,107,107,252,107,109,109,109,107,107,107,109,109,107,106,107,106,106,106,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,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,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,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,7,7,7,7,7,7,7,7,7,7,157,157,157,157,156,155,155,156,157,157,157,156,156,155,155,202,202,202,203,202,202,203,204,203,203,203,203,203,204,204,204,204,203,203,203,203,204,204,202,202,202,202,202,202,203,203,202,202,202,202,203,203,204,204,204,202,202,204,202,202,203,203,204,204,204,203,204,204,204,204,204,204,204,204,204,204,204,192,192,192,192,193,192,193,192,192,192,192,192,192,193,194,195,195,195,195,194,195,194,195,195,195,195,194,195,195,195,195,195,199,192,192,192,192,192,192,192,192,193,192
+,252,109,252,252,252,252,252,252,252,252,252,252,108,108,108,252,108,252,109,252,109,252,252,252,109,252,107,252,252,107,107,252,107,252,107,252,107,252,107,109,107,109,107,109,107,109,107,107,106,107,106,106,106,106,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,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,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,202,206,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,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,157,157,157,157,156,156,155,157,156,157,156,157,156,156,155,202,202,203,202,203,202,202,202,204,204,203,203,204,203,204,204,204,203,203,203,204,202,202,202,202,202,202,202,203,202,203,202,202,202,203,203,204,203,204,202,202,203,204,202,204,202,203,203,204,203,204,203,204,203,204,203,204,204,204,204,204,199,192,192,193,192,192,192,192,193,192,192,192,192,193,193,195,195,194,195,194,195,195,195,195,195,195,195,195,194,195,195,195,199,192,192,192,192,192,192,193,192,193,192,193
+,252,252,109,252,109,252,252,252,252,252,252,252,108,108,108,108,252,109,252,109,252,252,252,252,252,252,107,107,252,252,107,107,107,107,107,107,252,107,109,107,109,109,109,109,109,107,109,106,107,106,106,106,106,106,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,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,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,202,203,203,206,207,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,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,157,157,157,157,156,155,157,156,157,157,156,156,156,156,202,202,202,202,202,202,202,202,203,203,204,203,203,203,204,204,204,204,203,203,202,202,202,202,202,202,202,202,203,203,203,203,202,202,203,203,204,204,203,203,202,202,203,203,204,202,203,203,203,203,204,203,204,204,204,204,204,204,204,204,204,204,192,192,192,192,193,192,192,193,192,192,192,193,192,192,193,195,194,194,194,194,194,195,194,195,195,195,195,194,195,195,195,199,199,192,192,192,192,192,192,192,192,192,193,192
+,252,252,252,109,252,252,252,252,252,252,252,252,108,109,108,109,252,252,109,252,109,252,109,252,109,252,107,252,107,252,107,107,107,252,107,252,107,109,107,109,107,252,107,109,109,107,107,107,106,107,106,106,106,106,106,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,202,203,202,203,203,204,206,207,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,7,7,6,7,157,157,157,157,155,157,156,157,157,157,156,156,156,156,202,202,202,202,202,202,202,203,203,204,204,204,203,204,203,204,204,203,202,203,202,203,202,203,202,203,203,203,202,203,203,203,202,202,203,204,202,203,202,203,202,203,203,204,202,203,202,203,202,203,203,204,203,204,203,204,204,204,204,204,204,204,192,192,192,193,192,192,192,192,192,192,192,192,193,193,192,194,194,194,194,194,195,194,194,195,195,195,195,195,195,195,199,199,192,193,192,192,192,193,192,193,192,193,192,193
+,252,252,109,252,109,252,252,252,252,252,252,252,108,108,109,252,109,109,252,252,252,252,252,252,252,252,107,107,252,252,107,107,107,107,107,107,252,107,109,107,109,109,109,109,109,107,109,106,107,106,106,106,106,106,106,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,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,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,202,202,203,203,202,202,203,203,206,207,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,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,157,157,157,157,156,155,156,157,157,157,156,156,156,156,155,202,202,202,202,202,202,203,203,203,204,204,203,204,204,204,204,202,202,202,202,203,202,202,202,203,203,203,203,203,203,203,203,202,202,204,202,202,202,202,202,203,203,204,204,203,202,203,203,203,203,203,203,204,204,204,204,204,204,204,204,204,199,192,192,192,192,192,192,193,192,192,193,192,193,193,194,194,194,194,194,194,192,193,194,195,195,195,195,195,195,195,199,199,192,192,192,192,192,192,192,193,193,193,192,193,193
+,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,252,108,252,109,252,109,252,252,252,109,252,252,107,107,252,109,252,107,252,107,252,107,109,107,252,107,252,107,109,107,107,107,109,106,106,106,106,106,106,106,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,202,203,202,203,202,202,202,203,203,204,206,207,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,157,157,157,157,155,156,157,156,157,156,157,156,156,155,156,202,203,202,203,202,203,202,203,203,204,204,204,203,204,203,202,202,203,202,203,202,203,202,203,203,203,202,203,203,203,202,202,202,203,203,204,203,204,202,203,202,204,203,204,202,203,202,203,203,204,203,204,203,204,203,204,204,204,204,204,204,199,192,192,192,192,192,193,192,192,192,192,193,193,193,193,194,194,194,194,192,194,194,195,195,195,194,195,195,195,199,199,192,192,192,192,192,193,192,193,192,193,192,193,192,193
+,252,252,109,252,109,252,252,252,252,252,252,252,108,108,108,108,252,109,252,109,252,252,252,252,252,252,252,107,107,107,109,109,107,107,107,107,109,107,109,107,109,109,109,109,107,107,107,109,107,106,106,106,106,106,106,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,202,202,202,202,202,202,203,202,204,202,202,203,203,206,207,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,6,7,6,7,6,7,6,6,157,157,157,157,157,157,156,155,156,157,156,156,156,156,202,202,202,202,202,202,202,203,203,203,204,204,202,203,203,202,202,202,202,203,202,203,202,203,203,203,203,204,204,204,202,202,202,203,203,203,203,204,202,203,203,203,203,204,202,202,202,203,203,203,203,203,203,203,199,199,204,204,204,204,204,204,192,192,192,192,192,193,193,193,193,192,193,192,193,193,194,193,194,194,192,193,194,195,195,195,195,195,195,195,199,192,192,192,192,192,192,192,192,193,192,193,192,193,193,193,193
+,252,109,252,252,252,252,252,252,252,252,252,252,107,252,108,252,252,252,109,252,109,252,109,252,252,252,109,107,107,252,107,252,107,252,107,252,107,109,107,109,107,252,107,107,107,109,107,109,106,106,106,106,106,106,106,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,202,202,202,202,203,203,204,202,204,202,203,203,204,206,207,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,157,157,157,156,156,155,155,157,157,156,157,156,156,155,202,202,202,202,203,202,203,203,204,203,204,202,203,202,202,202,203,202,203,202,203,202,203,203,203,203,204,204,204,202,203,202,203,202,203,203,204,202,203,203,204,203,204,202,203,202,203,202,203,202,203,203,199,199,192,193,204,203,204,204,192,199,192,192,193,192,192,192,193,193,194,192,192,193,193,194,194,194,192,192,193,192,194,193,195,195,195,195,195,195,199,192,192,192,192,192,193,192,193,192,193,192,193,192,193,192,193
+,252,252,109,252,109,252,252,252,252,252,252,252,108,108,109,252,109,109,252,252,252,252,252,252,252,252,252,107,107,107,109,109,252,107,252,107,107,107,109,107,109,109,109,107,107,107,107,109,107,106,106,106,106,106,106,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,202,202,202,202,203,203,204,204,202,204,202,202,203,203,206,207,207,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,157,157,157,156,156,156,155,155,157,157,157,156,156,155,155,202,202,202,202,202,203,203,203,203,204,204,202,202,202,202,203,203,203,203,203,203,203,203,203,203,204,204,202,202,202,202,203,203,203,203,204,204,202,202,203,203,204,204,202,202,203,202,203,203,203,199,199,193,192,194,194,204,204,204,199,199,199,192,193,193,192,192,193,193,193,193,192,193,192,194,193,194,192,192,193,193,193,193,195,195,195,195,195,194,195,199,192,192,193,192,192,192,192,192,192,192,193,193,193,193,193,193
+,252,109,252,252,252,252,252,252,252,252,252,109,107,109,108,252,108,252,109,252,109,252,252,252,252,252,252,107,107,109,107,252,109,252,107,109,107,109,107,252,107,252,107,252,107,109,107,107,106,106,106,106,106,106,106,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,202,203,202,202,202,203,203,204,202,204,202,203,203,204,206,207,207,207,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,6,7,6,6,157,157,157,157,156,156,155,155,156,157,156,156,155,156,155,202,202,203,202,203,202,203,203,204,203,204,202,202,202,203,202,203,203,203,202,203,203,203,204,204,204,204,202,202,202,203,202,203,203,204,203,204,202,202,202,203,203,204,199,199,199,203,202,199,199,192,192,193,193,194,194,194,193,199,199,193,193,194,193,192,192,193,192,193,193,194,192,192,193,193,194,192,192,193,192,193,194,195,194,195,194,195,195,195,195,199,199,192,192,192,192,193,192,192,192,193,193,194,193,193,193,193
+,109,252,109,252,252,252,252,252,252,252,252,252,108,108,108,108,252,109,252,109,252,252,252,252,252,252,252,107,107,107,107,107,252,109,107,107,109,107,109,107,109,109,107,107,109,109,107,106,107,106,106,106,106,106,106,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,202,202,202,202,202,203,203,204,203,202,202,203,204,203,206,207,207,207,206,207,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,157,157,157,156,156,155,156,155,157,156,156,156,156,155,202,202,202,202,202,202,203,203,203,204,204,204,203,203,203,203,203,203,204,203,204,204,204,204,204,204,204,202,202,202,202,202,203,203,203,203,204,204,202,202,203,203,204,199,199,192,193,192,192,192,192,192,192,193,194,193,194,194,192,192,193,193,193,193,194,192,192,192,193,193,193,193,192,193,194,192,192,192,192,192,193,194,194,195,195,195,195,195,195,195,199,199,192,199,192,192,192,192,192,192,193,192,193,193,193,192,193,193
+,252,252,252,252,252,252,252,252,252,252,252,252,107,252,108,252,252,252,109,252,109,252,109,252,252,252,109,107,107,109,107,109,107,252,109,109,107,252,107,109,107,252,106,107,107,107,106,107,106,106,106,106,106,106,106,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,202,202,203,202,203,202,203,202,203,204,204,203,202,202,203,204,204,206,207,207,207,207,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,145,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,5,6,6,6,157,157,156,157,155,156,155,155,156,157,156,156,155,156,202,203,202,202,202,203,202,203,203,204,204,202,202,203,202,203,203,204,203,204,204,204,203,204,204,204,204,202,202,203,202,203,203,204,203,204,204,204,202,202,202,204,204,199,192,193,192,193,193,194,194,192,192,193,193,194,194,192,193,194,192,193,193,194,193,192,192,193,193,194,193,194,192,194,193,192,192,193,192,193,193,194,194,195,195,195,194,195,195,195,199,192,199,193,192,192,192,193,192,193,192,193,193,194,193,193,193,193
+,109,252,109,252,252,252,252,252,252,252,252,252,108,107,109,252,109,109,252,109,252,252,252,252,252,252,252,107,107,107,109,107,109,109,109,107,109,107,109,107,109,109,106,107,107,106,107,106,107,106,106,106,106,106,106,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,202,202,202,202,202,203,202,203,204,202,203,204,204,202,202,203,204,204,206,207,206,207,207,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,145,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,157,157,157,156,156,156,155,155,157,157,156,156,156,156,155,202,202,202,202,203,203,203,203,204,204,202,202,202,202,203,203,203,203,204,204,204,204,204,204,204,204,202,202,203,203,203,203,203,203,204,204,202,202,203,202,203,204,199,199,192,192,193,193,193,193,194,194,192,192,193,193,192,193,194,194,193,193,193,193,194,192,192,192,193,193,194,194,192,193,193,192,192,192,193,193,194,194,193,194,194,194,195,195,195,195,199,192,199,192,193,192,192,192,192,192,192,193,193,193,193,193,194,193
+,252,109,252,252,252,252,252,252,252,252,252,252,107,109,108,252,108,252,109,252,109,252,109,252,252,252,252,107,107,107,107,252,107,252,109,109,107,109,107,252,107,252,107,107,106,107,106,107,106,107,106,106,106,106,106,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,202,202,203,202,202,202,203,202,203,203,204,202,204,204,203,202,203,204,204,206,207,206,207,207,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,145,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,157,157,157,156,156,155,156,155,157,156,157,156,156,155,156,202,202,202,203,202,203,203,204,204,202,202,204,202,203,203,204,203,204,203,204,204,204,204,204,203,204,202,203,202,203,203,204,203,204,204,203,202,203,202,203,202,204,199,193,192,193,192,193,193,193,192,194,193,194,193,192,192,193,193,195,195,193,193,194,193,192,192,193,192,194,193,194,194,193,192,192,192,193,193,194,194,193,194,195,194,195,195,195,195,195,199,192,192,193,192,192,192,192,192,192,193,194,193,194,193,194,193,193
+,109,252,109,252,252,252,252,252,252,252,252,252,108,107,108,108,252,109,252,109,252,252,252,252,252,252,252,107,107,107,107,107,109,109,109,107,109,107,109,107,109,109,107,107,107,106,107,106,107,106,106,106,106,106,106,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,202,202,202,202,203,202,202,203,204,202,204,203,204,202,204,202,202,203,204,206,207,205,206,206,207,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,145,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,5,6,5,6,6,6,5,6,157,157,156,157,156,156,155,155,157,156,156,156,156,156,202,202,202,202,202,203,203,204,204,202,203,203,204,203,203,203,203,203,203,204,204,204,204,204,204,204,204,202,202,203,203,203,203,204,204,204,202,203,203,203,203,203,199,199,192,192,192,193,193,193,193,192,193,194,194,192,192,193,193,194,193,195,195,193,193,194,192,192,192,193,193,193,194,194,192,193,192,192,192,192,193,193,193,194,194,195,195,195,195,195,195,199,192,192,192,193,193,192,192,192,192,193,194,194,193,193,193,193,194
+,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,109,252,252,109,252,109,252,109,252,252,252,108,107,107,252,107,107,107,252,107,109,107,109,107,109,107,252,107,107,106,107,106,107,106,107,106,106,106,106,106,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,202,203,202,203,202,203,202,203,204,202,202,203,203,204,204,202,204,203,204,206,207,205,205,207,207,207,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,145,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,157,157,157,156,156,155,156,155,157,156,156,156,156,155,202,202,203,202,203,203,204,202,202,202,203,203,204,202,203,203,204,203,204,203,204,204,204,204,204,204,204,202,203,202,203,203,204,203,204,202,203,202,203,202,203,203,199,192,192,192,193,192,193,192,193,193,194,194,192,192,193,192,194,194,194,195,195,193,194,192,192,192,193,193,194,193,194,192,193,192,192,192,193,192,193,193,194,193,195,194,195,195,195,194,195,192,192,192,193,192,193,193,192,192,193,193,194,193,194,193,194,193,192
+,252,252,109,252,109,252,252,252,252,252,252,252,109,108,108,252,109,109,252,109,252,109,252,252,252,252,108,107,107,107,107,107,109,107,109,109,107,107,109,107,109,109,109,107,106,106,107,106,107,106,107,106,106,106,106,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,202,202,202,202,202,203,204,203,202,204,202,203,202,203,203,204,202,204,203,204,206,207,205,206,206,207,207,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,145,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,157,157,157,157,156,156,156,155,155,157,157,156,156,155,155,202,202,202,202,204,203,202,202,202,203,203,204,204,203,203,204,204,204,204,203,204,204,204,204,204,204,204,202,202,203,203,204,204,204,202,202,202,203,203,203,203,199,199,192,192,192,192,192,192,193,193,194,194,192,192,193,194,194,193,194,193,195,195,195,192,193,192,192,193,193,193,194,194,194,192,192,192,192,192,193,193,193,193,194,195,195,195,195,195,194,199,192,192,192,192,193,193,193,192,192,193,193,193,194,194,194,193,193,192
+,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,252,252,109,252,109,252,109,252,252,252,108,107,107,107,107,252,107,109,109,109,107,109,107,252,107,252,107,107,106,106,106,107,106,107,106,106,106,106,106,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,108,252,108,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,202,202,203,202,202,203,204,203,204,204,202,202,204,203,204,202,203,203,204,204,206,207,205,205,207,207,207,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,145,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,157,157,157,157,156,156,155,156,155,157,156,156,155,156,202,203,202,204,204,203,202,202,202,203,202,203,203,204,204,204,203,204,204,203,203,204,203,204,204,204,204,155,155,203,202,204,203,204,202,202,202,203,202,203,203,204,199,192,192,193,192,192,192,193,193,194,193,192,192,193,192,194,192,194,194,195,193,194,194,193,192,192,192,193,193,194,193,194,193,192,192,193,192,193,192,193,193,194,193,194,194,195,194,195,195,199,192,192,192,193,192,193,193,192,192,193,193,194,193,194,193,193,192,192
+,252,252,252,252,109,252,109,252,252,252,252,252,109,108,108,108,252,109,109,109,252,252,252,252,252,252,108,107,107,107,107,107,252,109,109,109,109,107,109,107,109,109,109,106,107,106,106,106,107,106,107,106,107,106,106,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,108,108,108,108,109,109,109,107,109,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,202,202,202,202,202,204,204,204,203,202,202,203,204,204,204,202,202,203,203,204,206,207,205,206,206,207,207,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,150,144,144,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,157,157,157,157,157,156,157,156,156,155,155,157,156,156,202,202,202,202,203,203,204,203,202,202,202,202,203,203,203,204,204,203,204,204,204,204,204,204,204,204,204,155,155,155,155,202,203,203,204,202,202,202,203,203,203,203,203,199,199,192,192,192,192,192,193,193,194,194,192,192,193,193,194,194,194,194,195,192,193,193,193,193,194,193,192,192,193,194,194,194,192,192,192,193,193,194,194,193,194,194,194,194,195,195,195,195,195,199,192,192,193,193,193,193,193,192,192,192,193,193,194,194,193,192,192,192
+,252,252,252,109,252,252,252,252,252,252,252,252,252,109,108,109,252,252,109,252,109,252,109,252,252,252,108,107,107,252,107,107,107,109,107,109,107,109,107,109,107,252,107,106,107,107,106,106,106,107,106,107,106,107,106,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,108,252,108,252,108,109,109,109,107,109,107,109,107,109,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,202,202,202,202,203,203,204,204,204,202,203,203,204,203,204,202,203,202,204,204,205,206,205,206,207,206,207,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,150,144,144,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,157,157,157,155,156,157,157,157,156,156,155,155,157,203,202,202,202,203,202,203,203,204,204,203,202,202,202,203,203,204,203,204,204,204,203,204,203,204,203,204,204,204,204,156,155,155,155,202,203,204,202,202,202,203,202,203,203,204,203,199,192,192,192,193,192,193,193,194,193,192,192,193,192,193,192,194,194,194,194,192,192,193,193,193,194,194,192,193,193,194,193,194,192,192,192,193,193,194,193,194,194,194,193,194,195,195,195,195,195,199,192,192,192,193,192,193,192,193,192,193,193,194,194,192,192,192,192,192
+,252,252,252,252,109,252,252,252,252,252,252,252,252,107,108,252,109,109,109,109,252,109,252,252,252,252,108,107,107,107,107,107,107,107,109,109,109,107,109,109,109,109,106,107,107,106,107,106,106,106,107,106,107,106,106,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,108,108,108,252,108,252,109,109,109,107,107,109,107,109,107,109,109,107,107,107,107,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,202,202,202,202,203,203,204,204,204,202,203,203,204,204,202,202,203,203,204,204,205,205,206,205,206,207,207,207,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,150,150,144,146,144,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,157,157,157,157,157,156,156,155,155,157,157,156,156,155,157,202,202,202,202,202,203,203,204,204,204,202,202,202,203,203,203,203,204,204,204,204,204,203,203,204,204,204,204,204,204,155,155,155,155,202,202,202,202,202,202,202,203,203,203,203,199,199,192,192,192,192,193,193,193,193,194,192,192,192,194,194,194,194,194,194,192,192,193,193,193,193,195,194,192,192,194,193,193,193,192,192,192,192,193,193,194,194,194,193,194,194,195,195,195,195,195,199,199,192,193,193,193,193,192,192,193,193,193,194,194,192,192,193,192,193
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,252,252,109,252,109,252,109,252,109,252,108,252,107,107,107,107,107,109,109,109,107,109,107,109,107,252,107,107,107,107,107,107,106,107,106,107,106,107,106,106,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,108,108,252,252,252,108,252,252,109,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,107,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,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,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,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,5,4,5,202,202,202,202,202,203,203,204,203,204,203,204,204,202,202,203,203,204,203,204,204,205,206,205,206,207,206,207,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,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,5,4,5,4,5,4,5,4,150,150,149,146,144,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,157,156,157,157,157,157,157,156,157,155,156,155,155,156,156,155,155,157,202,202,203,202,203,203,204,203,204,204,202,202,203,202,203,203,204,203,204,204,204,203,204,203,204,204,204,203,204,204,156,155,155,202,203,202,202,202,203,202,203,203,204,203,204,199,192,192,193,192,193,192,193,193,192,192,193,192,193,192,194,194,193,194,192,192,193,193,193,194,195,193,194,192,192,194,193,193,192,192,193,192,193,192,193,193,194,193,194,193,194,194,195,195,195,195,199,192,199,192,193,193,194,192,193,192,193,193,194,192,193,192,193,193,193
+,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,252,108,252,107,107,107,107,252,109,109,107,109,107,109,107,109,106,106,107,107,107,107,107,107,106,106,106,107,106,107,106,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,108,108,252,108,252,252,252,252,109,109,107,107,107,107,107,107,107,109,107,107,107,109,107,107,107,107,107,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,202,202,203,202,203,203,204,204,203,203,204,203,204,202,203,203,203,203,204,204,205,205,207,205,206,207,206,207,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,150,150,150,149,146,147,144,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,5,5,4,5,157,157,156,157,156,156,157,157,157,156,156,156,155,155,155,157,156,156,155,202,202,202,202,203,203,203,203,204,204,204,202,202,202,203,203,203,203,203,203,204,204,204,204,204,204,204,204,204,204,204,155,155,155,202,202,202,202,202,202,203,203,203,203,204,199,199,192,192,192,192,192,193,193,192,192,193,193,193,193,195,195,194,194,192,192,193,193,193,194,194,193,195,194,192,192,193,193,192,192,193,193,193,193,193,193,194,194,194,193,193,194,195,195,195,195,195,199,192,192,193,193,193,193,192,192,193,193,194,194,192,192,193,193,194,192
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,252,252,109,252,109,252,109,252,252,252,108,252,107,107,107,107,107,109,109,109,107,109,107,109,106,106,107,107,107,107,107,107,106,107,106,106,106,107,106,106,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,108,108,252,252,252,252,252,252,252,109,252,109,109,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,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,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,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,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,5,4,5,202,202,202,202,202,204,204,204,203,204,204,204,204,203,203,204,203,204,203,204,204,205,206,205,205,206,206,207,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,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,5,4,5,4,5,4,150,150,150,150,149,146,147,144,144,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,157,157,157,156,157,156,156,156,157,157,157,156,156,156,156,155,155,156,156,155,155,202,202,202,203,202,203,203,204,203,204,204,202,203,203,202,203,203,204,203,204,204,204,203,204,203,204,204,204,204,204,155,156,155,155,202,202,202,203,202,203,202,203,203,204,203,199,192,192,192,193,192,193,193,194,192,193,192,193,193,195,195,194,194,192,192,193,193,193,193,194,195,195,195,194,192,193,192,193,192,193,193,194,193,194,194,194,193,193,193,194,193,195,194,195,194,195,195,199,192,192,192,193,193,194,192,193,192,193,193,192,192,194,193,193,193,192
+,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,107,109,109,109,109,109,109,252,252,252,252,108,252,107,107,107,107,107,107,109,107,109,107,109,107,106,107,107,107,107,106,107,106,106,107,107,106,107,106,107,106,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,108,108,252,108,252,252,252,252,252,252,252,109,109,107,109,107,107,107,107,109,107,107,107,109,107,107,107,107,107,107,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,202,202,202,202,202,203,204,204,203,203,204,204,203,204,202,203,203,204,204,204,204,205,205,206,205,205,206,206,207,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,150,148,148,148,146,146,147,147,147,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,5,4,4,4,157,157,157,157,157,156,156,156,157,157,156,155,157,156,156,155,155,155,156,156,155,156,202,202,202,202,203,203,203,203,204,204,204,202,202,203,203,203,203,203,204,204,204,204,204,204,204,204,204,204,204,204,156,155,155,155,202,202,202,202,203,203,203,203,203,203,199,199,192,192,192,192,193,193,193,199,193,194,194,194,195,195,194,194,192,192,194,193,193,193,194,195,195,193,195,195,194,192,193,193,194,192,192,192,193,193,193,193,193,193,193,193,194,195,195,195,195,194,195,199,192,199,193,193,193,192,192,192,193,193,192,192,193,193,193,194,194,192
+,252,252,252,252,252,252,252,109,252,252,252,252,252,252,107,109,107,252,109,252,109,252,109,252,109,252,252,107,107,107,107,252,107,107,107,109,107,109,107,106,107,106,107,252,107,107,106,106,106,107,107,107,106,107,106,106,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,252,108,108,252,252,252,252,252,252,252,252,109,109,109,107,109,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,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,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,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,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,5,4,202,202,202,202,203,202,204,204,203,203,204,204,204,204,203,202,204,203,204,204,205,204,205,206,207,205,205,206,207,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,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,5,4,5,4,5,4,150,150,149,149,149,149,149,144,147,4,5,4,5,4,5,4,5,4,5,4,5,4,5,150,145,145,145,145,145,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,157,157,157,157,156,157,156,157,156,156,155,157,156,157,155,156,155,155,156,156,155,202,202,202,202,203,202,203,203,204,203,204,204,202,202,203,203,204,203,204,203,204,204,204,204,204,203,204,204,204,204,204,155,156,155,155,202,202,202,203,202,203,202,203,203,204,199,192,192,192,192,193,192,193,199,193,193,194,193,195,194,195,195,192,193,192,193,194,193,194,193,195,195,195,193,195,194,192,194,193,192,193,192,193,192,193,192,193,193,194,193,194,194,195,195,195,195,194,195,199,192,192,192,193,193,192,192,193,193,194,192,193,193,194,193,194,192,192
+,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,107,109,107,109,109,252,109,252,109,252,252,252,107,107,107,107,107,107,107,107,107,109,107,109,106,107,106,107,107,107,107,106,106,107,107,107,107,107,106,107,106,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,108,108,108,252,108,252,252,252,252,252,252,252,252,109,109,109,107,109,109,109,107,109,109,107,107,107,109,107,107,107,107,107,107,107,107,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,202,202,202,203,203,202,204,204,203,203,203,204,204,202,202,203,202,204,204,204,204,205,205,206,205,205,205,206,206,207,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,150,150,150,150,150,150,150,145,144,147,144,144,4,4,4,4,4,4,4,4,4,4,4,4,4,150,149,144,146,147,147,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,157,157,157,157,157,156,157,156,156,155,155,156,156,156,156,155,155,155,156,155,156,202,202,202,202,202,203,203,203,203,204,204,204,202,203,203,204,203,204,203,204,204,204,204,204,204,204,204,204,204,204,204,155,155,155,155,202,202,202,202,203,203,203,203,204,199,199,192,192,192,193,193,193,192,193,193,193,193,195,195,195,195,195,192,192,193,194,194,193,193,195,195,195,195,195,195,194,192,193,192,192,192,193,193,193,193,194,193,194,194,194,194,194,195,195,194,195,194,195,199,192,199,193,193,193,192,193,193,193,193,192,192,193,193,193,192,192,192
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,109,252,109,252,109,252,109,252,109,107,107,252,107,107,107,107,107,109,107,109,106,107,107,109,107,252,107,107,107,107,106,107,106,107,107,107,106,106,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,109,109,109,109,109,109,107,109,107,109,107,109,107,107,107,107,107,107,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,202,202,202,202,202,203,204,204,203,203,204,202,203,204,203,203,202,203,204,204,205,205,213,205,207,205,213,206,214,207,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,150,232,150,232,149,149,232,149,144,232,147,232,144,232,4,4,4,4,4,4,4,4,4,4,4,4,150,148,148,148,148,148,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,157,157,157,157,157,156,157,157,157,156,156,155,157,156,156,155,156,155,155,156,155,202,202,202,203,202,203,203,203,203,204,203,204,204,202,202,203,203,204,203,204,203,204,204,204,203,204,203,204,204,204,204,204,155,155,155,203,202,202,202,203,202,203,203,204,203,199,192,192,192,193,192,193,192,199,192,193,193,194,195,195,194,195,192,192,192,194,193,194,193,195,193,195,193,195,193,195,194,193,193,192,192,193,193,194,194,193,192,193,193,194,193,194,194,195,195,195,194,195,195,199,192,192,192,193,193,192,192,193,192,192,192,193,193,194,192,192,192,192
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,109,109,109,252,109,252,252,252,107,107,107,107,107,107,107,107,107,109,107,106,106,107,107,252,107,252,107,107,107,106,106,107,107,107,107,107,106,106,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,108,108,108,252,108,252,108,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,107,109,109,107,107,107,109,107,109,107,107,107,107,107,107,107,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,202,202,202,202,203,202,203,204,203,203,203,202,203,204,204,204,202,202,204,204,204,204,205,205,206,205,205,205,206,206,206,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,150,150,145,145,145,145,145,145,145,4,4,4,4,150,150,150,150,149,150,149,149,144,144,144,144,147,147,144,144,4,4,4,4,150,145,145,145,145,145,4,4,150,149,146,147,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,157,157,157,157,156,156,157,157,156,156,155,155,156,156,156,156,155,155,155,156,155,202,202,202,202,203,203,203,203,203,203,204,204,204,202,203,203,204,203,204,204,204,204,204,203,204,204,204,204,204,204,204,204,155,155,155,202,202,202,203,203,203,203,203,203,199,199,192,192,192,192,193,193,192,199,193,193,194,195,195,195,195,195,192,192,193,193,194,194,193,193,193,193,195,195,195,195,194,192,193,193,194,193,193,192,192,192,193,193,193,193,194,194,194,194,195,195,195,195,195,199,192,199,193,193,193,192,192,192,193,192,193,193,194,192,192,192,193,193
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,109,252,109,252,109,252,109,252,109,107,107,107,107,252,107,252,107,252,107,107,106,107,107,109,107,252,107,107,107,107,106,107,106,107,107,107,106,106,106,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,108,252,108,108,252,108,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,107,109,109,109,107,109,107,109,107,107,107,107,107,107,107,107,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,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,202,202,202,202,202,202,202,204,204,203,202,203,203,204,204,204,203,204,203,204,204,205,205,205,205,213,206,205,205,206,206,207,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,150,150,150,149,144,146,146,147,147,4,3,4,150,150,150,150,150,150,145,145,145,146,146,146,146,146,146,147,147,147,3,4,3,150,149,232,146,232,147,4,3,150,149,146,150,150,150,145,145,145,145,145,145,4,3,4,3,4,3,4,3,4,3,4,3,157,157,157,157,156,156,157,156,156,155,155,156,157,156,156,155,156,155,155,156,155,202,203,202,203,202,203,202,203,202,204,203,204,202,203,202,203,204,204,203,204,204,204,203,204,203,204,203,204,204,204,204,204,155,155,155,202,202,203,202,203,203,204,203,204,199,192,192,192,192,193,192,199,199,193,193,194,193,195,194,195,195,193,192,193,193,194,194,195,195,195,193,195,193,195,195,195,195,194,194,193,193,193,192,193,192,193,192,193,193,194,193,194,193,194,194,195,195,195,195,199,192,193,192,193,193,194,192,193,192,192,192,192,192,193,192,193,192,193
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,109,252,109,109,109,252,252,252,107,107,107,107,107,107,107,107,107,107,107,107,106,107,107,109,107,252,107,107,107,107,106,107,107,107,107,107,106,106,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,108,108,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,107,107,109,109,107,109,109,107,107,107,107,107,107,107,107,107,107,107,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,202,202,202,202,203,202,203,203,204,202,203,203,204,202,204,204,204,204,204,204,204,204,205,205,205,205,213,205,213,206,206,206,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,4,4,4,3,150,150,150,149,144,146,146,147,147,4,4,3,150,150,232,149,232,149,232,149,232,144,232,146,232,146,232,147,232,147,150,145,145,145,145,145,145,145,145,3,4,150,149,146,150,149,149,149,144,146,146,147,147,4,4,3,4,4,4,3,4,4,4,3,4,157,157,157,157,156,157,157,157,156,155,155,157,156,156,156,156,155,155,155,155,202,202,202,202,202,203,203,203,202,204,203,204,204,202,202,203,203,204,203,204,204,204,203,204,204,204,204,204,204,204,204,204,155,155,155,155,202,202,202,203,203,203,203,204,199,199,192,192,199,199,199,199,192,193,193,193,193,194,195,195,195,195,192,193,193,193,193,195,195,193,193,195,195,195,195,195,195,195,194,194,193,193,192,192,192,192,192,193,193,193,193,194,194,194,194,195,195,195,195,195,199,192,192,193,193,193,193,192,192,192,192,192,192,192,192,193,192,193,192
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,109,252,109,252,109,252,109,252,109,107,107,107,107,107,107,252,107,252,107,107,106,107,107,109,107,252,107,107,107,107,106,107,106,107,106,107,106,107,106,106,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,108,108,252,108,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,109,252,109,109,109,109,107,107,107,109,107,109,109,109,107,109,107,107,107,107,107,107,107,107,107,107,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,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,202,203,202,202,202,202,202,203,203,202,202,204,204,204,203,204,203,204,203,204,204,215,205,205,205,215,205,213,205,213,206,214,206,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,149,149,148,148,148,148,148,3,4,3,4,150,150,232,149,232,149,232,149,232,144,232,146,232,146,232,147,232,147,149,144,144,144,149,149,149,149,149,145,145,150,149,146,150,149,149,149,144,146,146,147,147,4,3,4,3,4,3,4,3,4,3,4,157,157,157,157,157,157,156,157,156,156,155,155,156,157,156,156,155,156,155,157,155,203,202,202,202,203,202,203,202,204,203,204,204,204,202,203,203,204,204,204,203,204,204,204,203,204,204,204,203,204,203,204,155,155,155,155,155,202,202,203,203,204,203,204,203,199,199,193,199,192,192,192,192,193,192,193,193,194,193,195,195,195,192,193,193,195,193,195,195,193,192,193,193,195,193,195,195,195,193,194,193,193,192,192,192,192,192,193,193,194,193,194,193,194,194,195,195,195,195,195,199,199,192,199,192,193,193,194,192,193,192,193,192,193,192,193,192,193,193,193
+,108,252,252,252,252,252,252,252,109,252,252,252,252,252,252,107,109,107,109,109,109,109,252,109,252,252,252,107,107,107,107,107,107,107,252,107,107,107,107,107,107,107,252,107,252,107,107,106,106,106,107,106,107,107,107,107,106,106,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,108,252,108,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,107,107,107,107,109,109,109,107,109,107,109,107,107,107,107,107,107,107,107,107,107,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,202,202,202,202,202,202,202,202,203,203,202,203,203,204,203,204,204,204,204,204,204,205,204,205,205,205,205,205,213,205,205,213,206,206,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,3,4,3,4,3,4,3,3,150,150,149,144,146,146,147,148,148,150,150,150,150,150,150,150,150,150,149,149,144,144,144,146,146,146,147,147,147,149,146,146,144,146,144,144,144,149,149,149,150,149,146,232,150,148,148,148,148,148,148,4,3,4,3,3,3,4,3,4,3,4,157,157,157,157,157,157,157,157,157,157,156,156,155,157,156,156,156,156,155,155,157,155,202,202,202,202,202,203,202,203,204,204,204,203,203,202,202,203,204,204,204,204,204,203,203,204,204,204,204,204,204,156,156,155,155,155,155,155,202,202,202,203,203,204,204,199,199,199,199,192,192,193,192,192,192,193,193,193,193,195,195,195,195,192,193,193,193,195,195,193,193,193,193,195,195,195,195,195,195,194,194,193,192,192,192,192,192,192,192,193,193,194,194,194,194,195,195,195,195,195,199,199,192,192,192,192,192,193,193,194,192,192,192,192,192,193,193,193,193,193,193
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,109,252,109,252,109,252,109,252,109,107,107,107,107,252,107,252,107,252,107,107,106,107,107,252,107,252,107,107,107,106,106,107,106,107,106,107,107,107,106,106,106,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,108,108,252,108,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,107,109,107,109,107,109,109,109,107,109,107,107,107,107,107,107,107,107,107,107,107,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,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,202,202,203,202,203,202,202,202,203,203,202,202,204,204,204,203,204,203,204,203,204,204,215,205,215,205,215,205,213,206,215,206,214,206,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,150,150,149,144,146,146,147,144,144,144,144,144,144,144,144,144,144,144,147,149,144,144,144,146,146,146,147,147,147,149,146,232,146,232,146,232,146,232,144,144,150,149,146,147,150,149,149,144,146,146,147,3,4,3,4,3,4,3,4,3,4,157,157,157,157,157,157,157,156,157,157,156,156,155,155,156,157,156,156,155,156,155,157,202,202,202,203,202,203,202,203,204,204,204,203,202,203,202,203,203,204,203,204,204,204,203,204,203,204,204,204,203,157,155,156,155,155,155,155,155,202,202,203,203,204,203,199,199,199,199,193,192,193,192,192,192,193,193,194,193,194,195,195,195,195,192,193,193,195,193,195,195,193,192,193,193,195,193,195,195,195,194,193,192,193,192,193,192,193,192,193,192,193,193,194,195,195,195,195,195,195,199,199,192,193,199,193,192,193,193,194,193,194,194,192,192,193,192,193,192,193,193,193
+,108,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,109,107,109,109,252,109,252,109,252,252,252,107,107,107,107,107,107,107,107,107,107,107,107,106,107,107,252,107,107,107,106,106,106,106,107,106,107,107,107,106,106,106,106,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,108,108,108,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,107,107,107,107,107,107,109,109,109,107,109,107,107,107,107,107,107,107,107,107,107,107,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,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,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,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,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,202,202,202,202,202,202,202,202,203,202,203,203,204,204,204,203,203,204,204,204,204,205,205,205,205,213,205,205,205,214,206,205,205,214,206,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,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,3,3,3,3,3,150,150,145,145,145,145,145,146,150,150,149,144,146,232,147,144,144,144,144,144,144,144,144,144,144,144,144,147,149,144,144,144,146,146,147,147,147,149,147,147,147,147,147,147,147,147,147,147,150,149,146,147,150,149,149,144,146,232,147,3,3,3,3,3,3,3,3,3,3,157,157,157,157,157,157,157,156,157,156,156,156,155,155,157,156,156,156,156,155,155,156,202,202,202,202,202,202,203,203,204,202,202,202,203,203,202,203,204,203,204,204,203,203,203,203,204,204,204,204,204,156,156,155,155,155,155,155,155,202,203,203,204,204,204,199,199,192,192,192,193,193,192,192,193,193,193,193,194,194,195,195,195,195,192,193,193,195,195,192,192,192,193,193,193,193,195,195,195,194,193,192,192,192,192,192,193,193,192,192,193,193,194,195,195,195,195,195,199,199,192,192,193,193,193,193,193,192,193,193,194,194,192,192,193,192,193,193,193,193,193,193
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,109,252,109,252,109,252,109,252,109,107,107,252,107,107,107,252,107,252,107,107,106,107,107,107,107,107,107,107,106,106,106,107,106,107,107,107,106,107,106,106,106,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,108,108,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,252,107,109,107,252,107,109,107,109,107,109,107,107,107,107,107,107,107,107,107,107,107,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,202,202,202,203,202,203,202,202,202,203,202,203,203,204,204,204,203,204,203,204,203,215,204,215,205,215,205,215,205,213,213,214,206,214,206,206,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,4,3,3,3,150,150,150,149,144,144,146,147,150,150,149,144,146,146,147,144,144,232,144,232,144,232,144,232,144,144,144,144,147,147,144,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,150,150,149,149,144,146,146,147,3,4,3,3,3,4,4,4,4,4,157,157,157,157,157,157,156,156,156,157,156,156,155,155,156,157,156,156,155,156,155,157,202,203,202,202,202,203,203,204,202,202,202,203,203,204,203,204,204,204,204,203,203,204,203,204,203,204,203,204,156,157,155,156,155,155,155,155,202,203,202,203,203,204,199,199,199,193,192,193,192,193,192,193,192,193,193,194,193,194,195,195,195,192,192,193,193,195,195,192,192,193,192,193,193,195,195,195,194,193,192,192,192,193,192,193,192,193,193,192,194,194,193,195,195,195,195,199,199,192,199,193,199,193,192,193,192,193,194,194,192,193,192,193,192,193,192,193,193,194,193,193
+,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,109,109,109,109,109,252,109,252,252,252,107,107,107,107,107,107,107,107,107,107,107,107,106,107,107,252,107,107,107,106,106,107,106,107,107,107,106,107,106,106,106,106,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,108,252,108,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,107,107,107,107,109,109,109,107,109,107,109,107,107,107,107,107,107,107,107,107,107,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,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,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,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,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,202,202,202,202,203,202,202,202,203,203,202,203,203,204,203,203,204,203,204,204,204,204,205,205,215,205,205,205,213,205,213,213,213,213,214,206,206,206,3,3,215,206,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,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,150,150,150,149,149,144,146,147,150,150,232,144,146,146,147,144,144,144,144,232,144,232,144,144,144,144,144,144,144,144,147,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,149,232,144,146,152,152,153,153,153,153,153,153,154,153,154,154,157,157,157,157,157,156,156,157,157,156,156,155,155,155,157,156,156,156,156,155,155,202,202,202,202,202,203,203,204,202,202,202,202,202,203,203,204,204,204,204,204,203,204,203,204,204,204,204,204,204,157,156,156,155,155,155,155,155,202,202,203,203,204,199,199,199,192,192,193,192,193,193,192,192,193,193,193,193,194,194,195,194,195,192,192,193,193,193,195,195,192,193,193,193,195,195,195,194,193,192,192,192,192,192,193,193,193,194,194,193,194,195,195,195,195,195,199,192,192,192,193,193,193,193,193,192,193,193,192,192,192,192,193,193,193,193,193,193,193,193,193,193
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,109,252,108,252,107,107,107,252,107,252,107,252,107,107,107,107,107,107,107,107,107,107,106,106,106,107,107,107,106,106,106,106,106,106,106,106,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,108,108,108,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,109,107,107,107,252,109,109,107,109,107,109,107,109,107,107,107,107,107,107,107,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,202,202,202,203,202,204,202,202,202,203,202,203,204,204,203,204,203,204,203,204,204,215,204,215,205,215,205,215,205,215,205,213,206,214,206,206,206,215,205,213,206,214,206,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,148,148,148,148,148,148,148,150,150,149,144,146,146,147,144,144,144,144,144,144,144,144,144,144,144,232,144,144,144,144,147,146,146,232,146,146,146,232,146,146,146,232,146,146,146,146,146,232,146,146,146,146,149,149,152,152,157,156,157,157,156,152,152,153,153,153,153,154,157,157,157,157,157,157,156,157,156,157,156,156,155,157,155,157,156,156,155,156,155,202,202,203,202,203,203,204,204,203,202,202,202,203,203,204,204,204,203,204,204,204,203,204,203,204,203,204,204,204,156,156,155,156,155,155,155,155,202,203,203,204,204,199,199,193,192,193,192,193,192,192,192,193,192,193,193,194,193,194,195,195,192,192,192,193,192,193,193,195,195,193,193,195,195,195,195,194,192,193,192,192,192,193,192,193,194,194,194,194,193,195,195,195,195,199,199,192,192,193,192,193,192,193,192,193,192,192,192,193,192,193,192,193,192,193,193,194,193,194,194,193
+,108,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,252,252,108,252,107,107,107,107,107,107,107,107,107,107,107,106,107,106,107,107,107,106,106,106,107,107,107,106,106,106,107,106,106,106,106,106,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,108,108,108,108,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,107,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,202,202,202,202,202,204,202,203,202,202,203,203,204,202,203,203,203,203,204,204,204,204,215,205,205,205,213,205,205,205,215,205,205,205,213,205,205,205,213,213,214,206,206,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,3,2,3,3,150,150,149,149,149,149,149,150,150,149,144,146,232,147,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,147,147,147,147,147,147,147,147,147,147,147,146,146,146,232,146,232,146,232,146,146,149,157,157,156,156,157,157,157,156,155,156,155,155,152,152,157,157,157,157,157,157,156,156,157,156,156,156,155,157,156,155,156,156,156,156,155,202,202,202,202,202,202,204,204,203,202,203,203,204,204,204,204,203,203,204,204,204,203,204,204,204,204,204,204,204,204,157,156,156,155,155,155,155,155,203,203,204,204,199,199,192,192,192,192,192,192,193,192,192,192,193,193,193,193,194,194,195,195,192,192,192,192,193,193,193,193,195,195,193,193,195,195,194,194,192,192,192,192,192,192,193,193,194,194,194,195,195,195,195,195,199,199,192,192,193,192,193,193,193,193,192,192,192,192,192,192,193,193,193,193,193,193,193,193,193,193,193,193
+,252,252,108,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,109,109,109,252,109,252,252,252,108,252,107,107,107,107,107,252,107,252,107,107,107,107,106,107,107,107,107,106,106,107,106,107,107,106,106,107,106,106,106,106,106,106,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,108,252,108,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,107,109,252,107,109,107,109,107,109,107,109,107,109,107,107,107,107,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,202,202,202,203,202,203,202,202,202,202,203,204,204,204,203,204,203,204,203,204,203,215,204,215,205,215,205,215,205,215,205,213,205,213,205,215,205,213,205,213,205,214,206,206,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,150,232,149,149,149,149,149,150,150,149,144,146,146,147,144,144,113,114,114,114,114,114,114,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,147,147,146,146,146,146,146,146,146,146,157,157,156,156,155,157,157,157,156,155,156,156,155,156,156,157,157,157,157,157,156,156,157,157,156,156,155,156,157,156,155,157,156,156,155,156,202,202,202,203,202,203,203,202,202,203,203,204,203,204,203,204,203,204,204,204,203,204,203,204,203,204,204,204,204,204,156,157,155,156,155,155,155,155,203,203,203,204,199,199,192,193,192,193,192,193,193,192,192,193,192,193,193,194,194,194,194,195,192,192,192,193,193,195,193,195,193,195,193,195,193,194,194,192,192,193,192,192,192,193,192,194,194,194,194,195,194,195,194,195,199,199,192,193,192,193,192,193,193,193,192,193,192,193,192,193,192,193,192,193,193,194,193,194,193,194,193,194
+,252,252,108,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,109,109,109,109,252,252,252,252,108,252,107,107,107,107,107,107,252,107,107,107,107,107,107,106,107,107,107,106,106,106,107,107,106,106,107,106,107,106,106,106,106,106,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,108,108,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,109,107,109,109,107,109,107,109,107,109,109,109,109,109,107,107,107,107,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,202,202,202,202,202,204,203,202,202,202,203,203,204,203,203,203,204,204,204,204,215,204,215,205,215,205,213,205,215,205,215,205,215,205,215,205,215,205,213,206,215,214,206,206,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,150,150,149,149,149,149,149,150,150,232,144,146,146,147,144,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,113,113,114,114,114,114,114,144,144,144,144,144,144,144,147,146,146,146,146,146,157,157,157,157,156,156,155,157,157,157,156,155,156,155,155,156,156,157,157,157,157,157,157,156,157,157,156,156,156,155,157,156,156,155,156,156,156,155,202,202,203,203,204,204,203,202,202,203,203,203,204,204,203,203,204,204,204,203,204,203,204,204,204,204,204,204,204,157,157,156,156,155,155,155,155,202,203,203,204,199,199,192,192,192,192,192,193,193,193,192,192,192,193,193,193,193,194,194,195,195,192,192,192,192,193,193,195,195,195,193,195,193,195,194,194,192,192,192,192,193,192,192,193,193,194,194,195,195,195,194,195,195,199,192,192,192,193,192,193,193,193,193,192,192,192,192,192,192,193,192,193,193,193,193,193,193,193,193,193,193
+,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,108,109,252,109,252,108,252,107,107,107,252,107,252,107,252,107,252,107,106,107,107,107,107,107,106,106,107,106,107,106,106,106,107,106,106,106,106,106,106,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,108,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,107,109,107,109,252,107,109,107,252,107,109,107,109,107,109,107,107,107,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,202,202,202,203,202,203,204,202,202,203,203,204,204,204,203,204,204,204,205,215,205,215,205,215,205,213,205,215,205,215,205,213,205,213,205,213,205,213,205,213,206,214,214,206,206,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,150,150,149,232,149,149,149,150,150,149,144,146,146,147,144,115,115,115,115,116,115,115,115,116,115,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,157,157,157,157,156,156,155,157,157,157,156,155,155,156,155,156,156,157,157,157,157,157,156,156,157,157,156,156,155,157,156,156,155,155,156,156,155,202,202,203,202,203,203,204,202,202,202,203,203,204,204,203,203,204,203,204,199,192,193,194,203,204,203,204,203,204,204,157,156,156,155,156,155,155,202,203,203,204,202,199,199,192,192,193,192,193,192,193,192,192,192,193,192,193,193,194,193,194,195,195,192,192,192,193,192,195,193,195,195,195,193,195,194,194,192,192,192,193,192,193,192,193,192,193,194,195,194,195,195,195,193,195,199,192,192,193,192,193,192,193,193,193,192,193,192,192,192,193,192,193,192,193,193,194,193,192,193,194,194,193
+,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,109,109,252,107,252,252,252,252,108,252,107,107,107,107,107,107,107,107,252,107,252,107,106,107,106,107,106,106,107,106,107,107,106,106,107,106,107,106,106,106,106,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,108,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,107,107,107,109,109,107,107,107,109,109,109,107,109,107,107,107,107,107,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,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,202,202,202,202,203,202,203,202,204,202,203,203,204,203,204,204,215,205,215,215,215,205,213,215,215,205,215,215,215,205,215,215,215,205,215,215,215,205,213,213,213,205,206,214,206,206,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,150,145,147,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,150,150,149,149,149,149,149,150,150,113,113,113,113,113,116,115,116,115,116,116,116,116,116,116,116,116,117,117,117,117,117,117,116,116,113,113,113,113,113,114,114,114,114,114,114,114,114,114,114,114,157,156,157,156,156,156,155,157,155,157,156,155,156,156,155,156,156,157,157,157,157,157,156,155,155,157,156,156,156,157,157,156,156,155,156,155,156,202,202,202,203,203,203,203,202,202,203,203,204,204,204,204,204,204,203,199,192,192,193,193,194,204,204,204,204,204,204,157,157,156,156,155,155,203,203,203,204,202,199,199,192,192,192,192,193,193,193,193,192,192,192,192,193,193,193,193,194,194,195,195,192,192,192,192,193,193,193,195,195,193,195,195,194,194,192,192,192,192,192,193,192,192,192,192,193,194,195,195,195,195,195,199,199,192,192,192,193,193,193,193,193,193,192,192,192,192,192,192,193,193,193,192,193,193,193,193,194,194,194,193
+,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,252,252,252,108,252,107,252,107,107,107,252,107,252,107,252,107,252,107,106,107,106,106,106,106,107,107,107,106,107,106,107,106,106,106,106,106,106,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,108,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,252,109,107,107,252,109,109,109,252,109,252,107,109,107,109,107,109,107,107,107,107,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,202,202,203,202,203,202,203,203,202,202,202,202,204,204,204,204,215,204,215,205,215,205,215,205,213,205,215,205,215,205,215,214,214,205,2,205,213,205,215,205,213,206,214,205,206,214,206,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,150,144,147,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,2,2,2,3,113,113,113,113,113,113,113,113,115,116,115,116,115,116,116,116,116,116,116,117,116,117,116,117,116,117,117,117,116,117,116,117,116,117,116,117,116,117,116,113,113,113,113,113,113,113,113,113,113,157,157,156,157,157,156,156,155,157,157,157,155,155,156,156,155,155,156,157,157,157,157,157,156,156,155,157,156,156,155,157,156,156,155,156,155,202,202,202,202,203,203,204,203,202,202,203,202,203,203,204,204,204,204,199,199,192,192,193,193,194,193,194,203,204,204,204,204,204,156,157,155,156,192,194,194,204,204,203,199,192,199,193,192,193,192,193,192,193,192,193,192,193,193,194,193,194,194,194,195,192,192,193,192,193,193,195,193,195,195,195,193,194,194,192,192,192,192,192,192,192,192,193,192,193,193,195,195,195,194,195,195,199,192,193,192,193,192,193,192,193,193,194,192,193,192,193,192,193,192,192,192,193,193,194,193,194,193,194,193,193
+,252,252,252,252,252,252,252,108,109,252,252,252,252,252,252,252,252,252,109,109,109,108,252,252,252,252,252,252,107,107,107,107,107,107,252,107,252,107,252,107,252,107,106,107,106,106,107,106,107,107,106,106,107,106,107,106,106,106,106,106,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,252,108,252,252,252,252,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,252,109,252,107,107,252,107,109,107,109,252,109,252,107,252,252,109,109,107,107,107,107,107,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,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,202,202,202,202,202,203,202,202,204,202,203,202,204,204,204,215,204,215,215,215,205,213,215,213,215,215,215,215,213,215,213,214,214,215,2,2,205,215,215,215,215,213,213,215,213,206,214,206,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,150,144,147,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,113,113,115,115,115,115,115,115,115,115,115,116,115,116,116,116,116,116,116,116,116,116,116,117,117,117,117,117,117,116,116,116,116,116,116,117,116,117,116,117,117,117,117,117,117,117,117,117,117,117,117,117,157,157,156,157,156,156,156,157,157,156,155,155,156,156,155,155,155,157,157,157,157,157,156,156,155,155,156,157,155,156,157,157,156,156,155,202,202,202,202,202,202,203,203,204,202,202,202,203,203,203,204,204,199,199,192,192,192,193,193,193,193,194,194,204,204,204,204,204,204,157,156,192,192,193,193,194,194,194,199,199,192,192,192,193,193,194,192,193,193,192,192,193,193,193,193,194,194,194,195,195,192,192,192,193,193,193,193,195,195,195,193,194,194,194,192,192,192,192,192,193,192,192,193,193,195,195,194,195,195,195,195,195,199,192,192,193,192,193,193,193,193,193,193,192,192,192,192,192,192,192,192,193,193,193,193,194,194,194,193,194,194
+,252,252,252,252,252,252,108,109,252,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,109,252,252,252,252,107,107,252,107,252,107,252,107,252,107,252,107,252,107,106,107,106,107,107,107,107,106,106,106,107,106,106,106,106,106,106,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,107,107,252,109,252,109,107,109,252,109,252,252,252,252,252,107,109,107,107,107,107,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,202,202,203,202,203,202,202,203,204,203,204,203,204,203,204,204,215,215,215,205,215,205,213,205,215,205,215,205,213,213,214,214,2,2,2,205,213,205,213,205,213,205,213,213,215,214,206,206,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2,2,2,150,144,147,2,1,2,2,2,1,2,1,2,1,2,2,2,1,2,1,2,113,113,113,116,113,113,113,115,115,117,117,117,117,117,116,117,116,117,117,116,115,116,116,117,116,117,116,117,116,117,116,116,116,117,116,117,116,117,116,117,116,117,116,117,116,117,116,117,116,117,116,117,116,117,117,117,117,117,117,157,157,156,157,157,156,156,157,157,156,156,155,156,155,156,155,155,157,157,157,157,157,157,156,156,155,157,156,155,157,157,156,156,155,202,202,202,202,202,202,203,202,203,202,202,202,203,202,203,203,204,199,199,192,192,192,193,193,193,193,194,193,194,194,204,204,204,204,204,192,192,192,193,193,194,193,194,193,199,192,199,192,193,192,194,194,193,192,193,192,193,192,193,193,194,193,194,194,195,195,193,192,193,192,193,193,195,195,195,193,195,193,194,192,193,192,192,192,193,192,192,192,193,193,195,195,195,194,195,194,195,193,199,192,193,192,193,192,193,193,194,193,194,192,193,192,192,192,192,192,193,192,193,193,194,193,194,194,194,194,194
+,252,252,252,252,252,252,108,108,252,252,252,252,252,252,252,252,252,252,109,109,108,108,252,109,252,252,252,252,252,107,107,107,107,107,107,107,252,107,252,107,252,107,252,107,106,107,252,107,107,107,106,106,107,106,107,106,106,106,106,106,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,252,108,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,252,252,107,109,109,109,109,252,109,252,109,252,252,252,252,252,252,107,107,107,107,107,107,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,202,202,202,202,203,203,203,202,202,204,203,202,204,204,204,204,215,204,215,215,215,215,213,215,215,215,213,205,213,213,213,213,2,2,2,1,215,215,215,215,213,213,213,205,213,213,214,214,206,214,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,1,150,144,147,2,2,2,2,1,2,2,2,2,2,2,2,1,2,2,2,2,115,115,116,117,115,115,115,115,116,116,117,117,117,116,117,117,117,117,116,116,117,117,117,116,117,117,116,116,117,117,117,116,116,116,116,116,117,116,116,116,117,116,116,116,117,117,117,116,117,117,117,117,117,117,117,117,117,117,117,157,157,156,157,156,156,155,157,156,156,155,155,156,156,155,156,155,157,157,157,157,157,156,156,155,155,156,156,155,157,157,156,156,156,202,202,202,202,202,202,202,203,202,202,202,203,203,203,203,204,199,192,192,192,192,193,193,193,193,193,193,194,194,194,194,204,204,192,192,193,193,193,193,193,194,194,194,199,199,192,192,193,192,193,193,194,193,193,192,192,192,193,193,193,193,194,194,194,194,195,192,192,192,193,193,195,195,193,193,195,194,194,192,192,192,193,192,192,192,192,192,193,194,193,194,195,194,195,195,195,195,199,199,192,192,192,192,193,193,193,193,194,194,192,192,192,192,192,192,192,192,193,193,194,194,194,194,193,194,194,193
+,252,252,252,252,252,252,108,109,252,252,252,252,252,252,252,252,252,252,109,109,108,252,108,252,252,252,252,252,252,107,107,107,107,252,107,252,107,252,107,252,107,252,107,252,107,106,107,252,107,252,106,106,106,107,106,107,106,106,106,106,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,108,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,107,107,107,252,109,252,109,252,109,252,109,252,109,252,252,252,107,107,107,109,107,107,107,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,202,203,202,203,202,203,202,202,202,203,204,204,203,204,203,204,204,215,215,215,215,215,205,215,205,215,205,213,213,214,213,214,1,2,1,2,215,215,205,215,205,213,205,213,213,214,205,206,214,206,214,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,150,149,149,144,147,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,115,115,116,117,115,115,115,116,116,117,117,117,116,117,116,117,117,117,116,116,116,117,116,117,117,117,116,117,117,116,117,116,116,117,116,117,116,117,116,117,113,113,113,114,113,114,114,114,114,114,114,114,114,114,114,114,114,114,157,157,156,156,157,157,156,156,157,157,156,156,155,156,156,156,156,155,157,157,157,157,157,157,155,155,156,156,155,155,156,157,156,156,155,203,202,202,202,203,202,202,202,202,202,202,202,203,203,204,199,192,192,192,192,193,192,193,193,194,193,194,193,194,194,194,192,192,192,193,193,193,193,194,193,194,193,194,199,192,192,192,192,193,193,194,194,193,192,192,192,193,192,193,193,194,193,194,194,194,195,193,193,192,193,195,192,195,193,195,193,194,194,192,192,193,192,192,192,193,192,193,192,195,193,195,195,195,194,195,195,195,192,192,192,193,192,193,193,194,193,194,192,194,192,193,192,193,192,193,192,193,192,193,193,194,193,194,194,194,193,193
+,252,252,252,252,252,252,108,108,109,252,252,252,252,252,252,252,252,252,109,109,108,108,252,109,252,252,252,252,252,252,252,107,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,107,107,106,106,106,106,107,106,106,106,106,106,1,2,1,2,1,2,1,2,1,2,1,2,1,2,108,252,108,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,107,252,109,109,109,109,109,252,109,252,252,252,252,252,252,252,107,107,107,107,107,107,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,202,202,202,202,203,203,202,203,204,202,204,203,204,204,204,204,204,215,215,215,215,215,213,215,215,215,215,213,213,213,214,214,2,1,2,1,2,215,215,215,215,215,215,215,213,213,215,214,214,206,214,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,150,149,149,149,144,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,115,115,115,116,117,115,115,116,115,116,116,117,117,116,116,117,117,117,116,116,116,116,116,117,117,117,117,117,117,117,115,116,117,113,113,113,113,113,113,113,113,113,116,116,116,116,116,116,116,116,116,116,116,116,116,117,117,117,117,157,157,156,156,157,156,156,157,157,156,156,155,155,156,156,155,156,157,157,157,157,157,157,156,155,156,156,156,156,155,157,156,156,156,156,202,202,202,202,202,202,202,202,202,203,202,202,202,203,203,199,192,192,192,193,193,193,193,193,193,194,194,194,194,194,192,192,192,193,193,193,193,193,193,194,194,194,199,192,199,192,192,193,193,193,194,194,193,192,192,193,192,193,193,193,193,194,194,194,194,195,192,193,192,195,193,193,193,195,195,194,194,192,192,192,192,192,192,192,192,193,193,194,194,195,195,194,194,195,195,195,195,192,192,192,192,193,193,193,193,194,192,193,193,194,192,192,192,192,192,193,193,193,193,193,193,194,194,194,193,194,193
+,252,252,252,252,252,108,108,252,108,252,252,252,252,252,252,252,252,252,109,252,107,252,108,252,108,252,252,252,252,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,106,107,106,106,107,106,106,106,106,2,1,2,1,2,1,2,1,2,1,2,1,2,1,252,108,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,107,107,107,107,252,109,252,109,252,109,252,252,252,252,252,107,107,107,109,107,109,107,107,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,202,202,203,202,203,202,203,203,202,204,202,203,204,203,204,203,204,204,204,215,215,215,213,215,215,215,213,215,213,213,214,213,214,1,2,1,2,1,215,215,215,215,213,215,213,215,213,205,214,213,214,206,214,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,115,115,112,113,113,113,2,1,2,1,2,1,2,1,2,1,2,1,2,1,115,115,115,117,115,115,115,115,116,116,117,117,116,116,117,117,117,117,116,116,117,116,117,117,117,116,117,117,115,115,116,116,115,117,115,115,116,115,116,116,117,116,117,116,117,157,151,152,152,115,116,115,116,116,116,116,117,116,117,157,157,156,155,157,157,156,157,156,156,155,156,155,156,156,157,157,157,157,157,157,157,156,155,156,157,156,156,155,156,155,157,156,156,202,202,202,202,202,202,202,202,202,203,202,202,202,204,204,199,192,193,192,193,192,193,193,193,193,194,193,194,193,194,194,192,192,193,192,193,192,193,193,194,193,194,194,199,192,192,192,193,192,193,193,194,194,193,192,193,192,193,193,194,193,194,193,194,194,194,194,193,192,193,192,193,193,195,193,194,193,194,192,193,192,193,192,192,192,193,192,194,194,195,194,195,194,195,194,195,195,193,192,193,192,193,192,193,193,192,192,193,193,194,193,194,192,192,192,193,192,193,193,193,193,194,193,194,193,194,193,193
+,252,252,252,252,252,108,108,108,252,252,252,252,252,252,252,252,252,252,109,109,108,108,108,108,252,252,252,252,252,252,252,107,252,107,107,107,252,252,252,252,109,107,252,107,252,107,252,107,252,107,107,106,107,107,106,106,107,106,106,106,1,1,1,1,1,1,1,1,1,1,1,1,1,1,108,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,107,107,107,109,109,252,109,252,109,252,252,252,252,252,252,252,107,107,107,107,107,109,107,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,202,202,202,202,202,203,203,204,204,203,202,203,203,204,203,204,203,204,204,204,215,215,215,215,215,215,215,213,213,214,214,214,214,1,1,1,1,1,215,215,215,215,213,213,213,215,213,214,214,214,214,214,214,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,115,115,115,117,112,113,113,1,1,1,1,1,1,1,1,1,1,1,1,1,1,115,115,115,117,115,116,115,116,116,116,117,117,116,117,117,116,116,117,116,117,116,117,117,117,117,117,117,117,115,115,116,116,117,116,116,116,116,117,117,115,115,116,116,117,157,157,156,151,152,115,115,115,115,116,116,116,116,117,117,157,156,156,155,157,157,157,157,156,155,156,155,155,157,157,157,157,157,157,157,157,156,156,155,157,156,156,156,156,155,155,156,156,155,202,202,202,202,202,202,203,202,202,203,202,204,203,203,199,192,192,192,192,192,193,193,193,193,193,193,193,193,194,194,194,192,193,192,193,193,193,193,193,193,194,194,199,192,192,192,193,192,193,193,193,193,194,193,192,192,193,193,193,193,194,192,193,193,194,194,194,192,193,193,193,193,195,193,195,194,194,192,192,192,193,193,192,192,193,194,194,194,194,195,195,194,195,195,195,195,195,192,199,192,193,193,193,193,192,192,193,193,193,193,194,194,194,192,192,192,193,193,193,193,194,194,197,193,193,193,194,193
+,252,252,252,252,252,108,108,252,108,252,252,252,252,252,252,252,252,252,109,252,107,252,108,252,108,252,108,252,252,252,252,252,107,252,107,252,107,252,107,109,109,252,107,252,107,252,107,252,107,252,107,107,107,107,106,106,106,106,106,106,1,1,2,1,1,1,2,1,1,1,2,1,1,1,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,107,107,107,252,107,252,109,252,109,252,109,252,109,252,252,252,107,252,107,109,107,107,107,107,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,202,202,203,202,202,202,203,203,204,203,202,203,204,203,204,203,204,203,204,203,204,215,215,215,215,215,213,215,213,213,214,214,214,1,2,1,1,1,215,215,215,215,213,215,213,215,213,214,213,214,214,213,214,214,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,1,1,2,115,116,115,116,112,112,113,113,1,1,1,2,1,1,1,2,149,112,112,112,1,115,115,116,115,116,115,116,115,116,116,117,117,116,116,117,116,117,117,117,116,117,116,117,116,117,117,117,115,116,116,117,116,117,116,115,116,117,116,117,116,117,117,115,157,157,157,156,151,151,152,115,115,117,117,116,115,116,116,117,157,157,155,155,157,157,157,157,156,155,155,155,157,157,157,157,157,157,157,157,157,157,155,155,156,157,156,156,155,155,155,156,155,156,202,203,202,202,202,203,202,203,202,203,202,203,203,199,199,192,192,193,192,193,192,193,192,193,193,194,193,194,193,194,194,192,192,193,192,193,193,194,193,194,194,194,199,192,192,192,192,193,192,193,193,194,194,193,192,193,192,193,192,193,192,193,192,194,193,194,193,195,192,193,192,193,193,195,193,194,192,193,192,193,192,192,192,193,192,194,194,194,194,195,195,195,194,195,195,195,195,192,192,193,192,193,193,192,192,193,192,193,193,194,193,194,194,194,192,193,192,193,193,194,196,193,196,193,193,193,193,194
+,252,252,252,252,109,108,108,108,252,252,252,252,252,252,252,252,252,109,109,252,252,107,108,108,252,108,252,252,252,252,252,107,252,107,252,107,107,107,109,109,109,109,252,107,252,107,252,107,109,107,252,107,107,107,107,106,106,106,106,106,1,1,1,1,1,1,1,1,1,1,1,1,1,1,108,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,109,109,109,109,252,109,252,109,252,252,252,252,252,107,107,107,107,107,107,107,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,202,202,202,202,202,203,203,204,204,203,202,203,203,203,203,204,203,204,204,204,215,204,215,215,215,215,215,213,213,213,214,214,1,1,1,1,1,1,215,215,215,215,215,213,213,215,213,214,215,213,214,214,214,214,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,115,115,115,115,116,112,116,112,113,1,1,1,1,1,1,149,149,149,149,149,112,115,115,115,115,115,115,116,116,116,116,116,116,117,116,117,116,116,116,117,116,117,117,117,117,117,117,115,115,116,116,116,117,117,116,115,116,117,117,117,116,117,117,117,157,157,157,157,156,156,151,152,115,116,115,116,116,116,116,116,157,157,156,156,157,157,157,157,157,156,155,155,157,157,157,157,156,157,157,157,157,156,156,155,157,157,156,156,156,156,155,155,156,156,155,202,202,202,202,202,202,202,202,203,202,203,203,199,199,192,192,192,192,193,192,193,193,193,193,193,193,194,194,194,194,194,192,192,192,193,193,193,193,194,194,194,199,192,192,192,192,193,192,193,193,194,194,194,193,193,192,192,192,193,193,192,192,193,193,194,194,195,195,193,192,193,193,193,193,194,192,192,192,193,192,192,192,193,193,193,193,194,194,195,195,195,195,195,195,195,195,194,192,192,192,193,193,192,192,192,192,193,193,193,193,194,194,194,194,193,193,193,193,196,196,193,193,193,193,194,193,194,194
+,252,252,252,252,252,108,108,252,108,252,252,252,252,252,252,252,252,109,109,252,252,108,107,252,108,252,108,252,108,252,252,252,107,252,107,252,252,109,109,252,109,107,107,252,107,252,107,109,107,107,107,252,107,107,107,107,106,107,106,106,19,19,19,19,19,19,19,19,19,19,19,19,19,19,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,252,107,252,107,252,109,252,109,252,109,252,109,252,109,252,252,252,107,107,107,109,107,109,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,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,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,19,19,19,19,19,19,19,202,202,202,203,202,202,202,203,203,204,203,202,202,203,202,203,203,204,203,204,204,204,215,215,215,215,215,213,215,214,213,214,213,19,19,19,19,19,215,215,215,212,215,215,215,213,215,213,213,214,213,214,213,215,214,214,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,115,115,115,117,117,112,117,116,112,112,19,19,19,19,149,149,149,149,115,115,112,112,112,115,115,115,116,115,116,116,116,116,117,116,117,117,117,116,117,116,117,116,117,117,117,115,115,115,116,116,117,116,117,115,116,115,116,116,117,116,115,117,117,157,157,157,157,157,156,155,151,152,116,115,116,115,116,115,116,115,157,156,156,157,155,157,157,157,156,155,155,157,157,157,157,156,156,157,157,156,157,155,157,157,157,156,157,156,156,155,156,155,156,155,202,202,203,202,203,202,203,202,203,202,202,203,204,199,192,192,192,192,192,192,193,192,193,192,194,192,194,193,194,193,194,192,193,192,193,193,192,192,193,193,194,194,192,192,192,192,193,192,193,192,193,193,194,194,194,193,194,192,193,193,193,192,193,192,194,193,194,195,195,192,193,193,195,193,194,193,192,192,193,192,192,192,193,192,193,193,193,194,194,194,195,195,195,194,195,194,195,194,192,192,193,192,192,192,193,192,193,192,193,193,194,193,194,193,194,192,193,192,193,196,193,196,193,193,194,193,194,194,194
+,252,252,252,252,109,108,108,108,252,252,252,252,252,252,252,252,252,252,109,109,109,107,108,108,252,108,252,107,252,252,252,252,252,107,252,107,109,107,109,109,252,109,252,107,252,107,252,107,109,107,107,107,252,109,109,107,107,106,107,106,106,20,20,20,20,20,20,20,20,20,20,20,20,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,109,107,109,109,252,109,109,109,252,252,252,252,252,252,252,107,252,107,107,107,107,107,107,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,202,202,202,202,202,202,203,203,204,204,202,202,202,202,203,203,203,203,204,204,204,215,204,215,215,215,215,215,213,213,214,214,214,20,20,20,20,215,215,215,215,215,215,215,213,213,215,213,213,215,213,213,214,205,214,214,214,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,115,115,115,115,117,115,117,112,117,112,112,112,112,112,116,115,116,116,117,116,115,115,116,116,115,115,115,115,116,116,116,116,117,116,117,117,117,117,117,117,117,117,117,117,115,115,115,115,116,116,116,116,117,115,116,117,116,116,116,116,115,117,117,157,157,157,157,157,157,156,156,151,151,155,115,115,116,116,116,116,117,157,156,157,157,156,155,157,157,155,155,157,157,157,157,157,157,156,157,156,157,155,157,157,157,157,157,156,156,156,156,155,155,155,155,202,202,202,202,202,203,203,202,202,203,202,204,199,192,192,192,192,192,192,192,192,192,192,192,192,194,194,194,194,194,192,192,192,192,192,193,193,193,193,194,194,199,192,192,192,192,192,193,192,193,193,194,194,194,192,193,192,193,192,193,192,193,192,194,193,194,194,195,195,193,193,193,193,194,194,192,192,193,192,193,192,192,192,193,193,193,193,194,194,195,195,195,195,195,195,195,195,199,192,192,192,193,192,192,192,193,193,193,193,193,193,194,193,194,194,192,192,193,192,193,193,193,193,194,193,194,193,194,194
+,252,252,252,252,252,108,108,252,108,252,252,252,252,252,109,252,252,252,109,109,109,252,107,108,108,252,108,252,107,252,109,252,252,252,107,252,107,109,107,109,109,252,109,107,107,252,107,252,107,107,107,252,109,109,107,109,107,107,106,106,106,106,20,20,20,20,20,20,20,20,20,20,20,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,107,107,107,107,107,109,107,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,202,202,202,203,202,203,202,203,203,204,202,203,202,203,203,204,203,204,204,204,204,204,215,204,215,215,213,215,214,215,215,214,214,20,20,20,215,215,215,212,215,213,215,215,215,215,215,215,215,215,214,214,214,215,213,214,214,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,115,115,116,115,116,117,115,116,112,116,117,112,116,115,115,115,116,116,117,115,117,115,116,115,117,115,116,115,116,116,117,116,117,116,117,116,117,115,117,115,116,116,117,115,115,115,115,115,116,115,115,115,117,115,116,116,117,115,116,116,117,115,117,157,157,157,157,155,151,157,156,155,156,151,152,116,117,116,117,116,117,117,157,155,157,156,156,155,157,156,155,155,157,157,157,157,157,156,157,156,157,155,157,156,157,157,157,156,157,156,156,155,156,155,155,155,202,202,203,202,203,202,203,202,203,202,202,199,199,192,192,192,193,193,192,192,194,192,193,192,193,193,194,193,194,193,192,192,192,192,193,192,193,193,194,193,194,192,192,192,192,192,193,192,193,193,194,194,194,192,192,192,193,192,193,192,193,192,194,193,194,194,194,195,195,192,193,193,194,193,192,192,193,192,193,192,192,192,193,192,193,193,194,193,194,194,195,194,195,195,195,195,194,193,193,192,193,192,197,192,193,192,193,192,193,193,198,193,194,194,198,192,193,193,197,192,193,193,194,193,194,193,194,193,194
+,252,252,252,252,109,108,108,108,109,252,252,252,252,252,252,252,252,252,109,109,109,109,109,107,108,108,252,252,252,252,252,252,252,107,252,107,252,107,109,109,109,109,109,107,107,107,252,107,109,109,107,107,107,109,109,107,107,107,107,106,106,106,106,20,20,20,20,20,20,20,20,20,20,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,107,107,107,107,107,107,107,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,202,202,202,203,203,204,203,204,203,202,204,202,202,203,203,203,203,204,204,204,204,204,204,204,215,215,215,215,215,213,214,215,213,214,20,20,20,215,215,215,215,212,215,215,215,215,215,213,215,213,215,214,213,214,215,213,213,214,213,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,115,115,115,115,115,115,116,116,115,117,112,117,112,116,115,115,115,116,116,116,115,117,117,116,116,117,115,115,115,116,116,116,117,117,117,116,116,117,115,116,116,117,115,115,115,115,115,116,115,115,115,115,115,116,115,117,116,117,117,117,116,116,115,116,157,157,157,157,156,156,155,151,156,156,156,155,151,155,116,117,117,117,157,156,156,157,156,156,155,155,157,155,156,157,157,157,157,157,156,157,157,156,156,155,156,157,157,157,157,157,156,155,156,157,156,156,155,155,202,202,202,202,202,203,203,202,202,203,199,199,192,192,192,192,192,193,193,193,192,192,192,193,193,192,193,194,194,194,192,192,192,193,193,193,193,193,193,194,192,192,192,193,192,193,193,193,193,193,194,194,192,192,192,192,192,193,192,194,193,193,193,194,194,194,195,195,195,195,193,193,194,192,192,193,192,192,192,193,192,193,193,193,193,193,194,194,194,195,195,195,195,195,195,195,194,192,192,193,192,192,192,193,192,193,193,193,193,193,193,194,194,192,192,192,193,193,193,193,193,193,193,194,193,194,194,194,194
+,252,252,252,252,252,108,108,252,108,252,252,252,252,252,109,252,252,252,252,109,109,109,109,252,107,252,109,252,109,252,252,252,109,252,252,252,107,252,107,109,109,252,109,108,107,252,107,252,109,252,107,107,107,252,107,107,107,107,107,107,106,106,106,20,21,20,20,20,21,20,21,20,21,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,109,107,252,107,252,107,252,109,252,109,252,109,252,109,252,109,252,107,109,107,107,107,107,107,107,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,202,202,202,203,202,203,203,204,204,202,203,202,202,203,202,203,203,204,204,204,203,204,204,204,204,204,215,215,202,215,213,214,215,215,214,21,20,215,215,212,215,212,215,215,215,213,213,213,213,212,205,213,211,213,213,215,205,214,213,214,211,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,115,115,115,115,116,115,115,115,116,116,117,116,112,117,116,115,116,115,116,116,117,115,116,117,117,116,117,115,116,115,115,115,116,116,117,117,116,115,117,115,115,115,116,115,116,115,116,115,116,115,115,115,117,115,116,115,116,116,117,116,117,117,117,117,117,117,157,157,157,156,156,157,155,151,156,155,156,155,155,151,117,117,117,156,157,156,157,156,157,155,156,155,157,156,157,157,157,156,157,157,157,156,157,156,156,155,157,157,157,156,156,155,156,155,155,156,156,155,155,202,202,202,203,202,203,203,204,203,202,196,199,192,192,192,192,192,193,192,193,193,192,192,193,192,192,194,194,193,194,192,192,192,193,192,193,193,194,193,194,193,192,192,193,192,193,193,193,193,193,194,194,192,192,192,192,193,192,192,193,193,194,194,194,194,194,195,195,195,195,195,193,193,192,192,193,192,193,192,192,192,193,193,193,193,193,194,195,194,195,194,195,194,195,197,195,194,194,192,197,192,197,192,193,192,196,192,197,193,197,193,194,193,198,192,197,192,197,193,193,193,197,193,197,193,194,193,197,194,194
+,252,252,252,252,109,108,108,108,252,252,109,252,252,252,252,252,252,252,252,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,108,108,252,107,109,109,109,109,107,107,109,109,252,109,252,107,107,109,107,107,107,107,107,107,107,107,106,106,20,20,20,20,20,20,20,20,20,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,109,107,252,109,109,109,252,252,252,109,252,252,252,252,252,107,109,107,107,107,107,107,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,202,202,202,202,202,203,203,203,203,204,204,203,202,202,204,203,202,203,203,203,203,204,204,204,204,204,204,202,204,204,204,215,214,214,215,215,20,20,215,215,215,215,215,215,215,215,215,215,215,213,212,215,215,211,214,213,215,212,213,213,213,213,211,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,80,83,86,89,92,95,115,115,115,116,116,117,116,117,112,116,115,115,115,116,116,116,116,117,117,116,116,117,115,115,116,116,115,116,117,116,116,117,115,116,115,115,115,115,115,115,115,116,116,116,115,115,115,115,115,116,115,115,116,116,117,117,116,117,117,117,117,157,157,156,155,155,157,156,151,155,151,156,155,155,151,151,155,157,157,156,156,156,157,157,156,156,155,155,157,157,157,157,157,157,157,157,155,157,157,156,155,155,157,157,156,156,156,156,155,155,155,156,155,156,155,202,202,202,202,202,203,203,204,204,203,199,192,192,192,192,192,192,192,193,193,193,192,192,192,192,194,193,193,193,192,192,192,193,192,193,193,193,193,194,194,192,192,193,192,193,192,193,193,193,194,194,193,192,192,193,192,193,192,193,192,194,193,194,194,194,195,195,195,195,193,195,193,192,192,193,192,193,192,192,192,193,192,193,193,193,194,195,194,195,195,195,195,195,193,195,195,194,196,193,193,193,192,193,192,193,192,193,193,193,193,194,193,194,194,192,192,193,192,193,193,193,193,193,193,194,193,194,194,193,194
+,252,252,252,252,252,109,108,108,108,252,108,252,252,252,109,252,252,252,252,252,109,252,109,109,109,252,109,252,109,252,109,252,252,252,252,252,107,108,108,109,109,252,109,108,107,252,107,252,107,252,109,109,109,252,107,107,107,107,107,107,107,107,107,106,106,20,21,20,21,20,21,20,21,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,252,107,252,107,252,107,252,109,252,109,252,109,252,109,252,252,109,107,107,107,107,107,107,107,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,202,203,202,203,202,203,203,204,203,204,204,202,202,204,204,203,202,203,203,204,209,202,203,204,209,204,202,202,203,203,203,204,203,213,214,204,215,215,20,215,215,215,215,212,215,212,215,215,215,215,215,213,212,215,212,211,213,215,205,212,212,213,211,213,211,21,20,20,20,20,20,20,35,38,41,44,46,32,34,37,38,41,42,45,46,32,33,48,51,54,57,60,62,44,45,47,32,33,34,36,48,50,51,54,55,58,59,62,62,48,53,58,62,37,38,41,41,44,48,50,51,53,54,57,57,60,61,63,115,115,115,116,115,116,115,116,115,115,115,115,115,116,115,116,115,116,116,117,117,117,117,117,157,157,157,157,156,156,157,157,156,156,155,151,155,156,155,155,155,151,156,157,199,199,199,193,156,156,155,156,157,157,157,157,156,157,157,157,156,155,157,157,156,156,155,157,156,157,156,156,155,156,155,155,155,156,155,155,202,202,202,203,202,203,203,204,202,199,192,193,192,193,192,193,192,193,193,193,193,192,192,192,193,194,193,194,192,192,192,193,192,193,193,194,194,194,193,192,192,193,192,193,192,193,192,194,194,194,194,192,192,193,192,193,192,193,193,193,193,194,194,194,194,195,195,195,195,195,194,194,192,192,193,192,192,192,193,192,193,193,193,193,194,195,194,195,194,192,192,195,193,195,194,195,193,196,192,197,192,197,193,197,192,197,193,197,193,197,194,198,194,198,192,197,193,197,193,197,193,197,193,197,193,197,194,193,194,194
+,252,252,252,252,252,252,108,108,108,108,109,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,108,107,109,109,109,109,107,107,109,107,109,109,252,109,109,109,109,107,107,107,107,107,107,107,107,106,106,20,20,21,20,20,20,20,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,109,107,109,109,252,109,252,109,252,252,252,252,252,252,109,107,109,107,107,107,107,107,107,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,20,21,20,20,20,20,20,20,202,202,202,202,202,203,203,210,208,208,208,208,210,209,209,203,209,203,203,203,203,209,204,209,209,204,203,202,203,203,203,204,204,208,204,211,214,204,215,20,215,215,212,212,215,212,215,215,215,215,215,215,215,213,211,212,215,211,213,215,215,212,212,213,211,213,211,211,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,33,34,35,37,38,39,40,41,42,44,45,46,47,32,34,35,37,39,40,42,44,45,47,32,33,33,34,35,35,36,37,38,38,39,39,40,41,42,42,43,44,44,45,46,48,50,52,55,56,59,61,63,157,157,157,157,157,157,156,156,157,155,156,156,156,151,151,151,151,156,155,155,151,157,192,199,193,197,193,198,156,156,155,157,157,157,157,156,156,155,157,156,155,157,156,155,157,155,156,157,156,156,156,156,155,155,155,156,155,155,155,203,202,203,202,203,203,204,202,199,192,196,192,193,192,196,192,193,192,193,193,192,192,192,193,194,193,193,193,193,192,193,193,193,192,193,194,194,194,192,192,193,192,193,192,193,193,196,193,194,194,197,192,193,192,193,192,193,193,197,193,194,193,194,194,195,195,195,195,197,194,193,192,192,193,192,193,192,192,192,193,193,193,193,194,198,194,195,194,192,192,193,193,193,193,195,194,197,196,193,193,193,193,192,193,193,193,193,193,193,194,194,193,194,192,192,193,193,193,193,193,193,193,193,193,194,194,193,194,198,194
+,252,252,252,252,252,252,107,109,108,252,108,252,108,252,252,252,109,252,252,252,252,109,109,252,109,252,109,252,109,252,109,108,109,252,252,252,252,252,252,108,252,109,109,109,109,108,107,252,107,252,109,252,109,109,109,109,109,107,107,107,107,107,107,107,107,107,21,20,21,20,21,20,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,252,107,252,107,252,109,252,109,252,109,252,109,252,252,252,107,109,107,109,107,107,107,107,107,107,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,202,202,208,202,202,202,209,210,208,203,208,203,208,208,209,202,209,203,203,203,208,208,211,209,208,209,202,210,203,209,203,209,208,209,208,208,211,214,215,20,212,212,212,212,212,215,212,215,215,212,215,215,215,205,213,205,211,212,211,213,215,205,212,212,213,211,213,212,211,211,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,21,36,37,40,32,34,35,37,38,40,41,43,44,46,47,45,45,46,46,47,46,47,157,157,157,157,156,157,156,156,157,157,156,156,155,156,155,156,155,155,151,151,155,155,151,199,193,196,193,193,198,198,198,198,156,156,155,156,155,155,155,157,156,156,155,155,157,156,155,157,156,156,155,156,155,156,155,155,155,156,155,203,202,203,202,203,203,204,202,199,192,196,192,196,193,193,196,196,193,194,193,194,192,193,193,194,192,193,192,193,192,193,192,193,193,193,193,194,194,195,192,192,192,193,192,193,193,194,194,194,194,194,192,192,192,192,193,193,193,193,193,193,193,194,194,194,195,195,195,198,194,193,192,192,193,192,193,192,192,192,193,192,193,193,194,198,194,195,194,192,192,193,192,193,193,195,194,195,195,196,193,197,192,197,193,196,192,197,193,197,194,198,194,198,193,198,192,197,193,197,193,197,193,197,193,197,193,198,194,198,194,194
+,252,252,252,252,252,252,108,108,108,108,109,108,252,252,252,109,252,252,252,252,108,107,108,107,109,107,109,107,252,109,252,109,252,252,252,252,252,252,252,109,108,252,252,252,109,107,108,107,107,107,107,107,107,107,107,107,109,109,107,107,107,107,107,107,107,107,107,20,20,21,20,21,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,252,109,109,109,252,252,252,252,252,252,252,107,109,107,109,107,109,107,107,107,107,107,107,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,21,20,20,20,21,20,21,20,202,210,210,210,208,210,210,209,209,208,208,203,203,203,208,208,208,203,203,209,208,208,208,208,211,209,210,209,210,208,203,209,208,208,209,209,208,208,211,214,215,212,212,212,215,212,215,212,212,212,215,212,212,215,212,215,215,212,211,211,211,213,212,215,212,212,211,211,211,211,211,211,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,41,42,43,44,45,46,47,43,43,45,45,46,47,156,156,156,156,156,156,156,155,155,156,156,155,155,156,155,155,155,155,155,151,151,155,155,155,155,199,196,193,196,193,193,198,198,198,156,156,156,156,156,155,155,155,156,155,155,156,156,155,155,156,156,156,156,156,156,155,155,155,155,155,155,202,203,202,203,203,204,202,199,192,196,192,196,193,196,193,196,193,193,194,194,192,193,193,194,194,193,192,193,192,193,193,193,193,194,194,194,194,194,192,192,192,193,192,193,193,196,194,197,193,196,193,192,192,193,192,193,193,197,193,197,193,197,193,194,195,195,195,198,198,193,194,192,193,193,194,194,192,192,193,193,193,193,193,198,198,197,194,192,192,192,192,193,193,193,194,195,194,196,196,197,193,193,193,196,193,193,193,197,194,194,194,198,194,194,192,197,192,193,193,197,193,193,193,197,194,194,194,194,194,194,194
+,252,252,252,252,252,252,107,108,108,252,108,252,108,252,252,252,252,252,252,108,107,252,107,108,107,252,107,252,107,252,107,252,109,252,107,252,252,252,109,252,109,252,109,252,107,252,107,108,107,252,107,107,107,252,107,109,107,252,107,252,107,107,107,107,107,107,107,106,107,20,21,20,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,252,107,252,107,252,107,252,109,252,109,252,252,252,109,109,107,109,107,109,107,107,107,107,107,107,107,107,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,210,210,209,209,208,209,210,210,209,209,208,210,203,203,208,209,208,208,203,203,208,209,208,209,208,211,208,209,209,209,210,210,208,209,208,209,208,209,208,215,211,214,212,212,212,212,212,212,212,212,212,212,212,212,212,212,215,215,212,212,211,211,211,212,211,215,215,205,211,211,211,211,211,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,21,21,45,46,46,47,32,38,37,38,38,39,38,39,40,156,156,156,156,156,156,156,155,156,155,156,156,156,155,155,155,155,155,155,155,155,155,155,155,151,151,151,192,196,193,196,197,193,193,198,198,198,198,156,155,156,155,156,155,156,155,156,155,156,155,156,155,157,156,156,155,156,155,156,155,155,155,155,155,203,203,203,202,203,203,203,199,196,193,196,193,196,196,196,196,193,193,194,193,193,193,194,194,192,192,193,196,193,193,193,193,194,193,194,194,195,192,192,192,193,192,193,193,193,194,197,193,196,194,192,192,192,192,193,193,193,193,197,193,193,193,194,194,195,195,198,195,193,193,192,193,192,193,193,194,192,193,192,193,193,193,194,194,193,194,192,192,193,192,193,193,195,193,195,194,197,196,196,193,197,193,196,193,197,193,197,194,198,194,198,194,198,193,197,193,197,193,197,193,197,193,197,193,197,193,198,194,198,194,198
+,252,252,252,252,252,252,108,107,108,108,109,252,109,252,252,252,252,252,108,107,108,107,108,107,108,107,109,108,109,107,109,109,109,109,252,252,252,252,252,252,252,109,252,107,252,107,252,107,252,107,107,107,107,107,107,107,107,107,109,107,252,107,107,107,107,107,107,107,106,107,21,21,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,252,109,252,252,252,252,252,252,109,107,109,107,109,107,109,107,107,107,107,107,107,107,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,202,202,209,209,209,209,208,210,209,209,208,210,210,210,209,209,208,208,208,203,209,209,208,209,208,208,211,208,209,209,208,210,209,209,208,208,209,209,208,208,208,215,211,211,212,212,212,212,212,212,212,212,212,215,212,215,215,212,212,212,212,212,211,211,212,212,211,212,212,212,212,211,211,211,211,20,21,20,21,20,21,21,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,20,21,20,44,20,45,20,32,34,36,37,40,41,43,45,32,33,34,35,37,38,39,40,41,47,47,53,54,56,57,59,60,62,63,48,49,51,52,54,55,57,58,60,61,63,48,50,52,58,60,61,63,48,50,52,54,55,199,193,196,193,193,193,197,198,198,197,198,198,155,155,155,155,155,155,155,155,155,155,155,155,155,156,156,156,156,155,155,155,155,155,155,155,155,202,203,202,203,203,203,199,196,193,196,196,196,197,196,196,197,197,194,194,193,193,193,193,196,192,193,196,193,193,193,193,193,193,194,195,195,193,192,192,193,192,193,193,196,196,197,194,197,196,193,194,192,193,193,193,192,193,197,193,197,193,196,194,195,194,198,195,197,193,193,192,192,192,192,193,192,193,193,193,193,193,194,194,198,194,192,192,193,192,193,193,193,193,195,195,197,197,196,196,196,193,196,193,193,193,197,193,197,194,198,194,194,194,197,193,197,192,197,193,193,193,197,193,197,193,198,194,198,194,198,194
+,252,252,252,252,252,252,252,108,107,109,108,252,108,252,252,252,252,252,108,108,107,108,107,109,107,252,107,109,108,109,108,252,107,109,109,252,109,252,252,252,252,252,252,252,107,252,107,252,252,252,109,252,107,107,107,252,107,252,107,109,107,252,107,107,107,107,107,107,107,106,107,107,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,252,107,252,107,252,109,252,109,252,109,252,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,21,20,21,20,21,21,21,20,21,20,21,20,210,210,209,210,209,209,208,208,208,208,209,210,209,209,208,208,209,210,203,203,209,209,209,209,208,209,208,209,211,209,208,209,208,209,209,208,208,209,208,209,208,208,208,215,211,212,212,212,212,212,212,212,212,212,212,215,211,215,215,212,212,212,212,212,211,211,211,212,212,212,212,212,211,212,211,212,211,211,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,47,32,34,35,38,39,42,43,45,32,35,37,40,42,45,47,62,63,48,49,52,53,56,57,60,61,63,48,50,51,54,55,58,59,61,63,48,49,52,53,56,57,60,61,63,199,196,193,196,193,197,197,198,197,198,197,198,198,156,155,155,155,155,155,156,156,156,155,155,155,156,155,155,155,155,155,155,155,155,155,155,203,203,203,203,203,203,196,192,196,196,196,196,196,196,196,197,196,193,197,194,194,193,193,192,192,193,196,193,196,193,193,194,193,194,194,195,195,192,192,193,192,193,193,197,193,196,194,197,196,196,194,192,193,192,193,194,194,196,193,197,193,197,194,194,194,195,195,197,193,193,192,193,193,192,193,193,193,193,193,193,194,194,194,198,194,193,194,193,192,193,193,195,193,195,194,195,194,197,196,197,193,197,193,197,193,198,193,196,194,197,194,198,194,198,193,197,193,197,193,197,193,197,193,197,193,198,193,198,194,198,194,198
+,252,252,252,252,252,252,252,252,108,107,108,108,109,252,109,252,252,252,252,108,108,107,108,107,108,107,108,108,109,108,109,108,252,109,109,109,252,252,252,252,252,252,252,252,252,252,252,107,252,107,252,109,252,107,107,107,107,107,107,107,252,107,252,107,252,252,107,107,108,107,106,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,252,109,252,109,252,252,252,252,252,252,109,107,109,107,109,107,109,107,107,107,107,107,107,107,107,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,210,210,209,209,209,209,208,208,209,209,208,210,209,209,208,210,209,209,209,209,209,209,209,209,209,209,209,209,208,208,208,209,208,208,211,209,208,209,209,209,208,208,208,211,211,208,211,212,212,212,212,212,212,212,212,212,212,212,212,211,212,212,212,212,212,212,211,211,212,212,212,212,211,211,211,211,211,211,211,211,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,41,20,42,43,20,44,45,45,47,47,32,33,34,35,36,37,38,32,33,34,35,36,37,38,40,41,21,42,44,45,46,47,58,58,59,59,60,60,61,61,62,62,63,63,196,196,196,196,197,197,197,197,198,198,198,198,198,198,75,75,76,77,78,78,79,53,53,53,54,156,156,155,156,155,155,155,155,155,155,155,203,202,203,203,203,196,192,196,196,196,196,196,198,198,193,193,193,193,198,194,194,197,192,196,193,196,193,196,193,193,193,193,194,195,195,195,192,192,193,192,193,193,197,193,196,193,196,193,196,193,192,193,194,193,196,193,197,193,197,193,194,193,194,195,195,198,198,193,193,192,193,192,192,193,193,193,193,193,193,198,193,198,198,194,193,192,192,194,193,193,193,193,195,195,195,194,197,196,196,193,197,193,197,193,197,193,197,194,198,194,198,194,197,194,197,193,197,193,197,193,197,193,196,193,197,194,198,194,198,194,198,194
+,252,252,252,252,252,252,252,252,252,108,107,109,108,252,108,252,252,252,252,108,108,109,107,108,107,109,107,109,108,252,108,252,108,252,108,252,109,252,107,252,109,252,109,252,252,252,252,252,107,252,107,252,109,252,107,107,107,252,107,252,107,252,107,252,107,252,107,107,252,108,107,107,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,252,107,252,107,252,107,252,109,252,109,252,252,252,107,109,107,109,107,109,107,107,107,109,107,107,107,107,107,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,210,209,210,209,209,208,208,210,210,208,209,208,210,209,210,209,210,210,210,210,210,210,210,209,209,208,209,208,209,208,208,209,209,208,209,211,209,208,209,208,209,208,209,208,211,211,208,211,212,212,212,212,212,212,212,212,212,212,212,211,211,212,212,212,212,211,212,211,211,211,212,212,212,211,211,211,211,211,212,211,211,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,21,20,33,20,34,20,35,35,37,37,38,38,39,39,40,40,42,42,43,43,44,44,45,45,47,47,32,33,35,35,37,37,39,40,42,42,44,44,46,47,63,48,50,51,54,55,58,59,62,62,59,199,196,196,196,196,197,197,198,197,198,197,198,198,198,198,198,69,71,71,72,73,74,74,76,76,78,78,79,52,53,52,54,53,55,54,55,203,203,203,203,196,199,196,196,196,196,196,196,197,198,198,197,193,198,197,194,194,196,196,193,196,193,196,193,196,194,193,194,193,195,195,196,192,193,193,193,193,197,193,196,196,196,194,196,196,197,193,197,193,196,193,197,197,197,193,197,194,194,194,194,195,198,197,193,192,193,193,193,193,193,193,193,193,193,198,194,198,198,194,193,194,196,194,193,196,193,197,195,193,195,194,197,196,196,193,197,193,197,193,197,193,198,193,198,194,198,194,198,194,197,193,197,193,197,193,197,193,197,193,197,193,198,193,198,194,198,194,194
+,252,252,252,252,109,252,252,252,252,252,108,107,109,108,109,252,109,252,252,108,108,107,108,107,108,107,108,108,109,108,109,108,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,252,107,252,109,109,109,108,107,107,107,107,107,252,107,252,252,107,107,252,252,108,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,109,107,252,252,252,252,252,252,252,252,109,109,109,107,109,107,109,107,107,107,107,107,107,107,107,107,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,140,141,209,209,209,208,208,208,210,208,209,208,208,209,210,210,210,210,210,209,210,209,209,208,208,208,209,209,209,209,209,208,209,209,209,208,211,209,209,208,208,208,209,208,208,211,211,208,208,211,212,212,212,212,212,212,212,212,212,212,212,211,211,212,212,212,212,212,212,211,211,212,212,212,212,212,211,211,211,211,211,211,211,21,21,21,21,21,21,21,21,32,34,37,39,42,44,47,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,32,34,36,38,41,42,45,47,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,42,42,43,43,44,44,45,46,46,47,47,32,33,35,36,37,38,40,41,42,43,45,46,47,53,54,54,196,196,196,196,197,197,197,197,198,198,198,198,198,198,198,198,198,62,63,63,64,65,67,68,69,70,72,73,74,75,77,78,79,51,52,52,203,203,203,203,199,196,196,196,196,196,197,193,193,193,198,198,193,197,195,198,194,196,196,196,196,196,193,196,193,197,194,195,195,195,195,192,193,196,193,196,193,193,197,193,198,194,197,196,197,193,197,193,196,193,197,194,197,193,194,193,194,194,195,195,198,197,193,196,193,193,193,193,193,193,193,193,193,198,194,198,198,198,198,193,193,196,192,196,193,197,193,193,195,195,196,196,196,193,197,193,197,193,197,193,197,193,198,193,198,194,198,194,197,194,197,193,197,193,197,193,196,193,197,193,197,193,198,194,198,194,198,194
+,252,252,252,252,252,252,252,252,252,252,107,108,108,109,252,252,108,252,108,252,108,252,109,252,107,109,108,109,108,252,108,252,108,252,108,252,108,252,107,252,108,252,109,252,252,252,252,252,109,252,107,252,107,252,107,252,108,252,252,252,108,252,108,252,108,252,108,252,252,108,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,252,107,252,107,252,107,252,109,252,252,252,252,109,109,109,107,109,107,107,107,109,107,109,107,107,107,107,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,21,21,20,21,21,21,20,21,20,21,21,21,20,21,21,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,21,21,21,21,20,21,20,21,21,21,21,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,21,21,20,21,21,21,20,21,20,21,21,21,20,21,21,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,20,21,20,21,21,21,21,21,20,21,21,21,20,21,21,21,21,21,20,21,139,203,140,209,209,208,208,209,209,208,209,208,208,209,210,210,210,209,210,209,210,209,209,208,209,208,209,211,208,211,209,208,209,209,209,208,209,211,209,211,209,208,208,208,209,208,208,211,211,211,211,211,211,48,49,50,51,52,53,54,55,56,57,32,34,37,38,41,42,45,47,211,211,211,32,34,34,36,37,39,40,42,42,45,45,47,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,21,21,21,20,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,49,49,50,50,196,196,196,196,197,196,197,197,198,197,198,198,198,198,198,198,198,198,198,60,199,192,196,62,63,64,65,65,67,67,69,69,71,199,196,72,203,203,203,203,199,196,196,196,196,196,193,193,198,197,198,197,198,197,195,197,198,194,196,196,196,196,193,196,194,197,194,197,195,195,195,192,193,196,193,193,193,193,197,197,196,194,198,196,196,193,197,197,196,193,197,194,197,193,197,197,194,194,195,195,198,198,194,197,196,197,193,197,193,197,193,197,193,198,194,198,198,194,198,198,193,194,193,196,193,197,193,197,195,197,195,196,197,193,197,193,197,193,197,193,197,193,198,193,198,194,198,194,198,193,197,193,197,193,197,193,197,193,197,193,198,193,198,193,198,194,198,198,198
+,252,252,252,252,109,252,252,252,252,252,252,108,108,108,109,108,252,252,252,252,252,252,252,252,108,107,108,108,108,108,108,108,252,108,109,108,252,252,252,107,252,252,252,252,252,252,252,252,252,252,252,107,252,107,108,107,252,252,252,252,252,252,108,108,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,109,107,109,107,252,252,252,252,252,252,252,252,109,107,109,107,109,107,107,107,107,107,109,107,107,107,21,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,21,20,21,21,21,40,20,48,50,51,54,55,57,59,61,63,63,139,61,62,208,48,209,209,208,208,209,50,51,210,210,210,210,210,209,209,209,209,208,208,208,209,208,208,208,211,211,209,209,209,209,208,208,208,208,211,211,209,208,208,208,208,208,208,208,211,211,205,211,205,32,34,36,37,40,41,43,45,47,32,33,34,35,36,37,38,40,41,42,42,211,211,211,211,211,211,211,211,21,21,21,21,21,21,21,32,37,42,47,21,21,21,21,21,21,21,32,35,38,41,44,47,21,21,21,21,32,46,21,21,21,21,21,21,32,34,37,39,42,44,47,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,48,49,49,49,196,196,196,196,196,197,197,197,197,198,197,198,198,197,198,198,198,198,198,192,196,196,197,197,61,62,63,63,64,65,66,66,199,196,196,196,196,196,196,196,196,196,196,198,198,197,193,193,197,198,198,198,198,198,197,195,195,196,196,196,196,197,197,197,197,195,195,195,197,195,195,193,196,193,196,193,196,193,193,196,193,197,198,196,196,197,193,196,193,197,193,197,197,197,193,198,194,195,195,194,195,194,197,196,196,193,197,193,197,193,197,197,197,194,198,194,197,198,198,198,193,196,196,193,197,197,197,195,195,195,196,196,193,197,196,197,193,197,197,197,193,197,197,197,193,198,198,198,194,197,197,197,193,197,196,196,193,197,197,197,193,198,198,198,194,198,198,194,198
+,252,252,252,252,252,252,252,252,252,108,252,108,108,109,108,109,108,252,108,252,252,252,108,252,107,109,107,109,108,252,108,109,108,252,108,252,108,252,108,252,108,252,108,252,252,252,107,252,107,252,109,108,107,252,107,252,107,252,108,252,108,252,108,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,252,107,252,107,252,107,252,107,252,252,252,109,252,252,109,107,109,107,109,107,107,107,109,107,109,107,109,107,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,21,32,21,34,21,36,20,38,21,41,43,43,20,36,47,36,57,58,59,60,62,63,63,63,209,49,130,130,130,48,210,210,210,210,209,210,209,210,209,209,208,209,208,209,208,208,211,211,208,209,211,209,208,209,208,209,208,209,208,209,209,209,208,208,208,209,208,209,208,211,211,208,211,211,21,215,215,215,215,213,212,215,215,211,214,213,215,212,213,213,213,213,211,211,211,211,212,211,211,211,21,211,21,39,47,21,21,20,21,21,21,21,21,21,21,20,21,21,21,21,21,21,21,20,21,21,21,21,21,21,21,20,21,21,21,21,21,21,21,20,21,21,21,21,21,21,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,49,196,196,196,196,196,197,197,197,196,197,197,198,197,198,197,198,198,198,196,196,196,197,197,198,60,62,61,62,62,199,199,196,192,198,197,198,198,196,196,196,197,196,197,198,193,198,193,198,197,198,198,197,197,195,197,195,196,197,196,197,196,194,196,194,197,195,197,195,195,193,196,193,196,193,196,193,193,196,193,197,197,198,196,197,197,197,193,196,196,197,194,197,197,197,194,198,198,198,195,195,197,194,197,196,197,193,197,193,197,193,198,194,198,194,198,198,197,198,194,197,196,193,196,197,197,198,197,195,197,196,193,197,193,197,193,197,193,197,193,197,193,198,194,198,194,198,194,198,194,197,193,197,193,197,193,197,193,197,193,198,193,198,193,198,198,194,198,198
+,109,252,109,252,252,252,252,252,252,252,108,252,108,108,108,108,109,108,109,252,252,252,252,252,252,108,108,108,108,107,108,107,108,107,252,108,252,107,252,252,252,252,252,252,252,252,252,107,252,107,252,107,108,107,108,107,252,108,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,109,107,252,109,252,252,252,252,252,252,252,252,109,107,109,107,109,107,107,107,109,107,109,107,107,21,21,21,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,20,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,21,21,21,20,21,21,20,21,21,20,21,21,21,21,21,21,21,21,45,21,36,20,37,21,38,38,59,60,62,63,62,32,36,40,43,47,210,210,54,210,210,209,210,209,209,209,209,208,208,208,208,208,208,211,211,211,211,208,211,211,32,33,34,35,35,37,37,38,39,40,41,42,42,44,44,45,46,47,212,215,215,215,213,21,212,21,32,39,46,21,213,213,215,205,214,213,214,21,211,211,213,32,211,39,43,47,47,21,21,21,21,21,21,21,21,21,32,35,38,41,44,47,21,32,37,42,47,44,44,44,44,44,44,44,44,44,44,44,32,36,39,43,47,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,32,32,32,32,33,33,33,34,34,34,35,35,36,36,37,37,37,38,38,39,39,39,40,40,41,41,42,42,43,43,43,44,44,44,45,45,46,46,47,47,48,48,49,49,196,196,196,196,197,196,196,197,197,198,197,197,198,198,198,197,198,198,197,196,196,196,197,197,198,60,61,61,199,192,196,192,197,197,197,197,198,198,198,198,196,197,198,198,198,197,197,197,198,198,198,197,195,197,195,195,194,197,198,198,197,197,197,197,195,197,195,195,195,196,193,196,193,193,193,196,193,196,197,194,198,196,197,196,197,193,196,193,197,194,197,197,198,194,198,194,198,195,195,195,197,196,193,197,196,197,193,197,197,197,194,198,198,198,198,198,198,198,198,197,196,196,193,197,197,198,198,197,196,196,196,196,196,196,197,197,197,197,197,197,197,197,198,197,198,196,198,198,198,197,197,196,196,196,197,197,197,197,197,197,198,198,198,194,198,198,198,194
+,252,109,252,252,252,252,252,252,252,252,252,108,252,252,252,109,108,252,108,252,108,252,109,252,109,108,108,109,108,109,108,252,108,252,108,252,108,252,108,252,108,252,108,109,108,252,252,252,252,252,108,108,108,108,107,252,107,252,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,252,107,252,107,252,107,252,109,252,109,252,252,252,252,252,252,109,107,109,107,107,107,109,107,109,107,109,107,107,21,40,21,41,21,21,21,43,21,44,21,45,21,21,21,32,21,34,21,36,21,21,21,39,21,32,21,35,21,21,21,39,21,41,21,43,21,21,21,47,21,46,21,34,21,21,21,35,21,38,21,41,21,21,21,46,21,32,21,20,21,21,21,32,21,35,21,38,21,21,21,44,21,47,21,36,21,21,21,37,21,38,21,38,21,21,21,39,21,40,21,41,21,21,21,47,21,42,21,34,21,21,21,38,21,40,21,43,21,21,21,47,21,33,21,35,21,21,21,39,21,41,21,43,21,21,21,46,21,37,21,37,21,21,21,38,21,38,21,20,21,21,21,39,21,42,21,45,32,34,35,37,38,40,41,43,44,46,47,210,210,52,52,209,55,57,210,209,210,209,209,208,209,208,208,208,208,208,208,211,211,211,211,208,211,208,208,21,209,215,208,215,213,214,215,21,214,215,212,211,211,211,211,211,37,40,41,44,45,47,213,215,213,215,32,34,35,37,38,40,41,213,211,211,213,211,211,21,211,21,21,21,21,21,32,37,41,47,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,45,45,45,45,45,45,45,45,45,32,35,40,43,47,32,33,32,33,32,32,32,33,33,34,33,34,34,35,35,36,35,36,36,37,37,38,37,39,38,39,39,40,39,41,40,41,41,42,42,43,42,43,43,44,44,45,44,45,45,46,46,47,46,47,48,49,48,49,49,50,50,196,196,196,196,196,196,197,197,198,198,198,197,198,198,198,197,198,198,197,196,197,197,198,197,198,60,192,192,196,192,197,196,197,197,198,197,198,198,198,196,197,197,198,198,198,197,198,197,198,197,198,197,195,195,195,196,198,197,198,196,197,197,195,197,195,195,195,193,193,196,193,197,193,197,193,196,197,197,198,198,196,196,198,197,198,196,196,196,197,197,197,197,198,198,198,198,195,195,194,196,194,197,193,197,193,197,197,198,197,198,194,198,198,197,198,197,198,198,197,196,193,196,197,197,198,198,197,196,196,193,197,193,197,193,197,193,197,193,198,194,198,194,198,193,198,194,198,198,197,193,196,193,197,193,197,193,197,193,198,193,198,194,198,198,198,198,198
+,109,252,109,252,252,252,252,252,252,252,108,252,108,252,108,108,109,108,109,108,252,252,252,252,252,108,108,108,108,108,108,108,109,108,108,108,252,108,252,108,252,252,108,108,252,109,252,252,252,252,109,108,108,108,108,108,252,252,252,252,252,252,108,108,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,252,109,252,109,252,252,252,252,252,252,252,252,109,107,109,107,109,107,107,107,109,109,109,109,109,107,21,21,41,20,21,21,43,21,21,20,45,21,21,21,35,20,21,21,39,21,21,21,34,21,21,21,42,21,21,21,45,21,21,21,39,21,21,21,32,20,21,21,41,21,21,20,33,21,21,21,36,21,21,21,39,21,21,21,33,21,21,21,33,20,21,21,36,21,21,20,38,21,21,21,41,21,21,21,44,21,21,20,47,21,21,21,47,21,21,21,46,21,20,21,45,21,21,21,43,20,21,21,43,21,21,20,44,21,21,21,34,20,21,21,38,21,21,21,41,21,21,21,45,20,21,21,32,21,21,20,32,21,21,21,36,21,21,21,40,21,21,20,33,21,21,34,36,36,37,38,39,39,40,41,42,43,44,44,48,49,50,51,53,54,55,56,57,58,60,60,62,63,48,49,51,51,53,54,55,56,32,33,34,35,215,215,215,215,211,211,215,215,215,215,215,215,215,215,215,215,215,212,215,213,46,46,46,46,46,46,46,46,32,212,21,215,213,214,46,46,46,46,46,46,46,46,46,46,47,21,21,21,21,21,21,47,47,47,46,46,46,46,46,46,46,46,46,46,47,47,47,47,47,32,32,32,32,32,33,33,33,33,33,33,33,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,38,38,38,38,39,39,40,40,40,40,41,41,41,41,42,42,42,42,43,43,44,44,44,44,45,45,45,46,46,46,47,47,47,48,49,49,49,49,50,50,51,51,52,196,196,196,197,196,196,196,197,197,198,197,198,198,197,197,198,197,198,193,197,197,197,197,198,198,198,192,196,192,196,196,197,197,197,197,198,198,198,196,197,197,198,198,198,197,197,197,195,195,197,197,196,197,197,197,198,198,198,198,197,197,197,197,195,197,195,197,196,196,196,193,197,197,196,196,197,194,198,197,198,196,196,197,198,193,197,194,197,196,197,197,198,197,198,195,198,198,198,197,196,196,196,197,196,197,197,197,197,198,197,198,198,197,198,197,198,198,198,197,193,196,193,197,198,198,197,196,196,196,196,196,197,197,197,197,197,197,197,197,197,197,197,197,196,198,198,198,198,197,196,196,197,196,197,197,197,197,197,197,198,198,198,194,198,194,198,198
+,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,108,109,108,109,108,252,108,252,252,108,108,108,108,109,108,109,108,252,108,252,108,252,108,252,108,108,108,108,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,107,107,107,252,107,252,107,252,107,252,109,252,109,252,252,252,252,252,252,109,107,109,107,109,107,107,107,109,107,109,107,109,107,37,21,41,21,44,21,32,21,42,21,46,21,32,21,37,21,42,21,32,21,33,21,35,21,35,21,37,21,37,21,39,21,40,21,41,21,42,21,43,21,44,21,45,21,46,21,47,21,39,21,41,21,42,21,44,21,45,21,32,21,42,21,43,21,33,21,32,21,32,21,47,21,36,21,38,21,39,21,41,21,42,21,43,21,45,21,46,21,47,21,32,21,33,21,34,21,35,21,36,21,37,21,38,21,38,21,39,21,40,21,41,21,42,21,47,21,43,21,44,21,32,21,35,21,37,21,47,21,41,21,40,21,45,21,47,21,41,21,42,21,44,21,45,21,47,21,40,21,32,21,41,203,203,202,42,39,40,40,41,41,42,42,43,42,44,44,45,44,45,45,47,209,41,209,21,209,32,46,21,209,21,208,21,209,215,215,215,215,47,208,32,34,37,39,42,44,47,212,21,211,21,47,21,215,215,213,213,215,47,47,47,47,47,47,47,47,47,47,45,46,21,211,21,211,21,21,47,47,47,47,47,47,47,47,33,32,33,32,33,32,33,32,33,32,33,33,34,33,34,33,34,33,34,34,34,32,33,32,33,33,34,33,35,34,35,35,36,35,36,36,37,36,37,37,38,37,38,38,39,39,40,39,40,40,41,41,42,41,42,42,43,42,43,43,44,43,44,44,45,45,46,45,46,46,47,46,47,100,101,101,102,102,48,48,49,49,50,49,51,50,51,51,199,196,53,52,53,196,196,196,197,196,197,197,198,198,198,198,197,196,197,197,198,197,198,197,198,196,197,197,198,198,197,193,192,196,197,196,197,196,197,197,198,197,198,196,197,197,198,195,195,197,195,195,197,197,197,197,198,197,198,197,198,197,198,197,198,197,198,195,197,195,197,196,196,196,197,197,196,196,197,197,197,197,198,196,196,198,198,198,196,196,197,197,197,197,197,197,198,198,198,195,195,195,198,196,196,197,193,197,196,197,197,198,194,198,194,197,198,197,198,198,198,198,197,197,196,196,197,197,198,196,196,196,197,193,197,196,197,193,197,197,197,194,197,197,198,194,196,197,198,197,196,198,197,193,196,196,197,193,197,197,197,193,198,197,198,193,198,194,198,197,197
+,252,252,109,252,252,252,252,252,252,252,108,252,108,252,108,252,252,108,109,252,109,252,252,252,252,252,108,108,108,108,108,108,108,108,108,108,109,108,252,108,108,108,108,108,108,108,252,108,252,108,252,252,108,108,252,108,252,108,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,252,109,252,252,252,252,252,252,252,252,252,252,109,107,109,107,109,107,107,109,109,107,109,107,107,36,37,37,39,39,32,21,34,34,35,36,37,38,39,21,40,41,42,43,44,44,45,21,35,37,40,42,45,32,33,21,36,37,38,39,41,42,43,21,46,47,40,32,34,35,37,21,40,41,32,34,36,38,41,21,45,47,40,41,41,41,42,21,43,43,43,43,44,44,45,21,32,34,41,37,45,40,44,21,32,47,36,37,40,38,43,21,47,41,38,32,40,33,43,21,46,34,38,35,40,36,42,21,44,38,45,39,47,40,37,21,39,41,40,33,41,32,43,21,44,44,45,32,47,37,33,21,34,47,35,34,36,32,37,21,38,42,39,47,32,47,33,21,35,39,36,40,37,40,38,21,39,210,34,203,202,203,202,203,203,210,202,203,202,203,202,203,36,203,37,204,203,202,203,203,21,203,203,204,203,204,204,204,215,215,21,209,21,213,215,214,21,215,213,215,215,212,215,215,215,32,32,32,32,32,32,32,33,32,33,214,33,33,33,215,214,214,213,214,33,33,33,33,34,33,34,34,34,34,34,34,34,34,34,34,34,34,35,34,35,35,35,35,35,35,35,35,32,32,33,33,33,33,34,34,34,34,35,196,197,197,36,36,37,37,37,37,38,38,38,38,39,39,40,40,40,40,41,41,41,41,42,42,43,43,43,43,44,44,44,44,45,45,45,45,46,46,47,47,47,97,98,98,99,99,100,100,101,48,48,49,49,49,50,50,51,51,51,52,52,52,53,192,196,196,196,198,196,196,197,196,196,196,197,197,198,198,197,197,198,198,196,198,197,197,197,197,198,198,198,198,198,198,192,196,192,196,196,196,196,197,198,197,197,197,198,197,198,195,195,197,195,195,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,196,196,196,197,196,196,196,196,196,196,196,197,196,198,197,198,198,197,196,198,198,196,196,197,196,197,196,197,197,198,197,198,198,198,198,198,198,197,196,196,197,197,197,197,197,197,198,197,197,197,197,198,197,198,198,198,198,197,196,197,197,198,196,196,196,196,196,197,196,197,197,197,197,197,197,197,197,197,197,198,196,197,197,198,196,198,197,196,196,196,196,197,197,197,197,197,197,198,197,198,194,198,198,198,197
+,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,108,109,108,252,108,252,109,252,109,108,109,108,108,109,108,252,108,109,108,252,108,108,108,108,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,108,107,109,107,252,107,252,107,252,107,252,109,252,109,252,252,252,252,252,252,109,107,109,107,109,107,109,107,109,107,109,107,36,21,37,21,39,21,40,21,42,21,43,21,45,21,32,21,36,21,39,21,42,21,46,21,38,21,32,21,34,21,36,21,39,21,42,21,32,21,34,21,36,21,38,21,33,21,35,21,36,21,43,21,40,21,42,21,44,21,46,21,47,21,42,21,43,21,32,21,37,21,42,21,47,21,32,21,34,21,35,21,36,21,37,21,38,21,40,21,46,21,35,21,32,21,33,21,36,21,43,21,36,21,37,21,38,21,39,21,40,21,41,21,42,21,42,21,43,21,44,21,45,21,46,21,47,21,32,21,32,21,32,21,34,21,35,21,37,21,38,21,40,21,41,21,43,21,44,21,46,21,47,21,32,21,32,21,32,38,32,39,32,40,32,42,32,43,32,44,32,45,32,46,32,38,32,34,32,37,32,41,32,45,32,46,32,40,32,41,32,41,32,42,32,35,36,35,36,35,36,35,36,35,36,36,36,36,36,36,36,36,36,36,37,36,37,36,37,36,37,36,37,36,37,36,37,36,37,36,37,36,37,36,37,32,33,32,33,33,34,33,34,34,35,34,35,35,36,35,36,36,37,36,37,37,38,37,196,196,197,197,198,197,197,197,198,40,41,40,41,41,42,41,42,42,43,42,43,43,44,43,44,44,45,44,45,45,46,45,46,46,47,46,47,47,101,101,102,102,96,96,97,97,48,48,49,49,50,50,51,51,52,51,199,199,196,196,196,196,198,198,56,199,196,196,197,197,198,196,197,196,197,196,197,197,198,198,197,197,198,198,198,193,199,199,197,196,197,197,198,197,198,198,198,196,196,196,196,196,196,197,198,197,197,197,198,197,198,197,195,195,195,197,197,197,197,197,198,197,198,197,198,197,198,198,198,197,198,196,196,196,197,197,198,197,198,197,198,196,196,197,197,197,198,198,196,196,196,198,198,197,196,196,196,196,197,197,197,197,198,198,198,198,198,197,198,197,196,196,197,196,197,197,197,196,197,197,198,197,198,197,198,197,198,198,198,197,196,196,198,198,196,196,197,193,197,196,197,193,197,196,197,193,197,197,198,194,198,196,197,194,198,198,196,198,197,196,197,193,197,196,197,193,197,197,198,193,198,197,198,197,198,197,197
+,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,108,109,252,109,108,252,252,252,252,108,252,108,109,108,108,108,108,252,108,108,108,108,108,108,108,108,108,108,108,252,108,252,108,252,252,108,108,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,107,109,107,252,109,252,109,252,252,252,252,252,252,252,107,109,107,109,107,109,107,109,107,109,107,107,35,33,36,35,37,37,39,39,40,41,41,43,42,45,44,47,45,32,33,34,34,35,36,37,37,38,39,40,40,41,42,43,43,44,45,46,46,47,34,40,35,41,41,42,47,44,36,45,37,46,37,47,32,39,36,41,39,43,43,45,47,47,32,38,33,32,35,34,36,37,38,40,34,42,39,44,44,47,34,36,35,37,33,39,36,40,39,41,41,43,44,44,47,45,44,46,45,34,46,35,36,36,32,37,38,38,44,39,34,41,38,42,41,43,45,44,44,45,45,46,46,47,32,35,40,36,41,36,32,36,39,40,38,40,39,42,40,32,41,37,32,42,44,47,33,44,36,42,39,42,42,47,45,46,44,46,44,46,45,46,32,46,33,46,33,32,34,32,34,32,35,32,32,32,35,32,204,203,41,32,209,203,204,215,215,40,35,35,213,36,213,36,35,214,214,215,215,36,212,215,212,36,36,36,36,36,212,36,213,214,213,214,214,37,36,36,36,37,32,32,211,33,211,33,214,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,37,37,38,38,38,38,39,39,39,39,40,40,40,197,197,197,197,197,198,198,198,198,198,198,198,198,198,43,44,44,44,44,45,45,45,45,46,46,46,46,47,47,47,47,97,97,98,98,99,99,100,100,101,48,48,49,49,50,50,50,51,51,52,52,53,53,54,54,55,199,192,196,196,196,196,197,198,198,198,199,196,196,196,196,198,198,198,196,197,196,196,197,197,198,198,197,198,198,198,197,199,199,196,196,198,198,197,197,198,198,198,197,196,196,196,196,196,197,198,198,198,197,197,197,198,198,198,198,197,197,197,197,197,198,197,197,198,197,198,197,198,198,198,198,198,196,196,196,197,197,197,197,198,198,198,197,196,196,197,198,197,197,196,196,197,196,198,198,198,196,197,196,197,196,197,197,198,197,198,198,198,198,198,198,197,196,196,196,197,196,197,196,197,197,197,197,197,197,198,197,198,198,198,198,198,197,197,197,196,196,196,196,197,196,197,196,197,197,197,197,197,197,197,197,198,196,196,197,197,198,198,197,198,197,196,196,197,196,197,197,197,197,197,197,198,198,198,198,198,198,197,197
+,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,108,109,108,109,252,252,252,252,252,108,109,108,109,252,108,252,108,252,108,108,108,109,108,108,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,252,252,252,109,252,252,252,252,252,252,252,252,252,109,107,107,107,107,252,107,252,107,252,107,252,109,252,109,252,252,252,252,252,107,109,107,109,107,109,107,109,107,107,107,107,21,41,21,41,21,41,21,33,21,35,21,36,21,38,21,39,21,41,21,43,21,44,21,46,21,47,21,34,21,37,21,39,21,42,21,45,21,47,21,41,21,41,21,41,21,41,21,41,21,41,21,41,21,41,21,41,21,41,21,41,21,41,21,41,21,36,21,43,21,41,21,41,21,33,21,34,21,35,21,36,21,37,21,38,21,39,21,40,21,41,21,41,21,43,21,43,21,45,21,45,21,47,21,47,21,47,21,32,21,37,21,41,21,45,21,47,21,36,21,36,21,36,21,36,21,37,21,37,21,37,21,42,21,47,21,47,21,35,21,41,21,47,21,47,21,47,21,47,42,32,43,32,44,32,44,32,45,32,45,32,46,32,47,32,47,40,37,40,38,47,39,47,32,47,33,32,34,47,35,32,36,32,37,32,38,35,35,35,34,35,34,35,34,35,35,35,36,37,36,36,36,37,36,32,32,33,32,33,33,34,33,34,34,35,34,35,34,35,35,36,35,36,36,37,36,37,36,37,37,38,37,38,38,39,38,39,39,40,39,40,40,41,40,41,41,42,41,42,41,42,42,197,196,197,196,197,197,198,197,198,197,198,197,198,198,198,197,198,46,47,46,47,47,47,102,103,96,97,98,99,100,101,102,96,96,48,48,49,49,50,50,51,51,52,52,53,53,54,53,55,55,56,55,56,56,58,196,192,196,196,196,196,197,198,197,198,198,198,192,196,196,196,196,197,197,198,197,198,196,196,196,197,197,198,198,198,197,198,198,199,196,196,196,197,197,198,198,198,197,197,198,197,196,197,196,196,197,197,197,198,197,198,197,197,197,198,197,198,197,197,197,197,198,198,197,198,197,198,197,198,198,198,198,198,198,196,196,197,197,198,197,198,197,198,197,196,196,197,198,198,197,196,196,197,197,198,197,198,198,198,196,197,197,197,197,198,198,198,198,198,198,198,197,198,196,197,196,197,196,197,196,197,197,197,197,197,197,198,197,198,197,198,197,198,198,198,197,196,196,197,196,197,196,197,196,197,196,197,193,197,197,198,197,198,197,196,193,197,197,198,198,197,198,197,193,196,196,197,196,197,197,198,193,198,197,198,197,198,197,197,197,197
+,252,252,109,252,252,252,108,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,109,252,252,109,252,252,108,252,108,252,108,252,108,108,108,108,108,108,108,108,108,108,108,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,109,109,252,109,252,252,252,252,252,252,252,252,252,107,109,107,109,107,109,107,109,107,107,107,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,32,21,36,21,40,21,43,21,47,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,32,21,42,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,44,21,32,33,34,21,36,21,37,21,39,21,41,21,43,21,44,21,46,21,47,21,32,21,32,21,32,21,32,21,32,21,32,21,32,44,32,46,36,44,36,45,36,45,36,46,36,47,34,203,46,46,47,47,47,40,47,203,47,203,47,34,34,34,35,34,35,34,35,34,35,34,35,32,32,32,33,33,33,33,33,33,34,34,34,34,35,35,35,35,35,35,36,36,36,36,36,36,37,37,37,37,38,38,38,38,38,38,39,39,39,39,39,39,40,40,40,40,41,41,41,41,41,41,42,42,42,42,43,42,43,43,43,43,44,44,44,196,197,197,197,197,197,197,197,197,198,197,198,198,198,198,198,197,198,198,198,101,101,102,102,102,103,103,96,48,49,49,50,50,51,51,52,52,53,53,53,54,54,55,55,56,56,57,57,58,58,59,59,59,196,196,196,192,196,196,197,197,197,197,197,197,198,198,196,196,196,196,196,197,198,198,197,197,198,198,198,198,197,197,197,198,198,198,198,198,196,196,196,196,197,197,197,198,198,197,198,197,196,196,197,197,198,197,197,198,198,198,198,198,197,197,197,198,198,197,198,197,197,197,198,198,197,197,197,197,198,198,198,198,198,198,196,196,197,197,197,198,198,196,196,196,196,197,198,198,198,197,196,196,197,197,197,197,198,197,198,197,198,198,197,197,197,197,198,197,198,198,198,198,198,197,196,196,196,196,197,196,197,197,197,197,197,197,197,197,198,198,198,198,198,197,197,197,198,196,196,196,196,196,197,196,197,197,197,197,197,197,197,197,197,197,197,196,197,197,197,197,198,197,198,197,196,196,196,196,197,197,197,197,197,197,198,198,198,198,197,197,197,198
+,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,108,252,108,252,252,252,108,108,108,108,252,108,109,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,252,107,252,107,252,107,252,107,252,109,252,109,252,252,252,252,109,107,109,107,109,107,109,107,109,107,107,34,32,35,32,37,32,38,32,39,32,41,32,42,32,32,32,33,32,34,32,36,32,37,32,38,32,39,32,40,32,41,32,32,32,34,32,35,32,37,32,38,32,40,32,41,32,43,32,44,32,46,32,36,32,38,32,40,32,42,32,44,32,47,32,39,32,42,32,45,32,32,32,46,32,35,32,36,32,37,32,38,32,39,32,35,32,41,32,46,32,35,32,36,32,32,32,33,32,34,32,32,32,32,32,33,34,34,36,35,39,35,42,36,45,37,47,38,32,38,32,21,32,21,32,21,32,21,32,21,32,21,32,21,47,21,46,21,47,21,46,21,40,21,40,21,40,46,40,37,42,38,40,39,40,32,40,32,40,39,40,46,35,35,35,35,35,35,35,35,35,35,35,35,32,32,33,32,33,33,34,33,34,33,34,34,35,34,35,34,35,35,36,35,36,36,37,36,37,36,37,215,38,37,38,37,38,38,212,38,39,39,215,39,212,39,40,211,41,40,41,40,41,42,42,42,42,42,43,42,43,42,43,43,44,43,44,43,44,44,45,44,45,45,46,45,46,45,197,196,197,196,197,197,197,197,198,197,198,197,198,197,198,198,198,197,198,197,198,198,198,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57,58,58,59,59,60,60,61,61,62,196,196,196,196,196,196,196,196,196,197,196,198,197,198,198,196,196,196,196,196,196,198,197,198,197,198,197,198,197,198,197,198,198,197,197,198,198,198,198,196,196,197,196,196,196,197,197,198,197,198,197,198,197,198,196,197,197,198,198,198,197,198,197,198,197,197,197,198,198,198,197,197,197,197,198,198,197,198,197,198,197,198,197,198,198,196,196,197,197,198,197,196,196,196,196,197,197,198,197,198,197,196,196,197,196,197,197,197,197,198,197,198,198,197,196,197,197,198,197,198,197,198,198,198,197,196,196,197,196,197,196,196,196,197,197,198,198,198,197,198,198,198,197,198,197,198,196,196,196,197,196,197,196,197,196,197,196,197,196,197,197,197,197,198,197,198,197,196,196,197,197,198,198,198,198,197,196,197,196,197,196,197,197,198,197,198,197,198,198,197,198,197,197,197
+,109,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,252,108,252,108,109,108,108,108,108,108,108,108,108,108,108,252,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,107,252,109,252,109,252,252,252,252,252,252,252,252,252,252,109,107,109,107,109,107,109,107,107,107,107,34,35,34,35,35,35,36,35,36,35,37,35,38,35,38,35,39,35,40,35,40,35,41,35,42,35,42,35,43,35,44,35,45,35,45,35,46,35,46,35,41,36,41,36,42,36,42,36,43,36,43,36,44,36,44,36,32,36,36,36,40,36,45,36,40,36,43,36,46,36,36,36,37,36,37,36,38,36,39,36,40,36,46,36,32,36,32,36,33,36,33,36,34,36,34,36,35,36,35,36,32,36,34,36,37,36,32,36,33,36,34,36,35,45,36,40,37,40,38,40,39,40,32,40,34,40,35,40,21,40,21,32,39,32,41,32,42,32,43,47,45,47,46,47,33,47,34,47,35,43,37,43,33,43,35,43,37,43,39,33,35,32,32,33,33,33,33,33,33,34,33,34,34,34,34,35,35,35,35,36,36,36,203,36,36,37,36,204,37,37,37,38,215,38,215,39,39,39,39,39,39,40,39,40,40,40,40,41,41,41,41,42,42,42,42,42,42,43,43,43,43,43,43,44,44,44,44,45,45,45,197,45,45,46,46,46,46,46,46,47,47,47,99,197,196,197,196,197,197,197,197,197,197,197,197,198,197,198,197,198,198,198,198,198,198,198,198,198,198,198,53,54,54,55,55,56,57,57,57,58,59,59,60,61,61,61,62,63,63,64,64,66,66,196,196,196,196,196,196,196,196,196,197,198,196,197,197,198,198,197,197,196,196,196,196,197,196,197,197,198,197,198,198,198,197,197,197,198,198,198,198,198,198,198,198,198,196,196,196,197,197,197,197,198,197,198,198,198,198,198,198,198,196,197,198,198,197,197,197,199,196,197,197,198,197,197,197,198,198,198,198,198,197,197,197,198,198,198,198,198,198,198,196,196,197,197,197,196,196,197,196,197,197,198,198,198,197,197,196,196,196,197,197,197,197,197,197,198,198,198,197,197,197,197,197,198,198,198,198,198,198,196,196,197,197,197,197,197,197,198,197,198,198,198,197,198,197,197,196,196,196,196,196,196,198,196,196,196,196,196,196,197,197,197,197,197,197,197,197,197,197,197,197,198,196,196,197,197,198,198,197,198,197,196,196,197,196,197,197,197,197,197,197,198,198,198,198,196,197,198,197
+,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,109,108,108,252,108,108,108,252,108,109,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,252,107,252,107,252,107,252,107,252,107,252,252,252,109,252,252,252,107,109,107,109,107,109,107,109,107,107,107,38,34,38,35,38,35,38,36,38,37,38,38,38,38,38,39,38,40,38,40,38,41,38,42,38,42,38,43,38,44,38,45,38,45,38,46,38,47,38,39,40,39,40,39,40,39,40,40,40,40,40,41,40,32,40,33,40,34,40,36,40,37,40,38,40,39,40,41,40,42,40,43,40,45,40,46,40,44,40,46,40,43,40,45,40,32,40,33,40,33,40,34,40,35,40,32,40,32,40,33,40,34,40,35,40,32,40,33,40,34,40,36,40,32,40,33,44,35,44,37,44,33,44,36,45,39,45,42,45,45,40,37,40,38,40,40,40,41,40,42,32,43,32,44,32,45,32,47,32,32,47,34,47,35,47,36,47,37,47,39,34,34,35,36,38,38,40,40,42,42,44,45,46,47,35,35,32,35,38,41,44,46,37,37,37,37,38,37,38,38,39,38,39,39,40,39,40,39,40,40,41,40,41,41,42,41,42,42,43,42,43,43,44,43,44,44,45,44,45,45,46,45,46,46,47,46,47,47,197,197,198,198,97,96,98,97,98,98,99,197,198,197,198,198,198,196,197,197,197,197,197,197,198,197,198,197,198,197,198,198,198,198,198,197,198,197,198,198,198,198,59,59,60,60,61,61,62,62,63,89,90,89,90,90,91,64,66,66,69,69,196,196,196,196,196,196,196,196,198,197,198,197,198,197,196,197,198,197,198,197,196,196,197,196,197,196,197,197,198,197,198,197,198,198,198,197,198,197,198,197,198,198,198,198,198,196,196,196,197,196,197,197,197,198,197,197,198,198,198,197,198,198,198,197,198,197,198,199,199,196,193,197,197,197,198,197,197,197,198,197,198,198,198,197,198,197,198,197,198,198,198,196,196,196,197,197,196,196,197,196,197,197,198,197,198,198,198,196,196,196,197,196,197,197,198,197,198,198,198,196,197,197,198,197,198,197,198,197,198,198,198,196,197,196,197,197,198,197,198,197,198,197,198,196,196,196,196,196,196,196,196,196,198,198,196,196,197,197,198,196,197,196,197,196,197,196,197,196,197,197,198,197,198,197,196,196,197,197,198,198,198,198,198,196,196,196,197,196,197,197,198,197,198,197,198,198,196,197,198,197,198
+,109,252,108,252,108,252,108,252,108,252,108,252,252,252,252,108,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,108,108,108,108,108,108,108,108,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,252,109,252,109,252,252,252,252,252,252,252,252,107,107,109,107,109,107,109,107,109,107,107,107,41,35,41,35,41,36,41,37,41,38,41,39,41,39,41,40,41,41,41,42,41,43,41,43,41,44,41,45,41,46,41,46,41,39,41,40,41,42,41,43,43,45,43,46,43,39,43,39,43,39,43,32,43,33,43,33,43,34,43,35,43,36,43,37,43,38,43,38,43,39,43,40,43,41,43,42,43,42,43,43,43,44,43,45,43,46,43,46,43,45,43,45,43,45,43,45,43,46,43,46,43,46,43,47,43,47,43,32,43,34,43,35,43,36,32,32,34,33,35,34,37,35,39,36,40,37,42,37,44,38,45,39,47,40,47,41,47,32,46,35,46,38,32,41,32,44,32,47,32,34,32,35,32,36,32,37,32,38,32,38,32,39,32,40,32,41,32,42,32,43,32,32,33,33,33,33,34,34,35,32,33,34,35,35,37,37,38,39,40,41,42,42,44,44,45,46,47,42,43,213,44,44,44,44,45,45,46,46,47,47,98,98,99,99,214,99,100,214,100,100,101,101,101,101,101,196,197,197,197,197,198,198,103,103,197,197,197,197,197,197,197,197,197,197,198,197,198,197,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,128,128,129,130,130,88,88,89,89,89,89,89,89,90,64,66,68,70,72,75,77,79,50,196,196,196,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,197,198,198,198,198,198,197,198,198,198,198,198,198,198,198,196,196,197,198,196,197,197,197,197,198,197,198,197,198,198,198,198,196,196,196,199,199,196,196,197,196,197,197,198,194,198,198,197,197,198,198,198,197,197,197,198,198,198,198,198,196,196,196,197,197,197,196,196,196,196,197,197,197,198,198,198,196,196,196,197,197,197,197,197,197,198,198,198,197,197,197,197,197,198,197,198,198,198,198,198,198,197,197,197,197,198,197,198,198,198,196,196,196,196,196,196,196,196,196,197,197,198,196,196,197,197,197,198,198,196,196,196,196,197,197,197,197,197,197,197,197,197,197,196,196,197,197,197,198,198,197,198,197,196,196,196,196,197,197,197,197,198,198,198,198,196,197,197,197,198,198
+,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,108,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,108,108,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,252,107,252,107,252,107,252,107,252,109,252,252,252,252,252,107,109,107,109,107,109,107,107,107,107,107,107,32,44,33,44,34,44,35,44,36,44,37,44,38,44,39,44,41,44,42,44,43,44,44,44,45,44,46,44,44,44,46,44,37,44,38,44,39,44,40,47,41,47,42,47,43,47,44,47,45,47,46,47,32,47,32,47,33,47,34,47,35,47,35,47,36,47,37,47,37,47,38,47,39,47,39,47,40,47,41,47,42,47,42,47,43,47,44,47,45,47,45,47,46,47,47,47,36,47,37,47,38,47,38,47,39,47,40,47,34,47,39,47,44,47,32,47,33,47,34,47,35,47,35,32,36,32,37,32,38,32,39,32,40,32,41,32,32,32,33,32,35,36,36,36,38,36,39,36,41,36,42,36,44,36,45,36,47,36,37,36,38,36,38,36,39,36,40,36,41,36,41,32,42,32,43,32,44,32,45,32,32,33,33,34,34,35,34,36,35,37,36,38,37,39,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,99,99,100,99,100,100,101,100,101,196,197,196,197,196,197,197,198,197,198,197,198,197,198,197,197,197,198,197,198,197,198,197,198,197,198,197,198,197,198,197,198,198,198,198,134,134,136,136,138,139,141,143,143,198,128,129,129,130,64,66,68,69,72,73,76,77,79,64,67,69,72,74,77,79,79,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,198,198,198,198,198,198,198,198,198,198,198,198,198,197,198,197,198,198,196,198,198,198,198,198,197,196,197,197,197,198,197,197,197,197,197,197,198,197,198,198,198,198,197,197,199,196,196,196,196,196,197,197,198,197,198,197,198,197,198,197,198,198,197,197,198,197,198,198,198,198,196,196,197,196,197,196,197,196,196,197,198,197,198,197,198,197,196,196,197,196,197,197,198,197,198,197,198,196,197,197,197,197,198,197,198,197,198,198,198,197,198,196,197,197,198,197,198,198,198,196,196,196,196,196,196,196,197,196,197,197,198,196,197,196,197,197,198,197,198,196,197,196,197,196,197,196,197,196,197,197,197,197,198,196,197,196,197,197,198,198,198,198,196,196,197,196,197,196,197,197,198,197,198,197,196,197,197,197,198,198,198
+,109,252,108,252,108,252,108,252,252,252,108,252,252,252,252,252,108,108,108,108,109,252,109,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,108,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,107,107,107,252,252,252,252,252,252,252,252,252,107,107,107,109,107,109,107,109,107,109,107,107,107,107,32,47,33,47,33,47,33,47,33,47,34,47,32,47,34,47,35,47,36,47,37,47,39,47,40,47,41,47,42,47,44,47,45,47,46,47,39,47,40,32,40,32,41,32,42,32,43,32,43,32,44,32,45,32,46,32,32,32,33,32,34,32,35,32,36,32,37,32,37,32,39,32,39,32,40,32,41,32,42,32,43,32,44,32,45,32,46,32,47,32,32,32,34,32,35,32,37,32,39,32,41,32,43,32,44,32,46,32,43,32,45,32,46,32,33,32,33,32,35,32,35,36,37,36,37,36,39,36,40,36,41,36,42,37,43,37,32,37,33,37,34,40,35,40,36,40,37,39,38,40,39,40,40,40,42,39,43,40,44,40,45,40,46,39,47,40,39,40,39,40,40,37,41,37,42,37,42,37,43,32,44,32,45,32,45,32,46,32,38,32,32,33,33,34,35,35,36,36,37,37,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,197,196,196,196,196,197,196,134,135,136,136,138,138,32,33,35,36,37,38,40,41,42,43,45,46,47,136,40,139,140,141,142,143,128,129,130,131,132,133,135,135,137,138,139,140,142,143,143,143,128,129,129,128,64,64,65,65,66,66,67,67,67,68,68,69,69,69,70,70,71,71,72,72,72,73,73,74,74,74,75,75,76,76,77,77,77,78,78,79,79,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,197,196,196,197,197,197,197,198,197,197,197,197,198,197,198,198,196,192,196,196,197,196,196,196,197,197,197,197,198,198,198,198,198,198,198,198,197,197,197,197,198,198,198,198,196,196,196,196,197,197,196,196,197,196,197,197,198,198,198,198,198,196,196,196,197,197,197,197,198,198,198,197,197,197,197,197,198,197,198,197,198,198,198,198,198,197,197,197,198,198,198,197,198,198,196,196,196,196,196,196,197,197,197,197,196,196,196,196,197,197,198,198,198,197,197,196,197,197,197,196,198,198,197,197,197,197,197,196,196,197,197,197,198,198,198,197,198,196,196,196,197,197,197,197,198,198,198,198,196,196,197,197,198,197,198,198
+,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,109,108,252,108,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,108,108,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,109,107,252,107,252,107,252,107,252,109,252,107,252,252,107,107,109,107,109,107,109,107,109,107,107,107,107,107,32,32,32,32,32,33,32,33,32,33,32,33,32,33,32,33,32,32,32,32,32,33,32,33,32,36,32,38,32,41,32,44,32,47,32,38,32,39,35,39,35,40,35,41,35,41,35,42,35,43,35,43,35,44,35,45,35,46,35,32,35,33,35,33,35,34,35,35,35,36,35,37,35,38,35,38,35,39,35,40,35,41,35,42,35,43,35,44,35,45,36,45,36,46,36,41,36,42,36,42,36,42,36,42,36,42,36,42,36,43,36,43,37,43,37,43,37,32,37,33,37,35,40,36,40,38,40,39,40,40,40,41,40,43,42,44,42,45,42,47,44,32,43,33,44,34,43,35,44,36,43,33,44,37,43,41,44,45,43,41,44,42,43,43,44,44,43,45,44,46,42,47,32,46,34,46,35,32,37,34,38,37,40,40,41,43,43,45,44,32,46,46,47,38,39,38,39,38,39,38,39,38,39,32,33,33,35,35,36,36,38,38,39,39,41,41,42,42,44,44,44,32,33,33,34,34,35,35,37,36,38,38,39,39,40,40,41,41,43,42,44,44,45,45,46,46,47,59,60,61,63,63,48,49,50,50,52,52,54,54,55,56,57,57,59,59,61,61,62,63,64,64,64,65,65,66,66,66,67,67,67,68,68,68,69,69,70,70,70,70,71,71,72,72,70,69,70,70,71,70,72,71,72,72,73,72,74,73,74,74,75,74,75,75,76,75,76,76,77,76,77,77,78,78,79,78,79,219,219,219,196,196,196,196,196,196,196,196,196,197,197,198,198,197,198,198,198,198,196,198,197,196,197,196,196,196,197,196,197,197,198,198,198,197,198,198,198,197,198,198,197,197,198,197,198,197,198,196,196,196,197,197,198,196,196,196,197,196,197,197,198,197,198,196,197,196,197,197,197,197,198,197,198,198,197,197,197,197,197,197,198,197,198,198,198,198,198,198,197,196,197,197,198,198,198,197,196,196,196,196,197,196,197,197,198,197,198,196,197,196,197,197,198,197,198,198,198,197,198,197,198,197,196,197,198,197,198,196,197,198,196,196,197,197,198,197,198,198,198,198,196,196,197,196,197,197,198,197,198,198,196,196,197,197,198,197,198,198,198
+,252,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,108,108,108,108,109,252,109,108,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,108,108,108,108,108,108,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,109,107,252,107,252,252,252,252,252,252,252,107,107,107,109,109,109,109,109,107,109,107,109,107,107,107,35,33,35,34,35,39,35,44,35,33,35,34,35,34,35,34,35,34,35,32,35,33,35,34,35,34,35,35,35,36,35,37,35,37,35,38,35,39,37,40,37,41,37,41,37,32,37,35,37,37,37,40,37,43,37,45,37,47,38,32,38,33,38,34,38,34,38,35,38,36,38,37,38,37,38,38,38,39,38,40,38,41,38,41,38,42,38,43,39,44,40,44,39,45,40,46,39,47,40,42,39,42,40,43,39,43,40,43,39,43,42,43,42,44,42,44,42,44,42,44,43,44,43,33,43,35,43,37,43,39,43,42,47,44,47,46,47,46,47,46,47,32,47,33,47,34,47,35,47,35,47,36,47,37,47,38,47,38,47,39,47,40,47,41,47,41,47,42,47,43,47,44,47,45,47,45,47,46,47,47,47,45,47,40,40,40,41,40,32,32,33,33,34,34,34,35,35,35,36,36,37,37,37,38,38,38,39,35,36,39,40,40,41,41,42,42,43,43,43,44,43,44,44,44,45,44,45,46,44,45,46,46,46,46,46,47,102,47,103,96,103,98,96,98,98,97,97,54,98,55,99,56,57,58,58,58,102,100,54,55,55,56,56,57,57,58,58,58,62,62,62,62,63,63,65,64,63,66,63,65,65,64,65,66,65,66,67,67,68,66,68,69,70,70,71,71,72,72,70,70,70,70,71,71,72,72,72,72,73,73,74,74,74,74,75,75,76,76,76,77,77,77,78,78,78,79,79,196,196,196,196,196,197,197,197,197,197,197,198,198,198,198,198,197,198,196,196,196,196,196,196,196,197,196,197,196,197,197,198,197,198,197,198,198,198,198,219,219,219,219,219,219,219,219,219,196,196,196,197,197,197,196,196,196,196,197,197,197,197,197,198,198,196,196,197,197,197,197,197,197,198,198,197,197,197,197,197,197,198,197,198,198,198,198,198,198,198,197,197,197,198,198,198,198,196,196,196,196,197,197,197,197,198,198,198,196,196,196,197,197,197,197,198,198,198,197,197,197,197,197,196,197,197,198,197,196,197,197,197,198,198,197,197,197,198,198,198,198,198,196,196,196,197,197,197,197,198,198,196,196,197,197,198,197,198,198,198,198
+,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,109,108,252,108,252,252,252,108,252,108,252,252,252,252,252,252,252,252,108,252,252,108,252,252,108,108,252,108,109,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,252,252,107,109,107,109,107,109,109,109,107,109,107,107,107,107,34,37,35,37,37,37,38,37,40,37,41,37,43,37,44,37,46,37,34,37,34,38,35,38,35,38,32,38,33,38,35,38,36,38,37,38,38,40,39,40,40,40,41,40,32,40,33,40,34,40,35,40,36,40,36,40,37,40,38,41,39,41,40,41,41,41,42,41,43,41,44,41,44,41,45,41,46,41,38,41,39,41,40,41,40,41,41,41,42,44,43,43,43,44,44,43,45,44,45,43,46,44,47,43,43,44,44,43,44,44,44,47,44,47,44,47,45,47,45,47,45,47,45,47,45,47,46,47,46,47,46,47,39,39,39,39,39,39,39,47,42,47,32,47,33,47,34,47,34,47,35,47,36,47,37,47,37,47,38,47,39,33,32,33,32,33,33,34,33,34,34,35,34,35,35,36,35,36,35,36,36,37,36,37,37,38,37,38,37,38,38,39,38,39,39,40,39,40,40,41,40,41,40,41,41,42,38,39,41,42,36,42,43,40,42,41,43,43,44,43,44,45,44,45,44,46,46,45,45,45,46,45,47,46,45,47,45,96,46,46,46,47,98,99,101,99,100,101,50,52,50,53,53,53,54,55,55,57,102,100,54,55,55,56,56,57,57,58,58,58,58,58,61,62,61,61,62,62,62,62,62,64,62,63,65,66,65,65,66,67,67,67,68,67,68,70,70,70,70,71,71,72,72,69,69,70,70,71,71,72,72,73,73,74,74,75,75,76,76,77,77,78,78,79,79,79,196,196,196,197,196,197,196,197,197,198,197,198,197,198,198,198,197,198,198,196,196,197,196,197,196,197,197,197,197,197,197,197,197,197,197,198,197,198,198,198,198,197,219,219,219,219,219,219,196,196,196,196,196,197,197,196,196,196,196,197,197,198,197,198,198,198,196,197,196,197,196,197,197,198,197,198,196,197,197,197,197,198,197,198,197,198,198,198,197,198,198,197,197,198,198,198,196,197,196,196,197,198,197,196,196,197,197,198,198,196,196,197,196,197,197,198,197,198,198,198,197,198,197,196,196,198,198,198,196,197,196,197,197,198,198,197,197,198,197,198,198,198,197,198,196,197,196,197,197,198,197,198,196,197,196,198,197,198,198,198,198,198
+,252,252,109,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,108,108,108,108,109,252,109,108,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,252,252,252,108,108,108,108,108,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,107,107,252,107,252,107,252,252,252,252,252,252,107,107,109,109,109,109,109,107,109,107,109,107,107,107,40,34,40,35,40,36,40,36,40,37,40,38,40,39,40,39,40,40,40,41,41,42,41,42,41,43,41,44,41,45,41,46,41,47,41,37,41,32,42,33,42,33,42,34,42,35,42,35,42,32,42,33,42,34,42,34,42,35,44,36,44,37,44,38,44,39,44,39,44,40,44,41,44,42,44,42,44,43,44,44,44,45,44,45,44,46,44,47,47,43,47,43,47,44,47,44,47,45,47,46,47,47,47,46,47,46,47,46,47,47,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,33,33,33,33,34,33,34,34,34,34,34,34,35,35,35,35,36,35,36,36,36,36,36,36,37,37,37,37,37,37,38,38,38,38,38,38,39,39,39,39,39,39,40,40,40,40,40,40,41,41,41,41,41,41,42,42,42,42,42,41,42,39,42,43,40,43,40,43,43,43,42,44,44,44,44,44,45,44,45,45,45,45,45,45,45,45,46,45,46,46,46,47,99,99,100,101,100,101,101,101,47,100,101,101,101,101,101,101,101,102,100,54,55,102,100,54,55,55,56,55,56,57,57,58,58,58,58,58,61,61,61,61,61,62,62,62,63,63,63,63,63,63,64,63,65,63,65,66,68,68,69,69,70,64,70,70,71,71,72,72,64,65,66,67,68,69,70,70,72,72,73,74,75,76,77,78,79,196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,198,198,198,198,198,196,196,196,197,197,197,197,197,198,197,198,198,198,198,198,198,198,198,198,198,198,196,196,196,196,219,219,219,219,198,198,198,196,196,196,196,197,197,197,197,198,198,198,198,196,196,196,196,197,197,197,197,198,198,197,197,197,197,197,197,198,198,198,198,198,198,198,196,197,197,198,198,198,198,196,196,196,196,198,197,196,196,197,197,198,198,198,196,196,196,197,197,197,197,198,198,198,197,197,197,196,197,198,197,198,197,196,196,197,197,197,197,198,197,197,197,198,198,198,197,198,198,196,196,197,197,197,198,198,196,196,196,197,197,198,197,198,197,198,198
+,252,252,252,109,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,108,252,252,109,108,252,108,252,252,252,108,252,252,252,252,252,252,252,108,252,252,252,252,108,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,109,252,107,107,107,252,107,252,107,252,107,252,107,252,107,252,252,252,107,107,107,109,107,109,109,109,107,109,107,109,107,109,33,42,34,42,34,42,35,42,36,42,36,42,37,42,38,42,38,42,39,42,40,44,40,44,41,44,42,44,42,44,43,44,44,44,44,44,45,45,32,45,33,45,33,45,34,45,35,45,35,45,36,45,37,45,37,45,38,45,39,47,39,47,32,47,34,47,35,47,37,47,39,47,41,47,43,47,45,47,47,47,46,47,47,47,41,47,42,47,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,34,33,34,33,34,33,34,33,34,33,34,34,34,34,34,34,34,33,34,34,34,34,33,34,33,34,33,34,33,34,34,35,34,35,35,35,35,35,35,36,35,36,36,36,36,37,36,37,36,37,37,37,37,38,37,38,37,38,38,39,38,39,38,39,38,39,39,40,39,40,39,40,39,40,40,41,40,41,40,41,40,41,41,42,41,42,41,42,41,42,42,43,42,42,43,42,42,42,43,42,43,43,42,44,43,43,43,44,43,44,44,43,44,45,44,45,44,45,45,45,46,45,45,46,45,46,46,46,46,46,47,100,101,101,47,101,100,47,100,100,101,47,101,100,47,100,100,100,101,100,102,101,47,102,102,101,101,99,99,54,102,99,56,56,102,56,102,57,57,61,58,58,58,61,61,61,61,61,61,61,63,63,63,63,63,63,64,61,64,61,65,67,68,67,68,69,69,70,70,70,70,71,71,72,72,75,73,72,76,64,78,76,77,196,196,196,196,197,196,197,196,197,197,198,197,198,197,198,197,198,198,198,197,198,196,197,196,197,196,197,196,197,197,197,197,198,197,197,197,197,198,198,198,198,198,198,197,198,198,198,197,197,197,196,219,219,219,219,219,219,219,219,219,198,196,197,197,198,198,198,197,198,196,197,196,197,197,198,197,198,196,197,196,197,197,198,197,198,197,198,197,198,198,198,196,197,197,198,198,198,198,196,196,196,196,196,197,196,196,197,197,198,197,198,196,196,196,197,196,197,197,198,197,198,197,198,197,196,197,198,197,198,196,197,196,197,197,198,197,198,198,198,197,198,197,198,198,198,198,198,196,197,197,198,197,198,197,196,196,197,196,198,197,197,197,198,198,198
+,252,252,252,252,108,252,108,252,108,252,108,108,108,252,252,252,252,252,252,252,252,252,108,252,252,252,252,108,109,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,252,252,252,107,107,109,252,107,252,107,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,107,252,107,252,252,252,252,252,252,252,252,107,107,107,107,109,109,109,109,109,107,109,107,107,107,44,33,45,34,44,35,45,35,44,36,45,37,44,37,45,38,44,39,45,39,47,40,47,41,47,41,47,42,47,43,47,44,47,44,47,45,47,46,47,46,47,32,47,33,47,34,47,35,47,35,47,36,47,37,47,38,47,39,32,32,32,32,32,32,32,32,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,33,34,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,37,42,47,35,36,35,36,35,36,35,36,36,36,36,37,36,37,37,37,37,37,37,37,37,38,37,38,38,38,38,38,38,38,38,39,39,39,39,39,39,39,39,40,39,40,40,40,40,40,40,40,40,41,40,41,41,41,41,41,41,41,41,42,42,42,42,42,42,42,42,43,42,43,43,43,43,43,43,43,43,43,42,43,42,43,43,43,44,44,44,43,44,44,44,45,44,45,45,45,45,45,45,45,46,46,45,46,46,46,46,46,47,47,47,47,46,100,100,100,46,100,47,47,101,47,101,101,47,101,100,47,100,100,100,101,100,102,101,47,102,102,101,101,99,99,54,102,99,56,56,102,56,56,57,58,57,58,58,60,60,60,61,61,61,61,61,61,61,61,62,63,63,63,63,61,65,61,68,61,69,69,70,70,70,70,71,71,72,72,69,74,68,70,196,196,196,196,196,197,197,197,197,197,197,198,197,198,198,198,198,198,198,198,198,196,196,196,196,197,196,197,197,197,197,197,197,197,197,198,197,198,198,197,197,197,197,196,198,198,198,198,197,198,197,197,197,196,196,196,196,196,196,219,219,219,219,219,219,219,219,219,219,219,219,219,219,197,197,198,198,198,198,196,196,197,196,197,197,197,197,198,198,198,198,198,198,198,196,197,198,198,198,198,196,196,196,196,197,198,196,196,197,197,197,198,198,198,196,196,196,197,197,197,197,198,198,198,197,196,197,198,197,196,196,197,196,197,197,197,197,198,198,198,197,198,197,198,198,198,197,198,198,196,197,197,197,198,198,198,196,196,196,197,197,197,197,198,198,198,198
+,252,252,252,108,252,109,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,252,252,107,109,107,109,107,107,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,109,109,107,107,107,107,252,107,252,107,252,107,252,107,252,107,252,252,109,107,109,107,109,107,109,107,109,107,109,107,109,107,47,38,47,32,47,33,47,34,47,35,47,36,47,37,47,38,47,39,47,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,41,43,41,42,41,42,42,44,45,47,32,32,32,32,32,32,32,32,34,33,34,33,34,32,33,36,37,39,40,42,43,46,47,33,34,33,34,33,34,33,34,33,34,33,34,33,34,34,35,35,35,32,37,42,47,35,35,35,35,35,35,35,36,35,36,35,36,35,32,35,37,40,42,45,47,36,37,36,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,38,37,38,38,38,38,39,38,39,38,39,38,39,38,39,39,40,39,40,39,40,39,40,39,40,40,40,40,41,40,41,40,41,40,41,41,41,41,41,41,42,41,42,41,42,41,42,42,42,42,43,42,43,42,43,42,43,42,43,43,44,43,44,44,43,43,44,43,43,44,43,43,43,43,42,43,44,44,44,44,44,45,45,44,45,44,45,45,45,46,45,46,45,46,45,46,46,46,46,47,46,47,46,47,46,100,47,99,99,99,47,100,100,100,100,100,100,101,47,101,100,47,100,100,100,101,100,102,101,47,102,102,101,101,99,99,54,102,99,56,56,102,102,56,56,56,58,58,57,58,57,62,57,57,101,58,61,61,62,61,61,62,62,62,62,63,62,63,63,64,64,64,94,93,64,95,66,92,65,72,196,196,196,196,197,196,197,197,197,197,198,197,198,197,198,197,198,198,198,197,198,130,196,196,197,196,196,196,197,196,197,197,198,197,198,197,198,197,198,198,198,196,197,198,197,197,197,197,197,197,197,197,198,197,198,197,198,197,198,197,198,196,196,196,196,196,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,198,198,198,196,196,197,197,198,198,198,198,198,196,196,196,196,196,196,196,196,196,197,197,198,198,198,197,196,196,197,196,197,197,198,197,198,196,197,197,198,197,196,196,197,196,197,197,198,197,198,197,198,198,198,197,198,197,198,198,198,197,198,196,197,197,198,198,196,196,197,196,197,197,197,197,198,198,198,198,198
+,252,252,252,252,108,252,109,252,252,252,108,252,108,252,108,252,252,252,252,252,108,252,108,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,252,107,107,107,107,109,252,107,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,107,107,107,107,252,107,252,107,252,252,252,252,252,252,252,107,107,107,109,109,109,109,109,107,109,107,109,107,109,32,32,32,32,32,47,44,42,39,37,34,32,32,33,33,35,35,36,37,38,38,39,40,41,41,42,43,44,45,45,46,47,33,33,33,33,34,33,33,34,35,37,38,40,41,42,44,46,47,33,33,33,34,33,34,33,34,34,35,34,35,34,35,34,35,34,35,34,35,35,35,35,35,35,35,35,35,35,35,35,35,32,39,47,35,35,35,36,37,36,37,36,37,36,37,36,47,32,35,38,41,44,47,37,37,37,37,37,37,38,38,38,38,38,38,38,38,38,39,38,47,45,42,40,37,34,32,38,39,38,39,39,39,39,38,39,38,39,38,39,39,39,39,39,39,39,39,39,39,39,39,40,40,40,40,40,40,40,40,41,40,41,40,41,41,41,41,41,41,41,41,42,41,42,41,42,42,42,42,42,42,42,42,43,43,43,43,43,43,43,43,43,43,43,43,44,44,44,44,44,44,44,44,43,44,44,44,45,43,43,44,44,44,45,44,45,45,45,45,46,45,46,45,45,46,46,46,46,46,46,46,46,47,46,47,46,47,47,47,46,99,47,47,47,47,99,99,99,100,100,100,101,101,101,101,47,101,100,47,100,100,100,101,100,102,101,47,102,102,101,101,99,99,54,102,99,56,56,102,55,55,56,56,57,57,58,58,58,60,61,58,61,61,61,62,62,62,63,63,62,63,61,62,62,63,62,90,62,94,91,90,94,91,94,92,93,93,196,196,196,196,197,197,197,197,197,197,198,198,198,198,198,198,198,198,198,198,128,129,196,196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,196,196,197,197,197,197,197,197,196,196,197,197,198,198,197,198,197,198,197,198,198,198,198,198,198,198,198,198,197,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,196,196,196,197,197,198,198,198,196,197,197,198,198,198,198,198,196,196,197,197,197,198,198,198,196,197,197,198,198,196,196,196,196,197,197,197,197,198,198,198,198,198,197,198,197,198,198,198,197,198,198,198,196,198,198,198,196,196,196,197,196,197,197,198,197,198,198,198,198
+,252,252,252,108,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,252,109,107,109,107,109,252,252,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,252,107,252,107,109,107,252,107,252,107,252,109,252,109,109,107,109,107,109,109,109,109,109,107,109,107,109,107,33,34,33,34,33,46,45,42,47,42,47,47,33,34,33,34,33,34,33,35,34,35,34,32,35,36,39,40,43,44,47,35,34,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,36,36,37,36,36,36,37,36,36,36,37,36,32,34,35,38,39,42,43,46,46,36,37,36,37,36,37,36,37,37,38,38,38,47,32,35,36,39,40,43,44,47,38,38,39,38,39,39,39,38,39,39,40,39,40,39,40,39,40,39,38,32,35,40,43,47,39,38,39,38,39,38,39,38,39,39,39,39,38,39,38,39,47,43,46,47,47,40,39,40,47,40,32,40,40,41,40,37,42,47,40,41,41,41,35,40,43,47,41,42,41,42,41,42,42,32,34,38,41,44,47,43,42,43,42,43,43,44,43,44,43,44,43,44,44,46,46,46,44,45,45,45,45,46,47,47,44,46,47,44,46,44,45,45,45,45,46,45,46,45,46,45,46,47,47,46,47,47,103,47,96,47,96,97,47,96,97,97,98,97,97,98,98,98,98,99,99,99,99,99,99,99,99,100,100,101,47,101,100,47,100,100,100,101,100,102,101,47,102,102,101,101,99,99,54,102,99,56,56,102,55,55,56,56,57,55,58,57,58,61,58,60,61,62,61,61,62,62,63,63,62,62,62,62,62,63,62,91,91,92,90,92,92,91,92,93,93,94,128,130,130,131,132,134,134,136,136,138,138,140,141,142,143,128,143,142,135,138,140,143,136,196,196,196,196,197,196,197,197,197,197,198,197,198,197,198,196,197,197,197,197,197,197,196,196,197,196,197,196,198,196,197,197,198,197,198,197,198,197,198,197,198,198,198,197,198,198,198,197,220,220,220,220,220,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,196,196,197,196,197,197,198,197,198,196,197,198,198,197,198,197,196,196,198,198,198,196,197,196,197,197,198,197,198,196,197,196,197,196,197,197,198,197,198,197,198,197,198,197,198,198,198,198,198,197,198,197,198,197,198,196,198,196,197,196,197,197,198,197,198,198,198,198,198
+,252,252,252,252,108,252,108,252,109,252,108,252,252,252,252,252,108,252,109,252,109,252,108,252,108,108,252,108,108,252,252,252,252,252,252,252,252,252,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,252,252,252,107,107,109,252,109,252,107,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,109,107,109,107,109,109,252,109,252,109,107,107,109,109,109,109,109,107,109,107,109,107,109,107,34,34,34,34,34,35,34,35,34,35,34,34,34,35,34,35,32,34,35,37,39,40,42,44,46,47,35,36,35,36,35,36,35,36,36,36,36,36,36,36,36,36,36,34,36,37,38,39,41,42,43,44,46,47,36,37,33,34,36,36,38,39,40,41,43,43,45,46,47,38,38,38,38,38,37,38,38,38,38,38,38,38,37,38,38,39,39,40,39,40,39,39,39,40,39,40,39,40,39,39,40,40,40,40,40,40,32,34,36,38,41,43,45,47,40,41,39,41,40,41,40,41,40,41,40,41,40,32,34,36,38,40,43,45,47,40,41,40,40,40,40,40,40,40,41,40,41,41,41,41,41,41,41,41,41,41,42,42,42,42,42,42,42,42,43,42,43,43,43,43,43,43,43,43,44,44,44,44,44,44,44,44,44,45,45,45,45,45,45,45,96,96,99,99,99,46,46,99,47,100,46,100,99,99,100,100,47,100,46,100,100,101,101,101,102,45,102,46,102,102,102,102,102,103,103,103,103,96,96,96,97,97,97,97,98,98,97,97,98,98,98,53,99,101,47,101,100,47,100,100,100,101,100,102,101,47,102,102,101,101,99,99,54,102,99,56,56,102,102,100,54,55,55,56,56,57,57,58,58,58,60,60,60,61,61,61,61,61,62,62,62,196,196,196,196,196,63,60,61,61,62,62,92,62,92,92,93,92,94,94,94,94,128,129,130,130,131,132,133,134,135,135,136,137,138,139,140,141,142,70,71,71,72,72,73,136,196,136,197,196,197,197,197,197,197,197,198,197,198,198,197,197,197,196,197,197,197,197,196,196,196,196,196,196,197,197,197,197,198,198,198,198,198,197,198,197,198,198,198,198,198,198,198,198,198,198,198,222,221,221,221,221,221,221,220,220,220,220,220,220,220,220,220,220,220,220,220,219,219,219,219,219,219,219,219,196,196,196,197,197,197,197,197,197,198,198,198,197,198,197,198,197,198,198,198,197,198,197,198,196,197,197,197,197,198,196,196,196,197,197,197,197,197,197,198,198,198,197,197,197,198,198,198,198,198,197,198,198,198,197,198,197,196,198,196,196,197,197,197,197,198,197,198,198,198,198
+,252,252,252,109,252,108,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,252,107,107,109,107,252,107,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,107,252,107,252,107,109,107,252,107,252,252,109,107,109,107,109,107,109,109,109,107,109,107,109,107,107,36,35,36,35,36,36,36,36,36,36,36,35,36,36,36,36,36,36,37,37,37,37,37,37,37,37,34,36,37,39,39,41,42,44,44,46,47,37,38,37,38,37,38,37,38,37,38,37,38,37,38,38,38,38,38,38,39,39,39,39,39,39,39,39,39,39,39,39,40,39,40,39,40,39,40,39,40,39,40,39,32,34,34,36,36,38,39,40,41,43,43,45,45,47,41,41,41,41,41,41,42,42,42,42,42,42,42,42,43,42,43,42,43,42,43,42,41,42,42,42,34,37,38,41,42,45,47,42,42,42,42,42,42,42,42,42,42,42,40,41,41,42,41,42,41,42,41,42,42,43,32,36,39,44,47,43,43,44,43,45,46,46,43,44,44,45,44,45,44,45,44,45,45,45,45,45,46,45,45,46,46,45,44,46,44,46,47,44,46,47,103,103,97,97,98,98,99,99,97,98,99,100,100,97,98,49,100,101,101,101,102,100,101,102,101,103,101,103,102,103,102,103,51,52,96,96,97,97,52,53,97,98,53,98,98,97,97,98,54,98,98,99,98,56,98,56,55,56,55,56,56,57,56,57,57,99,57,58,57,58,57,58,58,59,58,59,58,59,59,59,59,60,59,60,60,61,60,61,60,61,61,61,60,61,61,63,63,63,196,196,196,196,196,196,197,198,198,198,61,62,62,63,63,63,93,92,93,93,94,94,93,94,94,94,95,95,94,95,64,65,65,66,66,67,67,68,68,69,69,70,70,71,71,72,136,136,136,197,196,136,196,198,197,198,197,198,197,198,197,198,196,196,196,197,196,197,197,197,197,196,197,198,196,197,196,197,197,198,197,198,197,198,197,198,198,198,197,198,197,198,197,198,197,198,198,198,198,198,198,198,222,222,222,222,222,222,221,222,221,221,221,221,220,221,220,221,220,220,220,220,220,220,220,220,219,196,196,197,196,197,197,198,197,198,197,198,198,198,197,198,197,198,197,198,197,198,197,198,197,196,196,197,197,198,198,197,196,197,196,197,197,198,197,198,197,198,198,198,197,198,197,198,197,198,198,198,197,198,198,198,197,196,197,198,196,197,196,197,197,198,197,198,198,198,198,198
+,252,252,108,252,108,252,108,252,252,252,108,252,108,252,109,252,252,252,109,252,109,252,108,252,252,252,108,108,108,252,108,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,107,107,107,107,109,252,107,107,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,107,107,252,109,109,109,252,252,252,252,107,107,107,107,109,109,109,107,109,107,109,107,109,107,107,37,37,33,35,36,37,38,40,41,42,43,45,46,47,39,41,43,45,47,38,38,38,38,38,38,38,38,38,38,38,38,38,39,39,39,38,34,36,37,38,39,40,41,42,43,45,46,47,39,39,40,39,40,39,40,40,40,40,40,40,40,40,40,40,40,40,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,41,42,42,42,43,42,43,42,43,42,43,42,43,42,43,47,44,41,38,35,32,40,47,43,44,44,44,44,44,44,44,44,44,42,44,44,44,43,44,44,44,47,45,43,41,40,37,36,34,32,43,44,43,44,43,42,42,32,33,35,36,37,38,40,41,42,43,45,46,47,44,45,45,45,45,97,98,98,98,98,98,46,32,35,38,41,44,47,47,47,99,99,100,100,100,100,100,100,45,101,46,101,101,46,101,46,102,102,102,96,97,97,96,98,99,50,50,99,99,98,50,51,99,100,51,52,51,101,102,102,102,102,52,53,53,53,53,53,53,53,53,54,54,54,54,54,54,55,55,55,55,55,55,56,56,98,56,56,56,56,98,57,57,57,57,57,57,58,57,58,58,58,58,59,100,59,59,59,59,59,59,60,60,60,60,60,60,61,60,61,61,61,61,61,61,62,62,62,62,62,63,63,63,196,196,196,197,197,198,197,197,198,198,198,198,198,198,92,62,63,92,93,92,93,93,94,94,94,94,64,94,65,64,66,65,67,66,67,67,68,68,68,68,69,69,69,70,71,71,71,135,136,136,136,136,136,198,197,198,198,198,198,198,198,196,196,196,196,196,196,196,197,197,197,197,197,197,198,198,198,197,197,197,198,197,198,198,198,198,198,197,198,197,198,197,198,198,198,197,198,198,198,198,198,198,198,198,198,198,198,222,222,222,222,222,222,222,222,221,221,221,221,221,221,221,221,220,221,220,220,220,196,196,196,196,197,197,197,197,198,198,198,198,198,198,198,197,198,198,198,197,198,198,198,197,198,198,196,196,197,197,198,196,197,197,197,197,197,197,197,197,198,198,198,197,198,197,198,197,198,198,198,197,198,198,198,197,198,196,197,198,196,196,197,197,197,197,198,198,198,198,198,198
+,252,252,252,109,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,109,252,252,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,107,107,109,107,109,107,252,107,252,107,252,107,252,109,252,109,252,107,109,107,109,107,109,109,109,107,109,107,109,107,107,107,38,39,38,39,34,34,37,37,39,40,42,42,45,45,47,39,39,40,39,40,39,40,39,40,39,40,39,40,39,40,39,40,40,41,40,40,40,41,40,41,40,41,40,40,40,41,40,41,40,41,41,41,41,41,41,42,41,42,42,42,41,42,41,42,41,42,42,43,42,43,42,43,42,43,42,43,42,43,42,43,42,43,42,44,43,44,44,44,44,44,44,44,44,44,44,44,44,44,44,46,45,46,45,46,45,46,45,46,45,46,45,47,45,42,40,37,35,32,47,45,45,45,45,46,45,45,45,45,45,45,45,45,46,45,46,46,46,44,45,44,45,45,42,43,43,43,43,43,43,46,47,46,47,47,47,96,97,97,97,98,99,99,99,99,99,99,100,100,99,100,100,100,100,100,101,100,101,101,100,101,100,100,100,101,102,101,102,102,102,102,103,103,51,103,97,97,96,51,52,98,52,99,53,52,53,52,53,53,101,101,54,53,54,53,54,54,55,54,55,54,55,54,55,55,56,55,56,55,56,55,56,56,57,56,57,56,57,57,57,57,58,57,58,57,58,58,58,58,59,58,59,58,59,59,60,59,60,59,60,60,60,60,61,60,61,60,61,61,61,61,61,62,61,62,62,62,63,63,62,62,63,63,63,63,143,143,196,197,198,198,198,198,198,197,198,198,198,198,198,198,198,92,93,93,92,94,94,64,66,65,66,64,66,65,66,67,67,67,68,68,67,67,68,68,68,68,69,69,70,70,70,71,71,71,135,137,138,140,140,141,142,142,143,128,129,196,140,140,140,141,141,142,142,143,198,197,198,198,198,197,198,198,198,197,198,197,198,197,198,198,198,198,197,197,198,197,198,197,198,197,198,198,198,197,198,197,198,197,198,198,198,197,198,198,65,65,66,217,222,222,222,222,222,221,221,221,221,220,221,220,221,220,196,196,197,196,197,196,197,196,197,197,198,197,198,198,198,197,198,197,198,197,198,197,198,197,198,197,198,196,197,197,198,196,197,196,197,196,197,197,198,197,198,197,198,198,198,197,198,197,198,198,198,198,198,197,198,198,198,197,196,197,198,196,197,196,197,197,198,197,198,198,198,198,198
+,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,109,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,252,252,109,107,107,107,107,107,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,109,107,252,109,252,109,252,252,252,252,107,107,109,107,109,109,109,109,109,107,109,107,109,107,107,107,39,40,47,39,32,34,37,39,42,44,47,40,39,40,40,40,96,34,36,38,41,43,45,47,40,41,40,41,40,41,40,42,41,42,41,42,41,42,41,42,41,42,41,42,41,42,41,42,42,43,42,43,42,42,43,43,42,43,32,33,34,34,36,36,37,38,39,40,41,42,43,43,44,45,46,47,43,44,44,44,44,47,46,44,43,41,40,38,37,35,34,32,45,45,45,46,45,46,47,47,46,33,35,36,37,38,40,47,42,43,45,46,47,47,96,96,34,36,38,39,41,43,45,47,97,97,97,33,35,36,37,38,40,41,42,43,45,46,47,99,100,45,45,45,45,45,44,45,45,46,102,103,96,96,97,96,97,41,43,41,44,47,99,99,100,100,100,100,100,100,100,101,50,50,101,50,101,101,51,101,101,101,51,51,101,102,101,103,101,103,103,103,53,53,96,96,53,53,53,53,54,54,54,54,54,54,54,54,55,55,55,55,55,55,55,55,56,56,56,56,56,56,56,56,57,57,57,57,57,57,57,57,58,58,58,58,58,58,58,58,59,59,59,59,59,59,59,59,60,60,60,60,60,60,60,60,61,61,61,61,61,61,61,61,62,62,62,62,62,61,62,62,62,62,62,62,63,48,63,63,63,53,63,197,128,128,143,143,198,143,198,198,198,198,198,198,198,198,198,198,132,132,93,94,94,92,93,64,65,93,68,66,66,68,67,67,68,68,68,68,70,68,68,69,69,69,70,70,70,70,71,71,72,72,73,73,73,73,138,138,138,138,139,139,139,139,140,140,140,140,141,141,141,141,141,142,142,142,143,143,143,143,143,198,198,198,198,198,198,198,198,198,198,198,198,197,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,66,66,217,78,217,217,222,222,222,221,221,221,221,220,221,220,220,198,196,196,196,196,197,197,197,197,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,196,196,197,198,197,197,197,197,197,197,197,197,198,198,198,198,197,197,197,197,198,198,198,198,198,197,198,198,198,198,196,197,197,198,196,196,197,197,197,197,198,197,198,198,198,198
+,252,108,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,107,107,252,107,252,107,252,107,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,107,107,107,107,252,107,252,107,252,107,252,107,109,107,252,109,252,109,107,107,109,107,109,109,109,107,109,107,109,107,107,107,107,41,41,41,41,41,41,41,41,41,41,41,41,41,41,42,41,42,42,42,42,42,42,42,42,42,42,42,42,42,42,32,35,38,41,44,47,43,43,43,43,43,43,103,101,100,101,100,101,100,101,101,103,103,44,45,44,45,44,45,44,45,44,45,44,45,45,46,45,46,45,46,45,46,45,46,45,46,45,46,45,46,45,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,96,97,96,98,97,98,98,99,99,101,100,102,101,102,101,103,102,103,96,96,96,96,96,96,96,96,97,96,97,48,48,97,48,46,97,57,48,57,97,48,98,52,98,99,99,100,100,46,100,45,100,100,46,102,101,103,103,97,103,97,97,98,98,98,50,99,50,99,51,99,100,100,101,100,51,52,51,52,52,53,52,53,52,53,102,53,53,102,53,54,53,103,53,96,54,55,54,55,54,55,54,55,55,56,55,56,55,56,55,56,56,57,56,57,56,57,56,57,57,58,57,58,57,58,57,58,58,58,58,59,58,59,58,59,59,59,59,59,59,60,59,60,60,60,60,60,60,61,60,61,60,61,61,61,61,62,61,62,61,62,61,62,62,62,62,63,62,62,62,62,62,62,63,62,63,62,61,62,60,61,63,88,63,63,63,143,143,143,128,128,143,128,131,129,131,129,132,132,132,132,133,133,133,92,65,65,93,66,64,66,92,64,67,64,69,67,69,70,70,70,70,70,69,70,70,69,69,70,70,71,70,72,71,72,72,73,73,74,73,74,74,75,75,76,75,76,76,77,77,78,77,78,78,79,79,79,64,79,64,64,64,65,64,66,65,66,66,67,67,68,132,132,132,132,133,133,134,134,135,135,198,136,198,198,198,198,197,198,198,198,198,198,198,198,198,198,198,198,198,198,77,217,77,217,77,217,222,222,222,221,221,221,220,220,219,219,219,198,196,197,196,197,196,197,197,198,197,198,197,198,197,198,197,198,197,198,197,198,197,196,196,196,197,198,196,197,196,197,197,198,197,198,197,198,198,198,197,198,197,198,197,198,197,198,198,198,197,198,198,198,196,197,197,198,196,197,196,197,197,198,197,197,198,197,198,198
+,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,107,107,107,107,107,107,107,107,107,107,252,107,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,109,107,252,109,109,109,252,252,252,252,252,109,107,107,109,109,109,109,109,107,109,107,107,107,107,107,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,44,44,44,44,44,34,36,38,40,43,45,47,34,36,37,38,39,41,42,43,44,46,47,45,46,45,46,45,46,45,46,45,46,45,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,96,96,47,44,41,38,35,32,98,98,47,43,40,36,32,99,99,99,100,100,100,47,43,39,36,32,35,38,41,44,47,102,103,102,102,102,102,102,102,57,97,41,43,41,42,41,42,44,45,47,46,61,46,49,99,61,99,49,102,98,100,98,100,100,100,43,100,46,102,101,102,102,102,102,103,96,96,96,97,98,52,97,52,52,53,53,53,53,53,53,53,53,54,53,54,54,101,54,54,54,54,54,55,54,55,55,55,55,55,55,56,55,56,56,56,56,56,56,56,56,57,57,57,57,57,57,57,57,58,58,58,58,58,58,58,58,59,58,59,59,59,59,59,59,60,59,60,60,59,60,60,60,59,60,60,60,61,61,61,61,61,61,62,61,62,62,62,62,62,62,62,62,63,63,63,63,63,63,60,60,61,61,61,63,61,61,62,62,62,63,62,62,62,61,62,62,59,61,88,88,88,88,89,59,62,89,63,89,89,67,91,65,65,66,92,68,92,65,66,68,65,67,66,68,67,68,65,68,67,68,68,68,70,70,71,70,71,70,70,71,71,70,71,71,71,71,72,72,72,72,73,73,74,74,74,74,75,75,76,76,76,76,77,77,77,77,78,78,78,78,79,79,79,64,79,64,64,64,65,65,65,65,66,66,67,67,68,68,68,68,69,70,70,70,71,71,72,72,73,73,73,73,74,74,75,75,76,76,76,76,76,76,76,77,77,77,217,77,217,217,217,222,222,221,221,221,221,220,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,198,198,198,198,198,198,198,198,196,196,196,196,196,196,198,197,197,197,197,197,197,198,198,198,198,198,198,197,197,198,197,198,197,198,198,198,197,198,198,198,198,196,197,197,198,196,196,197,197,198,198,198,198,198,198,198,198
+,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,252,107,109,107,252,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,107,107,252,107,109,107,252,107,252,107,252,107,252,109,252,109,252,109,109,109,107,107,109,109,109,109,109,107,109,107,107,107,107,107,47,39,32,34,37,38,41,42,45,46,32,33,35,35,37,38,40,40,42,43,45,45,47,45,44,45,44,45,44,45,45,46,46,46,45,46,46,46,45,46,46,46,45,46,46,46,45,47,47,47,47,47,47,47,47,47,47,44,43,40,39,36,34,32,96,97,32,34,37,39,42,44,47,96,97,96,47,39,32,39,47,97,98,97,98,98,99,98,98,99,99,47,44,41,38,35,32,34,37,39,42,44,47,101,102,101,52,102,102,102,34,35,38,39,42,43,46,47,102,102,102,102,97,96,57,97,102,102,102,97,102,102,49,51,49,102,99,49,50,100,100,50,100,45,100,45,43,101,101,101,100,102,102,103,52,96,52,96,53,96,97,52,98,52,53,53,54,53,54,53,54,53,54,100,55,54,55,54,55,54,55,55,55,55,56,55,56,55,56,56,56,56,57,56,57,56,57,57,57,57,58,57,58,57,58,57,58,58,58,58,59,58,59,58,59,59,59,59,60,59,60,59,60,60,60,60,61,60,60,61,60,58,60,61,61,60,59,60,61,61,61,61,63,62,63,62,62,63,62,62,63,62,63,62,62,62,61,63,60,63,63,62,61,61,61,63,61,62,61,63,61,63,63,62,62,61,62,61,61,62,88,63,63,89,62,89,61,90,90,65,64,90,66,67,64,67,67,67,66,68,67,68,69,66,68,69,69,67,68,70,68,69,70,69,71,71,72,72,71,72,72,71,72,71,72,72,73,72,73,73,74,73,74,75,74,74,75,75,76,75,76,76,77,76,77,77,78,78,79,78,79,79,79,79,79,64,79,64,64,64,65,65,66,66,67,66,67,67,68,68,69,69,70,69,70,70,71,71,72,72,73,72,73,73,74,74,75,75,76,76,76,217,217,217,217,217,217,217,217,222,222,221,221,221,221,220,221,220,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,197,196,198,196,197,197,198,197,198,197,198,197,198,198,198,197,198,197,198,197,198,198,198,197,198,198,198,198,196,196,193,196,193,196,197,197,198,199,199,199,193,193,198,198,198
+,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,252,252,107,107,107,107,107,107,107,107,107,252,107,109,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,107,109,107,109,109,252,109,252,109,252,252,252,252,252,252,107,107,109,107,109,107,109,107,109,107,107,107,107,44,44,45,44,45,44,45,44,44,44,45,97,97,99,99,100,100,102,102,103,96,45,45,45,97,98,99,101,102,103,46,46,47,47,47,47,47,103,100,101,100,101,101,101,47,32,34,37,39,42,44,47,97,98,98,98,98,99,99,99,100,100,100,101,101,101,101,102,102,102,102,103,103,96,96,96,96,97,97,97,32,35,37,40,42,45,47,47,47,44,47,42,47,47,101,52,100,100,100,100,100,102,101,100,100,102,101,102,102,50,102,102,102,102,102,102,102,102,50,50,102,102,102,57,102,102,102,97,102,57,103,98,98,98,50,99,50,50,50,99,50,50,99,100,51,45,51,45,51,101,100,52,102,102,102,102,52,52,52,53,53,53,53,53,53,53,53,54,54,54,54,54,54,54,54,55,55,55,55,55,55,55,55,56,56,56,56,56,56,56,56,57,57,57,57,57,57,57,57,58,58,58,58,58,58,58,58,59,59,59,59,59,59,59,59,60,60,60,60,60,60,61,60,61,61,61,61,61,60,61,60,61,58,61,61,60,60,59,59,61,61,61,62,62,63,61,61,61,63,63,62,62,63,62,62,62,61,61,60,61,61,61,61,61,62,61,63,61,61,63,63,63,62,58,62,58,61,62,89,88,87,62,86,88,64,90,90,64,66,65,66,67,68,68,67,66,67,68,68,68,68,69,69,70,69,68,69,70,69,70,69,69,70,70,71,73,74,72,72,74,72,73,72,73,73,73,73,73,73,74,75,75,74,75,75,75,75,76,76,76,76,77,77,77,77,78,78,78,78,79,79,79,79,79,79,79,64,64,64,64,64,65,27,31,30,29,28,27,26,26,25,24,23,22,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,221,221,221,221,221,221,221,220,220,220,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,197,197,197,197,197,197,198,198,198,198,197,197,198,198,199,199,199,199,199,193,199,196,193,199,193,193,193,193,199,199,199,199
+,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,252,107,109,107,252,107,252,107,252,107,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,109,107,107,107,252,107,252,107,252,107,252,107,252,109,252,109,252,109,252,109,252,252,107,109,109,109,109,107,109,107,109,107,107,107,45,46,46,46,46,46,47,32,34,36,39,40,43,45,47,102,103,47,47,47,98,98,100,100,102,103,47,47,47,47,96,96,97,96,97,96,97,32,98,97,98,97,100,100,100,98,99,98,99,99,100,99,100,99,100,100,101,100,47,45,44,41,40,37,36,33,32,102,103,102,103,47,32,34,37,39,42,44,47,97,97,98,98,99,101,51,51,33,47,43,40,35,32,47,47,51,103,100,102,102,102,101,101,102,101,100,45,99,50,103,103,102,102,50,50,57,50,50,50,50,50,57,103,102,102,57,54,57,58,50,54,50,53,50,50,50,49,50,51,50,50,50,100,100,51,100,51,100,52,45,52,52,101,102,101,52,53,52,96,53,54,53,54,53,54,53,54,54,55,54,55,54,55,54,55,55,56,55,56,55,56,56,56,56,57,56,57,57,57,57,58,57,58,57,58,58,59,58,59,58,59,58,59,58,59,60,60,60,59,59,59,60,61,61,60,61,60,61,61,61,62,61,62,62,62,62,62,63,61,61,61,62,61,60,60,61,60,61,59,94,59,62,63,62,63,83,83,82,61,62,63,82,62,63,63,63,61,83,84,84,62,62,62,62,62,62,62,63,62,62,62,63,63,62,62,62,62,62,85,62,61,62,86,87,88,89,65,66,67,68,67,67,69,68,69,68,69,70,69,70,69,70,70,70,71,71,70,71,71,71,71,72,72,71,73,72,73,72,74,74,74,74,74,74,74,74,75,74,75,75,74,76,75,75,75,76,76,76,77,76,77,76,77,77,78,77,78,78,79,78,79,78,79,79,79,64,79,31,64,28,65,26,31,29,28,25,24,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,217,217,217,221,217,221,217,221,217,221,221,221,221,220,221,220,221,220,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,197,196,197,197,198,197,198,198,198,198,198,197,198,198,196,196,197,196,197,197,198,197,198,198,198,198,198,198,199,199,193,196,193,193,193,193,193,193,194,193,199,199,199,193,193,193,193
+,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,107,252,107,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,109,107,107,107,252,109,109,109,252,252,252,109,252,252,252,252,252,252,252,109,109,109,109,107,109,107,107,107,107,47,32,35,38,41,44,47,47,47,47,47,47,47,103,102,103,103,32,33,34,35,36,37,39,39,41,41,43,44,45,46,47,98,98,47,45,43,41,38,37,34,32,47,99,99,99,99,32,34,37,39,42,44,47,100,101,101,101,101,101,101,101,101,102,102,102,102,102,47,40,32,47,103,103,96,96,96,97,96,97,97,98,102,98,100,101,99,98,100,99,50,98,103,99,49,100,49,100,102,100,49,101,101,101,102,51,102,102,102,102,50,51,51,50,100,100,100,100,52,102,57,54,50,58,102,54,50,50,61,63,50,56,51,50,49,103,50,50,50,50,50,51,51,100,100,100,51,99,52,46,52,52,101,53,102,53,53,53,53,53,53,54,54,54,54,54,54,55,55,55,55,55,55,56,55,56,56,56,56,56,56,57,57,57,57,57,57,58,58,58,58,58,58,59,58,59,59,59,59,59,59,59,58,60,60,58,60,60,60,60,59,60,61,61,62,60,61,61,62,61,62,62,63,63,63,62,62,63,61,61,61,62,60,60,61,61,61,62,61,60,94,60,61,81,81,64,63,63,82,82,62,82,82,64,62,82,83,82,60,60,84,84,62,62,83,61,62,64,62,63,66,62,64,61,62,85,62,86,63,86,85,86,87,87,64,65,67,68,67,69,68,68,69,69,69,70,70,70,72,70,71,71,71,71,72,72,73,72,73,72,73,72,73,72,74,73,74,74,73,75,75,75,75,74,75,74,74,75,74,76,76,75,76,76,75,76,76,76,76,77,77,77,77,78,78,78,78,79,78,79,79,79,79,79,64,79,29,64,26,65,23,65,29,66,27,31,29,28,26,25,23,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,217,217,221,217,221,221,221,221,221,221,221,221,221,220,220,220,220,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,198,196,196,198,198,198,198,198,198,198,199,196,196,196,196,193,193,193,194,193,194,196,199,199,193,193,193,193,193,193,193
+,252,108,252,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,107,107,107,252,107,252,107,252,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,109,107,252,107,109,107,252,107,252,107,252,107,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,107,109,107,252,107,107,107,102,101,32,33,36,37,39,40,42,43,46,47,103,102,103,103,103,102,96,96,96,96,97,96,97,96,97,97,97,97,98,98,98,97,98,98,99,98,99,98,99,98,98,99,99,100,99,101,100,99,100,100,101,100,101,100,101,34,37,38,41,42,45,47,102,101,102,102,103,102,103,102,102,96,103,96,97,97,97,97,99,51,99,100,51,99,50,51,103,51,97,96,96,96,96,52,103,102,49,100,101,49,45,51,100,51,100,50,102,50,102,52,53,100,45,52,103,50,50,50,50,49,50,54,55,50,50,55,54,59,52,50,50,50,50,53,50,50,51,50,51,51,51,51,52,51,100,52,52,100,53,52,53,53,53,53,54,53,54,53,54,54,55,54,55,55,55,55,56,55,56,55,56,56,57,56,57,56,57,57,58,57,58,57,58,58,59,58,59,58,59,59,60,59,60,59,60,60,60,61,59,60,59,61,59,60,60,60,88,59,60,61,61,61,61,62,62,63,61,62,62,62,62,61,63,63,63,61,63,62,63,62,61,94,61,61,59,62,93,60,60,62,63,64,81,64,81,65,82,82,65,82,64,83,63,65,83,83,66,83,83,83,62,64,84,83,67,65,67,66,63,67,64,64,85,65,86,65,87,65,69,86,69,66,67,69,69,70,70,70,71,70,70,70,71,71,72,71,72,73,72,74,73,74,74,73,73,73,74,73,74,73,74,75,74,74,74,75,75,74,76,75,76,75,76,75,74,75,75,76,77,75,76,76,76,76,77,76,77,77,78,77,78,78,78,78,79,78,79,78,79,79,79,64,79,64,64,64,65,25,65,24,66,22,67,26,67,25,25,23,31,29,28,25,24,22,218,218,218,218,218,218,218,218,218,217,218,217,218,217,217,217,217,221,217,221,217,221,221,221,221,221,221,220,221,220,221,220,221,220,220,220,220,219,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,198,199,196,196,193,196,193,196,193,194,193,194,199,199,196,196,193,193,193,193,194,193,194
+,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,107,107,109,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,107,109,107,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,107,107,107,107,102,101,102,102,102,102,102,102,102,102,34,35,37,38,40,41,43,44,46,47,96,96,32,34,36,38,41,43,45,47,99,99,98,98,98,98,98,98,98,98,99,98,99,99,99,102,49,99,100,100,100,100,46,101,101,100,102,101,101,101,101,101,102,101,100,102,102,102,103,103,103,98,101,103,51,97,97,51,52,101,100,51,102,53,102,51,97,51,97,49,98,49,52,102,50,102,50,101,50,50,101,49,102,51,100,100,51,51,100,103,51,51,51,51,97,51,51,51,52,51,51,49,48,48,48,50,55,52,50,50,50,50,50,50,50,50,51,50,51,51,51,51,52,52,52,52,53,52,53,53,53,53,53,53,54,54,54,54,55,55,55,55,55,55,56,56,56,56,56,56,57,57,57,57,58,57,58,58,58,58,58,58,59,59,59,59,60,60,60,60,60,60,61,60,61,61,61,61,61,61,62,60,59,60,62,59,60,58,88,59,60,59,60,63,62,62,62,63,63,63,62,62,61,90,91,92,63,92,63,92,62,93,61,61,95,60,94,94,62,63,62,80,65,65,65,82,65,65,82,82,66,66,67,67,83,68,84,67,66,65,84,83,64,65,69,69,67,68,68,68,68,68,69,70,66,69,67,67,71,70,71,71,71,71,71,72,72,71,71,71,71,71,71,72,73,72,74,75,74,74,74,74,74,75,74,75,74,74,74,74,74,75,75,74,75,74,75,76,75,75,76,75,75,76,75,75,76,75,76,77,76,76,77,77,77,77,77,77,78,77,78,78,78,78,79,78,79,79,79,79,79,64,79,64,64,64,64,64,65,65,65,26,66,25,67,24,67,23,68,22,31,29,27,24,22,31,23,218,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,221,217,221,221,221,221,221,221,221,221,220,220,220,220,220,219,220,220,220,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,199,196,196,196,196,193,193,193,193,194,194,199,196,196,196,193,193,194,193,194,193,194,193
+,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,109,107,107,107,252,107,252,107,252,107,252,107,252,107,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,107,109,107,107,107,107,101,32,34,37,38,41,42,45,47,102,102,103,103,103,103,103,96,103,103,96,97,96,96,96,97,97,97,97,99,98,99,98,98,97,103,99,98,99,99,99,100,99,99,99,47,99,103,100,102,101,100,103,101,100,100,51,101,102,101,101,102,102,103,102,102,102,102,101,49,49,101,51,101,101,50,102,102,102,100,51,51,98,52,97,52,52,52,52,52,49,49,98,50,51,50,50,102,50,49,50,46,50,50,100,50,51,50,50,50,51,51,102,51,51,51,51,51,102,102,51,102,51,50,51,51,51,50,48,48,54,51,51,50,51,50,50,50,53,51,52,51,52,52,53,52,53,53,54,53,54,53,54,54,54,54,55,54,55,55,56,55,56,56,57,56,57,57,57,57,58,57,58,58,59,58,59,58,59,59,60,59,60,60,61,60,61,61,61,62,61,60,62,60,61,60,62,62,62,61,62,60,59,59,61,59,60,62,60,58,88,59,61,64,62,61,62,63,62,89,89,90,63,91,91,62,91,92,92,92,93,93,94,63,94,62,94,80,80,95,62,95,65,66,65,64,66,66,65,64,65,65,66,68,68,69,68,69,68,68,69,68,67,67,69,71,67,70,70,69,71,70,70,71,72,71,70,69,73,70,71,72,71,72,72,72,72,72,72,72,73,73,73,73,73,74,74,74,74,75,74,74,75,74,75,75,74,75,75,75,75,75,74,75,75,75,75,75,75,75,76,76,75,76,77,76,77,76,76,76,76,76,77,76,77,77,78,77,78,77,78,78,79,78,79,78,79,78,79,79,79,64,79,29,79,64,64,27,65,27,66,30,66,29,67,28,67,27,68,27,69,26,218,25,30,24,27,23,24,22,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,221,217,221,217,221,221,221,221,221,221,220,221,220,221,220,220,220,220,219,220,219,220,219,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,199,196,196,196,196,193,196,193,194,194,194,199,196,196,196,193,196,194,193,194,193,194,194,194
+,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,107,107,107,107,252,107,109,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,107,107,252,109,109,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,107,109,107,252,107,107,107,107,101,102,102,102,102,102,102,102,102,103,103,102,102,103,103,47,32,36,39,43,47,99,97,98,97,98,97,98,98,100,98,100,99,101,96,100,96,99,101,51,97,96,51,99,47,102,100,103,101,102,102,102,102,51,52,99,51,102,103,103,102,102,103,102,102,52,52,102,101,102,101,51,51,102,50,51,51,102,52,52,52,53,52,53,52,52,97,51,50,51,96,50,50,51,102,50,101,50,50,100,50,50,50,50,50,51,51,51,51,51,52,102,52,53,52,52,52,52,52,52,52,52,51,51,52,51,51,51,51,51,51,54,51,51,52,51,54,52,52,52,52,53,53,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,57,57,57,57,58,58,58,58,58,58,59,59,59,59,60,60,60,60,61,61,61,61,61,62,62,62,62,62,62,62,63,61,63,62,62,62,62,84,62,84,62,63,61,61,62,60,60,60,60,60,59,60,89,69,61,88,63,69,62,90,90,88,90,90,63,91,63,91,92,93,94,63,94,94,94,64,94,95,81,64,66,65,65,66,65,66,66,67,67,68,67,67,68,69,68,68,68,69,68,69,70,71,72,71,71,70,72,70,72,71,73,71,70,71,71,71,72,72,73,72,73,72,72,72,73,72,73,73,73,74,72,73,73,73,74,75,73,74,74,75,75,75,75,75,76,75,75,76,75,75,75,75,75,75,76,76,75,76,75,76,75,76,76,76,77,76,76,77,77,76,77,77,77,77,78,78,78,78,78,78,78,78,79,79,79,30,79,79,79,64,79,64,64,28,64,28,65,27,65,27,66,30,67,29,67,28,68,27,68,26,31,25,27,23,25,22,22,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,217,217,221,221,221,221,221,221,221,221,220,221,220,220,220,220,220,220,220,220,220,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,196,196,193,196,196,196,193,194,193,194,196,196,196,196,193,193,194,193,194,194,194,194,193,194
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,252,107,252,107,252,107,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,109,109,107,109,107,252,107,107,107,102,101,102,101,102,102,102,102,102,103,103,102,103,102,103,96,97,97,97,97,97,97,97,97,98,96,100,99,98,51,102,100,51,100,103,97,97,51,97,96,47,97,96,101,103,51,101,50,51,50,99,98,102,99,99,52,51,51,102,103,101,53,103,52,103,102,54,102,53,102,102,52,102,54,102,52,52,52,52,52,53,52,52,52,52,52,52,52,52,52,52,52,52,52,52,51,50,50,50,51,50,50,51,50,49,51,52,51,52,52,53,52,53,53,54,53,53,53,53,53,53,53,54,54,54,52,52,51,52,54,51,51,54,51,52,51,51,52,52,53,52,53,53,54,53,54,55,54,55,55,56,56,55,56,56,56,57,57,58,57,58,58,59,58,58,59,58,59,58,60,59,61,61,61,62,61,62,62,62,63,62,61,63,61,61,60,60,62,62,62,63,63,63,63,61,82,62,82,63,59,84,62,85,62,61,60,62,62,62,88,88,62,60,64,88,89,64,64,90,69,91,65,91,91,67,92,91,92,93,64,64,65,64,94,64,64,64,65,65,65,66,67,67,66,67,67,67,67,67,67,68,68,68,69,68,69,69,70,69,69,70,72,71,72,72,72,71,72,71,73,72,71,72,72,73,73,74,73,71,74,73,73,73,73,73,73,73,74,73,74,73,74,75,74,74,74,74,74,74,74,75,75,75,75,75,76,75,75,76,76,75,75,76,75,77,76,76,75,76,77,76,76,76,76,77,77,76,77,77,77,78,77,78,78,78,78,78,78,79,78,79,79,79,79,79,64,79,64,79,64,64,64,65,31,65,30,66,29,66,27,67,27,68,26,68,25,69,23,30,23,31,22,31,23,29,30,26,28,24,26,218,25,218,23,218,22,218,218,218,218,218,218,218,218,218,217,218,217,217,221,217,221,217,221,221,221,221,220,221,220,221,220,221,220,221,220,220,220,220,219,220,219,220,219,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,196,196,193,196,194,196,194,194,193,194,194,199,196,196,193,196,194,193,194,193,194,193,194,194,194
+,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,107,107,107,107,107,107,107,107,107,109,107,252,252,252,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,109,107,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,109,107,107,107,109,107,107,107,107,107,102,101,102,102,102,102,103,103,103,102,96,103,96,103,97,96,97,98,103,97,99,100,98,53,98,99,98,97,97,99,97,100,99,97,102,52,97,102,51,101,51,101,51,51,103,50,50,98,99,99,51,98,51,102,96,52,53,53,102,53,53,52,102,102,102,102,53,52,53,52,52,52,52,53,52,52,53,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,53,53,53,53,53,53,54,55,55,54,56,55,56,51,58,52,56,56,54,58,51,54,54,52,51,53,52,52,53,53,55,54,55,55,55,56,56,57,57,57,57,55,57,56,58,58,59,59,60,60,60,61,61,59,61,59,61,62,58,62,60,60,60,61,61,62,62,63,63,62,62,63,62,62,62,62,62,62,62,95,63,80,62,82,63,83,84,84,61,59,85,59,60,60,62,59,63,90,60,62,64,61,66,67,65,68,71,68,68,69,65,65,66,69,67,65,65,65,66,66,66,66,66,66,66,65,66,66,66,67,67,67,67,67,67,68,67,67,68,68,68,69,69,69,69,71,69,70,71,70,71,72,71,72,72,72,73,73,72,73,73,73,72,74,72,73,72,73,74,74,74,74,73,73,73,74,74,73,75,74,74,74,74,74,74,74,74,74,75,75,75,75,75,75,75,75,76,76,76,76,76,77,77,76,77,76,76,77,76,78,77,76,77,76,77,78,77,78,78,78,78,78,78,79,79,79,79,79,79,79,79,79,64,64,64,64,64,64,64,65,28,65,28,66,27,66,27,67,26,67,26,68,26,68,25,69,25,79,31,31,29,26,26,24,31,23,29,22,26,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,221,221,221,221,221,221,221,221,221,221,220,220,220,220,220,220,220,220,220,220,219,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,196,196,193,196,194,196,194,193,194,194,194,196,193,196,196,196,194,193,194,194,194,194,194,197,194,194
+,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,108,107,107,107,252,107,252,107,252,107,252,107,252,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,252,107,252,107,252,107,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,109,107,109,109,107,109,107,107,107,109,101,102,101,102,101,102,103,103,103,103,96,103,103,96,97,97,97,52,97,98,97,103,53,52,47,101,52,99,97,52,99,52,46,52,46,52,52,52,52,54,53,54,54,51,51,50,51,102,52,53,53,49,52,52,53,53,53,50,103,102,52,102,102,53,102,52,102,52,53,53,52,53,53,53,53,53,53,53,53,53,52,53,52,53,52,53,52,53,52,53,52,53,52,53,52,53,52,53,52,53,52,53,52,53,53,53,52,53,53,53,53,53,53,53,54,54,54,54,54,55,56,55,56,57,56,54,57,54,56,58,56,57,53,56,58,53,52,55,53,54,55,53,55,55,57,58,57,58,58,58,58,57,58,57,59,59,57,60,58,61,59,62,63,63,61,61,61,59,60,63,59,60,63,63,63,60,60,60,63,63,92,62,93,63,63,61,63,81,62,63,95,81,63,63,80,83,82,84,85,84,64,60,64,64,84,62,86,86,64,69,59,86,67,68,67,68,67,70,71,73,75,67,69,70,68,69,66,66,69,66,71,68,67,68,67,66,66,67,67,67,67,67,67,68,68,68,68,68,68,69,69,69,68,69,69,69,70,69,69,70,71,71,71,72,72,72,72,73,73,72,73,73,73,73,74,73,74,73,74,74,74,74,74,73,74,73,74,75,74,75,73,74,75,75,74,74,74,75,74,75,76,75,76,75,75,75,76,76,77,76,77,76,77,77,77,77,76,77,78,77,78,77,77,77,78,78,77,78,78,79,78,79,78,79,79,79,79,79,64,79,64,79,64,79,64,64,64,65,64,65,65,66,27,66,27,67,27,67,30,68,29,68,28,69,27,69,26,70,25,79,24,27,23,25,22,24,23,22,22,218,22,218,31,218,26,218,22,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,221,217,221,217,221,221,221,221,220,221,220,221,220,221,220,221,220,220,220,220,219,220,219,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,196,193,196,194,193,194,193,194,193,194,196,193,196,193,196,194,193,194,193,194,193,194,197,194,197,194
+,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,107,108,107,107,107,107,107,108,107,252,107,109,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,109,107,109,109,109,107,109,107,107,109,101,102,101,52,103,102,52,103,103,102,52,103,96,52,96,52,97,97,52,98,52,96,52,96,52,103,96,52,102,99,52,52,54,54,101,52,53,52,54,101,54,53,52,53,52,53,53,49,52,96,52,52,52,53,53,53,102,53,52,54,102,52,52,53,52,102,53,52,53,52,53,52,53,53,53,53,53,53,53,52,53,53,53,52,53,53,53,52,53,53,53,52,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,54,54,54,54,54,55,55,55,55,55,55,55,56,56,56,56,58,54,52,53,56,59,52,52,56,54,56,55,57,54,56,57,59,60,59,60,58,63,57,63,57,62,58,62,57,89,58,63,58,61,62,61,62,61,62,59,63,62,91,62,60,62,59,61,61,58,92,92,63,92,92,63,63,93,62,81,61,81,62,81,82,82,82,81,82,84,83,84,86,64,65,87,66,87,86,65,65,86,69,66,66,65,64,66,68,69,75,72,73,73,74,68,68,74,73,73,72,69,73,68,72,75,68,68,69,69,69,69,70,68,68,67,67,69,69,70,69,69,70,69,70,69,70,70,70,70,71,71,71,71,70,70,71,72,72,73,72,71,73,72,73,74,73,73,74,73,74,74,74,75,75,74,74,75,74,74,75,74,75,74,75,75,75,75,75,75,75,74,75,76,75,76,76,76,76,76,76,77,76,77,77,77,77,77,77,77,78,77,78,78,78,78,78,78,78,78,78,79,79,79,79,79,79,79,79,79,79,64,64,64,64,64,64,64,64,65,65,65,65,66,66,66,66,66,66,67,23,67,26,68,26,68,25,69,25,69,25,70,24,70,24,27,24,29,23,30,23,218,22,218,30,218,28,218,26,218,24,218,23,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,221,217,221,221,221,221,221,221,221,221,221,221,220,221,220,220,220,220,220,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,196,196,196,194,193,194,194,194,194,194,196,193,193,196,196,193,193,194,194,197,197,197,197,197,197,197,197
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,108,107,252,107,109,107,252,107,252,107,252,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,252,107,109,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,107,107,109,107,109,107,109,107,109,109,101,53,102,102,52,102,53,102,53,53,102,103,53,96,103,52,52,97,52,47,53,54,53,54,53,54,102,52,52,102,53,52,53,54,54,53,53,101,54,54,52,53,52,53,54,53,54,53,54,54,52,53,53,52,53,53,53,50,52,52,52,102,52,53,53,53,53,53,53,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,54,54,54,54,54,55,55,55,55,55,55,55,56,56,56,56,56,56,56,56,56,56,58,52,55,57,58,52,55,58,58,60,57,53,56,59,56,58,55,59,56,63,63,85,63,60,86,60,88,62,90,59,90,59,89,60,61,60,89,63,90,63,62,91,63,92,60,60,63,62,61,60,62,60,92,93,92,92,63,93,93,63,94,63,81,80,65,62,65,81,83,83,83,65,65,65,64,65,65,65,65,66,89,65,88,66,66,68,70,66,68,70,71,71,75,72,70,74,75,73,75,74,73,74,72,68,71,73,72,72,73,71,72,69,68,69,71,72,70,70,71,69,71,70,70,71,71,71,71,70,71,72,71,71,72,71,72,72,71,72,71,71,70,72,72,73,73,72,73,73,73,73,74,74,74,74,74,74,74,75,74,75,75,75,75,74,75,75,75,75,75,76,76,75,75,76,75,75,76,76,76,77,76,77,76,77,76,77,77,78,77,78,77,78,77,78,78,79,78,79,78,79,78,79,79,79,64,79,64,79,64,79,64,79,64,64,64,64,64,65,28,65,28,65,65,66,30,66,30,67,29,67,28,68,27,68,27,69,26,69,25,70,24,70,24,71,23,71,30,72,28,27,27,28,26,29,24,31,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,221,217,221,217,221,217,221,217,221,221,221,221,220,221,220,221,220,221,220,221,220,220,219,220,219,220,219,220,219,219,219,220,219,219,219,220,219,219,219,220,219,219,219,220,219,196,196,193,196,194,193,194,193,194,194,196,196,196,196,197,196,194,194,194,194,197,197,198,197,198,197,198,197,198
+,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,108,107,108,107,107,107,109,107,109,107,252,107,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,109,107,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,109,107,109,109,109,107,109,107,107,107,109,109,50,52,102,53,102,53,53,102,98,103,53,98,102,53,53,53,54,53,98,53,54,54,54,54,54,54,54,54,54,54,54,54,55,101,55,54,55,55,54,54,54,53,53,53,54,53,54,55,54,55,101,55,55,52,52,53,52,52,52,53,53,53,53,53,53,53,54,53,53,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,53,54,54,54,54,54,54,54,54,54,54,54,54,55,54,55,54,55,54,54,55,56,56,56,56,56,56,56,56,56,56,56,57,56,57,57,57,58,58,57,57,57,56,57,55,59,60,59,60,58,63,57,58,62,85,85,86,86,86,62,87,88,89,90,62,90,89,64,60,89,62,89,91,90,62,66,91,92,90,93,91,91,91,92,62,94,63,92,61,92,93,93,95,94,80,94,95,81,81,66,81,67,82,82,65,65,65,68,65,66,66,66,67,66,66,66,66,66,66,66,67,67,67,67,68,70,70,75,72,72,74,75,75,75,73,71,75,72,74,71,71,75,73,73,72,74,73,71,71,72,72,71,71,71,72,71,73,71,71,73,72,72,72,72,72,72,73,72,72,72,72,73,73,71,72,73,71,72,73,72,73,73,73,73,73,74,73,74,74,74,74,74,74,75,74,75,75,75,75,75,75,75,75,76,76,76,76,76,76,76,76,77,77,77,77,77,77,77,77,78,77,78,78,78,78,78,78,79,78,79,79,79,79,79,79,79,30,79,79,79,64,79,29,64,29,64,64,64,64,64,64,65,65,65,65,66,65,66,66,66,66,67,67,67,67,68,68,68,26,69,25,69,25,70,25,70,24,70,24,71,30,71,29,72,27,22,30,218,29,218,27,218,26,218,30,218,28,218,25,218,23,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,217,217,221,217,221,221,221,221,221,221,221,221,221,221,220,220,220,220,220,220,220,220,219,220,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,219,196,196,196,196,194,193,194,193,194,194,196,196,196,196,196,196,197,197,197,197,197,197,197,197,198,197,198,198,198,198
+,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,107,108,107,252,107,252,107,252,107,252,107,107,107,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,107,252,107,252,107,252,107,252,109,252,109,252,109,252,109,252,109,252,252,252,109,109,107,109,107,109,107,109,107,107,107,109,52,52,103,102,53,102,98,53,52,53,53,54,53,54,53,98,53,54,54,54,54,54,54,55,54,54,54,55,54,55,54,55,55,55,54,55,55,55,55,55,55,55,55,55,55,54,54,54,55,54,55,55,55,55,55,55,55,53,56,52,53,54,53,53,53,54,54,54,54,54,54,54,54,54,54,54,54,55,54,55,54,55,54,54,54,55,54,55,54,55,54,55,54,55,54,55,54,55,54,55,54,55,55,55,55,55,55,55,55,56,56,57,56,57,56,57,57,57,57,58,57,58,57,58,57,58,58,59,58,58,56,57,57,58,59,56,63,63,85,63,60,84,83,84,83,84,85,86,87,86,88,91,64,65,62,65,92,65,90,91,65,64,92,91,67,92,65,65,65,66,93,67,67,92,65,64,67,63,65,65,93,64,65,66,67,68,80,68,66,81,66,65,64,66,66,66,69,67,67,67,67,70,69,68,68,68,68,67,69,67,68,69,68,66,69,66,70,69,71,68,73,74,75,75,74,75,75,72,74,74,72,72,75,111,111,111,104,104,74,74,72,71,73,74,72,73,73,72,73,73,73,73,73,72,72,72,72,72,72,74,74,73,73,73,73,74,74,74,73,74,74,74,75,74,75,75,74,75,74,75,74,75,75,76,75,76,75,76,75,76,76,76,76,77,76,77,76,77,76,77,77,78,77,78,77,78,77,78,78,79,78,79,78,79,78,79,79,79,79,79,79,79,64,79,64,79,64,79,64,79,29,64,64,64,64,64,30,65,29,65,27,66,25,66,66,67,66,67,66,67,67,68,67,68,68,69,68,69,69,70,69,70,28,70,28,71,27,71,26,72,25,72,24,73,24,29,23,31,22,218,22,218,30,218,28,218,27,218,25,218,24,218,22,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,221,217,221,217,221,217,221,221,221,221,221,221,220,221,220,221,220,221,220,220,220,221,219,220,219,220,219,220,219,220,219,220,219,220,219,220,219,220,219,196,196,196,196,197,196,194,196,194,194,194,197,196,196,197,196,197,196,197,196,197,197,198,197,198,197,198,197,198,197,198
+,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,107,108,107,108,107,108,107,108,108,252,108,252,108,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,109,109,109,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,109,109,107,109,109,107,109,107,109,107,109,107,109,53,52,53,102,53,52,53,98,53,102,53,54,53,54,54,54,53,54,54,54,54,54,54,55,54,55,54,55,54,55,54,55,55,55,55,55,55,55,56,56,56,56,56,56,55,55,55,55,55,55,55,55,55,55,56,54,54,53,54,56,53,54,54,54,53,55,54,54,54,54,54,55,54,54,54,54,54,55,54,55,54,55,54,55,54,55,54,55,54,55,55,55,55,55,55,55,55,55,55,55,56,56,56,57,57,57,57,57,57,57,57,58,58,58,58,58,58,58,58,59,59,59,59,59,59,59,59,60,63,63,62,62,84,58,62,85,85,86,86,86,83,84,83,84,84,85,85,85,85,88,88,91,91,92,92,64,66,64,65,64,66,65,67,65,66,65,67,66,68,67,67,67,66,65,66,65,92,68,65,66,66,67,68,68,69,66,67,66,68,64,67,66,66,67,69,69,67,69,69,69,69,69,70,69,69,68,69,68,69,70,69,70,71,69,67,67,70,67,71,71,73,75,75,74,105,105,105,105,105,105,111,111,110,110,110,110,110,104,76,72,73,74,74,74,73,75,74,73,74,73,74,73,74,74,74,74,74,74,74,74,74,74,75,74,75,74,75,75,75,75,75,75,75,75,75,75,75,75,75,76,75,76,76,76,76,76,76,76,76,77,77,77,77,77,77,77,77,78,77,78,77,78,78,78,78,78,78,78,78,79,79,79,79,79,79,79,79,79,79,79,64,79,64,64,64,64,64,64,64,64,64,64,64,65,65,65,65,66,66,66,27,67,27,67,27,67,27,68,26,68,26,68,26,69,26,69,25,70,25,70,25,71,24,71,24,71,31,72,30,72,29,72,28,28,31,29,30,30,28,31,27,218,26,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,217,217,217,221,217,221,221,221,221,221,221,221,221,221,221,220,220,220,220,220,220,220,220,219,219,219,219,219,219,219,219,219,219,219,219,219,196,196,196,196,197,196,197,197,194,194,194,194,196,196,196,196,197,197,197,197,197,197,197,197,198,197,198,198,198,198,198,198
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,107,252,107,108,107,252,107,252,108,252,108,252,108,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,252,107,252,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,109,107,109,107,109,107,109,107,107,107,109,107,109,101,52,53,53,101,53,53,103,53,54,54,54,54,54,54,55,54,55,54,55,55,55,55,55,55,55,55,55,55,55,55,55,55,56,56,57,56,57,56,57,57,57,57,58,58,56,56,56,56,56,55,55,55,55,57,57,57,58,58,58,56,55,55,55,55,55,54,54,55,55,55,55,54,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,56,57,56,57,56,57,57,58,57,58,57,58,57,58,58,58,58,59,58,59,58,59,59,59,59,59,59,60,59,60,60,60,60,60,60,60,60,61,63,83,83,83,83,63,84,83,84,83,84,85,86,84,83,84,85,84,86,85,86,86,88,88,89,89,89,65,64,66,65,64,65,65,65,66,66,66,67,66,68,68,67,68,68,68,67,69,68,68,68,69,69,66,68,70,69,69,68,70,68,69,69,67,69,68,70,70,69,69,68,70,70,70,70,69,68,70,69,71,69,70,71,72,72,72,72,71,69,105,105,105,105,105,105,105,105,111,110,111,105,105,111,111,110,110,110,111,110,111,110,104,104,74,75,76,74,75,75,75,75,75,74,75,75,74,74,74,74,75,75,76,76,75,75,75,75,75,75,76,76,75,75,75,75,76,76,76,75,76,75,76,76,77,76,77,76,77,76,77,76,77,77,78,77,78,77,78,77,78,78,78,78,78,78,79,78,79,78,79,78,79,79,79,64,79,64,79,64,79,64,79,64,79,29,79,64,64,64,64,28,65,28,65,28,65,28,66,27,66,27,67,27,67,67,68,67,68,67,68,68,69,68,69,68,69,28,70,27,70,26,71,25,71,24,72,23,72,23,72,22,73,23,73,23,27,23,28,22,28,22,29,22,30,22,31,22,218,31,218,29,218,27,218,25,218,23,218,22,218,218,218,218,218,218,218,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,220,221,220,221,220,220,220,220,219,221,219,220,219,220,219,220,219,220,219,220,219,220,196,196,196,197,196,194,197,194,194,198,197,196,196,197,196,197,196,197,196,197,197,198,197,198,197,198,197,198,197,198,197,198
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,107,108,107,108,107,108,107,108,108,109,108,252,108,108,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,107,109,107,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,109,109,109,107,109,107,109,107,107,107,109,109,54,53,54,53,54,53,54,53,54,53,54,53,54,54,54,54,54,55,54,55,54,55,54,55,55,55,55,55,55,55,55,56,56,56,56,56,56,57,57,57,57,57,57,57,57,58,58,58,57,58,58,58,55,56,56,56,57,57,57,57,57,58,58,56,56,56,56,56,55,55,55,55,55,55,55,56,56,56,56,56,57,57,57,57,57,57,57,57,58,58,58,58,58,58,58,58,59,58,59,59,59,59,59,59,60,59,60,60,59,60,60,60,59,60,60,60,61,61,61,61,61,61,61,62,83,81,82,83,82,82,83,82,83,84,83,84,84,85,85,85,85,85,86,86,87,86,87,86,87,87,89,64,64,89,64,64,64,66,64,65,65,65,65,66,66,67,66,66,67,67,67,67,68,68,69,68,68,68,69,69,69,69,69,70,69,68,70,70,71,69,69,69,69,70,69,70,70,69,70,70,71,70,70,71,71,72,71,71,72,72,105,105,105,105,105,105,105,105,110,110,110,110,111,111,111,111,105,110,110,110,110,110,110,110,111,110,111,104,111,104,76,76,76,76,75,76,76,76,75,75,76,75,76,76,75,75,76,76,76,76,76,77,76,77,76,76,76,76,76,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,78,77,78,77,78,78,78,78,78,78,78,78,79,79,79,79,79,31,79,79,79,79,79,64,79,64,79,64,64,64,64,64,64,64,64,30,64,29,65,28,65,27,65,26,66,25,66,66,67,67,67,67,67,67,68,26,68,26,68,68,69,69,69,69,70,70,70,70,70,70,71,71,71,24,71,31,72,29,72,26,73,31,78,30,79,29,218,28,218,27,22,26,25,25,28,25,31,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,217,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,220,221,220,220,220,220,220,220,219,219,219,219,219,219,219,219,219,219,196,196,197,197,196,197,194,196,197,198,196,196,196,196,196,197,196,197,197,197,197,197,197,198,197,198,198,198,198,198,198,198,198
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,107,108,107,252,107,252,107,252,107,252,108,252,108,252,108,109,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,107,252,107,252,107,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,109,109,109,107,109,107,109,107,107,107,109,107,109,54,53,54,53,54,53,54,54,54,54,54,54,54,55,55,55,54,55,55,55,55,55,55,55,55,56,55,56,56,56,56,57,56,57,57,57,57,58,57,58,57,58,58,59,58,59,58,59,59,58,58,58,58,58,58,57,58,58,58,57,57,57,57,58,58,58,57,58,58,58,55,56,56,56,56,57,57,57,57,58,57,58,57,58,57,58,58,58,58,59,58,59,58,59,59,59,59,60,59,60,59,60,60,60,60,61,60,60,61,60,58,60,61,61,60,59,60,61,82,61,63,82,82,82,82,82,82,82,82,82,83,83,84,83,84,85,84,86,85,86,86,64,64,64,64,87,64,88,65,64,65,65,64,65,65,65,65,65,66,65,66,66,66,65,66,65,66,66,66,67,67,67,68,68,68,69,68,68,69,69,70,69,69,70,71,70,71,70,71,70,70,71,70,71,71,72,71,71,71,71,70,70,71,71,72,71,71,72,105,105,105,111,105,111,105,105,110,110,110,111,110,111,110,111,111,105,110,110,110,111,110,111,110,111,110,111,104,106,104,106,106,75,75,76,76,76,75,76,76,76,76,76,77,77,76,76,76,77,77,77,77,76,76,77,76,77,76,77,77,77,77,77,77,77,77,77,77,77,77,78,77,78,77,78,77,78,77,78,78,78,78,79,78,79,78,79,78,79,79,79,79,79,64,79,64,79,64,79,64,79,64,79,64,64,64,64,64,64,64,65,64,65,65,65,22,66,28,66,27,66,27,67,27,67,27,68,26,68,26,68,30,69,29,69,28,69,27,70,27,70,26,71,25,71,24,71,23,72,22,72,24,72,24,73,23,73,23,78,23,78,23,79,23,79,22,218,22,218,22,218,22,218,31,218,29,218,27,218,26,218,24,218,22,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,220,220,220,220,196,196,196,196,196,196,196,196,196,197,196,197,194,197,198,196,197,196,197,196,197,196,197,196,197,197,198,197,198,197,198,197,198,197,198,198,198,198,198
+,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,108,107,108,107,108,107,108,107,109,107,108,108,252,108,109,108,252,108,108,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,109,109,109,109,252,109,109,109,252,252,252,109,252,252,252,252,252,252,252,109,109,109,109,107,109,107,109,107,107,107,109,107,109,54,53,54,53,54,53,54,54,54,54,54,54,54,55,55,55,54,55,55,55,55,55,55,55,55,56,55,56,56,56,56,57,56,57,57,57,57,58,57,58,57,58,58,59,58,59,58,59,59,59,59,58,59,59,59,58,57,58,58,58,59,58,59,58,59,59,58,58,58,58,58,58,57,58,57,57,57,58,58,58,58,58,58,58,58,59,59,59,59,59,59,59,59,60,60,60,60,60,60,61,60,61,61,61,61,61,60,61,60,60,58,61,61,60,61,59,61,82,82,82,82,82,82,82,82,82,82,82,82,82,82,83,83,83,84,85,84,85,65,65,86,65,65,65,64,65,65,65,65,65,66,65,66,65,66,67,66,66,66,66,66,66,66,66,66,66,66,66,66,66,67,67,67,67,68,68,68,68,68,68,70,69,70,70,70,71,71,71,71,71,71,71,70,71,71,72,71,70,71,71,71,71,72,71,72,105,105,105,111,111,111,111,105,111,110,110,110,110,110,111,111,111,111,105,110,110,110,110,110,110,110,111,110,111,104,111,111,104,106,106,76,76,75,75,76,76,77,76,76,76,76,77,76,76,76,76,76,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,78,77,78,78,78,78,78,78,78,78,79,79,79,79,79,79,79,31,79,79,79,30,79,30,79,64,79,64,64,64,64,64,64,64,64,64,64,64,65,28,65,28,65,28,66,28,66,66,66,27,67,27,67,27,67,27,68,26,68,26,68,26,69,26,69,26,70,26,70,25,70,25,70,25,71,25,71,24,72,24,72,30,72,29,73,28,73,31,73,29,78,29,79,28,79,27,218,26,218,25,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,217,217,221,217,221,221,221,221,221,221,221,221,221,221,220,220,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,197,197,196,196,194,194,198,196,196,196,196,196,197,196,197,197,197,197,197,197,198,197,198,197,198,198,198,198,198,198,198,198
+,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,109,252,252,107,109,107,252,107,109,107,109,108,252,108,109,108,252,108,108,108,109,252,252,108,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,107,109,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,109,109,109,109,107,109,107,107,107,109,107,109,109,54,54,54,55,54,55,54,55,54,55,54,55,54,55,54,55,55,55,55,55,55,55,56,55,56,57,56,56,56,56,57,57,57,57,57,57,58,58,58,58,58,58,59,58,59,59,59,59,59,59,59,59,58,59,59,59,58,58,57,58,58,59,58,59,58,59,59,59,59,58,59,59,59,58,57,58,59,58,59,58,59,58,59,60,60,60,59,59,59,60,61,61,60,61,60,61,61,61,62,61,62,62,62,62,62,61,61,61,60,60,82,82,59,82,61,82,82,81,61,61,82,61,82,82,82,82,82,82,82,83,64,82,83,83,84,84,83,64,65,64,64,64,64,65,66,65,66,66,66,66,66,65,67,65,66,67,66,67,67,68,67,67,66,67,67,67,67,67,67,67,67,67,68,67,68,67,68,67,69,69,69,70,70,69,69,70,70,70,70,71,71,72,71,71,72,72,71,72,73,72,71,72,71,105,105,105,111,110,111,110,111,105,110,110,110,110,111,110,111,110,111,110,105,110,111,110,110,110,111,110,111,110,111,104,111,106,104,107,107,106,106,75,76,76,76,76,76,77,77,77,77,76,77,76,77,76,77,78,77,77,78,78,77,78,77,78,77,78,78,77,77,78,78,77,77,78,78,77,78,78,79,78,79,78,79,78,79,79,79,79,79,79,79,64,79,64,79,64,79,64,79,64,79,64,79,64,64,64,64,64,65,64,65,28,65,28,66,28,66,28,66,27,67,66,67,66,67,67,68,67,68,68,68,68,69,29,69,28,69,27,70,25,70,25,70,24,71,31,71,30,71,29,72,28,72,27,72,26,73,25,73,24,73,23,74,22,74,22,74,31,31,29,218,28,218,27,218,25,218,24,218,30,218,28,218,27,218,25,218,24,218,22,218,218,218,218,218,218,218,217,218,217,217,217,217,221,217,221,217,221,217,221,217,221,221,196,196,196,196,196,196,196,196,196,196,196,197,197,196,196,197,196,197,197,198,197,198,198,197,197,196,196,196,196,197,197,194,197,198,196,196,196,197,196,197,196,197,196,197,197,198,197,198,197,198,197,198,198,198,197,198,198,198,198,198
+,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,109,252,108,107,108,107,108,107,109,107,109,108,252,108,109,108,252,252,252,108,108,252,109,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,107,109,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,109,107,109,107,109,107,107,107,109,109,109,54,54,54,55,54,55,54,55,54,55,54,55,54,55,54,55,55,55,55,55,55,55,56,55,56,57,56,56,56,56,57,57,57,57,57,57,58,58,58,58,58,58,59,58,59,59,59,59,59,59,59,59,59,59,59,59,59,59,58,58,59,58,59,59,59,59,59,59,59,59,58,59,59,59,58,58,58,59,59,59,58,60,60,58,60,60,60,60,59,60,61,61,62,60,61,61,62,61,62,62,63,63,63,62,61,61,62,81,82,82,82,61,63,82,60,61,82,61,82,84,84,82,82,82,82,84,82,82,82,65,65,65,64,66,64,64,65,65,65,67,65,65,67,65,66,66,65,66,66,66,66,66,66,67,67,67,67,67,67,67,67,67,68,68,67,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,69,69,69,69,69,69,70,70,70,70,70,71,71,71,71,72,71,72,72,71,72,105,105,105,110,111,111,111,111,111,105,111,110,110,110,111,110,111,111,111,111,111,110,110,110,110,110,110,110,111,110,111,104,111,106,108,104,107,106,106,106,106,76,76,76,76,76,76,76,77,77,77,77,77,77,77,77,77,77,77,78,77,78,77,78,78,78,78,78,78,78,78,78,78,78,78,78,79,78,79,79,79,79,79,79,79,79,79,79,79,79,79,64,79,64,79,64,64,64,64,64,64,64,64,64,64,64,64,64,65,65,65,27,65,65,66,66,66,66,66,66,67,67,67,67,67,22,68,27,68,26,68,26,69,69,69,69,69,26,70,25,70,25,70,25,71,25,71,25,71,25,72,24,72,24,72,24,73,24,73,31,73,30,73,28,74,27,74,25,31,24,31,23,218,31,218,30,218,28,218,27,218,26,218,25,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,221,217,221,221,221,221,221,196,196,196,196,197,197,197,197,197,197,197,197,196,196,196,196,197,197,197,197,197,197,198,198,198,196,196,196,197,197,197,197,194,198,198,196,196,196,196,196,197,196,197,197,197,197,197,197,197,197,198,198,198,198,198,197,198,197,198,198,198,198
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,109,252,109,107,252,107,252,107,109,108,252,108,109,108,252,108,252,108,252,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,109,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,109,109,109,107,109,107,109,107,109,107,109,109,55,54,55,54,55,54,55,54,55,55,55,55,55,55,55,55,57,56,55,56,55,56,56,57,57,58,58,57,57,58,57,58,57,58,58,59,58,59,58,59,59,60,59,60,59,60,60,60,61,59,59,59,59,59,59,59,59,59,59,58,59,58,59,59,59,59,59,59,59,59,59,59,59,59,59,59,58,59,61,60,59,61,59,60,60,60,59,59,60,61,61,61,61,62,62,63,62,63,63,63,62,62,61,63,63,63,61,61,82,82,65,80,82,62,82,63,61,82,64,64,83,82,82,84,60,60,64,64,66,66,67,66,67,66,66,65,65,65,66,67,66,67,66,67,67,68,67,67,67,66,67,66,66,66,67,67,67,68,68,68,68,67,68,68,68,68,68,69,68,69,69,69,69,68,69,69,69,69,70,69,70,69,70,69,70,70,70,70,71,70,71,70,71,70,71,70,71,71,71,105,105,105,111,110,111,111,111,111,111,105,111,110,111,110,111,110,111,110,111,110,111,111,110,110,111,110,111,110,111,110,111,110,111,106,108,108,104,107,107,106,106,106,76,76,76,76,77,77,76,77,76,77,76,77,77,77,77,78,78,77,77,78,78,77,78,77,78,77,78,78,79,78,79,78,79,78,79,79,79,79,79,79,79,64,79,64,79,64,79,64,79,64,79,64,79,64,64,64,64,29,64,29,65,28,65,28,65,28,65,28,66,65,66,66,66,27,67,27,67,27,67,27,68,27,68,26,68,26,69,26,69,26,69,26,70,25,70,25,70,30,70,30,71,29,71,29,77,28,77,28,77,27,78,27,73,26,73,26,73,25,74,25,74,24,74,24,218,30,218,28,218,26,218,24,218,22,218,31,218,29,218,28,218,26,218,25,218,24,218,22,218,218,218,218,218,218,218,217,218,217,217,217,217,221,217,221,217,221,217,221,221,196,196,196,196,196,197,196,196,196,197,196,197,196,197,196,196,196,197,196,197,196,197,197,198,197,196,196,197,196,197,196,197,197,198,197,198,198,196,196,197,196,197,196,197,196,197,197,197,197,198,197,198,197,198,197,198,198,198,198,196,198,198,198,198
+,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,108,252,108,107,108,107,109,107,108,107,252,252,109,108,252,252,252,108,108,108,252,252,109,252,109,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,109,109,109,252,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,109,109,109,109,107,109,107,107,107,109,109,109,107,55,55,55,55,55,55,55,56,57,56,57,56,57,57,58,58,58,56,56,57,56,57,57,59,57,58,59,58,58,58,58,59,59,59,59,60,60,60,60,60,60,61,60,61,61,61,61,61,61,61,59,59,59,61,59,59,59,59,59,59,60,59,60,60,60,61,59,59,59,59,59,59,59,59,59,61,61,61,62,60,59,60,62,59,60,58,59,59,60,59,60,63,62,62,63,62,63,63,81,63,63,61,63,82,61,64,64,64,64,63,65,63,82,82,82,65,64,64,83,63,65,83,83,66,83,65,65,66,67,67,66,67,66,67,68,66,67,67,70,67,67,68,69,68,68,67,68,67,69,67,67,66,67,66,67,67,66,68,67,68,68,68,68,68,68,69,69,69,69,70,71,70,70,70,70,70,70,70,70,70,70,70,71,70,71,70,71,71,71,71,71,71,71,71,72,72,105,105,105,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,111,111,111,111,111,111,110,110,110,110,110,110,111,111,111,111,111,106,107,108,104,107,107,107,107,106,106,106,76,76,76,77,77,77,77,77,77,77,77,77,77,77,77,77,78,78,78,78,78,78,78,78,79,78,79,78,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,64,79,64,79,64,79,64,79,64,79,64,79,64,64,64,65,65,65,65,66,66,66,66,66,66,66,66,67,67,67,27,68,26,68,26,68,25,68,25,69,24,69,24,69,23,70,23,70,22,70,25,71,25,71,25,71,25,71,24,78,24,78,24,78,24,79,31,79,30,27,29,29,28,31,27,218,26,218,31,218,29,218,30,218,29,218,28,218,27,218,25,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,221,217,221,221,221,221,221,196,196,196,196,197,196,196,196,196,196,197,196,196,196,197,197,196,196,196,196,197,196,196,196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,196,196,196,196,197,196,197,196,197,197,197,197,197,197,198,197,198,198,198,198,198,198,198,198,198,198,198,198
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,107,109,107,109,107,109,108,252,108,252,108,252,108,252,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,107,109,107,252,107,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,109,109,109,107,109,107,109,107,107,107,109,109,109,55,55,55,55,55,55,56,57,56,57,56,57,57,58,58,58,56,56,57,56,57,57,59,57,58,59,58,58,58,58,59,59,59,59,60,60,60,60,60,60,61,60,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,59,59,59,59,59,59,61,61,61,61,61,59,59,59,61,59,62,62,62,61,62,60,59,59,61,59,60,62,60,58,59,59,90,91,92,61,92,63,62,63,62,63,62,94,94,82,80,80,94,80,94,80,65,81,82,65,65,82,82,66,66,67,67,83,68,84,67,66,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,69,70,70,71,69,68,69,69,68,68,69,68,69,68,67,67,68,68,67,68,69,69,68,69,68,69,70,70,71,71,70,71,70,70,70,71,71,70,71,70,70,71,72,72,71,71,72,71,72,72,72,71,72,105,105,105,111,111,111,111,111,111,111,111,111,111,111,110,110,110,111,110,111,110,111,110,111,111,111,110,111,110,111,110,111,111,111,111,111,104,106,107,104,107,108,107,107,106,107,106,106,106,76,77,77,77,77,77,77,77,78,77,78,77,78,77,78,78,79,78,79,78,79,78,79,79,79,79,79,79,79,64,79,79,79,30,79,30,79,30,79,30,79,31,79,30,79,29,64,29,64,28,64,28,65,27,65,27,66,26,66,25,66,25,66,24,67,24,67,23,67,22,67,22,68,26,68,26,68,26,69,26,69,31,69,30,70,29,70,29,70,28,70,27,71,26,71,26,71,25,72,24,72,23,72,30,67,29,73,28,79,27,26,26,28,24,29,23,30,22,31,23,218,31,218,29,218,27,218,26,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,217,217,217,221,217,221,217,221,221,196,196,196,196,196,197,196,196,196,197,196,197,196,197,196,197,198,197,196,196,196,197,196,197,196,197,196,197,197,197,197,197,197,198,197,198,197,198,197,198,196,196,196,196,196,197,196,197,197,197,197,197,197,198,197,198,198,198,198,198,198,198,198,198,198,198,196,196
+,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,108,252,108,107,109,107,108,107,109,108,109,108,109,252,252,252,252,252,108,108,252,252,109,252,109,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,109,107,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,107,109,107,109,107,109,109,109,107,107,57,57,57,57,58,58,58,58,58,58,58,57,57,59,59,57,57,58,57,58,59,59,58,59,59,60,59,60,60,61,60,61,61,61,62,61,60,62,60,61,60,62,62,62,61,62,62,61,61,61,61,61,61,94,61,61,61,59,59,61,59,61,61,61,61,59,59,63,61,63,62,62,84,84,62,62,62,62,63,61,61,62,60,60,60,60,60,59,91,61,91,92,92,92,93,93,94,94,63,94,63,62,65,63,63,80,63,63,63,64,66,66,65,64,65,65,66,68,68,69,68,69,105,105,105,105,105,110,105,105,110,110,110,111,110,111,111,111,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,68,69,69,69,69,70,69,70,70,70,71,71,72,70,71,70,71,71,71,71,71,71,72,71,71,72,72,72,72,72,72,72,71,72,105,105,111,105,111,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,111,111,111,111,111,110,110,110,111,111,111,110,111,111,111,111,111,111,111,104,106,106,107,107,107,107,107,106,106,106,106,77,77,77,77,77,78,78,78,78,78,78,78,78,78,78,79,78,79,79,79,79,79,79,79,79,79,79,79,79,79,31,64,30,64,30,64,29,64,28,64,27,65,27,65,26,65,26,65,29,65,29,65,28,65,28,66,28,66,28,66,28,66,28,67,27,67,27,67,27,68,27,68,27,68,27,68,26,69,26,69,26,69,26,70,26,28,26,30,25,71,25,71,25,71,25,71,25,72,25,72,24,72,24,73,24,27,24,28,24,28,30,29,29,30,28,30,26,31,25,31,24,218,23,218,31,218,29,218,28,218,27,218,25,218,24,218,23,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,217,217,221,221,221,196,196,196,196,196,196,196,196,197,196,196,196,196,196,196,196,197,197,198,198,196,196,196,196,196,196,197,197,197,197,197,197,197,197,197,197,197,197,198,198,198,198,198,198,196,196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,198,198,198,196,196,196,196,196,196
+,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,109,107,109,107,252,107,109,108,252,108,252,108,252,108,252,108,252,108,252,108,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,107,109,107,109,107,107,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,109,109,107,109,107,109,107,107,107,109,109,109,107,107,58,59,58,59,58,59,59,58,59,59,59,59,59,58,59,59,60,60,94,60,61,61,58,59,59,60,59,60,60,61,60,61,61,61,62,61,60,62,60,61,60,62,62,62,61,62,62,62,62,61,62,62,62,94,61,61,81,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,84,84,63,59,83,62,62,64,61,60,66,62,64,62,62,85,60,63,91,92,93,94,63,94,94,63,64,94,95,95,66,65,64,65,66,65,66,66,67,67,68,67,67,68,105,105,105,105,105,105,105,105,105,105,110,110,111,110,111,110,111,111,105,105,105,105,105,110,111,110,111,110,111,111,110,109,105,110,111,110,111,105,105,105,71,70,70,70,70,70,70,71,71,71,72,71,72,71,72,71,72,72,72,71,72,72,72,72,73,72,73,72,73,72,73,105,105,111,111,105,111,111,111,111,111,111,111,111,111,111,111,110,110,110,111,110,111,111,111,111,111,110,111,111,111,111,111,110,111,110,111,110,111,110,111,104,104,106,107,106,107,107,107,106,107,106,107,106,106,77,78,77,78,78,78,78,79,78,79,78,79,78,79,78,79,79,79,79,79,64,79,64,79,29,79,29,79,28,79,28,64,28,64,27,65,27,65,26,65,26,65,25,66,25,66,24,69,23,70,23,71,22,72,22,73,30,74,30,75,29,77,28,78,28,79,27,26,27,27,26,27,25,28,25,28,24,29,23,30,23,30,22,31,22,71,25,71,25,71,24,71,24,72,24,72,24,72,24,73,24,25,23,26,23,26,23,27,23,28,23,29,31,29,29,30,27,31,26,31,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,221,217,221,217,221,221,196,196,198,198,198,198,196,198,197,198,197,198,197,198,197,198,198,196,196,197,196,197,196,197,196,197,196,197,197,197,197,197,197,198,197,198,197,198,197,198,197,198,198,198,196,197,196,197,196,197,196,197,197,198,197,198,197,198,197,198,198,198,197,198,197,198,196,196,196,196,196,197,197,197
+,108,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,109,107,108,107,109,107,109,108,109,252,109,108,252,252,252,252,108,108,252,252,252,252,109,252,252,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,107,107,107,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,109,109,107,109,107,109,107,107,107,109,107,109,107,59,59,59,59,59,59,60,58,59,58,60,59,61,61,61,62,62,60,60,94,60,61,61,61,61,60,61,61,61,59,58,59,59,60,59,60,60,61,60,61,61,61,62,61,60,62,94,61,60,62,62,93,61,62,61,105,105,105,105,105,105,105,110,110,110,110,110,110,111,111,111,111,110,104,106,61,64,84,83,67,65,67,66,62,67,64,64,85,65,86,65,91,92,93,64,64,65,64,94,64,64,64,65,65,65,66,67,67,66,67,67,67,67,67,105,105,105,110,105,110,105,105,105,109,110,110,110,110,110,110,111,111,111,105,105,109,110,110,110,109,110,111,111,110,111,111,111,105,105,110,110,110,110,105,105,105,105,106,73,71,71,71,71,71,71,71,71,72,72,71,72,73,72,72,72,72,73,72,72,74,73,73,73,73,73,73,105,105,111,111,111,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,111,111,111,110,111,111,111,106,104,108,106,106,107,107,107,107,107,106,106,107,106,106,78,78,78,78,78,78,79,79,79,79,79,79,79,79,79,79,79,31,64,30,64,30,64,29,64,28,64,27,65,27,65,26,65,26,65,65,26,65,72,24,73,23,75,23,77,22,79,29,30,28,31,28,31,28,67,31,22,30,23,30,23,29,24,28,24,28,25,27,25,26,26,26,26,25,27,25,27,24,28,23,28,23,29,22,29,25,30,31,30,30,31,30,72,29,218,28,218,27,218,27,218,26,218,25,218,24,218,24,25,23,31,22,218,22,218,22,218,31,218,29,218,27,218,25,218,23,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,217,217,221,217,221,221,221,221,196,198,198,198,198,198,196,196,197,197,197,198,197,198,197,198,198,196,196,196,196,196,196,197,197,197,196,197,197,197,197,197,197,197,197,198,197,198,197,198,198,198,198,198,198,198,196,197,197,197,197,197,197,197,197,198,198,198,198,198,197,198,197,198,198,196,196,196,196,197,197,197,197,197,197
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,108,252,252,252,252,108,109,107,109,107,252,107,109,108,252,108,252,108,252,108,252,252,108,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,109,107,252,107,109,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,109,107,109,107,109,107,109,107,109,107,109,107,109,107,60,61,61,61,61,59,61,94,58,62,62,59,61,61,61,62,62,62,62,61,62,62,62,59,60,60,94,60,61,58,59,59,60,59,60,60,61,60,61,61,92,62,92,60,93,60,61,95,62,94,94,61,105,105,105,105,111,110,111,110,110,110,111,110,111,110,111,111,111,109,110,109,104,107,106,64,65,69,69,67,68,68,68,68,68,69,70,66,69,69,67,65,65,65,66,66,66,66,66,66,66,65,66,66,66,67,67,67,67,105,105,105,105,110,111,110,105,110,111,110,105,110,110,109,110,110,110,110,111,110,111,105,110,109,110,110,111,110,111,110,111,110,111,111,111,105,111,110,111,110,111,111,105,105,111,106,107,106,73,72,73,72,72,72,72,72,72,72,73,72,73,72,73,72,73,73,73,73,73,73,73,74,74,105,105,111,111,105,105,105,111,111,111,111,111,111,111,111,111,111,111,110,111,111,111,110,111,111,111,110,111,110,111,110,111,111,111,111,111,110,111,110,111,110,106,107,108,104,104,107,106,106,107,106,107,107,107,106,107,106,106,106,79,78,79,78,79,79,79,30,79,79,79,64,79,27,23,26,79,28,64,28,64,27,65,27,65,26,65,26,65,25,66,25,66,24,25,66,24,30,30,29,30,29,31,29,66,29,66,29,67,29,67,28,67,28,68,28,23,28,24,27,25,27,26,27,27,27,29,26,30,26,31,26,70,26,70,26,70,26,71,25,71,25,71,25,218,25,218,24,218,24,218,24,218,24,218,24,218,24,218,23,218,23,218,30,218,29,218,28,218,26,218,25,218,24,218,23,218,22,218,23,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,217,217,217,221,217,221,217,221,217,221,217,221,221,221,221,221,196,197,198,197,198,197,198,197,198,197,196,196,196,196,197,196,197,196,197,196,197,197,197,197,197,197,198,197,198,197,198,197,198,197,198,197,198,198,198,198,197,196,197,196,197,197,198,197,198,197,198,198,198,197,198,197,198,197,196,196,196,196,197,197,198,197,198,197,198
+,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,108,252,108,252,108,108,109,108,109,107,109,252,109,108,252,252,252,252,252,252,252,252,108,252,252,252,108,108,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,107,109,107,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,109,107,109,107,109,107,107,107,109,109,109,107,107,107,60,61,61,61,61,59,61,94,58,62,62,62,62,58,62,62,62,60,59,61,61,61,62,60,60,94,60,61,61,61,60,61,60,94,60,61,61,61,62,92,92,93,93,94,62,94,62,94,105,105,105,110,105,111,111,111,111,110,110,109,110,110,111,110,111,111,111,109,110,109,104,107,107,106,67,69,71,67,70,70,69,71,70,70,71,72,69,70,68,69,66,66,69,66,71,68,67,68,67,66,66,67,67,67,105,105,105,105,110,110,111,111,111,111,111,109,110,110,110,110,110,110,110,110,110,110,111,111,111,105,110,110,110,110,111,111,111,110,111,111,111,105,110,110,111,110,111,111,111,111,105,111,110,110,110,106,106,73,74,74,74,73,74,74,73,73,74,73,73,73,73,73,73,73,73,73,74,74,74,74,105,105,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,111,111,111,111,111,111,111,111,111,110,111,110,111,106,107,107,108,104,104,104,108,106,106,106,106,107,107,106,106,106,106,106,106,106,79,31,79,30,79,30,79,79,79,29,79,28,79,28,79,27,64,27,64,26,66,26,71,25,75,25,79,24,64,24,65,23,65,23,65,22,65,22,66,31,66,31,66,30,66,30,67,30,67,30,67,29,67,29,68,29,68,29,68,28,69,28,69,28,218,31,218,30,218,30,218,29,218,28,218,28,218,27,218,27,218,26,218,25,218,25,218,24,218,23,218,31,218,29,218,28,218,27,218,25,218,24,218,23,218,23,218,22,218,22,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,196,196,197,196,197,196,197,197,197,197,197,197,197,197,198,197,198,197,198,198,198,198,198,198,197,197,197,197,197,197,198,198,198,197,197,197,197,197,197,197,198,197,198,198,196,196,196,198,197,197,197,197,197,197,198,197
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,108,109,107,252,108,252,108,252,107,252,108,252,108,252,252,252,108,252,252,252,252,108,107,108,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,107,107,107,252,107,252,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,107,109,107,109,107,109,107,109,107,109,107,109,107,107,63,60,59,59,59,60,61,61,60,61,61,61,61,59,61,94,58,62,59,61,83,61,62,62,62,61,62,61,61,61,62,62,62,59,60,59,60,63,62,91,92,93,94,63,94,94,105,105,111,111,110,111,111,111,111,110,109,110,109,110,111,111,110,111,111,111,109,110,104,104,107,108,107,107,106,71,71,70,72,70,72,71,73,71,70,74,68,68,74,73,73,72,69,73,68,72,75,68,68,69,69,105,105,105,110,111,110,111,111,111,110,111,111,110,109,110,109,110,109,110,109,110,110,110,110,111,110,105,110,111,110,111,110,111,110,111,110,111,105,111,111,111,110,111,110,111,110,111,111,111,111,110,110,111,106,110,106,106,74,75,74,74,74,74,74,75,73,75,74,73,74,74,74,73,74,74,74,75,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,111,110,111,111,111,111,111,110,111,106,107,107,108,108,104,104,104,107,106,107,108,106,107,107,107,106,107,106,106,106,106,30,79,29,79,28,79,27,79,26,79,25,79,24,79,23,64,22,64,29,64,28,64,28,65,28,65,28,65,27,65,27,66,27,66,26,66,26,66,26,67,25,67,25,67,25,218,25,218,24,218,24,218,24,68,23,218,23,218,23,218,22,218,22,218,22,218,22,218,27,218,31,218,29,218,28,218,27,218,25,218,24,218,23,218,22,218,27,218,26,218,24,218,23,218,22,218,22,218,22,218,23,218,22,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,196,197,196,197,196,197,196,197,197,198,197,198,197,198,197,198,197,198,197,198,198,197,196,197,197,198,197,198,197,198,197,198,198,198,197,198,197,198,197,198,197,198,196,196,198,197,197,198,197,198,197,198,197,198
+,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,108,109,108,108,107,109,107,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,107,108,108,108,108,108,252,252,252,108,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,107,107,107,107,109,107,109,107,252,109,109,109,252,252,252,109,252,252,252,252,252,252,252,252,109,107,109,107,109,107,107,107,109,109,109,107,109,107,60,63,59,59,59,60,61,61,60,61,61,61,61,59,61,94,58,62,83,83,82,62,83,84,84,62,62,62,59,60,58,59,59,60,59,60,63,62,92,91,92,93,105,105,105,105,105,111,111,111,111,111,111,111,110,109,109,109,110,110,111,111,109,109,109,109,110,104,108,108,108,107,107,107,106,71,72,72,72,71,72,71,73,72,70,74,75,73,75,74,73,74,72,68,71,73,105,105,105,105,105,110,111,110,111,110,111,111,111,111,111,111,110,109,110,110,110,110,110,110,110,110,111,111,110,110,111,110,111,110,111,111,111,110,111,111,111,111,111,110,110,110,111,110,111,110,111,111,111,105,110,110,110,110,106,108,110,106,106,75,75,75,75,75,74,75,74,75,74,75,74,75,75,75,75,76,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,111,111,111,111,111,111,111,111,111,111,106,106,107,108,108,104,104,104,107,107,107,107,107,106,107,107,107,106,107,106,106,106,106,31,79,28,79,25,64,22,64,31,64,30,64,30,64,29,64,28,64,27,65,27,65,26,65,26,65,25,66,24,66,23,66,23,66,22,67,29,218,28,218,28,218,27,218,26,218,25,218,24,218,23,218,23,218,22,218,29,218,25,218,22,218,28,218,26,218,24,218,22,218,31,218,29,218,27,218,25,218,23,218,218,218,30,218,30,218,29,218,28,218,27,218,26,218,25,218,25,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,221,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,197,197,197,197,197,197,197,197,197,197,197,197,198,198,198,198,198,197,197,197,197,197,197,197,198,198,198,197,198,198,198,198,198,197,197,197,198,198,198,196,196,198,197,197,197,197,198,197,198,197,198,198
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,108,108,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,108,108,108,252,252,252,252,252,252,252,252,252,252,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,107,109,107,109,107,109,107,109,107,109,109,109,107,107,60,63,63,63,95,63,80,59,82,63,83,84,84,56,63,85,63,83,82,82,84,83,82,84,85,84,61,66,67,65,68,71,68,68,69,65,65,66,69,67,21,105,105,105,105,111,111,111,110,111,111,111,111,109,109,110,109,110,110,111,110,111,111,110,109,110,104,108,108,108,107,108,107,107,107,106,72,71,72,72,72,73,75,72,72,74,75,75,75,73,71,75,105,105,105,105,111,111,111,111,110,111,110,111,110,111,111,111,110,111,109,110,109,110,109,110,109,110,110,111,110,110,110,110,110,111,110,111,111,110,110,111,110,111,111,111,111,110,110,111,110,111,110,111,110,111,111,111,111,110,110,110,110,106,107,109,109,107,106,106,75,76,75,75,75,75,75,75,75,76,75,76,75,75,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,111,111,111,110,111,110,111,110,111,111,111,111,109,109,104,106,107,107,108,108,104,104,108,107,108,107,108,107,106,106,107,106,107,106,107,106,106,106,106,30,79,30,79,29,64,29,79,28,64,28,64,27,65,27,65,26,65,26,65,25,66,25,66,24,66,24,66,23,67,22,218,22,67,31,67,29,68,28,68,27,218,26,218,25,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,30,218,30,218,29,218,29,218,28,218,28,218,27,218,27,218,26,218,26,218,25,218,25,218,24,218,24,218,23,218,23,218,22,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,217,221,221,221,217,221,221,221,221,221,221,197,198,197,198,198,198,197,197,197,198,197,198,197,198,197,198,197,198,197,198,198,198,198,198,197,198,197,198,197,198,196,196,196,197,196,197,197,198,197,198,198,198,197,198
+,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,109,252,109,252,109,108,108,108,252,252,252,252,252,252,252,252,252,252,108,252,252,252,108,108,108,108,108,252,108,252,252,252,252,252,252,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,107,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,107,107,109,109,109,107,109,107,107,81,63,63,95,81,62,63,80,83,82,84,85,84,64,62,64,82,84,83,84,82,84,83,84,86,67,68,67,68,67,70,71,73,75,67,69,70,68,105,105,111,111,111,111,111,111,111,111,111,111,111,109,109,110,110,110,110,110,110,111,111,111,111,104,104,108,108,108,108,108,108,108,107,107,106,71,72,72,72,72,66,70,69,105,105,105,105,105,105,105,105,111,111,111,111,111,111,111,110,111,110,111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,111,110,110,110,110,111,111,111,111,110,110,110,110,110,110,110,110,111,110,111,111,111,105,110,110,110,110,106,107,108,109,110,106,106,106,106,76,75,75,75,75,76,76,76,76,75,76,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,111,111,111,111,111,111,111,111,111,109,109,104,106,107,108,108,104,104,108,107,107,107,107,107,107,106,107,106,107,106,106,106,106,106,106,106,64,29,64,28,64,26,64,24,64,23,65,28,65,27,65,26,65,25,66,24,66,24,66,23,66,22,67,24,218,23,218,23,218,22,218,31,218,29,218,28,218,26,69,24,69,23,218,28,218,27,218,27,218,26,218,26,218,25,218,25,218,24,218,24,218,23,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,220,198,198,198,198,198,198,198,198,198,198,198,198,196,196,196,196,196,197,197,197,197,197,198,198,198,198,198,198
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,107,108,107,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,107,109,107,109,107,109,107,109,109,109,107,109,107,61,81,62,81,82,82,82,81,82,84,83,84,86,64,65,87,66,87,86,65,65,86,69,66,66,65,64,66,68,69,75,72,73,73,74,105,105,105,111,111,105,110,111,110,111,110,111,111,111,111,110,109,110,110,110,110,111,110,111,111,111,109,104,108,108,108,108,108,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,111,111,111,111,111,111,111,111,111,111,110,111,110,109,109,109,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,111,111,111,111,111,110,110,111,110,111,110,111,109,110,109,110,109,110,110,110,110,111,110,111,110,111,111,111,109,110,109,110,109,110,106,108,108,110,106,107,106,107,106,106,75,75,75,75,76,76,76,76,105,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,109,110,111,111,111,111,111,110,111,111,111,110,111,111,111,110,111,111,111,110,111,110,111,110,111,110,111,111,111,111,109,109,104,106,107,108,104,104,108,107,108,107,108,107,107,107,107,106,107,106,107,106,107,106,107,106,106,106,64,30,64,30,65,29,65,28,65,27,65,27,66,26,66,25,66,24,66,24,218,23,218,22,218,31,218,29,68,27,218,25,218,23,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,30,218,30,218,29,218,29,218,28,218,28,218,27,218,26,218,26,218,25,218,25,218,24,218,24,218,23,218,22,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,220,220,220,220,220,220,220,198,198,197,196,196,196,196,197,196,197,197,198,197,198,198,198,197,198,198,198
+,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,109,108,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,108,107,108,107,108,252,252,252,108,252,252,252,109,109,252,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,109,109,109,252,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,107,252,107,109,107,107,107,109,109,109,109,109,107,107,62,81,80,65,62,65,81,83,83,83,65,65,65,64,65,65,65,65,66,89,65,88,66,66,68,70,66,68,70,71,71,75,72,105,105,111,111,111,111,111,110,111,111,111,111,111,111,111,109,110,110,110,110,111,111,111,111,111,110,111,111,104,104,105,105,105,105,105,110,111,111,111,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,110,109,110,109,109,109,109,109,109,109,109,109,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,109,109,110,111,109,110,110,110,109,109,109,109,109,110,110,110,110,110,110,111,110,111,111,111,109,110,110,110,110,110,110,106,107,106,110,107,107,107,106,106,106,75,75,75,75,75,76,105,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,109,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,111,111,111,111,111,111,111,111,111,111,109,109,109,104,106,108,104,108,108,108,108,108,108,107,108,107,107,107,106,106,106,106,107,107,107,106,106,106,106,31,65,30,65,29,65,29,65,28,66,27,66,26,66,26,66,25,67,24,67,23,218,23,218,22,68,31,218,30,68,29,68,29,69,28,69,27,218,27,218,26,218,26,218,25,218,25,218,24,218,23,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,218,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,196,196,196,197,198,196,197,196,197,197,198,198,198,198,198,198,197,198
+,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,109,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,107,108,107,252,252,252,252,252,252,252,252,252,109,109,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,107,107,109,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,107,252,107,109,107,107,107,109,107,109,107,109,107,95,81,81,66,81,67,82,82,65,65,65,68,65,66,66,66,67,66,66,66,66,66,66,66,67,67,67,67,68,70,105,105,105,111,111,111,105,110,111,110,111,110,111,110,111,111,111,111,110,110,111,110,111,109,110,110,111,110,111,111,110,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,111,111,111,111,111,111,111,111,111,111,110,110,110,109,110,109,109,109,111,111,110,109,110,109,110,110,110,109,110,110,111,110,111,110,111,110,111,111,111,111,111,110,111,109,109,109,111,111,110,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,111,110,109,110,110,110,109,110,110,111,110,106,110,108,107,107,107,107,106,107,106,74,76,76,105,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,109,110,110,111,111,111,110,111,111,111,110,111,111,111,110,111,111,111,111,111,110,111,110,111,111,111,110,111,111,109,109,109,109,104,106,104,108,108,108,108,108,108,107,106,107,108,107,107,106,106,106,107,106,107,107,107,106,107,106,106,31,66,29,66,27,66,25,66,23,67,22,67,30,67,28,218,27,68,25,68,23,68,22,68,29,68,26,218,23,218,28,218,27,218,26,218,30,218,29,218,29,218,28,218,27,218,26,218,25,218,24,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,217,217,218,217,217,217,217,221,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,220,220,220,220,220,220,220,220,220,220,220,220,220,196,196,196,197,197,198,196,197,197,197,197,198,197,198,197,198,197,198,198,198
+,108,252,108,252,252,252,108,252,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,108,107,108,108,108,252,108,252,252,252,252,252,109,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,109,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,107,252,107,109,107,107,107,109,107,109,109,109,107,109,107,80,68,66,81,66,65,64,66,66,66,69,67,67,67,67,70,69,68,68,68,68,67,69,67,68,69,68,105,105,105,111,105,105,105,111,110,111,111,111,111,111,111,111,110,110,110,111,110,111,111,110,110,110,109,110,110,111,111,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,111,111,110,110,110,109,109,109,109,109,110,110,110,110,111,111,110,109,109,111,110,110,110,110,110,110,111,110,111,111,111,111,111,110,111,109,109,109,110,109,109,110,111,110,110,110,110,110,109,109,109,109,110,110,111,111,111,109,110,109,110,110,110,110,109,110,110,110,110,110,111,106,110,107,107,107,107,107,107,106,106,106,105,105,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,109,109,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,111,110,111,111,111,111,111,111,111,111,111,111,109,109,109,104,104,106,104,108,108,108,107,108,108,108,106,107,107,108,107,107,106,106,107,107,106,107,107,106,106,106,106,106,106,28,66,28,66,27,66,26,67,25,67,25,67,24,67,24,67,23,218,22,218,28,218,28,218,27,218,26,218,25,218,25,218,31,218,29,218,28,218,26,218,25,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,196,196,196,197,198,198,198,196,197,197,197,197,197,197,198,198,198,197,198,198,198,197
+,252,108,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,108,252,109,108,109,108,109,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,107,108,108,108,252,252,252,252,109,252,252,252,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,107,109,109,107,109,107,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,107,252,107,109,107,109,107,109,107,109,107,109,107,107,66,67,66,68,64,67,66,66,67,69,69,67,69,69,69,69,69,70,69,69,68,69,68,69,70,105,105,105,105,105,105,111,110,110,110,110,111,111,111,111,110,111,111,111,110,111,110,111,111,110,109,110,109,110,109,111,109,110,110,110,110,110,110,111,110,111,110,111,110,109,111,111,110,111,110,111,111,111,111,111,110,110,110,110,109,109,109,109,109,110,109,110,110,109,109,111,111,110,109,110,110,110,110,111,110,111,110,111,110,111,111,111,111,110,109,110,109,110,109,110,109,110,109,110,109,110,110,111,110,109,109,110,111,109,109,110,109,110,109,110,109,109,109,111,111,111,110,111,110,111,110,111,110,111,107,108,107,107,106,105,105,105,111,111,111,105,105,111,111,111,110,111,111,111,111,111,111,111,110,111,109,110,109,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,111,110,111,110,109,110,111,110,111,111,111,111,109,109,109,104,106,107,104,104,108,108,108,108,108,107,106,106,107,107,108,107,108,106,107,106,107,107,107,107,107,106,107,106,106,106,106,27,67,26,67,106,67,23,67,22,68,67,68,67,68,30,68,29,69,29,218,28,218,27,218,26,218,25,218,25,218,24,218,30,218,28,218,27,218,25,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,196,196,197,197,198,197,198,198,197,196,197,196,197,197,196,197,198,198,198,198,198,198,198
+,108,252,108,252,252,252,252,252,108,109,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,108,109,108,108,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,252,252,252,108,252,252,252,109,109,108,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,109,109,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,107,252,107,252,107,107,107,109,109,109,109,109,107,109,107,68,70,68,69,69,67,69,68,70,70,69,69,68,70,70,70,70,69,68,70,69,71,105,105,105,105,105,105,111,111,110,110,111,111,110,110,111,111,111,110,110,110,110,110,111,111,111,111,111,111,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,109,109,110,110,111,111,110,111,111,111,111,111,111,111,110,110,110,110,109,109,109,109,109,110,110,109,109,111,111,111,111,111,111,110,110,110,110,110,110,111,110,111,110,111,111,111,111,110,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,111,111,109,109,109,109,109,110,110,110,109,110,110,111,111,110,110,110,110,111,111,111,111,111,109,109,109,105,105,105,111,111,111,111,111,105,105,111,111,111,111,111,111,111,111,111,111,111,111,109,109,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,111,111,111,109,109,110,110,111,111,111,111,111,109,109,109,109,104,106,108,104,108,108,108,108,108,108,108,108,106,106,107,108,108,107,106,106,106,106,107,106,107,106,107,106,106,106,106,106,67,29,67,28,67,27,68,26,68,25,218,24,218,23,218,22,218,29,218,28,218,27,218,27,218,26,218,25,218,24,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,220,220,220,221,220,220,220,221,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,196,197,197,197,197,198,198,198,196,196,196,197,196,196,196,197,198,198,198,198,198,198,197
+,252,252,252,252,252,252,252,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,252,108,252,252,252,109,252,252,252,109,109,109,108,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,107,107,109,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,107,252,107,109,107,109,107,109,107,109,107,109,107,107,107,68,70,70,71,69,69,69,69,70,69,70,70,69,70,70,71,70,70,71,105,105,111,111,105,111,111,111,111,111,110,110,110,111,110,111,111,111,111,110,110,111,110,111,110,111,110,111,111,111,111,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,111,110,110,111,110,111,110,111,110,111,109,110,109,109,109,110,109,110,109,109,110,110,110,111,110,111,111,110,109,110,110,111,110,111,110,111,110,111,111,111,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,111,111,109,109,110,109,110,109,109,109,110,110,111,111,110,109,110,109,110,110,111,110,111,110,111,110,105,105,105,105,105,105,105,105,105,105,111,111,111,110,111,110,111,111,111,110,111,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,109,109,110,109,110,110,111,110,111,109,110,109,110,110,111,104,104,106,104,108,108,108,108,108,108,107,108,106,107,107,108,108,108,106,107,106,107,107,107,107,107,106,107,106,106,106,106,106,68,30,68,29,68,28,68,26,68,25,218,23,69,22,69,68,69,69,70,69,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,196,197,196,197,197,198,197,198,197,198,197,198,196,197,196,197,196,198,197,198,198,198,197,198
+,108,252,108,252,108,252,252,252,108,109,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,252,108,252,252,252,252,252,252,109,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,107,107,109,109,107,107,109,109,109,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,107,252,107,107,107,109,107,109,107,109,107,109,107,109,70,71,70,71,70,70,71,70,71,71,72,71,71,71,71,70,105,105,105,105,105,105,111,111,111,111,111,110,110,110,110,110,110,111,111,111,111,111,111,110,110,111,111,111,111,111,111,109,109,109,109,110,109,110,109,109,109,110,109,110,110,110,110,110,110,111,111,111,111,111,110,110,109,109,109,109,109,110,109,110,109,110,109,109,109,110,110,110,110,111,111,111,110,111,110,109,109,109,109,110,110,110,110,110,110,111,111,111,109,110,109,109,109,109,109,110,110,110,109,110,110,110,110,110,109,109,109,109,109,109,109,109,109,110,109,110,109,110,110,111,111,110,110,110,110,110,110,110,110,111,110,111,105,105,105,105,111,111,111,111,111,111,111,105,111,111,111,111,111,111,111,111,111,111,109,109,109,110,110,111,111,111,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,109,109,110,109,110,110,110,110,111,111,110,110,110,110,110,104,106,104,106,108,108,108,108,108,108,108,108,107,108,106,107,108,108,107,107,106,107,106,107,106,108,107,107,106,106,106,106,106,106,106,68,29,68,28,68,27,69,26,69,25,218,24,218,23,218,22,218,27,218,27,70,26,218,25,218,24,218,23,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,197,198,198,198,197,198,197,198,196,196,196,197,197,197,197,198,197,198,198,198,197
+,252,108,252,252,252,252,252,252,252,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,109,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,252,252,252,252,252,252,252,252,109,109,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,107,109,107,109,107,252,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,107,252,107,109,107,109,107,109,107,109,107,109,107,107,107,109,71,71,71,71,71,71,71,70,71,71,72,71,70,105,105,111,105,105,111,111,111,111,111,111,111,111,110,111,110,111,110,111,110,111,111,111,111,111,110,111,110,111,111,111,111,111,109,109,109,110,109,109,109,110,109,110,109,110,110,110,110,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,109,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,111,111,110,110,110,110,110,110,111,110,111,110,105,105,105,111,111,111,111,111,111,111,111,111,105,111,111,111,111,110,111,110,111,111,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,109,109,110,109,110,110,111,110,111,111,110,109,110,110,111,104,106,104,108,108,108,108,108,108,108,108,108,108,108,108,108,106,108,107,108,107,108,106,107,106,108,108,107,106,107,106,107,106,106,106,106,27,69,26,69,24,218,23,218,218,70,69,70,30,218,30,218,29,218,29,218,28,218,27,218,27,218,26,218,25,218,25,218,24,218,24,218,23,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,198,197,198,197,196,196,197,196,197,196,197,197,198,197,198,198,197
+,108,252,108,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,252,252,252,108,252,252,252,252,252,108,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,107,107,109,109,109,107,109,107,252,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,252,107,107,107,109,107,109,107,109,107,109,107,109,109,70,70,70,70,71,71,72,71,71,72,72,105,105,105,105,105,111,111,111,111,111,111,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,110,110,109,109,109,109,109,109,110,110,110,109,109,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,109,110,110,110,110,111,111,111,110,111,110,111,110,111,111,111,110,111,111,111,109,109,109,109,109,110,110,110,110,110,110,110,110,111,109,109,109,110,110,110,109,109,109,110,110,110,110,111,111,110,110,110,109,110,110,110,110,109,110,111,110,110,110,110,110,110,110,110,110,111,105,105,111,105,111,111,111,111,111,111,111,111,105,111,105,111,111,110,110,111,111,111,111,110,109,109,109,110,110,111,111,111,110,110,110,111,111,111,110,111,111,111,111,111,111,111,109,111,109,109,109,110,110,110,110,111,111,110,110,110,110,110,110,111,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,107,108,107,107,106,106,107,108,107,107,107,106,106,106,106,106,106,106,69,69,30,218,28,218,26,218,29,218,28,218,26,218,25,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,218,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,221,221,220,221,220,220,220,221,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,196,196,197,197,197,197,198,197,198,198,198,198
+,252,108,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,252,108,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,108,108,252,108,252,252,252,252,252,252,252,252,108,252,108,109,109,109,252,109,252,109,252,109,252,252,252,252,252,107,109,107,109,109,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,107,252,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,70,70,70,70,70,71,71,105,105,105,105,111,111,111,111,111,111,111,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,111,111,111,110,111,111,110,110,109,109,109,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,111,111,110,111,110,111,110,111,110,111,111,111,109,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,109,109,111,111,110,110,110,110,111,110,111,111,110,109,110,109,110,109,110,109,110,110,110,109,110,110,111,110,110,110,111,110,105,105,111,111,105,111,111,111,111,111,111,111,111,111,111,105,111,110,111,110,111,111,111,111,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,111,111,109,109,110,109,110,110,111,111,110,109,110,110,111,110,111,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,107,108,107,108,107,108,106,106,107,108,106,107,106,107,106,107,106,106,106,106,69,218,69,70,69,70,70,70,23,70,31,71,30,218,29,218,28,218,27,218,26,218,26,218,25,218,24,218,23,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,217,221,221,220,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,198,197,198,197,198,197,198
+,108,252,108,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,109,108,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,108,108,108,252,108,252,252,252,252,252,252,252,108,109,109,109,109,109,252,109,252,252,252,252,252,252,252,252,107,107,109,109,109,107,109,109,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,107,252,107,107,107,109,107,109,107,109,107,109,107,109,109,107,107,70,71,70,71,105,105,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,110,109,109,109,109,110,109,110,110,110,109,109,109,109,109,109,109,109,109,110,109,109,110,110,111,110,110,110,109,109,109,110,110,110,110,111,111,111,110,111,110,111,110,111,111,111,111,111,111,111,111,109,109,109,109,110,109,110,110,110,110,110,110,110,110,111,110,111,111,111,111,110,110,110,110,111,110,111,111,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,105,105,105,105,105,105,111,111,111,111,111,111,111,111,111,105,111,105,111,110,110,111,111,111,110,110,110,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,111,111,111,109,109,109,109,109,110,109,110,110,110,110,110,110,110,110,110,109,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,107,108,108,108,108,107,108,107,107,106,106,108,107,107,107,106,106,106,106,106,106,106,218,28,70,27,70,26,70,25,71,25,71,24,218,24,218,23,218,23,218,22,218,30,218,28,218,26,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220,220
+,252,108,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,108,108,109,108,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,108,108,108,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,107,109,107,109,107,109,107,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,107,252,107,252,107,109,107,109,107,109,107,109,107,107,107,109,109,107,107,105,105,105,105,111,111,111,111,111,111,111,111,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,110,110,110,110,110,110,109,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,109,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,110,111,111,110,109,110,109,110,109,110,109,110,110,111,111,111,111,111,110,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,110,110,105,105,105,111,111,111,105,111,111,111,111,111,111,111,111,111,105,111,105,111,110,110,109,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,109,109,109,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,109,108,108,108,108,108,108,108,108,108,108,105,105,105,105,111,105,104,104,104,104,104,104,104,108,107,108,106,108,106,107,106,107,106,107,106,107,106,106,106,70,29,218,29,218,28,218,27,218,26,218,26,218,25,218,24,218,23,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221
+,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,108,108,108,108,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,108,108,252,108,252,108,252,252,252,252,252,252,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,107,107,107,107,109,109,109,109,109,109,109,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,107,252,107,109,107,109,107,109,107,109,107,109,107,109,109,109,107,107,111,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,110,110,110,111,110,110,110,111,111,111,111,111,111,111,111,111,111,111,110,109,110,111,109,109,109,110,109,109,109,109,109,110,109,110,109,110,110,110,110,109,109,109,109,110,109,110,110,110,110,110,110,110,110,111,110,111,111,111,111,110,110,110,110,111,110,111,110,111,111,111,110,109,109,109,109,110,110,110,110,110,110,111,110,111,111,111,110,110,111,111,111,111,111,110,109,109,109,109,109,109,109,109,109,110,109,110,109,110,110,110,109,110,110,110,110,110,110,110,110,110,105,105,105,105,111,111,105,105,111,111,111,111,111,111,111,111,111,111,111,105,111,111,111,109,109,110,110,111,110,110,110,110,110,110,110,111,110,110,110,111,110,111,110,111,111,111,110,111,111,111,111,109,111,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,105,109,105,105,105,105,105,105,105,105,105,105,109,109,109,109,109,109,104,104,104,104,104,104,104,104,108,107,107,106,108,107,107,106,107,106,106,106,106,106,106,106,218,24,218,23,218,23,218,22,218,25,218,24,218,23,218,31,218,30,218,29,218,28,218,27,218,27,218,26,218,25,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,217,218,218,218,217,218,217,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220,221,220,220,220
+,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,108,252,108,109,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,108,108,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,252,252,252,252,252,107,109,107,109,109,252,107,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,107,252,107,252,107,109,107,109,107,109,107,109,107,107,107,109,109,107,107,107,111,111,111,111,111,111,111,111,111,111,111,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,111,111,110,109,110,110,109,109,110,110,111,110,109,109,110,109,110,109,110,109,110,110,111,110,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,111,110,110,111,110,111,110,111,110,111,110,111,110,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,111,110,109,109,109,109,109,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,110,105,105,105,111,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,105,111,110,111,110,109,109,110,110,111,110,111,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,111,109,110,111,109,109,110,109,110,109,110,109,110,110,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,111,110,109,110,110,111,110,111,111,111,109,104,106,107,108,104,104,108,107,107,106,107,106,107,106,107,106,107,106,107,106,106,24,218,23,218,23,218,22,218,25,218,31,218,29,218,27,218,26,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221
+,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,108,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,108,108,108,108,108,109,109,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,108,108,252,108,252,252,252,252,252,252,109,108,109,109,109,252,252,252,252,252,252,252,252,252,252,107,107,107,107,109,109,109,109,109,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,107,252,107,109,107,109,107,109,109,109,107,109,107,109,109,107,107,107,107,111,111,111,111,111,111,111,110,111,111,110,109,110,110,110,110,111,111,111,111,111,111,111,111,111,111,109,109,110,109,110,110,110,110,111,109,109,109,110,110,109,109,109,109,110,109,110,110,110,110,110,110,111,109,109,109,110,109,110,109,110,110,110,110,110,110,111,110,111,111,111,111,110,110,110,110,110,110,111,110,111,111,111,109,109,109,110,109,110,110,110,110,110,110,111,111,111,111,111,111,111,110,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,110,109,110,109,110,109,110,110,110,110,110,110,105,105,105,111,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,109,110,110,110,110,111,110,110,110,110,109,110,111,111,110,110,110,111,110,111,110,111,111,109,111,111,111,111,111,111,109,110,110,111,109,109,109,111,109,110,109,110,110,110,110,110,110,110,110,110,110,111,110,111,111,111,111,111,111,111,109,110,109,110,109,110,110,110,110,110,110,104,106,107,108,104,104,107,107,107,107,107,107,107,106,107,106,106,106,106,106,106,71,72,71,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220
+,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,108,108,109,108,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,108,109,108,109,252,109,252,109,252,252,252,252,252,252,252,107,107,107,109,107,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,107,252,107,109,107,107,107,109,107,109,107,107,107,109,107,107,107,107,107,111,111,111,111,111,110,111,110,111,110,111,111,110,110,110,110,111,110,111,111,111,110,111,111,109,109,110,110,111,111,110,109,110,110,109,109,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,110,111,110,111,110,111,110,111,110,111,110,109,109,110,109,110,110,111,110,111,110,111,111,110,110,111,110,111,111,109,109,109,109,110,109,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,105,105,105,111,111,105,110,111,111,111,105,111,111,105,105,111,105,111,111,111,109,111,111,111,105,111,110,109,109,110,110,111,111,111,110,111,109,110,109,111,110,111,110,111,110,111,110,111,110,109,110,111,110,111,110,111,111,109,109,110,109,111,110,111,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,111,111,109,110,109,110,109,110,109,110,110,110,110,111,110,104,106,107,107,104,104,104,107,107,107,107,106,107,106,107,106,107,106,106,106,106,29,218,28,218,26,218,25,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,217,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221
+,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,108,109,109,108,108,109,108,109,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,108,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,107,107,107,107,109,109,109,107,109,109,109,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,107,252,107,109,107,109,107,107,109,109,107,109,107,107,109,107,107,107,107,107,107,111,110,110,110,111,110,110,110,111,111,111,111,111,111,111,110,111,111,111,111,109,109,109,109,110,110,110,110,111,111,110,110,109,109,109,109,109,109,109,109,109,109,110,109,110,110,110,110,111,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,111,111,111,111,110,110,110,111,110,110,110,111,111,111,110,109,109,109,109,110,110,110,110,111,109,110,110,110,110,111,111,109,109,109,109,109,109,109,109,109,109,109,110,109,109,109,109,109,109,109,109,110,109,110,109,110,110,110,105,105,105,105,111,111,105,105,111,111,105,111,105,110,111,111,111,111,111,111,111,111,109,111,111,111,111,111,111,109,109,110,110,111,111,111,110,109,109,109,109,110,110,110,110,111,111,111,110,111,111,109,109,110,110,109,109,110,110,110,110,110,110,111,111,111,109,109,109,110,110,110,109,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,109,110,111,110,109,110,110,110,110,110,110,110,110,111,104,106,107,108,108,104,104,107,107,107,107,107,107,107,106,106,106,106,106,106,106,218,29,218,28,72,27,218,26,218,25,218,31,218,29,218,28,218,26,218,25,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,218,218,217,218,217,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,221,221,220,221,220,221,220,221,220,221,220
+,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,108,108,252,108,252,108,109,109,108,108,252,108,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,109,109,109,252,109,252,109,108,109,252,252,252,252,252,107,252,107,109,107,252,107,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,107,252,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,107,110,111,110,110,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,109,109,109,110,109,109,109,110,109,110,110,110,110,111,109,110,109,110,110,111,111,110,110,110,110,111,110,111,110,111,111,111,111,111,110,111,110,111,110,111,110,111,110,111,109,109,109,110,109,110,110,111,110,109,111,110,110,111,110,111,109,109,109,110,109,109,109,110,109,109,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,110,109,105,105,105,105,111,110,105,105,111,111,111,111,111,110,110,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,109,109,110,110,111,110,109,109,110,109,110,110,110,110,111,110,111,110,111,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,110,110,111,110,111,111,111,109,110,110,111,109,110,109,110,109,109,110,111,110,110,110,104,106,107,107,104,104,104,104,106,107,107,107,107,106,107,106,107,106,106,106,106,106,218,26,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221
+,109,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,252,109,109,108,108,108,109,108,109,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,109,109,252,252,252,252,252,252,252,252,252,252,252,107,107,107,109,109,109,109,109,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,107,252,107,109,107,109,107,109,107,109,107,109,107,107,109,109,109,109,107,107,107,111,109,109,110,110,110,110,110,110,110,111,110,111,111,111,111,111,111,111,109,109,109,110,110,110,110,110,110,111,111,111,111,111,109,109,109,109,109,110,109,109,109,110,110,110,110,109,109,110,110,110,110,110,110,111,111,110,110,110,110,111,110,111,111,111,111,111,110,110,110,110,110,111,110,111,110,111,109,109,109,110,110,110,110,111,111,109,111,110,110,111,111,109,109,109,109,109,109,109,109,109,109,110,109,109,109,109,109,109,109,109,109,109,109,109,109,110,109,105,105,105,105,105,111,105,105,105,111,111,111,111,111,111,110,110,110,110,110,110,110,111,110,111,111,111,111,111,111,111,105,111,111,111,109,110,110,111,110,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,110,110,110,110,110,110,110,110,111,111,111,111,111,109,109,109,109,109,110,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,109,110,110,111,110,110,110,104,106,107,108,104,104,104,106,108,106,107,107,107,107,107,107,106,107,106,106,106,106,106,218,25,218,24,218,31,218,30,218,28,218,27,218,26,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,217,221,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221
+,252,108,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,108,252,108,109,109,108,108,252,108,252,108,252,108,108,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,252,252,252,252,252,252,252,107,107,109,107,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,107,252,107,109,107,107,107,109,107,109,107,107,107,109,107,109,109,107,107,107,107,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,109,111,110,109,110,109,110,109,110,109,110,110,111,110,111,110,109,110,109,109,110,109,110,110,110,110,111,110,111,110,111,110,111,110,111,111,111,111,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,109,110,110,111,110,109,110,111,110,111,111,109,109,109,109,109,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,110,109,110,105,105,105,105,105,105,105,105,111,111,110,111,110,111,111,111,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,111,109,111,110,111,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,111,111,110,111,110,111,110,111,110,111,111,111,109,109,109,110,109,109,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,111,109,109,110,110,111,111,111,104,106,106,108,108,104,104,104,106,106,106,108,107,107,107,107,106,106,106,106,106,106,106,106,218,218,218,218,218,218,30,218,29,218,27,218,26,218,25,218,24,218,28,218,24,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221
+,252,252,109,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,109,109,109,108,108,108,108,108,252,108,108,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,109,109,252,252,252,252,252,252,252,252,252,107,107,107,109,109,109,109,109,109,109,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,107,252,107,109,107,109,109,109,107,109,107,109,107,107,107,109,109,109,107,107,107,107,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,110,111,109,110,110,111,111,109,109,110,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,109,109,109,109,110,110,110,110,110,110,111,110,111,111,111,110,111,111,111,109,111,111,111,111,111,111,110,109,109,109,109,109,110,110,110,110,110,110,109,109,109,110,111,111,110,109,109,109,109,109,109,109,109,109,109,109,110,109,109,109,110,110,110,109,109,109,109,109,109,109,105,105,105,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,111,111,111,110,111,111,111,111,111,111,111,111,111,110,110,110,110,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,111,111,111,110,110,110,110,111,111,111,111,111,111,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,109,109,110,110,110,111,111,111,110,104,106,107,108,104,104,104,107,107,106,106,106,107,107,107,107,107,107,106,106,107,106,106,106,106,27,218,27,218,26,218,25,218,25,218,24,218,23,218,22,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220
+,252,252,252,109,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,109,109,109,108,108,252,108,252,108,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,107,109,107,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,107,109,107,107,107,109,109,109,107,109,107,107,109,109,107,109,109,109,107,107,107,110,109,110,110,111,110,110,110,111,110,111,110,111,110,111,110,111,110,109,109,111,111,111,111,110,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,109,109,110,109,110,109,110,110,110,110,111,110,111,111,111,111,111,110,111,109,111,110,111,110,111,109,110,109,110,109,110,109,110,110,111,110,111,110,109,109,109,110,111,111,110,109,109,109,109,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,109,105,105,105,105,105,111,111,111,111,111,111,111,111,111,110,111,111,111,111,111,111,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,110,111,110,110,110,109,109,110,109,110,109,110,110,110,110,111,110,111,110,111,111,111,111,111,110,111,110,111,111,111,111,111,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,109,110,109,110,110,111,110,111,111,111,110,111,110,106,108,104,107,107,106,107,106,107,106,106,107,107,106,107,106,106,106,106,106,106,106,218,31,218,29,218,28,218,27,218,25,218,24,218,23,218,22,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221
+,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,108,109,108,109,108,109,108,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,107,109,109,109,107,109,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,107,109,107,109,107,107,109,109,107,109,107,107,107,109,107,109,109,109,109,107,107,107,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,109,110,111,111,111,111,111,110,109,110,110,110,110,110,110,110,110,110,110,111,110,111,111,111,111,111,109,111,111,110,110,110,110,110,110,111,111,111,111,111,110,111,111,111,111,111,111,110,110,110,109,109,109,109,109,110,109,110,110,110,110,110,109,109,109,109,110,111,111,111,109,109,109,109,109,109,109,110,109,110,109,109,109,109,109,110,109,110,109,110,110,109,109,105,105,105,105,105,111,111,111,111,111,111,105,111,111,111,110,111,111,111,111,111,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,110,110,110,110,110,110,109,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,111,110,111,110,111,111,111,111,111,109,109,109,109,109,110,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,109,109,109,110,110,110,110,111,111,110,110,110,110,111,110,106,107,107,106,107,106,106,106,106,107,106,108,107,107,107,106,107,107,106,106,106,106,218,218,218,31,218,30,218,29,218,28,218,27,218,26,218,24,218,23,218,22,218,218,218,218,218,218,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,109,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,252,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,109,252,109,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,107,109,107,107,107,109,107,109,107,109,107,107,109,109,107,109,109,109,107,107,107,110,110,110,110,109,110,111,110,111,110,111,110,111,110,111,110,111,109,110,109,111,111,109,109,110,110,111,110,111,111,111,110,111,110,111,110,111,110,111,109,110,110,111,109,110,110,111,110,111,110,111,111,111,110,111,110,111,110,111,111,111,111,110,109,109,109,110,109,110,109,110,109,110,110,110,110,111,110,111,109,109,111,110,110,111,110,111,111,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,105,105,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,111,110,111,110,111,111,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,110,111,110,111,109,109,109,109,109,110,109,110,110,111,110,111,110,110,110,111,110,111,110,111,110,111,110,111,111,111,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,109,109,110,110,111,110,110,110,111,110,111,110,111,104,111,109,108,107,107,106,107,106,106,106,106,107,106,108,107,106,106,106,107,106,107,106,106,106,218,25,218,23,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221,220,221
+,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,108,109,108,109,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,109,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,252,109,109,109,252,252,252,252,252,252,252,252,252,252,252,107,109,107,109,107,107,107,109,109,109,107,107,107,109,107,109,109,109,109,109,107,107,109,110,110,110,110,111,111,111,110,111,110,111,111,111,111,111,109,111,111,111,111,109,110,111,110,110,110,110,110,111,111,111,110,111,110,111,111,111,111,109,110,110,111,111,110,110,109,110,110,110,110,111,111,111,111,111,111,111,110,111,109,109,109,109,109,109,109,110,110,110,110,110,110,110,110,110,110,110,110,111,109,109,109,110,110,110,110,111,111,109,109,110,109,109,109,110,110,110,109,110,110,110,110,110,110,105,105,105,105,111,111,111,111,111,111,111,111,105,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,111,110,111,110,111,111,111,110,111,111,111,111,111,111,111,110,110,109,109,109,109,109,109,109,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,109,109,109,110,109,109,109,110,110,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,109,110,109,110,111,111,110,110,110,110,110,110,110,111,104,111,109,108,108,107,107,107,106,107,106,106,106,107,106,108,107,107,106,107,107,108,106,106,106,106,31,218,29,218,27,218,26,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221
+,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,108,109,252,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,109,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,109,109,109,107,109,107,110,109,110,110,111,110,111,110,111,111,111,110,111,109,111,109,111,110,111,111,110,109,110,110,111,110,111,111,111,110,111,110,111,111,111,110,111,110,109,109,111,111,111,111,111,110,111,110,111,110,109,109,110,110,111,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,109,109,110,109,110,110,111,111,111,109,110,109,110,109,110,109,110,109,110,109,110,109,110,105,105,105,105,111,111,110,111,111,111,111,105,111,105,110,111,111,111,110,111,111,111,110,111,111,111,111,111,111,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,111,111,111,111,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,111,110,110,110,111,110,111,110,109,109,110,109,110,110,111,110,111,111,111,110,111,110,110,110,111,110,111,104,111,109,108,107,108,107,107,106,107,106,107,106,106,106,108,106,107,106,106,106,107,107,107,106,107,106,106,30,218,28,218,26,218,31,218,28,218,25,218,23,218,217,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221,221,221,220,221
+,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,108,109,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,109,109,109,109,109,107,107,107,110,110,110,110,111,110,111,111,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,110,111,110,111,111,111,111,111,110,111,111,111,111,109,109,109,110,109,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,109,109,109,110,110,111,111,111,110,110,110,110,110,110,110,111,111,111,111,111,111,109,109,110,109,110,110,110,110,110,110,105,105,111,111,111,111,110,110,111,111,111,105,105,111,111,110,111,111,111,111,111,105,111,110,111,111,111,111,111,111,111,110,110,110,110,109,111,110,111,110,111,111,111,111,111,111,111,111,109,109,109,109,109,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,111,111,111,111,111,111,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,109,110,110,110,110,110,110,111,109,109,109,110,110,110,110,110,110,111,111,111,111,110,110,110,110,110,110,104,104,111,106,108,108,108,107,107,107,107,106,106,106,107,107,106,106,106,107,107,106,106,107,107,106,106,106,106,106,106,26,218,24,218,22,218,218,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,217,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221
+,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,108,109,252,109,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,109,109,107,107,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,111,111,110,109,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,109,110,109,110,109,110,110,111,110,111,111,110,110,110,110,111,110,111,110,111,110,111,110,111,111,111,111,110,109,110,105,105,105,105,105,105,110,111,110,111,110,111,105,111,110,111,110,111,111,111,111,111,111,111,110,111,110,111,110,111,111,111,109,110,109,111,110,111,110,111,110,111,110,111,110,111,111,111,111,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,109,111,110,111,110,111,111,111,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,111,110,111,110,111,110,111,109,110,109,110,109,110,110,111,110,111,110,111,111,111,110,111,110,111,110,104,106,108,104,109,108,108,107,108,107,107,106,107,106,107,106,107,107,106,107,106,107,106,106,107,107,106,106,107,106,106,106,218,25,218,31,218,28,218,25,218,22,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,221,217,217,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,220,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221
+,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,108,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,252,252,108,252,108,252,108,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,252,109,109,109,252,252,252,109,252,252,252,252,252,252,252,107,107,109,109,107,109,107,109,107,109,107,107,107,107,107,109,107,109,109,109,107,107,107,107,110,111,111,111,110,111,109,111,111,111,111,111,111,111,109,109,109,110,110,110,110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,110,110,111,109,109,109,109,109,109,109,110,109,109,109,110,110,110,109,110,110,110,110,110,110,110,110,110,110,110,110,109,109,109,109,110,110,110,110,110,110,111,111,111,110,110,110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,105,105,105,111,111,110,110,110,110,111,111,111,111,111,111,110,110,111,111,111,111,105,111,111,110,111,111,111,111,111,111,111,110,110,110,111,111,111,110,111,110,111,111,111,111,111,111,111,111,109,109,109,109,109,109,109,109,110,110,110,110,110,110,110,110,110,110,110,110,109,110,111,110,111,111,111,111,111,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,109,110,111,110,110,110,110,110,111,109,109,109,110,110,110,110,110,110,111,111,111,111,111,111,110,110,110,110,106,107,109,104,109,107,108,108,108,107,107,107,107,107,106,106,106,107,107,106,106,107,107,107,106,107,106,107,106,107,106,106,106,106,218,218,218,218,218,218,218,218,218,218,218,218,218,217,218,218,218,217,218,217,217,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,108,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,109,107,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,109,109,109,109,109,107,107,107,110,109,110,110,110,110,111,110,111,111,111,109,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,111,110,110,111,110,111,110,111,109,109,109,105,105,105,105,105,105,105,105,110,109,110,109,110,109,110,110,111,109,109,109,110,109,109,109,110,109,109,109,110,110,111,111,110,109,110,110,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,105,105,111,111,111,111,110,110,111,110,111,110,111,110,111,110,111,109,110,110,111,111,111,110,111,111,111,110,111,110,111,111,111,111,110,109,110,111,111,110,111,110,111,111,111,110,111,111,111,110,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,109,110,111,109,111,111,111,111,111,109,110,109,110,109,110,109,110,109,110,109,109,111,110,109,109,109,111,111,110,110,109,110,111,110,109,109,110,109,110,110,111,110,111,111,111,111,111,111,111,110,111,110,106,107,108,106,104,104,108,107,108,108,108,107,108,107,107,106,106,106,108,107,106,106,106,107,107,106,106,106,107,107,107,106,106,106,106,106,218,218,218,222,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221
+,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,108,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,252,109,108,252,108,252,108,252,108,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,109,109,109,109,252,109,252,109,252,252,252,252,252,252,252,109,109,107,109,109,109,107,109,107,109,107,109,107,107,107,107,107,109,109,109,109,109,107,107,107,107,107,110,110,110,110,110,110,111,111,111,111,111,111,110,110,110,109,109,109,110,110,110,110,111,111,109,109,110,110,110,110,110,110,110,110,111,110,111,105,105,105,105,109,107,107,106,106,106,106,106,105,105,105,105,105,105,105,105,105,105,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,105,105,111,111,111,111,110,110,110,110,110,111,110,111,111,111,110,111,111,110,110,110,110,105,111,111,110,110,110,111,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,110,109,109,109,109,109,109,109,110,109,110,110,110,109,110,110,110,110,110,110,109,110,110,109,110,110,111,111,111,109,109,109,110,109,110,109,110,110,110,110,109,110,111,109,110,110,111,111,109,111,110,110,111,110,111,110,109,109,110,110,111,111,111,111,111,111,111,111,111,110,110,110,106,107,108,104,104,104,106,104,108,107,108,108,108,107,107,107,108,107,107,106,107,106,106,106,107,107,107,106,107,107,107,106,107,106,106,106,106,218,218,218,218,218,218,218,218,218,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,109,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,109,109,109,107,107,107,107,109,110,110,111,110,111,110,111,110,111,110,111,110,111,111,110,110,111,110,111,110,109,109,110,109,109,109,110,110,111,110,111,110,105,105,105,105,109,109,110,105,105,111,104,107,106,106,106,106,106,106,106,106,107,107,107,107,107,105,105,105,105,108,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,110,110,111,110,105,105,111,111,111,110,110,110,111,110,111,110,111,110,111,110,111,105,111,110,111,110,111,110,111,111,111,110,111,110,111,110,111,110,111,111,111,110,111,111,111,111,110,109,110,110,110,110,110,110,110,110,110,109,109,109,110,109,110,109,110,109,110,109,109,109,110,110,111,110,111,110,111,109,109,109,110,110,111,110,111,111,110,109,110,109,110,109,110,109,110,109,110,109,111,109,110,110,111,109,111,110,111,110,111,110,111,110,111,110,111,109,111,110,111,110,111,111,111,110,111,110,111,110,106,107,104,104,110,110,104,106,107,107,108,108,104,104,108,107,108,107,107,106,106,106,107,106,106,106,108,107,107,106,107,107,106,106,107,106,107,106,106,104,104,104,104,104,218,218,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,218,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,222,222,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221
+,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,108,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,252,252,252,252,108,252,108,252,108,252,108,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,109,109,252,109,109,109,252,252,252,252,252,252,252,109,109,107,107,107,109,109,109,107,109,107,109,107,109,107,109,107,107,107,107,107,109,109,109,109,109,107,107,107,110,110,110,110,111,110,111,110,111,111,111,111,111,111,110,110,110,110,109,109,110,109,110,110,110,110,110,110,111,105,105,105,105,109,109,109,110,105,105,105,111,111,111,104,107,106,107,106,107,106,107,106,107,106,107,106,107,106,107,107,108,108,109,108,109,109,109,109,110,109,110,109,110,110,110,109,110,110,110,110,110,110,110,110,110,110,110,105,105,111,111,111,111,110,110,110,110,110,110,110,111,111,111,109,110,105,111,110,111,111,110,110,111,111,111,110,110,110,110,110,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,109,109,109,109,109,109,109,110,110,110,109,109,110,110,110,111,111,111,110,111,109,109,109,110,110,110,110,111,110,111,111,111,109,110,109,110,110,110,110,110,109,109,109,110,110,110,111,111,110,110,110,111,110,110,110,111,111,111,111,111,111,111,111,111,111,111,111,110,109,109,110,110,104,104,110,111,111,109,104,106,106,107,107,108,108,104,104,104,108,108,107,107,106,106,106,107,107,106,106,107,107,107,106,108,106,108,106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104,104,218,217,218,217,218,217,218,217,217,217,217,217,217,221,217,217,217,221,217,221,217,221,217,221,221,221,221,221,221,221,217,221,217,221,221,221,222,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,109,252,109,252,109,108,252,252,252,108,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,109,107,109,107,109,107,109,109,109,107,109,107,107,107,109,107,107,107,109,107,109,107,109,107,109,107,107,107,107,107,111,110,111,110,111,110,111,110,111,110,111,111,109,109,110,109,110,109,110,110,110,110,110,110,105,105,105,105,105,105,105,105,105,105,105,105,111,110,111,110,111,111,111,104,107,106,107,106,107,106,107,107,108,107,107,107,107,107,107,108,107,108,109,108,109,108,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,105,105,105,111,111,110,111,110,111,110,111,110,111,110,111,110,111,109,111,111,111,111,110,110,111,110,111,111,110,109,110,110,111,110,111,110,111,110,111,111,111,110,111,111,110,109,110,110,110,109,110,110,111,110,110,109,110,109,110,109,110,109,110,109,109,109,110,109,110,110,111,111,111,110,111,110,109,109,110,109,110,109,110,110,111,110,111,111,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,111,111,111,109,110,109,110,110,111,110,111,110,109,109,110,109,104,106,107,106,107,107,108,108,104,104,104,104,107,106,107,106,107,107,107,106,106,107,108,107,107,106,106,107,107,106,107,106,106,106,104,104,104,104,104,104,104,104,104,104,104,106,104,217,218,217,217,217,218,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,222,222,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221
+,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,109,109,109,252,109,252,252,252,252,252,252,109,109,107,107,109,107,109,109,109,107,109,107,107,109,109,107,109,107,107,107,109,107,109,109,109,109,109,107,107,107,107,110,110,110,111,110,111,110,111,111,111,109,109,109,109,109,110,109,110,110,110,105,105,105,105,111,111,111,111,111,110,110,110,110,110,110,110,110,111,111,111,111,111,111,104,107,107,106,107,107,107,106,107,107,108,107,107,107,107,107,107,108,108,108,109,108,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,105,105,105,105,105,105,105,111,111,110,110,110,110,109,110,110,111,111,111,111,105,111,111,110,111,111,111,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,109,109,109,109,109,109,110,109,109,109,110,110,110,110,111,111,111,110,111,110,109,109,110,110,110,110,110,110,111,111,111,109,110,109,110,110,110,110,110,109,109,109,110,110,111,111,111,110,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,111,109,109,109,110,110,111,111,111,109,110,110,110,110,104,106,106,106,107,107,108,108,108,108,104,104,104,104,104,106,106,106,107,107,107,106,106,107,107,107,107,106,108,106,107,106,106,106,106,106,104,104,104,104,104,104,104,104,104,106,107,108,104,217,218,217,218,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,217,221,222,221,217,221,217,221,222,221,222,221,222,221,222,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,107,109,252,109,252,109,252,109,252,252,109,109,107,107,109,107,109,107,109,109,109,107,107,109,109,107,109,107,107,107,109,107,109,107,109,109,109,107,109,107,107,107,107,110,111,110,111,110,111,110,111,109,109,109,110,109,110,109,105,105,105,105,111,105,105,111,111,111,111,109,110,109,110,110,110,110,111,110,111,110,111,110,111,111,110,104,107,107,107,106,107,107,107,107,107,107,108,107,107,107,107,107,107,108,107,108,109,108,110,108,110,109,110,109,110,109,110,109,110,109,110,109,110,105,105,105,105,105,111,111,111,110,109,109,110,109,110,110,111,110,111,110,111,111,105,111,110,110,111,111,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,111,109,109,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,109,110,109,110,110,111,110,111,109,110,109,110,109,110,109,110,109,110,110,109,109,111,111,111,110,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,109,110,110,111,110,111,111,110,110,111,111,110,109,110,110,110,110,104,106,107,106,107,107,108,107,108,108,104,108,104,104,104,104,107,106,107,106,107,107,106,106,106,106,108,107,106,108,107,106,107,106,107,106,106,106,104,104,104,104,104,106,104,106,107,107,104,104,106,217,218,217,217,217,217,217,217,217,217,217,217,217,217,221,217,221,217,221,217,221,221,221,221,221,217,221,221,221,221,221,221,221,221,221,221,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222
+,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,252,109,252,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,107,107,252,109,252,109,252,252,252,252,252,109,107,107,107,107,107,107,109,109,109,109,107,109,109,107,109,107,109,107,107,107,107,107,109,109,109,107,109,107,107,107,107,107,110,110,110,110,110,110,111,109,109,109,105,105,105,105,105,105,105,111,105,105,111,111,111,110,110,110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,104,108,107,107,107,108,107,107,107,107,107,107,107,107,108,107,108,107,108,107,108,107,108,109,108,110,109,109,109,110,109,110,109,110,110,110,109,105,105,111,111,111,111,111,111,111,110,110,110,109,109,110,110,111,111,111,111,111,111,105,111,111,110,111,110,111,109,110,109,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,109,109,109,109,109,110,111,110,109,110,110,110,110,110,110,110,110,111,110,111,110,109,110,111,111,111,109,109,109,110,109,110,109,110,110,110,109,110,110,110,109,111,110,110,110,110,110,110,110,111,110,110,110,111,111,111,109,109,109,110,110,110,110,110,110,111,111,109,111,110,110,110,110,110,110,110,110,110,110,104,106,107,107,107,107,108,108,108,108,104,104,104,104,108,107,106,106,107,107,107,106,106,106,106,108,107,106,108,106,107,107,106,106,107,106,106,106,104,104,104,106,104,104,104,106,107,108,104,106,106,217,218,217,217,217,217,217,217,221,217,221,217,221,217,221,217,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,221,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,252,107,252,109,252,109,252,109,252,109,252,252,109,107,107,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,107,107,109,107,109,107,109,109,109,107,109,107,107,107,109,107,110,110,111,110,111,105,111,105,105,110,105,110,105,111,111,110,111,111,111,111,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,111,104,104,108,107,108,107,107,107,107,107,107,107,107,107,107,107,107,108,107,108,107,108,108,108,108,108,109,108,110,108,110,109,110,109,110,109,110,105,105,111,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,110,111,111,111,105,111,110,111,110,111,110,111,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,111,111,110,111,110,110,109,110,110,110,110,110,110,111,109,110,109,110,110,111,111,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,111,111,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,111,110,110,110,111,110,111,110,111,110,111,110,111,109,110,109,110,109,110,110,111,110,111,111,111,110,111,111,110,109,110,110,110,109,110,110,111,110,104,104,106,106,107,107,108,108,104,104,104,104,106,108,107,106,106,106,107,106,107,106,106,106,106,107,106,107,107,106,107,106,106,106,107,106,106,104,104,104,104,104,104,104,106,107,104,106,106,106,218,217,218,217,218,217,217,217,217,217,217,217,217,217,222,221,217,221,217,221,221,221,222,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,108,252,108,252,252,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,107,107,107,252,109,252,252,252,252,252,252,109,107,107,107,107,107,109,109,109,109,107,107,109,109,109,107,109,107,109,107,107,107,109,107,109,109,109,107,109,107,107,107,107,107,107,107,105,111,111,105,111,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,111,110,111,111,111,111,111,111,111,111,104,108,108,108,108,107,108,107,108,108,108,107,107,107,107,107,107,108,107,107,107,108,107,108,107,108,108,108,109,108,109,109,110,109,110,109,105,105,111,111,111,111,111,110,110,110,110,110,110,110,110,110,111,110,109,110,110,111,111,111,110,110,111,110,111,111,111,109,109,109,110,110,110,110,110,110,110,110,111,110,111,111,111,111,111,111,111,111,110,110,110,110,110,110,110,110,109,109,110,110,110,110,111,111,111,109,110,110,110,110,110,110,111,110,111,111,111,111,111,111,111,111,111,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,110,111,111,109,110,110,111,109,109,109,109,110,110,110,110,110,110,111,111,111,111,110,110,110,110,110,110,110,104,106,106,107,107,108,108,104,104,104,104,107,107,107,108,106,106,106,107,107,107,106,106,106,107,107,107,106,108,107,107,107,106,106,107,107,107,106,104,104,104,104,104,106,107,104,106,107,106,106,106,218,217,217,217,217,217,217,221,217,221,221,221,217,217,217,221,222,221,217,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,221,221,221,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221,221,221,222,221,221,221,221,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,107,107,252,107,252,109,252,109,252,252,109,109,107,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,109,109,109,107,109,107,107,107,107,107,107,107,111,110,111,110,111,111,111,110,111,111,111,109,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,104,108,108,108,108,107,108,107,108,108,108,108,108,107,108,107,107,107,107,107,107,108,107,108,107,108,108,108,107,108,109,108,110,109,110,105,105,105,105,111,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,110,109,111,111,111,111,110,111,110,111,110,111,111,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,111,111,110,111,111,111,110,110,110,110,110,110,110,109,109,110,109,110,110,111,110,111,109,110,110,110,110,111,110,111,110,111,110,111,111,111,110,111,111,111,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,109,109,110,109,110,109,110,110,110,110,111,110,111,110,111,111,110,110,111,110,111,110,111,104,104,104,104,106,107,107,104,104,104,107,108,107,107,108,107,106,107,107,107,106,106,106,106,107,108,106,108,107,107,106,107,106,106,106,107,106,106,104,104,104,104,106,104,106,107,107,107,106,106,106,218,217,217,217,217,217,217,217,217,217,217,222,217,222,221,221,222,221,221,221,221,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,108,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,108,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,107,107,107,252,252,252,109,252,252,252,109,107,107,107,107,109,107,109,107,109,109,107,107,109,109,109,107,109,107,109,107,107,107,107,107,109,109,109,107,109,107,109,107,107,107,107,107,107,111,111,110,111,111,111,111,111,111,111,109,110,110,110,110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,111,111,104,104,108,108,108,108,108,108,108,108,107,108,108,108,108,108,108,108,107,107,107,107,107,107,107,107,108,107,108,107,108,107,108,109,108,109,105,105,105,105,111,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,111,111,109,111,110,111,110,111,111,111,111,111,111,111,109,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,110,110,110,110,109,109,110,110,110,110,111,110,111,109,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,111,111,109,109,109,110,109,110,109,110,110,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,110,110,110,111,111,111,110,111,111,111,111,111,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,110,110,110,110,111,110,110,110,111,111,111,110,104,106,108,104,104,108,107,107,107,107,108,106,106,106,107,106,106,106,106,106,106,107,106,108,107,107,107,106,106,107,106,107,107,106,104,106,107,108,104,106,106,106,107,107,106,106,106,106,218,217,221,221,217,217,217,221,217,217,217,221,217,222,217,221,222,221,222,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221,222,221,221,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,108,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,109,252,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,107,252,107,252,107,252,252,252,252,109,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,107,109,107,109,109,109,107,109,107,109,107,107,107,109,107,107,107,107,110,111,111,111,111,111,109,110,109,110,109,110,109,110,110,111,110,110,110,111,110,111,110,111,110,111,111,111,111,111,104,108,107,108,108,108,107,108,107,108,107,108,107,108,107,108,108,108,107,107,107,108,107,107,107,108,107,107,107,107,107,107,108,108,109,105,105,105,105,105,111,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,111,111,109,111,110,111,110,111,110,111,110,111,111,111,111,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,110,111,111,111,111,111,111,111,111,110,110,109,109,110,110,111,109,110,110,111,110,111,110,110,110,110,110,111,110,111,111,111,111,111,110,111,110,111,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,111,110,109,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,109,109,110,109,110,109,110,110,111,110,111,111,111,110,110,110,111,110,111,110,111,110,111,110,111,110,111,104,106,107,108,104,104,107,108,107,108,107,108,107,107,106,107,106,107,106,106,106,108,106,108,107,107,106,107,106,106,107,107,107,104,106,107,108,104,107,106,106,107,106,107,106,107,106,106,106,217,221,217,217,217,217,217,221,222,221,222,221,217,221,221,221,221,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,108,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,107,252,252,252,252,252,109,109,107,107,107,107,107,109,107,109,109,107,107,109,107,109,109,109,107,109,107,107,109,109,109,109,107,109,107,109,107,109,107,107,107,107,107,107,107,111,111,111,111,109,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,111,111,111,111,111,111,104,108,108,108,108,108,108,108,108,108,108,108,108,108,107,108,108,108,107,107,107,107,108,108,107,107,107,107,107,107,107,107,107,107,105,105,105,105,105,105,111,109,109,109,109,110,109,110,110,110,110,110,110,111,109,110,110,111,111,111,110,111,110,111,111,111,111,111,111,111,111,111,109,110,110,110,110,110,110,111,111,111,110,111,110,111,110,111,111,111,111,111,111,111,111,111,110,110,110,109,109,109,109,110,110,110,110,111,111,110,110,110,110,111,111,111,111,111,110,111,111,111,111,111,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,109,110,110,111,111,110,110,110,110,110,110,111,110,111,111,111,111,111,111,111,111,111,111,109,109,110,110,110,110,110,110,111,111,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,104,106,106,107,108,104,104,108,107,107,107,107,107,107,107,107,106,106,106,106,106,106,106,108,107,107,107,107,107,107,106,107,107,104,106,106,107,104,108,107,106,106,106,107,107,107,106,106,106,106,106,217,221,217,221,217,221,217,221,217,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,108,252,109,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,252,107,107,109,252,109,252,252,109,109,107,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,107,107,107,107,107,109,107,107,107,111,111,109,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,111,111,104,108,108,108,108,108,108,108,108,108,107,108,107,108,107,108,107,108,108,108,107,108,107,108,108,108,107,108,107,108,107,107,107,105,105,105,105,111,105,105,111,110,109,110,109,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,110,110,111,110,111,111,110,110,110,110,111,110,111,110,111,110,111,111,111,110,111,110,111,111,111,110,111,109,110,109,110,109,110,110,111,110,111,111,111,110,111,111,111,110,111,110,111,110,109,111,111,109,110,109,111,109,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,110,109,109,109,110,110,111,111,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,104,104,106,107,107,108,108,104,107,108,107,108,107,107,108,107,106,107,106,107,106,107,106,106,106,108,106,108,107,107,106,107,106,106,107,104,106,104,108,108,107,107,106,107,106,107,106,107,106,107,106,106,221,217,221,217,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,108,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,107,107,107,107,252,109,252,252,252,109,109,109,107,107,107,107,107,107,109,109,109,109,107,107,109,109,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,107,107,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,111,111,110,111,111,111,111,104,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,107,108,108,108,107,108,107,107,108,108,108,108,107,108,107,105,105,111,105,111,105,105,111,110,109,110,110,110,110,110,110,109,109,110,110,110,110,111,111,111,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,111,110,111,109,109,109,110,110,110,110,110,110,109,109,111,111,111,111,111,111,111,111,111,111,111,110,111,109,109,109,110,110,110,110,110,110,111,111,111,110,110,110,111,110,111,110,111,111,111,111,111,109,109,110,111,109,109,109,109,109,109,109,110,110,110,110,110,110,111,110,111,111,111,110,110,110,110,110,111,111,111,110,111,111,111,111,111,111,111,111,111,110,110,110,111,111,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,104,106,107,107,108,108,104,104,106,107,108,107,107,107,107,107,107,106,107,106,106,106,106,106,106,107,106,107,108,107,107,106,107,107,108,104,104,107,108,108,107,107,107,106,107,107,107,106,106,106,106,106,106,221,217,217,222,221,222,217,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,109,252,252,109,109,252,252,252,252,252,252,252,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,109,107,252,109,252,109,252,109,109,109,109,107,107,107,109,107,109,107,109,107,109,109,107,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,107,107,107,109,107,107,107,109,107,107,109,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,111,104,108,108,108,108,108,108,108,108,108,108,108,108,108,108,107,108,108,108,107,108,107,108,107,108,107,108,107,108,108,108,107,108,105,105,105,111,105,111,105,105,111,110,109,110,109,110,109,110,110,109,109,110,109,110,110,111,111,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,110,111,110,110,109,110,109,109,109,110,109,110,110,109,109,110,110,111,110,111,111,111,110,111,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,111,109,110,110,111,111,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,111,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,109,110,110,111,110,111,111,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,104,106,106,107,107,108,108,104,106,106,107,108,107,107,107,107,106,107,106,107,106,107,106,106,106,106,107,108,106,107,107,106,107,108,104,107,107,108,107,108,107,107,106,107,106,107,106,107,106,107,106,107,106,106,221,217,221,217,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,109,109,252,252,109,109,252,252,252,252,252,252,108,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,107,107,107,107,252,252,252,252,252,252,109,109,109,107,107,107,107,107,109,107,109,109,109,107,109,109,109,107,109,107,107,109,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,107,107,107,109,109,109,109,109,110,109,110,111,110,110,109,111,110,110,111,111,111,111,111,111,107,107,108,108,108,108,108,108,108,108,108,108,108,108,107,107,108,108,108,108,108,108,108,107,108,107,108,107,108,107,107,108,105,105,105,111,111,105,111,105,111,111,110,109,110,110,110,110,110,110,109,109,110,110,110,110,111,111,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,111,111,111,109,109,109,110,109,110,110,110,109,109,109,110,110,110,110,111,111,111,109,109,109,109,109,110,109,109,109,110,110,110,110,110,110,111,111,111,110,111,110,111,111,111,111,111,111,109,109,109,109,110,110,111,110,110,110,110,110,110,110,110,110,110,110,111,109,110,111,111,111,111,111,111,110,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,109,110,110,110,110,111,111,111,111,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,104,106,106,107,107,108,108,104,104,106,106,108,107,108,107,107,107,107,107,107,106,107,106,106,106,106,106,106,107,107,107,107,106,107,108,104,108,108,108,108,107,107,107,107,106,106,107,107,107,107,106,106,106,106,106,106,221,217,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,109,252,109,252,252,109,109,252,109,252,109,252,252,252,252,108,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,107,252,109,252,109,252,109,252,109,109,109,107,107,107,107,109,107,109,107,109,107,109,107,109,109,109,107,107,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,109,107,107,107,107,107,107,109,110,109,110,110,111,110,109,111,110,110,111,110,111,110,111,110,109,109,110,107,107,107,107,108,108,108,108,108,108,108,108,107,108,107,107,107,108,108,108,107,108,107,108,107,108,107,108,107,108,107,105,105,111,111,111,111,111,105,111,111,110,109,110,109,110,109,110,110,110,109,110,109,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,110,111,110,109,109,110,109,110,109,110,109,110,109,109,109,110,109,110,110,111,110,111,111,109,109,110,109,110,109,110,110,111,111,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,111,110,109,110,109,111,110,111,109,110,110,110,110,111,110,111,110,111,110,109,109,110,110,111,110,111,111,111,111,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,110,109,110,110,111,110,111,110,111,111,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,104,106,106,107,107,108,108,104,104,104,106,106,106,108,107,108,107,107,107,107,106,107,106,107,106,107,106,106,106,108,107,108,107,107,104,107,108,108,107,108,107,108,107,108,107,107,107,107,106,107,106,107,106,107,106,107,106,106,221,217,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,109,252,109,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,109,252,252,252,252,252,109,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,252,252,252,252,252,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,109,107,107,109,109,252,252,252,252,109,109,109,107,107,107,107,107,109,107,109,107,109,109,109,109,109,109,109,107,109,109,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,107,107,107,107,110,109,110,110,110,109,111,111,111,111,111,110,110,110,111,111,109,109,110,110,107,106,107,107,107,107,108,108,108,108,108,108,108,108,108,107,107,107,108,108,108,108,108,105,105,105,105,105,105,105,105,105,111,111,111,111,111,105,111,111,110,109,110,110,110,110,110,110,110,110,109,110,111,110,111,110,110,110,111,111,111,110,111,111,111,111,111,111,111,110,111,111,111,110,109,109,109,109,110,109,110,109,110,110,109,109,110,110,110,110,110,110,111,111,111,109,109,109,110,110,110,109,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,110,109,109,110,110,110,110,111,111,110,110,110,110,110,110,111,110,110,110,109,109,110,110,110,110,111,111,111,111,111,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,109,109,110,110,110,110,111,110,111,111,111,111,110,110,110,110,110,110,111,110,110,110,111,111,111,110,104,106,108,109,108,104,110,108,104,104,104,106,106,106,108,107,108,107,107,107,107,107,107,106,107,106,106,107,106,106,108,107,107,107,107,108,108,108,108,108,108,108,108,107,108,107,106,108,107,107,107,106,106,106,106,106,106,106,107,221,222,217,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,107,252,109,252,109,252,109,252,109,109,109,109,107,109,107,109,107,109,107,109,107,109,107,109,109,109,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,107,107,109,107,107,107,107,107,110,110,111,110,111,110,111,110,111,111,111,110,111,110,109,109,110,109,110,107,107,106,107,106,107,107,107,108,108,108,108,108,108,108,108,107,107,105,105,105,105,105,111,111,105,105,105,105,105,111,111,110,111,111,111,105,111,111,110,109,110,110,110,109,110,110,111,110,109,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,111,111,111,110,111,110,111,110,111,109,109,109,110,109,110,109,110,109,109,109,110,109,110,109,110,110,111,110,111,111,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,111,111,110,111,109,109,109,110,110,111,110,111,111,111,110,110,110,111,110,111,110,111,110,109,109,110,109,110,110,111,110,111,110,111,111,111,110,111,110,111,110,111,110,111,111,111,110,111,111,109,109,110,109,110,109,110,110,111,110,111,111,111,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,106,110,108,104,104,111,104,107,106,106,107,108,107,108,107,107,107,107,106,107,106,106,106,107,107,106,106,108,107,108,108,108,108,108,108,108,108,108,107,108,107,108,106,107,108,107,106,106,106,107,106,107,106,107,106,107,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,107,107,109,109,109,252,109,252,252,109,109,109,109,107,107,107,107,107,107,109,107,109,109,109,109,109,109,107,107,109,109,109,107,109,107,109,107,107,107,109,107,107,107,107,107,107,107,107,107,107,107,107,110,110,110,110,110,111,111,111,111,111,110,110,110,109,109,109,109,110,107,107,106,107,106,107,106,107,107,107,107,108,108,105,105,105,105,105,105,105,111,105,111,105,105,105,105,105,105,111,111,105,111,111,111,111,105,111,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,110,111,110,111,111,111,111,111,109,109,109,109,109,109,109,110,109,110,109,109,109,110,110,110,110,111,110,111,111,109,109,110,109,111,110,110,110,110,110,110,110,110,110,111,110,111,111,111,111,111,111,110,109,109,109,110,110,111,111,111,110,110,110,110,110,110,110,111,110,111,110,109,109,109,109,110,110,110,110,110,110,111,110,111,111,111,110,111,111,111,111,109,111,111,111,111,109,109,109,110,110,110,110,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,106,107,108,104,104,104,107,106,106,106,106,107,108,107,107,107,107,107,107,107,107,106,107,107,107,106,106,106,108,108,108,108,108,108,108,108,108,108,108,108,108,107,106,107,108,107,106,106,107,107,107,106,106,106,107,107,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,109,252,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,109,252,109,252,109,252,109,109,109,109,107,107,107,109,107,109,107,109,107,109,109,109,109,107,107,107,109,109,107,109,107,109,107,109,107,109,107,107,107,107,107,109,107,109,107,109,107,107,107,107,110,111,110,111,110,111,109,110,110,110,110,109,109,110,109,110,109,107,106,107,106,107,106,107,106,105,105,105,105,105,111,105,105,111,105,105,111,105,111,111,111,105,105,105,105,105,105,105,111,111,111,111,105,111,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,110,111,110,111,110,111,110,111,109,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,111,110,109,109,109,110,110,111,110,110,110,110,110,111,110,111,110,111,110,111,111,111,111,109,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,109,110,109,110,110,111,110,111,110,111,111,111,110,111,110,109,110,111,111,109,109,110,109,110,110,111,110,111,110,111,111,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,109,110,111,110,111,110,111,110,106,106,110,104,107,106,107,106,107,106,106,107,108,107,108,107,107,106,107,106,106,106,107,107,106,106,106,108,108,108,108,108,108,108,108,108,108,107,108,107,108,107,106,107,107,106,106,106,107,106,107,106,107,106,107,106,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222,221,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,108,252,108,252,108,108,109,252,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,109,109,109,109,109,252,109,109,109,109,107,107,107,109,107,109,107,109,109,109,109,107,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,107,107,107,107,107,107,107,107,107,107,107,107,111,111,111,109,110,110,110,110,110,110,110,109,109,109,110,109,110,107,107,105,105,105,105,105,105,105,105,105,105,105,111,111,111,111,111,111,111,111,111,105,105,105,111,111,111,111,111,111,111,111,105,111,111,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,111,111,110,111,111,111,111,111,111,111,110,111,110,110,110,111,111,111,110,111,109,109,109,109,109,109,109,110,109,109,109,109,109,110,109,110,110,110,110,111,111,109,109,109,109,110,110,111,111,110,110,110,110,110,110,111,111,111,111,111,111,111,109,109,109,110,110,111,110,110,110,111,111,111,110,110,110,110,110,111,110,111,110,111,111,109,109,110,109,110,110,110,110,110,110,111,111,111,111,111,111,111,110,111,109,110,111,109,109,109,109,110,110,110,110,111,111,111,111,110,110,110,110,110,110,110,110,111,110,110,110,111,110,111,110,109,111,111,111,111,111,111,106,107,108,104,110,107,107,107,106,107,106,106,106,108,107,107,107,107,107,107,107,107,106,106,106,107,107,106,106,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,107,107,107,106,106,107,107,107,106,106,106,106,106,107,107,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,108,109,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,109,109,252,109,252,109,109,109,109,109,107,107,107,107,109,107,109,107,109,107,109,107,109,107,109,109,109,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,107,107,107,107,107,109,110,109,110,109,110,109,110,110,111,110,109,109,110,109,110,105,105,105,111,111,111,105,111,105,111,111,105,111,109,111,111,111,111,111,111,111,105,105,105,105,111,105,111,111,111,111,105,111,111,111,110,109,110,109,110,110,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,111,110,111,110,111,110,111,110,111,110,109,109,109,109,109,109,109,109,110,109,109,109,109,109,110,110,111,110,111,109,110,109,109,109,110,110,111,111,111,110,111,110,111,110,111,110,111,110,111,111,109,109,110,109,110,109,110,110,111,111,111,111,111,110,110,110,111,110,111,110,111,110,111,110,111,109,109,109,110,109,110,110,110,110,111,110,111,110,111,111,111,110,111,110,111,110,111,109,110,109,110,110,111,110,111,110,111,111,110,110,111,110,110,110,111,110,111,109,110,109,110,110,111,110,111,110,111,110,111,110,111,106,107,108,104,110,107,107,107,106,106,107,107,106,106,106,108,107,108,107,108,106,107,107,106,106,107,107,107,106,106,106,108,108,108,108,108,108,108,108,108,108,108,108,108,107,108,107,108,107,106,106,107,107,107,106,106,106,107,106,107,107,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222,222,222,221,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,108,108,108,108,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,252,109,109,109,109,252,252,109,109,109,107,107,107,107,107,109,109,109,109,109,107,107,107,109,109,109,109,109,107,109,107,109,107,107,109,109,107,107,107,107,107,107,107,107,107,107,107,107,107,109,109,109,109,109,109,110,109,110,109,110,110,109,109,110,110,110,111,111,110,111,105,105,111,111,105,111,111,111,111,111,111,111,111,111,105,105,111,105,111,111,111,111,111,111,105,111,111,105,111,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,111,111,110,110,110,111,111,111,110,111,110,111,110,111,110,111,111,111,111,111,109,109,109,109,109,109,109,109,109,109,109,109,109,109,110,110,111,109,109,109,109,110,109,110,110,111,111,110,110,110,110,110,110,109,110,111,111,111,109,109,109,110,109,109,109,110,110,110,110,111,111,111,110,110,110,110,110,110,110,111,110,111,110,111,110,109,109,109,109,110,110,110,110,110,110,111,111,111,110,111,110,111,111,111,111,111,111,109,109,110,110,110,110,111,111,111,111,111,110,110,110,110,110,110,110,109,109,110,110,110,110,110,110,111,111,111,111,111,111,111,111,106,107,108,104,110,107,107,107,106,106,107,107,107,106,106,106,108,107,107,107,106,106,107,106,106,106,107,107,106,106,106,106,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,107,107,106,106,106,107,107,107,106,106,106,107,107,107,106,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,252,109,109,252,109,252,109,109,109,107,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,109,107,109,107,107,109,109,109,110,109,110,109,110,109,111,109,110,109,110,109,110,110,111,110,111,111,111,111,111,111,111,110,111,110,111,111,111,111,105,105,105,105,105,105,111,105,111,111,111,105,111,111,111,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,111,110,111,110,111,110,111,109,109,109,109,109,109,109,109,109,109,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,111,110,110,110,111,109,110,109,110,110,111,110,111,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,109,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,111,110,111,111,111,109,110,109,110,110,111,110,111,111,111,111,110,110,110,110,111,110,109,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,106,107,108,104,110,107,108,107,107,106,107,106,107,107,107,106,106,107,108,107,108,107,107,106,107,106,107,106,107,106,106,107,106,108,108,108,108,108,108,108,108,108,108,108,108,107,108,107,108,107,106,107,106,106,107,106,106,106,107,107,107,107,106,106,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,108,108,108,108,108,252,108,108,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,109,109,109,252,252,252,252,109,107,107,107,109,109,109,109,109,107,109,107,107,107,107,107,109,109,109,107,109,107,109,107,107,109,109,107,109,107,107,107,107,107,107,107,107,107,107,107,107,109,109,109,110,110,110,110,111,110,110,109,110,110,110,110,110,110,110,110,111,111,111,110,111,111,111,111,111,111,111,111,105,111,111,111,105,111,111,111,111,111,105,105,111,111,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,111,111,111,111,110,110,110,111,110,111,111,111,111,110,110,111,111,111,110,111,111,111,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,110,109,109,109,110,109,110,109,110,110,109,109,110,110,110,110,110,110,111,110,111,111,109,109,110,109,109,109,110,110,110,110,111,111,111,111,110,110,110,110,111,110,110,110,111,110,111,110,111,111,111,110,111,111,111,111,111,111,111,111,111,110,111,110,111,111,111,111,111,111,111,111,111,109,109,110,110,111,111,110,111,111,111,110,110,110,110,110,109,109,109,109,110,110,110,110,111,111,111,110,111,111,111,111,111,106,107,108,109,110,108,107,107,107,106,106,107,107,107,106,106,106,106,107,108,107,107,107,107,107,107,106,107,107,106,106,107,107,106,108,108,108,104,104,104,104,108,108,108,108,108,108,108,108,108,107,106,106,106,106,107,107,106,106,107,107,106,106,106,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,107,252,252,252,109,109,109,252,109,252,252,107,107,109,107,109,107,109,109,109,107,107,107,109,107,109,109,109,109,109,107,109,107,109,107,107,107,109,107,109,107,107,107,109,107,107,107,109,107,107,107,110,109,110,110,111,111,110,109,110,109,110,110,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,111,111,105,105,111,111,105,105,111,111,105,111,105,105,111,111,111,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,111,111,110,110,110,111,110,111,111,111,110,111,110,111,110,111,110,111,111,111,109,109,109,110,109,109,109,109,109,109,109,110,109,109,109,110,109,110,109,109,109,110,109,110,109,110,110,109,109,110,109,110,109,110,110,111,110,111,110,111,111,110,109,110,109,110,110,111,110,111,111,111,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,111,110,111,110,111,110,111,111,111,111,111,109,110,109,110,110,111,110,111,110,111,110,110,110,111,110,109,109,110,109,110,110,109,110,111,110,111,110,111,110,111,110,111,111,109,109,109,108,108,107,108,107,108,107,107,106,106,106,107,107,107,106,108,107,108,107,107,107,107,106,107,106,106,106,107,106,104,104,104,104,104,104,104,104,104,104,104,108,108,108,108,108,108,107,108,107,108,106,107,106,107,106,107,106,107,107,107,106,106,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222,222,222,222,222,222,223,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,108,108,108,108,108,108,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,252,252,252,252,107,107,107,107,109,109,109,107,107,107,107,107,109,109,109,109,109,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,107,107,107,107,107,110,110,111,111,109,110,109,110,109,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,105,105,111,105,105,105,105,111,111,111,111,111,111,111,111,109,109,109,109,109,110,109,110,110,110,110,110,110,110,110,111,110,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,110,110,109,109,109,109,110,110,110,110,110,110,111,110,111,111,111,111,110,110,110,110,111,110,111,111,111,110,110,110,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,111,110,111,111,111,111,111,111,111,111,111,110,110,109,109,109,110,110,110,110,111,111,110,110,110,110,110,109,110,110,110,111,109,110,111,111,111,111,111,111,111,111,111,111,109,109,109,109,108,108,108,107,107,107,107,107,106,106,107,107,107,106,106,106,107,107,107,107,107,106,106,106,106,104,104,104,104,104,109,109,109,109,109,109,109,109,109,104,104,104,104,108,108,108,108,107,108,107,107,107,107,107,107,107,106,106,107,106,106,106,106,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,252,108,252,108,252,108,252,108,252,108,252,108,109,108,252,108,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,109,107,109,107,107,109,109,107,109,109,107,109,107,107,107,107,107,109,107,109,107,109,107,109,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,110,111,111,111,105,105,105,105,105,111,110,111,111,111,111,111,111,110,111,111,111,109,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,111,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,109,110,111,110,111,109,109,109,109,109,109,109,110,109,109,109,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,110,110,111,110,111,110,111,111,111,110,111,110,111,110,111,111,110,109,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,109,110,111,110,111,111,111,111,111,111,110,110,109,109,110,109,110,110,111,111,111,110,111,110,111,110,111,110,111,110,109,111,111,110,111,110,111,110,111,110,111,110,109,109,110,109,108,107,108,107,108,107,108,107,107,106,107,106,107,106,107,106,106,106,107,106,106,104,104,104,104,104,109,109,110,109,110,109,110,110,111,110,111,109,110,109,110,109,110,110,109,109,109,107,108,107,108,107,108,107,107,107,107,106,107,106,107,106,107,106,106,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,108,108,108,252,252,108,108,108,108,108,108,252,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,109,109,109,107,107,107,109,107,109,107,109,109,109,109,107,107,107,107,109,107,107,107,109,107,109,107,107,107,107,107,107,107,107,107,107,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,105,105,111,105,105,111,111,111,111,111,111,111,111,111,110,110,111,110,110,110,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,110,111,110,110,110,109,109,110,110,110,110,111,111,109,111,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,110,109,109,109,110,109,110,109,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,111,110,111,111,111,111,110,109,111,110,110,110,110,110,110,110,111,110,110,110,111,111,111,110,111,111,111,111,111,111,111,111,111,111,111,111,109,109,110,110,111,111,111,111,111,111,110,110,110,110,109,109,110,111,111,110,110,110,110,110,111,110,110,110,111,110,109,111,111,111,111,110,111,111,111,111,111,109,109,109,110,109,108,108,108,108,108,107,108,107,107,107,106,106,106,106,107,107,106,104,104,104,104,104,104,109,109,109,110,110,110,110,110,110,110,110,111,110,111,109,109,109,110,110,110,110,110,110,111,111,104,104,106,108,108,107,107,107,107,107,107,107,106,106,107,106,106,106,106,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,108,108,252,108,252,108,252,108,252,108,252,108,252,108,252,107,252,107,252,252,252,107,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,109,109,107,107,107,107,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,109,107,109,107,109,109,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,105,105,105,105,105,111,111,111,110,111,111,111,110,111,111,110,110,111,110,111,111,110,110,109,109,110,109,110,109,110,110,111,110,111,111,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,109,110,109,110,110,111,110,111,111,111,110,109,109,109,109,110,109,109,109,109,109,109,109,110,109,109,109,110,109,110,109,110,109,109,109,110,109,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,111,111,110,111,111,109,109,111,111,111,110,110,110,111,110,111,110,109,110,111,110,111,110,111,110,111,110,111,111,111,110,111,111,111,111,109,109,110,110,111,111,111,110,111,111,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,109,109,111,110,111,110,111,110,111,110,111,109,110,108,108,108,108,108,108,108,108,107,108,107,108,107,106,106,107,110,110,110,110,110,109,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,109,109,109,110,109,110,110,111,110,111,110,111,111,104,104,106,107,108,107,108,107,107,107,107,106,107,107,107,106,106,106,106,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,108,108,108,252,252,252,108,108,108,108,108,108,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,109,107,107,107,107,107,109,109,109,109,109,109,107,107,109,109,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,107,109,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,111,111,105,105,105,105,111,111,111,111,111,111,111,111,111,105,111,111,111,110,110,110,111,111,110,110,110,110,109,109,110,110,111,111,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,109,109,109,110,110,110,110,111,111,111,111,111,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,110,109,110,110,110,110,110,109,110,111,111,110,111,111,111,111,111,109,110,110,110,111,111,110,110,110,110,110,110,109,110,110,111,111,111,110,111,111,111,111,111,111,111,111,111,111,111,111,109,110,110,111,111,111,111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,109,111,110,111,110,111,110,111,111,111,111,109,109,109,108,108,108,108,108,108,108,108,108,108,108,108,110,110,110,110,110,109,109,109,109,109,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,109,109,109,109,110,109,110,110,110,110,111,110,111,111,111,111,104,106,106,107,108,107,107,107,107,107,107,106,107,106,107,106,106,106,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,252,252,252,252,252,252,252,108,108,108,252,108,252,108,252,108,252,107,252,107,252,107,252,107,252,252,252,107,252,252,252,252,252,252,252,252,252,252,252,252,107,107,109,107,107,107,109,107,109,107,109,107,109,109,109,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,109,107,109,107,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,105,105,105,111,105,111,110,111,110,111,111,111,111,111,111,111,111,111,109,110,110,111,111,110,109,110,109,110,109,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,110,111,109,110,109,110,110,111,111,111,109,110,110,111,109,109,109,109,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,109,109,109,109,110,109,110,109,110,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,109,109,110,109,111,110,111,111,110,110,111,110,111,109,110,109,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,111,110,111,110,111,110,111,111,111,110,111,110,110,110,110,110,110,110,111,110,111,110,111,110,109,109,110,110,111,110,111,110,111,110,111,110,111,110,109,109,108,108,108,108,108,108,108,108,108,108,111,111,110,110,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,104,111,104,107,106,106,107,108,107,108,107,107,107,107,106,107,106,107,106,107,106,223,222,223,222,223,222,104,104,104,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,108,108,107,107,107,252,107,107,107,252,107,252,107,252,252,252,107,252,252,252,252,252,252,252,252,252,107,252,107,109,107,107,107,109,107,109,107,109,109,109,109,107,107,107,109,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,107,107,109,109,110,109,110,110,110,110,110,110,111,111,111,111,105,105,105,111,111,111,111,111,111,111,111,111,111,105,111,105,111,111,110,109,110,110,111,111,110,110,110,109,110,110,110,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,109,109,110,110,111,111,110,109,110,110,111,111,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,110,110,110,110,111,110,111,111,111,111,110,110,111,111,111,109,109,109,110,110,110,110,111,111,110,110,110,110,110,110,109,109,110,110,111,110,111,111,111,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,109,111,109,111,111,110,110,110,110,110,110,110,110,110,110,111,110,109,110,111,110,110,110,111,111,111,110,111,111,111,110,109,108,108,108,108,108,108,108,108,111,111,111,111,110,111,109,109,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,109,109,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,104,106,106,106,106,107,107,107,107,107,107,107,107,107,107,106,106,106,106,106,223,222,104,104,104,104,104,104,104,104,104,104,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,252,107,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,252,252,107,252,107,107,107,109,107,109,107,109,109,109,109,109,107,109,107,109,109,109,107,107,107,109,107,109,107,109,107,107,107,109,107,107,107,109,107,109,109,110,109,110,110,111,110,111,110,111,111,105,105,105,105,105,105,111,105,111,111,111,110,105,105,111,111,111,111,109,109,111,111,110,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,111,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,110,111,111,109,109,110,109,110,110,111,111,109,109,110,109,109,109,110,109,109,109,110,109,109,109,110,109,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,111,109,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,109,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,109,109,109,110,109,110,110,111,110,111,111,111,110,111,111,110,110,110,110,111,110,110,110,111,110,109,109,111,110,111,110,111,110,111,110,109,110,111,110,111,110,109,108,108,108,108,108,108,108,111,110,110,110,111,110,109,109,109,109,110,109,110,109,110,109,109,111,110,109,110,109,110,109,110,110,110,109,110,110,111,110,110,110,109,109,109,111,110,109,110,109,110,109,110,110,111,110,111,110,111,110,106,108,104,106,106,106,106,107,108,107,108,107,107,107,107,106,107,106,107,106,106,106,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,108,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,107,107,107,107,107,107,107,107,107,252,107,252,107,252,107,252,107,252,252,252,252,252,252,252,252,252,107,252,107,107,107,107,107,109,109,109,109,109,107,107,107,109,109,109,109,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,107,109,109,109,110,110,110,110,111,111,111,105,105,105,111,111,111,111,111,111,111,111,111,111,111,111,109,110,111,111,109,111,110,109,110,109,110,110,110,109,110,110,110,110,110,109,109,109,109,109,110,109,110,110,111,110,110,110,110,110,110,110,111,110,111,111,111,109,109,109,110,110,110,110,111,111,109,109,110,110,110,110,111,111,111,109,109,109,109,109,110,110,110,109,109,109,109,109,109,109,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,111,110,111,110,109,109,109,109,110,110,110,110,111,110,111,111,111,110,109,111,110,110,110,110,111,110,111,110,111,110,111,110,111,111,111,111,111,111,111,109,109,109,110,110,110,110,110,110,111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,109,110,110,111,110,111,110,110,110,111,109,110,111,111,111,111,110,109,109,108,108,108,108,108,108,110,110,110,110,110,110,109,109,109,109,109,109,109,109,109,109,110,110,111,111,110,110,110,110,110,110,110,110,110,110,110,110,110,110,109,110,111,111,109,109,110,110,110,110,110,110,110,110,110,110,111,110,106,107,104,104,106,106,106,106,106,107,107,107,107,107,107,107,106,107,107,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,107,107,109,107,109,107,109,107,109,109,107,107,109,107,109,107,109,109,109,107,109,107,109,107,109,107,107,107,107,107,109,107,109,107,252,109,110,109,110,110,111,111,105,105,105,110,111,110,111,109,111,110,111,111,111,111,109,109,110,109,110,110,111,111,110,109,110,109,110,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,109,109,110,110,111,110,111,110,111,110,111,110,109,109,110,109,110,110,111,110,111,110,111,111,109,109,110,109,110,110,111,110,111,110,109,109,110,109,110,109,110,110,110,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,111,110,111,110,111,111,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,111,111,109,110,111,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,110,110,110,111,110,111,111,111,111,111,111,110,110,110,110,110,110,110,110,109,109,110,110,111,111,111,110,111,110,109,109,110,110,109,109,111,111,109,109,110,108,108,108,108,108,108,110,110,110,111,110,109,109,109,109,110,109,110,109,109,109,110,110,111,110,111,109,110,109,110,109,110,109,110,110,110,110,109,109,110,110,111,111,110,109,110,109,110,109,110,110,110,110,111,110,111,110,106,107,109,104,107,106,107,106,106,106,106,107,108,107,108,107,106,106,107,106,107,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,106,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,108,252,108,252,252,252,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,107,107,107,107,107,107,252,107,107,107,252,107,107,107,252,252,252,107,252,252,252,252,252,252,109,107,109,107,107,107,109,107,109,107,109,109,109,109,107,107,107,107,109,109,109,107,107,107,109,107,109,107,109,107,107,107,107,107,107,107,107,252,109,109,110,110,111,105,105,105,111,111,109,109,110,110,111,111,111,105,111,109,109,109,110,109,110,110,110,110,111,111,111,111,110,110,110,109,110,110,110,110,110,110,110,109,109,109,109,109,110,109,110,110,111,111,109,109,110,109,110,110,110,110,110,110,111,110,111,110,111,111,111,110,109,109,109,109,110,110,110,110,111,111,109,109,110,109,110,110,109,109,109,109,110,110,109,109,109,109,109,109,110,110,110,110,110,110,110,110,111,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,111,111,111,109,109,110,110,111,110,110,110,111,110,110,110,111,110,111,110,111,111,111,109,110,110,111,111,109,109,110,110,111,111,111,110,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,109,111,110,110,110,111,110,110,110,109,109,110,109,110,110,110,110,111,111,109,109,108,108,108,108,110,110,110,110,110,110,109,111,109,109,109,109,109,109,109,109,110,110,110,110,111,110,110,109,110,110,110,110,110,110,110,109,110,110,110,110,111,111,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,106,108,104,107,107,106,106,106,106,106,106,106,107,107,107,107,107,106,106,107,107,107,106,107,107,106,106,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,106,106,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222,223,222,222,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,252,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,252,109,107,109,107,107,107,107,107,109,107,109,109,109,109,107,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,252,252,109,110,105,105,105,111,111,109,110,109,110,110,111,111,111,105,111,109,109,110,111,109,110,110,110,110,111,110,111,110,111,111,111,109,110,109,110,109,110,110,110,109,109,109,110,109,110,110,111,110,111,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,109,111,110,109,109,110,109,110,109,110,110,111,109,109,109,110,109,109,109,109,109,110,109,110,109,110,109,109,109,110,109,110,109,110,110,110,110,111,110,109,109,110,109,110,109,110,109,109,110,111,110,110,110,111,110,111,110,111,110,109,109,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,110,111,110,111,111,109,110,111,110,111,110,111,111,111,111,110,110,110,109,110,110,111,110,110,110,111,110,110,110,111,110,111,110,111,110,111,109,109,109,110,109,110,110,111,110,111,111,110,108,108,108,110,110,110,110,109,109,111,111,109,109,110,109,110,109,110,109,109,109,111,111,110,109,110,109,110,110,110,109,110,110,109,109,110,110,111,110,111,111,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,106,109,107,106,107,106,107,106,107,106,106,106,106,107,108,107,108,107,107,107,106,106,106,106,107,107,106,106,104,104,104,104,104,104,104,104,104,104,106,104,104,104,104,104,104,106,106,106,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,109,108,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,252,252,252,107,107,107,107,107,107,107,252,107,107,107,252,107,252,107,252,252,252,252,252,252,109,109,109,107,109,107,107,107,109,107,109,109,109,107,109,107,107,107,109,107,109,109,109,109,109,107,109,107,109,107,109,107,107,107,107,107,107,107,107,107,252,105,105,105,105,111,111,109,109,110,110,110,111,111,111,105,111,111,109,110,111,111,110,109,110,110,110,110,110,110,111,110,111,111,111,111,110,110,110,110,110,110,110,109,109,109,110,110,111,111,111,110,109,109,109,109,110,110,110,110,110,109,109,109,110,110,110,110,111,111,111,109,109,109,110,110,110,110,110,110,109,109,110,109,109,109,109,109,109,109,110,109,110,109,109,109,109,109,110,110,110,110,110,110,110,110,109,109,109,109,110,110,110,110,111,111,111,111,110,110,111,110,111,111,111,109,109,110,110,110,111,111,110,110,110,110,110,110,111,110,111,110,111,109,109,109,110,110,110,110,111,111,110,110,110,110,110,110,111,109,110,110,111,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,109,109,109,110,109,110,110,110,110,111,111,111,111,110,109,110,110,109,109,110,110,111,111,109,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,109,109,109,110,110,111,111,109,109,109,109,109,109,110,109,110,110,110,110,110,110,110,110,110,110,110,109,107,107,107,107,107,106,106,106,107,107,106,106,106,107,107,107,107,107,107,107,107,106,106,106,107,107,106,106,104,104,104,104,104,104,104,104,106,104,104,104,104,104,104,104,106,106,106,106,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,252,108,252,252,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,109,107,109,107,109,107,107,107,109,107,109,109,109,107,109,107,107,107,109,107,109,107,109,107,109,109,109,107,109,107,109,107,109,107,107,107,109,107,109,107,252,107,252,105,111,111,111,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,111,109,110,109,110,110,111,110,111,110,111,110,111,111,110,109,110,109,110,109,110,110,110,109,109,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,111,110,109,110,109,110,109,110,110,109,109,109,109,110,109,110,109,110,109,110,109,110,109,109,109,109,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,111,111,110,111,110,111,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,110,111,110,111,109,110,109,110,109,110,110,111,110,111,110,111,111,110,109,110,110,110,110,110,110,111,110,110,110,111,109,110,109,110,109,110,110,109,109,110,109,110,109,110,110,111,110,111,111,110,109,108,109,110,109,110,110,111,111,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,111,111,111,110,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,109,107,107,107,106,107,106,106,106,107,106,107,106,106,106,106,107,108,107,108,107,107,106,106,106,107,106,107,106,106,106,104,106,104,104,104,104,104,104,106,107,104,106,104,104,104,106,107,106,106,106,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,108,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,252,252,252,107,107,107,107,107,107,107,107,107,252,107,252,107,252,252,252,107,252,107,107,107,109,109,109,107,109,107,109,109,109,107,109,107,109,107,107,107,107,107,107,107,109,109,109,109,109,109,109,107,109,107,109,107,107,107,107,107,107,107,107,107,252,252,111,111,111,111,109,109,110,110,110,110,111,111,105,111,110,110,110,110,111,111,110,110,110,110,110,110,111,111,111,111,111,111,110,110,110,110,110,109,109,109,109,109,110,109,109,109,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,109,109,109,110,109,110,110,110,109,109,109,109,109,109,109,109,109,110,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,110,110,109,109,109,109,110,110,110,110,111,111,111,110,111,110,110,110,111,110,110,110,111,111,111,110,109,110,111,109,109,109,109,109,110,110,110,110,111,111,111,111,111,111,111,110,110,110,110,110,110,110,110,110,110,110,109,109,109,109,110,109,110,110,109,109,110,110,110,110,110,110,111,110,111,111,110,109,108,108,109,109,110,110,111,111,109,109,109,109,109,109,109,109,110,109,110,109,110,110,110,109,110,110,110,110,110,110,109,109,111,111,110,110,109,109,109,109,109,109,109,109,110,110,110,109,110,110,110,110,110,110,110,109,107,107,107,107,107,107,107,106,106,106,107,107,107,106,106,106,106,107,107,107,107,107,107,107,106,107,106,107,107,106,106,104,106,108,104,104,104,104,104,104,106,107,108,104,104,106,107,106,107,106,106,106,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,252,108,252,108,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,107,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,109,109,107,109,107,109,107,109,107,107,107,107,107,252,107,252,107,252,252,111,110,111,109,110,110,111,110,111,111,111,111,110,110,111,110,111,111,111,109,110,110,110,110,110,110,111,110,111,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,111,110,110,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,109,110,109,110,110,111,109,109,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,111,111,110,109,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,109,109,109,109,110,109,110,110,110,110,111,110,111,110,111,111,111,111,110,110,110,110,110,110,111,110,110,110,109,109,110,109,110,109,110,110,109,109,110,109,110,109,110,110,111,110,111,109,110,109,108,108,110,109,110,110,111,111,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,109,110,111,110,111,110,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,109,110,110,111,109,108,107,108,107,107,107,107,106,107,106,107,106,107,107,107,106,106,106,106,107,108,107,108,107,107,107,107,106,107,106,106,106,104,106,104,104,104,104,104,104,104,106,107,108,104,104,108,107,107,106,107,106,106,106,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,108,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,108,252,252,252,252,107,107,107,107,107,107,107,107,107,107,252,107,252,107,252,252,252,107,107,107,109,109,109,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,109,107,109,109,109,109,109,109,109,107,109,107,109,107,107,107,107,107,107,107,107,107,252,111,111,111,109,109,110,110,111,111,111,110,110,110,110,110,111,111,111,111,109,109,110,110,109,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,111,111,111,111,111,111,111,110,110,110,110,110,109,109,109,109,109,109,109,109,109,109,109,109,109,110,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,109,111,110,111,111,111,111,111,111,109,109,109,109,110,110,110,110,111,111,111,111,110,110,110,110,111,110,111,110,111,110,111,110,111,111,109,109,109,109,109,109,110,110,110,110,110,110,111,111,111,111,111,111,111,111,110,110,110,110,110,110,110,110,109,109,109,109,110,109,110,110,110,110,109,109,110,110,111,111,111,111,111,109,109,109,110,109,109,110,110,110,111,111,109,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,109,111,110,110,110,110,110,110,110,110,110,111,109,109,109,109,109,109,109,110,109,110,109,110,110,110,110,110,110,110,109,108,107,107,107,107,107,107,107,107,107,107,106,106,106,107,107,106,106,106,106,106,107,107,107,107,107,107,106,107,107,106,106,106,104,104,104,104,104,104,104,104,104,106,107,104,104,108,107,107,107,106,107,107,106,106,106,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,222,223,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,108,252,108,252,107,252,252,107,107,252,107,252,107,252,107,252,107,252,107,252,107,252,107,107,107,109,107,109,107,109,107,109,107,109,107,107,109,109,107,109,107,107,107,109,107,109,107,109,107,109,107,109,109,109,109,109,107,109,107,109,107,107,107,107,107,252,107,252,252,111,109,111,110,109,110,111,111,111,111,110,110,111,110,111,110,111,111,111,109,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,109,111,111,111,110,110,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,109,109,110,110,111,110,111,110,111,110,111,111,111,109,110,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,111,110,109,111,111,110,111,110,111,109,109,109,110,109,110,109,110,110,111,110,111,110,111,111,111,110,111,111,111,110,110,110,110,110,110,110,111,109,109,109,110,109,110,109,110,109,110,110,109,110,111,110,111,110,109,109,108,108,111,109,110,109,110,110,111,111,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,111,110,110,110,110,111,110,111,110,111,110,109,109,109,109,110,109,110,109,110,109,110,109,110,110,110,110,109,109,108,107,108,107,108,107,108,107,107,107,107,106,107,106,107,106,107,106,107,106,106,106,106,107,108,107,108,107,107,106,107,106,106,106,104,104,104,104,104,104,104,104,106,107,104,104,108,107,108,107,108,106,107,107,107,106,106,106,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,108,109,108,109,108,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,108,252,252,252,252,252,107,107,107,107,107,107,107,252,107,107,107,252,107,252,107,252,107,107,107,109,109,109,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,109,107,109,107,109,109,109,109,109,107,109,107,109,107,107,107,107,107,107,107,252,107,252,111,111,111,109,109,109,111,111,111,110,110,110,110,111,111,109,109,109,109,109,109,109,109,109,109,110,109,109,109,110,110,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,111,111,110,109,109,110,110,111,111,111,111,111,110,110,109,109,109,109,109,109,109,109,109,110,109,109,109,110,109,110,109,110,109,109,109,110,110,110,110,110,110,109,109,110,110,110,110,111,110,111,110,111,111,111,111,111,109,109,109,110,110,110,110,110,110,111,111,111,110,110,110,111,110,110,109,110,110,110,110,111,111,111,109,109,109,109,109,110,110,110,110,110,110,111,111,111,111,110,110,111,111,111,111,111,110,110,110,110,110,110,110,109,109,109,109,110,109,110,110,110,110,110,110,110,110,110,110,108,108,108,108,111,110,109,109,110,110,111,111,110,109,109,109,109,109,109,109,109,109,109,109,110,110,110,109,110,109,110,111,110,110,110,110,110,110,110,110,111,110,110,109,109,109,109,109,111,109,110,109,110,110,110,110,110,106,110,108,108,108,108,107,108,107,107,107,107,107,107,107,107,107,107,106,107,106,106,106,106,106,106,106,106,108,107,107,107,107,106,106,106,106,104,104,104,104,104,104,104,104,104,106,108,104,108,108,108,108,107,107,107,106,107,107,107,106,106,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,223,223,223,223,222,223,223,223,222,223,223,223,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,108,109,252,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,252,252,107,107,107,107,252,107,252,107,252,107,252,107,252,107,252,107,107,107,109,107,109,107,109,107,109,107,109,107,109,107,107,107,109,107,107,107,109,107,109,107,109,107,109,109,109,109,109,107,109,107,109,107,109,107,107,107,252,107,107,107,252,107,252,111,111,109,110,110,111,110,110,110,111,110,109,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,110,110,111,110,111,110,111,109,109,109,110,109,110,109,110,110,110,110,111,110,111,110,111,111,111,111,110,109,109,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,111,110,111,110,111,111,109,109,110,109,110,110,111,110,111,110,111,110,111,110,111,109,110,109,110,110,111,110,111,111,111,109,109,109,110,109,109,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,111,111,110,110,110,110,111,110,109,109,109,109,110,110,111,109,110,110,110,110,110,110,111,108,108,108,108,111,111,109,109,109,110,110,111,111,110,110,109,109,109,109,110,109,110,111,110,109,110,109,110,109,110,110,109,110,111,110,110,110,110,110,111,110,111,110,111,109,110,110,111,109,110,110,111,109,110,110,110,106,108,108,110,108,108,108,108,107,108,107,108,107,108,107,108,106,108,107,107,106,107,106,107,106,107,106,107,106,106,106,106,107,108,107,108,106,106,106,106,106,104,104,104,104,104,104,104,104,104,108,104,108,108,108,108,107,108,107,106,106,107,107,107,106,106,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,223,223,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,108,109,108,109,108,109,108,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,252,252,107,107,107,107,107,107,107,107,107,107,107,107,252,107,109,107,107,107,109,109,109,107,109,107,109,107,109,107,109,107,109,107,107,107,107,107,107,107,109,107,109,109,109,109,109,109,109,107,109,107,109,107,109,107,107,107,107,107,107,107,252,107,111,111,111,111,111,111,111,110,110,110,109,109,109,109,109,109,109,109,109,109,109,109,110,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,109,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,111,111,109,109,109,109,109,110,111,109,109,109,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,109,109,110,110,110,110,111,110,111,111,110,110,111,110,111,111,111,111,109,109,109,109,110,110,110,110,111,110,111,111,110,110,110,109,109,109,110,110,110,110,110,110,111,111,111,111,109,109,110,109,109,109,110,110,110,110,111,111,110,110,111,111,111,111,111,111,110,110,110,110,110,110,109,109,110,110,111,109,110,110,110,110,110,110,110,110,111,108,108,108,108,108,111,109,110,109,110,110,111,111,110,110,110,110,109,109,109,109,110,111,109,109,110,109,110,109,110,110,110,110,109,111,110,110,110,110,110,110,111,110,111,109,110,110,111,109,110,110,110,110,111,110,106,107,108,109,110,108,108,108,108,108,108,108,108,107,108,107,107,106,107,107,108,107,107,107,107,106,107,106,106,106,106,106,106,106,106,107,108,107,107,106,104,106,104,104,104,104,104,104,104,104,108,108,104,108,108,108,108,108,108,108,108,107,106,106,107,107,106,106,106,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,252,107,252,107,252,107,252,107,252,107,107,107,109,107,109,107,109,107,109,107,109,107,109,107,107,109,109,107,107,107,109,107,109,107,109,107,109,107,109,109,109,109,109,107,109,107,109,107,107,107,107,107,252,107,252,107,252,107,111,110,111,110,111,110,110,110,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,110,110,111,110,111,110,111,109,109,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,109,109,109,109,109,109,110,110,111,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,110,110,111,110,111,111,111,110,111,110,111,110,111,110,109,109,110,109,110,110,110,110,111,110,111,111,111,110,111,110,109,109,110,109,110,109,110,110,111,110,111,110,111,111,110,109,110,109,109,109,110,110,111,110,111,110,111,110,111,110,111,111,110,110,110,110,110,109,110,110,111,109,109,109,110,109,110,109,110,110,110,110,108,108,108,108,108,108,111,109,110,109,110,110,111,111,111,110,111,110,109,109,110,111,111,111,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,109,109,110,110,111,109,110,109,110,110,111,106,107,107,109,109,110,108,108,108,108,108,108,107,108,107,108,107,108,107,106,106,107,107,108,107,107,106,106,108,106,106,107,106,106,106,106,106,106,107,108,107,106,107,104,104,104,104,104,104,104,104,108,108,104,108,108,108,108,108,108,108,108,107,106,106,108,106,107,107,107,106,106,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,223,223,222,223,222,223,222,223,222,223,222,223,223,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,108,109,108,109,252,109,109,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,107,107,107,252,107,107,107,109,109,109,107,109,107,109,107,107,107,107,107,109,109,107,107,107,107,107,107,109,107,109,107,109,109,109,109,109,107,109,107,109,107,252,107,107,107,107,107,107,107,107,107,252,107,252,110,111,111,110,110,109,109,109,109,109,109,109,109,110,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,110,110,110,111,111,111,110,109,109,109,109,110,110,110,110,110,110,110,110,111,111,111,111,109,109,109,109,110,110,111,111,109,109,109,109,109,109,109,109,110,109,109,109,110,109,110,109,110,109,109,109,110,110,110,110,110,110,111,110,111,111,110,110,111,110,111,110,111,111,111,109,109,109,110,110,110,110,110,110,111,111,111,110,110,110,110,110,109,109,109,109,110,110,110,110,111,111,111,109,110,109,110,109,110,110,110,110,110,110,110,110,111,111,111,111,111,111,110,110,110,110,109,110,111,110,110,110,109,109,109,109,110,110,110,110,110,110,108,108,108,108,111,111,110,109,110,110,109,110,111,110,111,110,111,110,109,109,110,110,111,109,109,109,110,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,111,109,109,109,110,110,111,111,109,109,110,110,110,106,107,107,108,109,109,110,108,108,108,108,108,108,108,108,108,108,108,107,108,106,106,107,107,108,108,107,106,107,107,108,106,106,106,106,106,106,106,106,106,108,106,108,104,104,104,104,104,104,108,104,104,104,107,108,108,108,108,108,108,106,108,108,108,107,106,106,107,107,106,107,108,108,106,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,252,109,109,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,252,107,252,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,109,109,107,107,107,109,107,109,107,109,107,109,107,109,107,109,109,109,107,109,107,252,107,252,107,252,107,107,107,252,107,252,107,252,252,252,111,111,110,110,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,109,110,109,110,109,110,109,110,110,111,110,111,110,111,110,109,109,109,109,110,110,111,109,110,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,110,110,111,110,111,110,111,111,111,110,111,110,111,110,111,110,111,110,109,109,110,109,110,110,111,110,111,111,111,111,111,110,111,110,111,110,109,109,110,109,110,110,111,111,111,109,110,109,110,109,110,110,110,110,110,110,111,110,111,110,111,110,111,111,110,110,110,109,110,110,111,110,111,110,111,110,109,109,110,109,110,109,110,110,108,108,108,111,111,109,110,109,110,109,110,110,109,110,111,110,111,109,110,110,111,111,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,111,110,111,109,110,109,110,110,111,111,111,109,110,109,106,106,107,107,108,108,109,109,110,108,108,108,108,108,108,107,108,107,108,107,108,107,108,106,107,107,108,108,107,106,107,107,108,108,107,106,107,106,107,106,106,106,106,104,104,104,104,104,104,106,104,104,104,104,107,108,108,108,108,108,108,108,106,107,108,107,108,107,106,106,107,106,107,107,108,108,106,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223,223,223,222,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,109,108,109,108,109,109,109,109,109,109,109,108,109,108,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,107,107,107,107,107,107,109,107,109,109,109,107,109,107,107,107,109,109,109,109,107,107,107,107,107,107,109,107,109,109,109,109,109,109,109,107,109,107,252,107,252,107,107,107,107,107,107,107,107,107,252,107,252,252,252,111,110,109,109,109,109,109,109,109,109,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,111,110,111,110,111,110,111,111,111,111,111,111,111,111,111,109,109,109,110,109,110,110,110,110,111,110,111,111,111,109,109,109,110,110,111,109,109,109,109,109,110,109,109,109,109,109,109,109,109,109,110,109,110,109,110,109,110,110,110,110,110,110,111,111,111,111,110,110,110,110,111,110,111,111,111,111,111,109,109,109,110,110,110,110,111,111,111,111,111,110,110,110,111,110,111,110,109,109,110,110,110,110,111,111,109,109,110,109,110,110,110,110,110,110,110,110,111,111,111,111,111,111,110,110,110,110,109,110,111,110,110,110,110,110,110,110,109,109,110,110,110,110,108,108,111,111,109,109,109,109,110,110,110,110,110,110,111,111,109,109,110,110,111,109,109,109,109,109,109,109,109,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,109,109,110,110,111,111,111,111,109,109,106,106,107,107,108,108,109,109,110,110,108,108,108,108,108,108,108,108,108,108,108,108,108,107,106,106,107,107,108,108,106,106,107,107,108,108,107,106,106,106,106,106,106,106,106,104,104,104,104,108,104,104,104,104,107,108,108,108,108,108,108,108,108,108,106,108,108,108,108,106,106,106,107,107,108,108,108,106,106,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223
+,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,109,109,108,109,108,109,252,109,252,109,252,109,252,109,252,109,252,109,252,109,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,107,107,107,252,107,252,107,107,107,109,107,109,107,109,107,109,107,107,107,109,107,109,107,109,107,109,107,109,107,109,107,109,107,109,109,109,109,109,107,252,107,252,107,109,107,107,107,252,107,252,107,252,107,252,107,252,252,252,110,109,109,109,109,110,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,111,110,111,110,111,110,111,110,111,110,111,110,111,110,111,111,111,111,111,110,111,252,109,109,110,109,110,109,110,110,111,110,111,110,111,109,109,109,109,109,110,109,110,109,110,109,110,109,110,109,109,109,110,109,110,109,110,109,110,109,110,109,110,110,110,110,110,110,110,111,111,111,111,110,110,110,110,111,110,111,111,111,111,111,109,109,109,110,110,110,110,111,111,111,111,111,110,110,110,111,110,111,110,109,109,110,110,110,110,111,111,109,109,110,109,110,110,110,110,110,110,110,110,111,111,111,111,111,111,110,110,110,110,109,110,111,110,110,110,110,110,110,110,109,109,110,110,110,110,108,108,111,111,109,109,109,109,110,110,110,110,110,110,111,111,109,109,110,110,111,109,109,109,109,109,109,109,109,109,110,109,110,110,110,110,110,110,110,110,110,110,110,110,109,109,110,110,111,111,111,111,109,109,106,106,107,107,108,108,109,109,110,110,108,108,108,108,108,108,108,108,108,108,108,108,108,107,106,106,107,107,108,108,106,106,107,107,108,108,107,106,106,106,106,106,106,106,106,104,104,104,104,108,104,104,104,104,107,108,108,108,108,108,108,108,108,108,106,108,108,108,108,106,106,106,107,107,108,108,108,106,106,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223,223]}
+);
diff --git a/apps/animclk/animclk.pal b/apps/animclk/animclk.pal
new file mode 100644
index 000000000..d33bfcdb9
Binary files /dev/null and b/apps/animclk/animclk.pal differ
diff --git a/apps/animclk/animclk.pixels1 b/apps/animclk/animclk.pixels1
new file mode 100644
index 000000000..7f0dbf944
--- /dev/null
+++ b/apps/animclk/animclk.pixels1
@@ -0,0 +1 @@
+ ʘ˘̛̛̘̘̘˛ʛ̛̛̛̛̛̛̛̜̜̜蕕蕐̛̛̛蓖̛蓕̛薔̜萐˝蓐̜萐̜萒萐萒̝
\ No newline at end of file
diff --git a/apps/animclk/animclk.pixels2 b/apps/animclk/animclk.pixels2
new file mode 100644
index 000000000..f4a4ee077
--- /dev/null
+++ b/apps/animclk/animclk.pixels2
@@ -0,0 +1 @@
+萐蒒蒒蒒蒒̜蓐蒒̝蕕qrrrrrr̜萒qqqqqqqrrrrrrrrqqrrrrr̝蕕sssstssstsqqqqqqqqrrrrrrrrrrrrrrrrr̝qqqqqtststtttttttuuuuuuttqqqqqrrrrrrrrrrr̝qqqqqqqqstststtttttutututuuututututututqqqqqqqqqq̜qqssssssssststtttttttttuuuuuuttttttututuuuuuuuuuuuuu̝qqqtqqqssuuuuututuutsttututututttututututututututututuuuuuusstussssttuuutuuuuttuuutuuttuuutttttutttutttuuutuuuuuuuuuuusstusssttuuututuuutttutuuutuututtutututuqqqrqrrrrrrrrrrrrrssstusststtuuttuuutttttuuuuuuustuqqqqqqqqqtttttttttttttuuuuspqqqsssussssttuuttuuuuttutuuutuussttsusststtututuststtttutusupqqsssuststttuutuuttututuuuuuuussttuttttuussttussssttttuustppqqpppsststststtuuttutuuutututuuusttututstututuusssuutsttustptpqpssssssttttttututttutuuuuuusstttuutstuuutuuuststttttuuputppsspppssststtttutuuutututuuusssttutuststtutsuutstststsusupuppppptsttutssttssssttttutuuuuuuuuuussssttttustuttttsuussttttuustptuptsssttusustsuststtutututususttussssstsssusttusttusutututuutsupuptssstttsuuttussstttuuuttusttussssstssssstsutuuuttsttuuututputststtustuutustsssttuutsussststststsssuststtutuuuuuuuuuutuptsssttttuuttussttstuttustssssssstttssssstssttuutuuuu"$02367:;>>05:>%&)),0235699<=?ssstststssssstststtuuuuu"#%&'()*,-./ "#%'(*,-/ !!"##$%&&''()**+,,-.02478;=?Ɯ$%( "#%&()+,./--.././Ɯ)*+,-./++--./Ɯ-../ &%&&'&'(Ɯ,- "$%()+- !"#%&'()//5689;<>?0134679:<=?024:<=?02467ƛ/ "#&'*+- #%(*-/>?014589<=?02367:;=?014589<=?Ɯ)*+,--// !"#$%& !"#$%&()*,-./::;;<<==>>??KKLMNNO5556!"##%%&&''((**++,,--// !##%%'(**,,./?02367:;>>;EGGHIJJLLNNO45465767 "$&)*-/!!""##$$%%&&''(()**++,,-..// !#$%&()*+-./566>??@ACDEFHIJKMNO344 !!""##$$%%&&''(())**++,,--..//001122<>?@AACCEEGH . "%'*,/ !!""##$$%%&&''(())**++,,--../0111=>??@ABB !"#$%&'()*+,-./ !!""##$$%%&&''(())**++,,--..//001<>=>>,,,,,,, $'+/ !"#$%&'()*+,-./ !!!"""##$$%%%&&'''(())**+++,,,--..//0011<==--------- #(+/ ! ! !!"!""##$#$$%%&%'&''(')())**+*++,,-,--.././0101122< !!!!!!! !!!!""""####$$$$%%&&&&''(((())))****++,,,,---...///0111122334"" ! !!"!#"##$#$$%$%%&%&&''('(())*)**+*++,+,,--.-.././deeff0011213233545""""#$$%%%%&&&&''(((())))**++++,,,,----..///abbccdde00111223334445%&%()())*)**+*++,+,,-,--.-.././/eeff``aa00112233438(+,,,,----....////aabbccdde0011222334455667././//fg`abcdef``00112233445565778788:eefffgg`01122334455566778899::;;;0112233445566778899::;;<<==>566778999:;;<===>??@@BB;;<<==>>?YZYZZ[@BBEEƀXXYYYYYYZ@BDFHKMO2Ɔƀ@BDEHILMO@CEHJMOOƎ@@AABBCCCDDEEEFFGGHHHIIJJJKKLLMMMNNOO=??012244667899;;==>?@@@AABBBCCCDDDEEFFFFGGHHFEFFGFHGHHIHJIJJKJKKLKLLMLMMNNONOb7c89:::fd6778899:::>>>>??A@?B?AA@ABABCCDBDEFFGGHHFFFFGGHHHHIIJJJJKKLLLMMMNNNOO2425556779fd6778899:::::=>==>>>>>@>?ABAABCCCDCDFFFFGGHHEEFFGGHHIIJJKKLLMMNNOOO/deeeeeeefd67fd67787899:::::=====>>>??????@?A?ABDDEEF@FFGGHH@ABCDEFFHHIJKLMNOdde/ed/dddedfe/ffeecc6fc88f8f99=:::=======??????@=@=ACDCDEEFFFFGGHHKIHL@NLMd//e/ee/ed/dddedfe/ffeecc6fc88f889:9::<<<========>????=A=D=EEFFFFGGHHEJDFc/dddddde/ed/dddedfe/ffeecc6fc88ff888::9:9>99e:==>==>>>>?>??@@@^]@_B\AHƂcdddeeee/ed/dddedfe/ffeecc6fc88f778899:::<=:===>>>??>?=>>?>Z>^[Z^[^\]]ƀcccdde/ed/dddedfe/ffeecc6fc88f778897:9:=:<=>==>>??>>>>>?>[[\Z\\[\]]^d/dddedfe/ffeecc6fc88ffd6778899:::<<<=====>>>?<==>>\>\\]\^^^^FGGHHIĈ787889899c9:9:9::;:;:;;;;<;<<=<=<===<==???=>>???]\]]^^]^^^__^_@AABBCCDDEEFFGGHĈ9999:9::::;d;;;;;;<<<<<<=<======>>>>>???\>?\]\]]^^^^@^A@BACBCCDDDDEEEFGGG:::;:;:;;<;<;<<<<=<=<=====>=>>>??>>????\]]\^^@BAB@BABCCCDDCCDDDDEEFFFGGGČAAB;;;;<<<<<<<<========>>>>>=>>>>>>?0???5?ŀƏƄ]^^\]@A]DBBDCCDDDDFDDEEEFFFFGGHHIIIIBBN<=<=<====>=>=>=>>>>?>>>>>>?>?>=><=?X???\AA]B@B\@C@ECEFFFFFEFFEEFFGFHGHHIIJIJJKKLKLLMMNMNNOOO@O@@@A@BABBCCDƈMMM>=>>>>>>>>??????<<===?==>>>?>>>=>>;=XXXXY;>Y?YYC[AAB\D\ABDACBDCDADCDDDFFGFGFFGGFGGGGHHHHIIJJJJKKLLLLMMMMNNNNOOO@O@@@AAAABBCCDDDDEFFFGGHHIIIIJJKKLLLLLLLMMMM>?>>?>>?>?>>>=??>===?=>=?=??>>=>==>X??Y>Y=ZZA@ZBC@CCCBDCDEBDEECDFDEFEGGHHGHHGHGHHIHIIJIJKJJKKLKLLMLMMNNONOOOOO@O@@@AABBCBCCDDEEFEFFGGHHIHIIJJKKLLL>?===??>>?>>>==<=====>=?==???>:>:=>YXW>VX@ZZ@BABCDDCBCDDDDEEFEDEFEFEEFFGIJHHJHIHIIIIIIJKKJKKKKLLLLMMMMNNNNOOOOOOO@@@@@A>?SSR=>?R>???=STT>>>>>>>?>>>??>>>>>U>=>VWXYABCDCCEDEDEFEFEFFFGGFGGGGHHGIHIHJJJJJJJJKJKKJLKKKLLLMLMLMMNMNNONONOOO@O@AQQ@??RR>RR@>RSR<>S=>@>?B>@=>U>V?VUVWW@ACDCEDDEEEFFFHFGGGGHHIHIHIHIHJIJJIKKKKJKJJKJLLKLLKLLLLMMMMNNNNONOOOOO@O@AAB@Q@QARRAR@S?ASSBSSS>@TSCACB?C@@UAVAWAEVEBCEEFFFGFFFGGHGHIHJIJJIIIJIJIJKJJJKKJLKLKLKJKKLMKLLLLMLMMNMNNNNONONOOO@O@@@AABCCAAARAARRBBCCSDTCBATS@AEECDDDDDEFBECCGFGGGGGHHGGGGGGHIHJKJJJJJKJKJJJJJKKJKJKLKKLKKLKKLKLMLLMMMMMMNMNNNNONOOOOO@O@@@@@AAABCCDBA@BBA@AABDDEDEDDEDCCEGCFFEGFFGHGFEIFGHGHHHHHHHIIIIIJJJJKJJKJKKJKKKKKJKKKKKKKLLKLMLMLLLLLMLMMNMNMNNONONONOOO@OO@@ABBCCDEABABBCCDCCDEDDDEDEFGHGGFHFHGIGFGGGHHIHIHHHIHIIIJHIIIJKIJJKKKKKLKKLKKKKKKLLKLKLKLLLMLLMMLMMMMNNNNNNNNOOOOOO@O@@@AABCCDDCCBCCCCCCDDDEDEEFEEFHGHHHGHGIHGHHIIJIGJIIIIIIIJIJIJKJJJJJJJKKKKKLKKLLKKLKMLLKLMLLLLMMLMMMNMNNNNNNONOOOOO@O@O@@@AABBCDDECCCCCCDCCDDDEEEEGEFGFGHGHHHIIHIIIHJHIHIJJJJIIIJJIKJJJJJJJJJKKKKKKKKLLLLLMMLMLLMLNMLMLMNMNNNNNNOOOOOOOOO@@@@@@@AABBCCDDEOCCCDDDDDDEEEDEEEFEEFGGGHHHHIIHIIIIJIJIJJJJJIJIJKJKIJKKJJJKJKLKLKKKLLMLMLMMMMLMNMNMMMNNMNNONONOOOOO@O@O@O@@@A@AABBCCDDEEFODDCCEEFEEFEFEFFFFGGGGFFGHHIHGIHIJIIJIJJJKKJJKJJKJKJKKKKKKKJKLKLLLLLLMLMMMMMMMNMNNNNNNNNNOOOOOOOOOO@@@@@@@@AAAABBBBBBCCDDEEFFGHFFGEGFFGGGGFGHGGHGHHGHGGFHHIIHIIIIJJJJJJJKJKKKKJKKKKKLLKKLKKLLLMLMLMLMMNMNMNMNNONONONOOO@O@O@O@O@@@@@AAAABBCCDDEEFFGGHHHGGGHGIGGIHHHHHHIHHHHIIGHIGHIHIIIIIJIJJJJJJKJKKKKKKKKLLLLLLLLMMMMMMMMNMNNNNNNONOOOOOOOOOO@O@@@@@@@AAAABABBBBCCCCDDDEEFFFGGHJJHGIJHIIHIIIIIHHHHHHJJIIIIJJJIJJJKJKKJKJKJKKLKLKLKLLLLMLMLMLMMNMNMNMNNONONONOOOOOOO@O@O@O@O@@@@@AABBBCBCBCCDCDDEDEEFEFFGGHHIhLHIJJJIKJIJIJIJJJJJJJJJJKJKJKKKKKKKKKKKKKLKLLLLLLLLMMMMMMMMNMNMNNNNNNNNOOOOOOOOOOO@O@@@@@@@@@@@AAAABBBCCCDDDEEFFGGGHHHnhhJKLJKKKKKJKKJJJJKKLLKKKKKKLLKKKKLLLKLKLLMLMLMLMLMMNMNMNMNNNNNNONONONOOO@O@O@O@O@OO@@@@AAABBCCCDCDCDDEDEDEFFGGHHHIIohohLLLLKLLLKKLKLLKKLLLLLMLMLLLLLMMMMMMMMMMMMMMMMMNMNMNNNNNNNNOOOOOOOOOO@O@O@@@@@@@@@AAABBBCCCCCCDDDDEEEEFFFFFFGGGGHHINOhjhjjKKLLLKLLLLLMMLLLMMMMLLMLMLMMMMMMMMMMMMNMNMNMNMNNNNONONONOOOOO@O@O@O@O@O@@@@@@@A@AAABBBCCDDDEEEFFGGGHHHIINNOOoohjjLLKKLLMLLLLMLLLLLMMMMMMMMMMMMMMMMMMMMNMNNNNNNNNOOOOOOOOOOOO@O@@@@@@@@@@@AAABBBBCCCDDDEEFFFFGGHHHIIINOOjhkkjjKLLLLLMMMMLMLMLMNMMNNMNMNMNNMMNNMMNNMNNONONONOOOOOOO@O@O@O@O@O@O@@@@@A@AABBBCBCBCCDCDDDDEEEFFFGGGHHHIIIJJJlhkjjjjLLLLLLLMMMMMMMMMMMNMNMNNNNNNNNNNNNNONOOOOOOOOOOOOO@O@O@@@@@@@@@@@@@AAAAABBBBBBCCCCCDDDEEEEEFFFGGGHHHIIIIJJlhkkjjjLLLLMMLMLMLMMMMNNMMNNMNMNMNNONONONOOOOOOO@O@O@O@O@O@O@@@@@AAAABABBBCCCDDDEEEFFFFGGMMMNIIIJJJhkkkkjjjLLLMMMMMMMMMMMMMNNNNNNNNONONOOOOOOOOOOOOOOOOO@O@O@O@O@O@O@@@AAAABBBBBBBBCCCDDDDEEEFFFGGGGNNNOOklkkjkjjjLMMMMMMMNMNMNMNNONONONOOOOOOO@OOOOOOOOO@@@AABBBBCCCCDDDEEEFFFFGGGHHHCIOkkkkkjjjjMMMMMNNNNNNNNNNONOOOOOOOOOOOOO@@@@@AAAAAAABBBBCCCDDDDEEEFGGGGHHHIjkkkjkjkjjMNMNNNNONONONONOOOOO@O@OOOO@@AAAABBEFGHIJKMNOGGGGHHHIkkkkkjjkjjNNNNNNOOOOOOOOOOO@@@@@AAAAAAHIKMOCHjkjkkkjkjjjONONOOOOOO@OO@@AAAABBBBBCCCDFFFGGGjjjkkjjjjjjjOOOOOOOOO@@BGKO@AAAABBBBCCCCDDDEEkljkkkjkjjjjOOOOOOO@@@@AAAABBBBCCCDkkkjkkkjkjjjjOO@@@@@@@AAAABBBBCklkjjkjkjkjjjjOO@O@@AAAABBBBCCCDDkkkjkjkjjjjjjj@@@@@AAAABBBBCEEkkkkjkjkjkjkjjj@@AAAABBBBDlkkkjjjjkkkjjjjAAAABBBBCCDDDEEklkkjjjkjkkkjkjjBBBBCCCDDDDDklkkjjkkjkkjjjjjjBBBCCCCCklkljkjkkkkkjkjjjjCCjCCDCDCDDEkllkjjjjkjkjkjjjjjCCCDDkllljkjkkkkkjkjjjjjDDDDDEEDEEFEkllkkjkjkjlkkjjjjjjjDDDEEFjlklkljkjllkjkjkjjjjEEFEFlllklkkjjklkkkjjjjjjjEEllklklkljjkljkjkjkjjjjEEFEFFFFGkllllklkkjjlkkkjjjjjjjFFFGGhhhhhhhlkljljkjkjkjkjjjFhhhhhhhhlkkjlkkjkjjjjjjjoomhjklhhlkkjkjkjkjkjkjjnnnnhjklhhkkkkkkkjkjjjjjjGHGnnnonhjkkhhhkkkkjkjkjkjjjjnnnnohjkllhhkkkkkkkjjjjjjjHnonnnhjkkhhhhjkkkkjkjkjjjjjnonnnhjklhhhjljkkkkkkjkjjjjjnooohjjllhhhjjjlkkkkjjjjjjjjooonhjklhhhkkjjjkkkkkkjjkjjjjnooononjlhkkjkjkjjkkjkjjjjjjjoonnnnonjkkjkjjjjkjlkkkjkkjjjjnononohomlkkjkjjjjkjlkjjjkjkjjjnnnnohomllkkkjkjjjkjlkkjkkljjjjnonohomlklkkjkjkjjjljkjjjkkkjkjjnnhhojlllkkkkjjjkkjjjkkjjkkjjjjjjnhjlhmllklkkjkjkjkkjkjkjjkkjjkjjjjkmhmklllkkkkkjjjkkjjkkkjkjkjkjjjjkljhhlklllklkkjjjlkjjjkkjjjkkkjjjjjlhhhjhlklllkkklkkjkjjjkkkjkkkjkjjjjhnnhjkkllhhlklkkjjjkjjjlkkjkkjjkjkjjhhhhhoomhjjkkllhhhllkkjjjkkjjkkkjljljjjjjjhhhhhhhhhhhmnmhjkjkkllhhhhkjkjkkkjjklkkjjkkjkjjjhhhhhhhhhhhjhnnhjjjkkllllhhhhhjjjkkkjjkkkkjljkjjjjjhhhhhhhhhjklhnhjkjkklkllhlhhhhkjkjkkjjjjlkjlkjkjkjjjhhhhhjhjkkhhjnnhjkkkkllllhhhhlkjjkkkjjjjlkjljkkjjkjjjhhhjhhhjklhjjnonhhjjkkllhhhhjlkjjjkjkjjjjkjkkjkjjjkjjhhhhhhhjkhjjjnnnhjjkkllhhhhkkkljjjkkkjjjkkkjlkkkjjkkkjhhhhhjkhjkjjjnonohhhhjkkhhhklkklkjkkkjjjjkljlkkjkjjjkjjhhhhjhjkkkjjjonnnooonhjlhhlkkkkljjjkjjjjjjkjlkkkjjkjkkjhjklhjjjkkjjjjnonononohjklhhklklklkkjkjkjjjljlkkjkjjkkkhjklhkjjkjkjkjjjnnononohjjklhhlkkkkkkkkjjjjjjjlkkkkkkjkkhjjkhlkjjjkkkjjjjjnononohhjkkllhklklkklkjkjkjkjjjljlkkjkjjkhjhllkkjkjkjkjkjjononoohjkkllhhjklkkkkkkjkjjjjjjkjklkkjkklhhkllkkkjkkkjjjjjjnononohjjkkllhjjklkkkkjkjkjkjjjjkljkkjklhkklklkkjkjkjkjkjkjjonooohjjkkllhhjjlklkkkkkkjkjjjjjjkkkkjklhllllkkkkjjkkkkjjjjjjnonohjjkkllhhhjjjlklkkkkjkjkjkjjjlklkkhkllklklklkkkkjkjkjkjkjjooonhjlmlhnlhhhjjjlklkkkkkkjkjjkjjlkkkkllllllllklkjlkkkjjjjjjjknonononojnlhhohkjjklklkkkkjkjjjkkjjlklllllllllklkljklkjjjkjkjkjkonoooooojklhhhkjjjjklkkkkkkkkjkkkjjjlllllllllllllkjklkjjkkkjjjkknmnonononjjnhkjkjkjjklklkkjkjjjkkjjjllllllllllklklkjkkjjjkjkjkjkjmoooooojklhnkkkjkjjjlkkkkkkkkjjjkkjjlllllllllllllllkkkjjkkkjjjjjkknononojklhnkkkjjkkjjjlklkljkkjjkkkjjjlllllllllllllklklkjjkkkjjjkjkkoooooojklhnkkkjjkkkjjjlkkkjjkjjjkkjjjjlllllllllllllllkkjjjkkkjjjkkkjnononjklhnklkkjkjkkkjjklklkkjkjkjkjjkjllllllllllllklklkjkjjkjjjkkkkjjooooojklmnlkkkjjkkkjjjjklkkkkkkjkkjjkkjlllhhhhlllllllllkjjjjkkjjkkjjjnonoommmllklklkkjjjkkkjlklkkkkjkjjjkjhhhhhhhhhhhllllllklkljkjkjkjkkkjjoooommmmlllkkkkkjjkkkjjjkkkkkjjjjhhhhhmmmmmmmmmhhhhllllklkkkkkkkjjkjjjjnonmmnmlklklklkkjkjkjkjjjkjjhhhhhmmnmnmnnonomnmnmnnmmmklklklkkkkjkjkjkjj
\ No newline at end of file
diff --git a/apps/animclk/app-icon.js b/apps/animclk/app-icon.js
new file mode 100644
index 000000000..f904072e3
--- /dev/null
+++ b/apps/animclk/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+i4AFnYHGBBIAPDA0dAH4A/ABtBFtlk0uALlml0uBF1uAvQvtvQvroGAF4NWdteARwIvsXwNWq1BAFEdwK+CF9VBF4d6F9SOBR4OAF1OIF4KOB0opjwV6vd7rrtCFwIvlwN70q6BFQN6RwIEBsoAHrwJIACGBdINWvTtDAoIvINgIuYxAvBwAsCLwIjB0glGxKbCMDGCvYvBDwItBGYdWxIAExBpBp9dx4LFAAuPx+IxAQELoK9BE4S+CLgKQCC4IAD1gKBp9WBQoAFxOCE4WCAAIvB0uBWgIuCq2kAoIiBp962YAECIVPqFWBYoAEWQIAH0qNBLwYDBLwRfCF49Pp+BAIIuI1gnBvYADAoIBC0q9BAAWl0hiBp4nBDwoRBLwOzNwOtBgms1ouBq4mBAAQECRwICBGAJeCvQEEldeAAZxESIIzBBgeCq9dFwKKEqwuDvS/CMAQCCXgJiBp9dAAQFBFYUrAAgrBAAszmddq4ABJwI0CFANVXIjsCAIU5nMznNXLYIpBlksmUyq0yBgIBBroDBAwQKCJAMrJIIiBDYJNBAoILBqoJBHIIaDJYIABJgIsBAAIKBAAI7CAgIJBHgNVqsrkgCBPAgwBAAMkDARYBJ5AAFGgcrFQOIAALBFEQQwBbQQ3BAASGCqokDLAwACToKfDAYRyCwQzBFYaODfAOl0q/BR4I1BL4IcDAYIyDmUOhw4DN4IABr1eLQJkDxGsAAWBLAQxBA4L3BYQQoChEIFAIABFAuCKoWIAYYqE1oAB2ez6+sxGrLwOr6HW63XBQOrFYQxBFIRRBEgglBFogqEFYQtC2YODGAWl1nQGQXWU4geBAYNeE4YXD0mBFIoqBJ4RpG1YwEAQOBvQNBZYQHBwI1EBIQABcAOsFoaOCSw4XFeIkr0mlwACBBYYgBCooSBbwIrDwOIB4oAFMAITC6GrL4N60gCBAgSFBRAQCDvUkkgwBruIw+CQIYsHXQQAHwGAF4YTB5+kMwgABqp0Cp+BNgwsEFpQABD4JdDFQgxCAgOAAYIwCqzgEQwgsLAAWkEAIACGIQ2DNQmkYIUrOIRaEFx/QXA4oCY4g4CFwSRBB4SJOX4wiBMIYpDFwhfCGAtPSYJeCACC5FLoYEDNQYJBSAcqAQNWF6oeBXQgrCAoIzBAIKQFGAeAdwIAQDwNVqt6vLeDLQYzDFwVWfAYHCCIYAOwAaEEwJbCLQSTC0krHwV6CwOkqqWBYgVWF5whCRwr1BMgQ8ECAYCBp8kFwIwCAQIvN"))
diff --git a/apps/animclk/app.js b/apps/animclk/app.js
new file mode 100644
index 000000000..ced5372a0
--- /dev/null
+++ b/apps/animclk/app.js
@@ -0,0 +1,106 @@
+var pal = new Uint16Array(E.toArrayBuffer(E.toString(require("Storage").read("animclk.pal"))));
+var img1 = require("Storage").read("animclk.pixels1");
+var img1height = img1.length/240;
+var img2 = require("Storage").read("animclk.pixels2");
+var img2height = img2.length/240;
+var cycle = [
+ {reverse:0,rate:1,low:32,high:47},
+ {reverse:0,rate:3,low:48,high:63},
+ {reverse:0,rate:3,low:64,high:79},
+ {reverse:0,rate:2,low:80,high:95},
+ {reverse:0,rate:1,low:96,high:103},
+ {reverse:0,rate:3,low:128,high:143},
+ {reverse:0,rate:2,low:22,high:31}
+];
+var is12Hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"];
+var IX = 80, IY = 10, IBPP = 1;
+var IW = 174, IH = 45, OY = 24;
+var inf = {align:0};
+var bgoptions;
+
+require("Font7x11Numeric7Seg").add(Graphics);
+var cg = Graphics.createArrayBuffer(IW,IH,IBPP,{msb:true});
+var cgimg = {width:IW,height:IH,bpp:IBPP,transparent:0,buffer:cg.buffer};
+var locale = require("locale");
+var lastTime = "";
+
+function drawClock() {
+ var t = new Date();
+ var hours = t.getHours();
+ var meridian = "";
+ if (is12Hour) {
+ meridian = (hours < 12) ? "AM" : "PM";
+ hours = ((hours + 11) % 12) + 1;
+ }
+ // draw time
+ cg.clear(1);
+ cg.setColor(1);
+ var x = 74 + 32 * inf.align;
+ cg.setFont("7x11Numeric7Seg",3);
+ cg.setFontAlign(1,-1);
+ cg.drawString(hours, x, 0);
+ x+=2;
+ if (t.getSeconds() & 1)
+ cg.fillRect(x, 10, x+2, 10+2).fillRect(x, 20, x+2, 20+2);
+ x+=6;
+ cg.setFontAlign(-1,-1);
+ cg.drawString(("0"+t.getMinutes()).substr(-2), x, 0);
+ x+=44;
+ cg.setFont("7x11Numeric7Seg",1);
+ cg.drawString(("0"+t.getSeconds()).substr(-2), x, 20);
+ cg.setFont("6x8",1);
+ cg.drawString(meridian, x+2, 0);
+ let date = locale.date(t);
+ if (cg.stringWidth(date) < IW-64) {
+ cg.setFontAlign(0, -1);
+ cg.drawString(date,IW/2+32*inf.align,IH-8);
+ } else {
+ cg.setFontAlign(inf.align, -1);
+ cg.drawString(date,IW*(inf.align+1)/2,IH-8);
+ }
+}
+
+function draw() {
+ var t = (new Date()).toString();
+ if (t!=lastTime) {
+ lastTime = t;
+ drawClock();
+ }
+ // color cycling
+ cycle.forEach(c=>{
+ var p = pal.slice(c.low,c.high);
+ pal[c.low] = pal[c.high];
+ pal.set(p,c.low+1);
+ });
+ // draw image
+ g.setColor(-1);
+ // draw just the clock part overlaid (to avoid flicker)
+ g.drawImages([{x:0,y:OY,image:{width:240,height:img1height,bpp:8,palette:pal,buffer:img1}},
+ {image:cgimg,x:IX,y:IY+OY}],
+ {x:0,y:OY,width:239,height:img1height});
+ // now draw the image on its own below - this is faster
+ g.drawImage({width:240,height:img2height,bpp:8,palette:pal,buffer:img2},0,OY+img1height);
+}
+
+if (g.drawImages) {
+ // draw clock itself and do it every second
+ draw();
+ var secondInterval = setInterval(draw,100);
+ // load widgets
+ Bangle.loadWidgets();
+ Bangle.drawWidgets();
+ // Stop when LCD goes off
+ Bangle.on('lcdPower',on=>{
+ if (secondInterval) clearInterval(secondInterval);
+ secondInterval = undefined;
+ if (on) {
+ secondInterval = setInterval(draw,100);
+ lastTime="";
+ draw();
+ }
+ });
+} else {
+ E.showMessage("Please update\nBangle.js firmware\nto use this clock","animclk");
+}
+// Show launcher when middle button pressed
+setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" });
diff --git a/apps/animclk/app.png b/apps/animclk/app.png
new file mode 100644
index 000000000..63eac03e5
Binary files /dev/null and b/apps/animclk/app.png differ
diff --git a/apps/animclk/create_images.js b/apps/animclk/create_images.js
new file mode 100644
index 000000000..8436d99b3
--- /dev/null
+++ b/apps/animclk/create_images.js
@@ -0,0 +1,57 @@
+/* Creates an image and palette based off of
+an image from http://www.effectgames.com/demos/canvascycle/
+
+You just need to open devtools and find the `CanvasCycle.processImage`
+call, then create a file for it. eg.
+
+http://www.effectgames.com/demos/canvascycle/image.php?file=V29&callback=CanvasCycle.processImage
+
+Finally cycles just needs adding
+*/
+var CanvasCycle = {
+ processImage : function(info) {
+ const IMG1_HEIGHT = 55;
+ const IMG2_HEIGHT = 240-(24+55);
+ var img1 = Buffer.alloc(240*IMG1_HEIGHT);
+ var img2 = Buffer.alloc(240*IMG2_HEIGHT);
+ var n=0;
+ /* img.writeUInt8(240, n++);
+ img.writeUInt8(240, n++);
+ img.writeUInt8(8, n++);*/
+ var pal = Buffer.alloc(256*2);
+
+ for (var i=0;i>3);
+ pal.writeUInt16LE(p, i*2);
+ }
+
+ function getPixel(x,y) {
+ return info.pixels[(x+640-240)+((y+480-240)*640)];
+ }
+
+ n = 0;
+ for (var y=0;y= 0 && i <= 30) {
+ u += step_u;
+ } else {
+ u -= step_u;
+ }
+
+ drawPoint((360 * i) / steps, 2, col);
+ }
+}
+
+function drawData(title, obj, startX, startY) {
+ g.clear();
+ drawTitle(title);
+
+ let xPos, yPos;
+
+ if (typeof(startX) === "undefined" || startX === null) {
+ // Center text
+ g.setFontAlign(0,-1);
+ xPos = (0 + g.getWidth() - 2) / 2;
+ } else {
+ xPos = startX;
+ }
+
+ if (typeof(startY) === "undefined") {
+ yPos = 5;
+ } else {
+ yPos = startY;
+ }
+
+ g.setFont("6x8", 1);
+
+ Object.keys(obj).forEach((key) => {
+ g.drawString(`${key}: ${obj[key]}`, xPos, yPos += 20);
+ });
+
+ g.flip();
+}
+
+function drawMoonPositionPage(gps, title) {
+ const pos = SunCalc.getMoonPosition(new Date(), gps.lat, gps.lon);
+
+ const pageData = {
+ Azimuth: pos.azimuth.toFixed(2),
+ Altitude: pos.altitude.toFixed(2),
+ Distance: `${pos.distance.toFixed(0)} km`,
+ "Parallactic Ang": pos.parallacticAngle.toFixed(2),
+ };
+ const azimuthDegrees = parseInt(pos.azimuth * 180 / Math.PI);
+
+ drawData(title, pageData, null, 80);
+ drawPoints();
+ drawPoint(azimuthDegrees, 8, {r: 1, g: 1, b: 1});
+
+ let m = setWatch(() => {
+ let m = moonIndexPageMenu(gps);
+ }, BTN3, {repeat: false, edge: "falling"});
+}
+
+function drawMoonIlluminationPage(gps, title) {
+ const phaseNames = [
+ "New Moon", "Waxing Crescent", "First Quarter", "Waxing Gibbous",
+ "Full Moon", "Waning Gibbous", "Last Quater", "Waning Crescent",
+ ];
+
+ const phase = SunCalc.getMoonIllumination(new Date());
+ const pageData = {
+ Phase: phaseNames[phase.phase],
+ };
+
+ drawData(title, pageData, null, 35);
+ drawMoon(phase.phase, g.getWidth() / 2, g.getHeight() / 2);
+
+ let m = setWatch(() => {
+ let m = moonIndexPageMenu(gps);
+ }, BTN3, {repease: false, edge: "falling"});
+}
+
+
+function drawMoonTimesPage(gps, title) {
+ const times = SunCalc.getMoonTimes(new Date(), gps.lat, gps.lon);
+
+ const pageData = {
+ Rise: dateToTimeString(times.rise),
+ Set: dateToTimeString(times.set),
+ };
+
+ drawData(title, pageData, null, 105);
+ drawPoints();
+
+ // Draw the moon rise position
+ const risePos = SunCalc.getMoonPosition(times.rise, gps.lat, gps.lon);
+ const riseAzimuthDegrees = parseInt(risePos.azimuth * 180 / Math.PI);
+ drawPoint(riseAzimuthDegrees, 8, {r: 1, g: 1, b: 1});
+
+ // Draw the moon set position
+ const setPos = SunCalc.getMoonPosition(times.set, gps.lat, gps.lon);
+ const setAzimuthDegrees = parseInt(setPos.azimuth * 180 / Math.PI);
+ drawPoint(setAzimuthDegrees, 8, {r: 1, g: 1, b: 1});
+
+ let m = setWatch(() => {
+ let m = moonIndexPageMenu(gps);
+ }, BTN3, {repease: false, edge: "falling"});
+}
+
+function drawSunShowPage(gps, key, date) {
+ const pos = SunCalc.getPosition(date, gps.lat, gps.lon);
+
+ const hrs = ("0" + date.getHours()).substr(-2);
+ const mins = ("0" + date.getMinutes()).substr(-2);
+ const secs = ("0" + date.getMinutes()).substr(-2);
+ const time = `${hrs}:${mins}:${secs}`;
+
+ const azimuth = Number(pos.azimuth.toFixed(2));
+ const azimuthDegrees = parseInt(pos.azimuth * 180 / Math.PI);
+ const altitude = Number(pos.altitude.toFixed(2));
+
+ const pageData = {
+ Time: time,
+ Altitude: altitude,
+ Azimumth: azimuth,
+ Degrees: azimuthDegrees
+ };
+
+ drawData(key, pageData, null, 85);
+
+ drawPoints();
+
+ // Draw the suns position
+ drawPoint(azimuthDegrees, 8, {r: 1, g: 1, b: 0});
+
+ m = setWatch(() => {
+ m = sunIndexPageMenu(gps);
+ }, BTN3, {repeat: false, edge: "falling"});
+
+ return null;
+}
+
+function sunIndexPageMenu(gps) {
+ const sunTimes = SunCalc.getTimes(new Date(), gps.lat, gps.lon);
+
+ const sunMenu = {
+ "": {
+ "title": "-- Sun --",
+ },
+ "Current Pos": () => {
+ m = E.showMenu();
+ drawSunShowPage(gps, "Current Pos", new Date());
+ },
+ };
+
+ Object.keys(sunTimes).sort().reduce((menu, key) => {
+ const title = titlizeKey(key);
+ menu[title] = () => {
+ m = E.showMenu();
+ drawSunShowPage(gps, key, sunTimes[key]);
+ };
+ return menu;
+ }, sunMenu);
+
+ sunMenu["< Back"] = () => m = indexPageMenu(gps);
+
+ return E.showMenu(sunMenu);
+}
+
+
+function moonIndexPageMenu(gps) {
+ const moonMenu = {
+ "": {
+ "title": "-- Moon --",
+ },
+ "Times": () => {
+ m = E.showMenu();
+ drawMoonTimesPage(gps, "Times");
+ },
+ "Position": () => {
+ m = E.showMenu();
+ drawMoonPositionPage(gps, "Position");
+ },
+ "Illumination": () => {
+ m = E.showMenu();
+ drawMoonIlluminationPage(gps, "Illumination");
+ },
+ "< Back": () => m = indexPageMenu(gps),
+ };
+
+ return E.showMenu(moonMenu);
+}
+
+function indexPageMenu(gps) {
+ const menu = {
+ "": {
+ "title": "Select",
+ },
+ "Sun": () => {
+ m = sunIndexPageMenu(gps);
+ },
+ "Moon": () => {
+ m = moonIndexPageMenu(gps);
+ },
+ "< Exit": () => { load(); }
+ };
+
+ return E.showMenu(menu);
+}
+
+function getCenterStringX(str) {
+ return (g.getWidth() - g.stringWidth(str)) / 2;
+}
+
+/**
+ * GPS wait page, shows GPS locating animation until it gets a lock, then moves to the Sun page
+ */
+function drawGPSWaitPage() {
+ const img = require("heatshrink").decompress(atob("mEwxH+AH4A/AH4AW43GF1wwsFwYwqFwowoFw4wmFxIwdE5YAPF/4vM5nN6YAE5vMF8YtHGIgvhFpQxKF7AuOGA4vXFyAwGF63MFyIABF6xeWMC4UDLwvNGpAJG5gwSdhIIDRBLyWCIgcJHAgJJDoouQF4vMQoICBBJoeGFx6GGACIfHL6YvaX6gvZeCIdFc4gAFXogvGFxgwFDwovQCAguOGAnMMBxeG5guTGAggGGAwNKFySREcA3N5vM5gDBdpQvXEY4AKXqovGGCKbFF7AwPZQwvZGJgtGF7vGdQItG5gSIF7gASF/44WEzgwRF0wwHF1AwFF1QwDF1gvwAH4A/AFAA=="));
+ const str1 = "Astrocalc v0.02";
+ const str2 = "Locating GPS";
+ const str3 = "Please wait...";
+
+ g.clear();
+ g.drawImage(img, 100, 50);
+ g.setFont("6x8", 1);
+ g.drawString(str1, getCenterStringX(str1), 105);
+ g.drawString(str2, getCenterStringX(str2), 140);
+ g.drawString(str3, getCenterStringX(str3), 155);
+
+ if (lastGPS) {
+ lastGPS = JSON.parse(lastGPS);
+ lastGPS.time = new Date();
+
+ const str4 = "Press Button 3 to use last GPS";
+ g.setColor("#d32e29");
+ g.fillRect(0, 190, g.getWidth(), 215);
+ g.setColor("#ffffff");
+ g.drawString(str4, getCenterStringX(str4), 200);
+
+ setWatch(() => {
+ clearWatch();
+ Bangle.setGPSPower(0);
+ m = indexPageMenu(lastGPS);
+ }, BTN3, {repeat: false});
+ }
+
+ g.flip();
+
+ const DEBUG = false;
+ if (DEBUG) {
+ clearWatch();
+
+ const gps = {
+ "lat": 56.45783133333,
+ "lon": -3.02188583333,
+ "alt": 75.3,
+ "speed": 0.070376,
+ "course": NaN,
+ "time":new Date(),
+ "satellites": 4,
+ "fix": 1
+ };
+
+ m = indexPageMenu(gps);
+
+ return;
+ }
+
+ Bangle.on('GPS', (gps) => {
+ if (gps.fix === 0) return;
+ clearWatch();
+
+ if (isNaN(gps.course)) gps.course = 0;
+ require("Storage").writeJSON(LAST_GPS_FILE, JSON.stringify(gps));
+ Bangle.setGPSPower(0);
+ Bangle.buzz();
+ Bangle.setLCDPower(true);
+
+ m = indexPageMenu(gps);
+ });
+}
+
+function init() {
+ Bangle.setGPSPower(1);
+ drawGPSWaitPage();
+}
+
+let m;
+init();
\ No newline at end of file
diff --git a/apps/astrocalc/astrocalc-icon.js b/apps/astrocalc/astrocalc-icon.js
new file mode 100644
index 000000000..aa04c2805
--- /dev/null
+++ b/apps/astrocalc/astrocalc-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+AH4A/AH4AW43GF1wwsFwYwqFwowoFw4wmFxIwdE5YAPF/4vM5nN6YAE5vMF8YtHGIgvhFpQxKF7AuOGA4vXFyAwGF63MFyIABF6xeWMC4UDLwvNGpAJG5gwSdhIIDRBLyWCIgcJHAgJJDoouQF4vMQoICBBJoeGFx6GGACIfHL6YvaX6gvZeCIdFc4gAFXogvGFxgwFDwovQCAguOGAnMMBxeG5guTGAggGGAwNKFySREcA3N5vM5gDBdpQvXEY4AKXqovGGCKbFF7AwPZQwvZGJgtGF7vGdQItG5gSIF7gASF/44WEzgwRF0wwHF1AwFF1QwDF1gvwAH4A/AFAA=="))
\ No newline at end of file
diff --git a/apps/astrocalc/astrocalc.png b/apps/astrocalc/astrocalc.png
new file mode 100644
index 000000000..c26a651ec
Binary files /dev/null and b/apps/astrocalc/astrocalc.png differ
diff --git a/apps/astrocalc/first-quarter-icon.js b/apps/astrocalc/first-quarter-icon.js
new file mode 100644
index 000000000..d88ec79b5
--- /dev/null
+++ b/apps/astrocalc/first-quarter-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("rlcgI1ygf4BZM/BZMD//wCxP/8AWJ/+ACxP+CxQ6ICwP/4AWJERAWCEQ4WCERAWCEQ4WDOg4WCNA4WD/gWKRYwWDHI4WDHIwWDHI4WDHIwWEOYwWDHIwWEKAwWD/4WKKAwWEKAoWEYgwWPM4wWEM4oWQM4oWEPwwWbPwoWESowW/C34WOZ1vACxP8Cyv4CxWACyoKFCwiUFCwhmGCwh9FCwhmGCwhmFCwhPGCwgKFCwg4GCwZPGCwg4GCwY4GCwgKGCwY4GCwZxGCwjBFCwghHCwQhHCwYhHCwQhHCwRlHCwSHHCwYKICwI3HCwQKJAFAA=="))
\ No newline at end of file
diff --git a/apps/astrocalc/full-icon.js b/apps/astrocalc/full-icon.js
new file mode 100644
index 000000000..8bc04f7fc
--- /dev/null
+++ b/apps/astrocalc/full-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("rlcgJC/AD8B//4BRILJBQP/+AKGn4LC4AKFh4KC/4KFgYKD/gLFv4LD8AKEj4KD/+AEJAiGEIgiFIYhFFOAQADOghlDNA0HBQv+Q4wADRYZaFLgg4GHIg4GHIY4GHIhxFOYhxGOYgKHKARPHKARPHKAZPHKATBFYgoWKMw5nDMw5nCCyx9IPwQKIPwIW/C34WJZ1sDBQ/8CwM/BY/ACxkfBY+AgEBBQ/4CwJ+IBQJ+IPoJnIMwRnIMwJQIJ4RQIJ4JQIJ4RQIBQQ5HHAQ5HHAY5HHARzHOIRzHOIbEHYIIACLgpaDEQwhFEQohEIopDENAplERYwKGOgZwEBYoKIAH4AXA=="))
\ No newline at end of file
diff --git a/apps/astrocalc/last-quarter-icon.js b/apps/astrocalc/last-quarter-icon.js
new file mode 100644
index 000000000..b6517f66b
--- /dev/null
+++ b/apps/astrocalc/last-quarter-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("rlcgI0xgP8BRP/4ALI/4WJv4WJj4WJg//CxA3BCxM/CxIhCCw4hCCxAhCCw4hCCxAKCCw5lBCxEDCxSHBCxA4DCw4KCCw44DCww4DCw5xCCw44DCw5PDCw0PCxQKDCwxPDCwzBDCyRmECwxmDCyRmDCwx9ECzoKDCwyUEC34W/CyDOtn4WJgYWVgIWKj4WVPwgWFSogWGM4gWGPwYWGM4gWGM4YWGKAgWGKAYWGHIgWGKAYWHHIYWGHIYWHHIYWGHIYWHOYYWHYgQWHEQYWHEQQWIEQQWHEQQWINAQWIRYIWIOgQWIHQIWJBYIWJAFI="))
\ No newline at end of file
diff --git a/apps/astrocalc/new-icon.js b/apps/astrocalc/new-icon.js
new file mode 100644
index 000000000..5d610fbe1
--- /dev/null
+++ b/apps/astrocalc/new-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("rlcgIGDh///4RHBQQLHg4KC/wKFgIKC//4BYt/BYfgBQkfBQf/wAsHFw4HCBwXwBQc/AwYLB4AhEIARIBEQn//gECgYiEIYJ2FIoQQBE4YzBDgd/NoguBNAUPKoo/BB4YhEEQIdCAYYiECQMHUwwHDEIweBLgMPWIwiBAQSlENwQTBDIQAFFQMDHAw5BOYN/HAwfB8ANCAAofCHA45B+EPHA4UBKQQAGMgMfUYQAFv+DJ45QCn5PHKAPDJ45QB/hmICwPnT4yhC/1/Mw5nBCxZmIM4P/PpB+BC34WEVZCsB/7CIYYIWWOX4WbfiwWL/gKHgf+n/ABY8/4YWJ/k/VhF/4LDIg/4j5nI/+APxEP+EPM48BCgN/KA5CBg5QHMwINCJ4/AgY5Hh4fBj45GHAKeBAQSfFMgIZCHAoqCv45GA4QOBEQsfDwQDDEIgSC/4iFv6dCg4iFj60Dn4iEEIKRCL4K5E/5uDh4QDDgKFEv4uDj4/EE4IRCDYIzEAwIvBAQKnFEQIADMIhFBAAayFNAIACMoZtDBYa9GFwbrHBQR2EBYoKEA=="))
\ No newline at end of file
diff --git a/apps/astrocalc/suncalc.js b/apps/astrocalc/suncalc.js
new file mode 100644
index 000000000..e2beaedca
--- /dev/null
+++ b/apps/astrocalc/suncalc.js
@@ -0,0 +1,328 @@
+/*
+ (c) 2011-2015, Vladimir Agafonkin
+ SunCalc is a JavaScript library for calculating sun/moon position and light phases.
+ https://github.com/mourner/suncalc
+*/
+
+(function () { 'use strict';
+
+ // shortcuts for easier to read formulas
+
+ var PI = Math.PI,
+ sin = Math.sin,
+ cos = Math.cos,
+ tan = Math.tan,
+ asin = Math.asin,
+ atan = Math.atan2,
+ acos = Math.acos,
+ rad = PI / 180;
+
+ // sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas
+
+
+ // date/time constants and conversions
+
+ var dayMs = 1000 * 60 * 60 * 24,
+ J1970 = 2440588,
+ J2000 = 2451545;
+
+ function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; }
+ function fromJulian(j) { return (j + 0.5 - J1970) * dayMs; }
+ function toDays(date) { return toJulian(date) - J2000; }
+
+
+ // general calculations for position
+
+ var e = rad * 23.4397; // obliquity of the Earth
+
+ function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); }
+ function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); }
+
+ function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); }
+ function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); }
+
+ function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; }
+
+ function astroRefraction(h) {
+ if (h < 0) // the following formula works for positive altitudes only.
+ h = 0; // if h = -0.08901179 a div/0 would occur.
+
+ // formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
+ // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad:
+ return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179));
+ }
+
+ // general sun calculations
+
+ function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); }
+
+ function eclipticLongitude(M) {
+
+ var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center
+ P = rad * 102.9372; // perihelion of the Earth
+
+ return M + C + P + PI;
+ }
+
+ function sunCoords(d) {
+
+ var M = solarMeanAnomaly(d),
+ L = eclipticLongitude(M);
+
+ return {
+ dec: declination(L, 0),
+ ra: rightAscension(L, 0)
+ };
+ }
+
+
+ var SunCalc = {};
+
+
+ // calculates sun position for a given date and latitude/longitude
+
+ SunCalc.getPosition = function (date, lat, lng) {
+
+ var lw = rad * -lng,
+ phi = rad * lat,
+ d = toDays(date),
+
+ c = sunCoords(d),
+ H = siderealTime(d, lw) - c.ra;
+
+ return {
+ azimuth: azimuth(H, phi, c.dec),
+ altitude: altitude(H, phi, c.dec)
+ };
+ };
+
+
+ // sun times configuration (angle, morning name, evening name)
+
+ var times = SunCalc.times = [
+ [-0.833, 'sunrise', 'sunset' ],
+ [ -0.3, 'sunriseEnd', 'sunsetStart' ],
+ [ -6, 'dawn', 'dusk' ],
+ [ -12, 'nauticalDawn', 'nauticalDusk'],
+ [ -18, 'nightEnd', 'night' ],
+ [ 6, 'goldenHourEnd', 'goldenHour' ]
+ ];
+
+ // adds a custom time to the times config
+
+ SunCalc.addTime = function (angle, riseName, setName) {
+ times.push([angle, riseName, setName]);
+ };
+
+
+ // calculations for sun times
+
+ var J0 = 0.0009;
+
+ function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); }
+
+ function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; }
+ function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); }
+
+ function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); }
+ function observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; }
+
+ // returns set time for the given sun altitude
+ function getSetJ(h, lw, phi, dec, n, M, L) {
+
+ var w = hourAngle(h, phi, dec),
+ a = approxTransit(w, lw, n);
+ return solarTransitJ(a, M, L);
+ }
+
+
+ // calculates sun times for a given date, latitude/longitude, and, optionally,
+ // the observer height (in meters) relative to the horizon
+
+ SunCalc.getTimes = function (date, lat, lng, height) {
+
+ height = height || 0;
+
+ var lw = rad * -lng,
+ phi = rad * lat,
+
+ dh = observerAngle(height),
+
+ d = toDays(date),
+ n = julianCycle(d, lw),
+ ds = approxTransit(0, lw, n),
+
+ M = solarMeanAnomaly(ds),
+ L = eclipticLongitude(M),
+ dec = declination(L, 0),
+
+ Jnoon = solarTransitJ(ds, M, L),
+
+ i, len, time, h0, Jset, Jrise;
+
+
+ var result = {
+ solarNoon: new Date(fromJulian(Jnoon)),
+ nadir: new Date(fromJulian(Jnoon - 0.5))
+ };
+
+ for (i = 0, len = times.length; i < len; i += 1) {
+ time = times[i];
+ h0 = (time[0] + dh) * rad;
+
+ Jset = getSetJ(h0, lw, phi, dec, n, M, L);
+ Jrise = Jnoon - (Jset - Jnoon);
+
+ result[time[1]] = new Date(fromJulian(Jrise) - (dayMs / 2));
+ result[time[2]] = new Date(fromJulian(Jset) + (dayMs / 2));
+ }
+
+ return result;
+ };
+
+
+ // moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas
+
+ function moonCoords(d) { // geocentric ecliptic coordinates of the moon
+
+ var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude
+ M = rad * (134.963 + 13.064993 * d), // mean anomaly
+ F = rad * (93.272 + 13.229350 * d), // mean distance
+
+ l = L + rad * 6.289 * sin(M), // longitude
+ b = rad * 5.128 * sin(F), // latitude
+ dt = 385001 - 20905 * cos(M); // distance to the moon in km
+
+ return {
+ ra: rightAscension(l, b),
+ dec: declination(l, b),
+ dist: dt
+ };
+ }
+
+ SunCalc.getMoonPosition = function (date, lat, lng) {
+
+ var lw = rad * -lng,
+ phi = rad * lat,
+ d = toDays(date),
+
+ c = moonCoords(d),
+ H = siderealTime(d, lw) - c.ra,
+ h = altitude(H, phi, c.dec),
+ // formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
+ pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H));
+
+ h = h + astroRefraction(h); // altitude correction for refraction
+
+ return {
+ azimuth: azimuth(H, phi, c.dec),
+ altitude: h,
+ distance: c.dist,
+ parallacticAngle: pa
+ };
+ };
+
+
+ // calculations for illumination parameters of the moon,
+ // based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and
+ // Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998.
+
+ // Function updated from gist: https://gist.github.com/endel/dfe6bb2fbe679781948c
+
+ SunCalc.getMoonIllumination = function (date) {
+ let month = date.getMonth();
+ let year = date.getFullYear();
+ let day = date.getDate();
+
+ let c = 0;
+ let e = 0;
+ let jd = 0;
+ let b = 0;
+
+ if (month < 3) {
+ year--;
+ month += 12;
+ }
+
+ ++month;
+ c = 365.25 * year;
+ e = 30.6 * month;
+ jd = c + e + day - 694039.09; // jd is total days elapsed
+ jd /= 29.5305882; // divide by the moon cycle
+ b = parseInt(jd); // int(jd) -> b, take integer part of jd
+ jd -= b; // subtract integer part to leave fractional part of original jd
+ b = Math.round(jd * 8); // scale fraction from 0-8 and round
+
+ if (b >= 8) b = 0; // 0 and 8 are the same so turn 8 into 0
+
+ return {phase: b};
+ };
+
+
+ function hoursLater(date, h) {
+ return new Date(date.valueOf() + h * dayMs / 24);
+ }
+
+ // calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article
+
+ SunCalc.getMoonTimes = function (date, lat, lng, inUTC) {
+ var t = date;
+ if (inUTC) t.setUTCHours(0, 0, 0, 0);
+ else t.setHours(0, 0, 0, 0);
+
+ var hc = 0.133 * rad,
+ h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc,
+ h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx;
+
+ // go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)
+ for (var i = 1; i <= 24; i += 2) {
+ h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc;
+ h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc;
+
+ a = (h0 + h2) / 2 - h1;
+ b = (h2 - h0) / 2;
+ xe = -b / (2 * a);
+ ye = (a * xe + b) * xe + h1;
+ d = b * b - 4 * a * h1;
+ roots = 0;
+
+ if (d >= 0) {
+ dx = Math.sqrt(d) / (Math.abs(a) * 2);
+ x1 = xe - dx;
+ x2 = xe + dx;
+ if (Math.abs(x1) <= 1) roots++;
+ if (Math.abs(x2) <= 1) roots++;
+ if (x1 < -1) x1 = x2;
+ }
+
+ if (roots === 1) {
+ if (h0 < 0) rise = i + x1;
+ else set = i + x1;
+
+ } else if (roots === 2) {
+ rise = i + (ye < 0 ? x2 : x1);
+ set = i + (ye < 0 ? x1 : x2);
+ }
+
+ if (rise && set) break;
+
+ h0 = h2;
+ }
+
+ var result = {};
+
+ if (rise) result.rise = hoursLater(t, rise);
+ if (set) result.set = hoursLater(t, set);
+
+ if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true;
+
+ return result;
+ };
+
+
+ // export as Node module / AMD module / browser variable
+ if (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc;
+ else if (typeof define === 'function' && define.amd) define(SunCalc);
+ else global.SunCalc = SunCalc;
+
+}());
diff --git a/apps/astrocalc/waning-crescent-icon.js b/apps/astrocalc/waning-crescent-icon.js
new file mode 100644
index 000000000..8ff83ab1f
--- /dev/null
+++ b/apps/astrocalc/waning-crescent-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("rlcgJC/ABHgBRN8BRMfwAKIg/4CxP/BRM/HBMH/wKIgP/4AhJ/ghJ/5PJ/5PJj4WJgf/+AWIv5mJHAIWJ/5mJHAJ9IHAIWJn59JHAJ9JJ4IWIh4WK/4WJJ4KUIYIKUJJ4IWIMwIWgMwIWIPoLCJCwLCICxYKBCxCUBC34W/Cya3WCxr8In78JgYWhj4WJgIWKPwP8SpXAM5IWJPwIWIKAIWJM4PgKBP+CxBQBCxA5CBRBQBYZA5CBRA5BSpA5CSpA5BCxJzBPxDEBPxIiBM5MDPxJFBM5IiBKBMBKBKLBKBMAhwKJAH4ABA="))
\ No newline at end of file
diff --git a/apps/astrocalc/waning-gibbous-icon.js b/apps/astrocalc/waning-gibbous-icon.js
new file mode 100644
index 000000000..2373475f4
--- /dev/null
+++ b/apps/astrocalc/waning-gibbous-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("rlcgI0xgP/wAKJ/wWI///+AKHv4LBEQ8fBQP8BQ0HBQP/8A3HAAQWGn4KCHIwhDHIwhE/AhJ//AEJJQGBQZQGMoQABRQsDCwhQFQ4RnHHAgWGBQhnFHAhnFHAoWFOIhnFHAp+FJ4oWEh4WKBQp+EJ4qVEYIgWRMwwWEMwoWLVghmFVgh9GCzYKGCwaUGC34W/CxzOtn4WJgYKF/wWK8AKCgIWKj4WVPwwWDSo38BQZnG4B+JCwhnGCwhnF/AKDKA2AKBIWEHIwKEKAqrDHI4KEHIp9EHIqUEHIxmEOYp9EYgxmEEQpmFEQoKFEQhmFEQhPGNAhPFRYg4GOggKHHQSIFBYghIAFQ="))
\ No newline at end of file
diff --git a/apps/astrocalc/waxing-crescent-icon.js b/apps/astrocalc/waxing-crescent-icon.js
new file mode 100644
index 000000000..d89525c88
--- /dev/null
+++ b/apps/astrocalc/waxing-crescent-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("rlcgJC/ABdwBRMD8ALJj+ABREB/wWJh/wBZN/4AKIg4iKn/4KBP/ERMfERMB/5FJj//NBP//hnJ/6LJ/45Jg45Kv45JCwI5Jn5zJPwI5JCwJQICwP/CxRQISoJQJSoLEICwRQICwJnICzJnIYYJ+JCzB+ICwKVJC34W/CxbOffgIWIfgXACxP8Cyv4CxWACyUDPpU/ShIWBPpIWBPpEHMxMAv5mJCwJPICwQKIYQI4IYQJPJCwI4ISgI4JSgIKICwI4Jn5xJSgLBIMwIhJg4hJMwIKJj4hJgJlJgE+BRMHBRIA+A"))
\ No newline at end of file
diff --git a/apps/astrocalc/waxing-gibbous-icon.js b/apps/astrocalc/waxing-gibbous-icon.js
new file mode 100644
index 000000000..90ccd6f37
--- /dev/null
+++ b/apps/astrocalc/waxing-gibbous-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("rlcgI1yj/4BREH/4LJ/4LJj4LB8AKGgYKB/+ABY1/BQP+BQ0PCwQuHBQX/4A4IEQ8BCwYiGn4iJJ4YiHJ4QAB+CIGAAZoFBQn8MxCLHBQg5FMwY5GMwg5GCwo5EMwhzGPog5FCwxQECwv/PpJQFSghQFCwzEECyJnECwxnDVYoWFBQpnECwx+ECzp+DCwyVEC34W/CyDOt4AKCg4KF/gWDv4WQ/AWKwAWVBQcDShMAn5mJCwx9DCwxmEgJmJgEfJ5IWGBQasGHAisFJ4gWGHAh+FHAiVGBQhnFHAp+EOIhnGYIZnGEIpQEEIxnEEIpQEEIxQDMoo5EQ4o5FFgyKDBRAiBBRAApA="))
\ No newline at end of file
diff --git a/apps/astroid/ChangeLog b/apps/astroid/ChangeLog
new file mode 100644
index 000000000..42c1df403
--- /dev/null
+++ b/apps/astroid/ChangeLog
@@ -0,0 +1 @@
+0.02: Add "ram" keyword to allow 2v06 Espruino builds to cache function that needs to be fast
diff --git a/apps/astroid/asteroids.js b/apps/astroid/asteroids.js
index cb44db904..da4dc017e 100644
--- a/apps/astroid/asteroids.js
+++ b/apps/astroid/asteroids.js
@@ -59,6 +59,7 @@ function gameStart() {
function onFrame() {
+ "ram"
var t = getTime();
var d = (lastFrame===undefined)?0:(t-lastFrame)*20;
lastFrame = t;
diff --git a/apps/ballmaze/README.md b/apps/ballmaze/README.md
new file mode 100644
index 000000000..22a295686
--- /dev/null
+++ b/apps/ballmaze/README.md
@@ -0,0 +1,15 @@
+# Ball Maze
+
+Navigate a ball through a maze by tilting your watch.
+
+
+
+
+## Usage
+
+Select a maze size to begin the game.
+Tilt your watch to steer the ball towards the target and advance to the next level.
+
+## Creator
+
+Richard de Boer
diff --git a/apps/ballmaze/app.js b/apps/ballmaze/app.js
new file mode 100644
index 000000000..3e26277b7
--- /dev/null
+++ b/apps/ballmaze/app.js
@@ -0,0 +1,552 @@
+(() => {
+ let intervalID;
+ let settings = require("Storage").readJSON("ballmaze.json",true) || {};
+
+ // density, elasticity of bounces, "drag coefficient"
+ const rho = 100, e = 0.3, C = 0.01;
+ // screen width & height in pixels
+ const sW = 240, sH = 160;
+ // gravity constant (lowercase was already taken)
+ const G = 9.80665;
+
+ // wall bit flags
+ const TOP = 1<<0, LEFT = 1<<1, BOTTOM = 1<<2, RIGHT = 1<<3,
+ LINKED = 1<<4; // used in maze generation
+
+ // The play area is 240x160, sizes are the ball radius, so we can use common
+ // denominators of 120x80 to get square rooms
+ // Reverse the order to show the easiest on top of the menu
+ const sizes = [1, 2, 4, 5, 8, 10, 16, 20, 40].reverse(),
+ // even size 1 actually works, but larger mazes take forever to generate
+ minSize = 4, defaultSize = 10;
+ const sizeNames = {
+ 1: "Insane", 2: "Gigantic", 4: "Enormous", 5: "Huge", 8: "Large",
+ 10: "Medium", 16: "Small", 20: "Tiny", 40: "Trivial",
+ };
+
+ /**
+ * Draw something to all screen buffers
+ * @param draw {function} Callback which performs the drawing
+ */
+ function drawAll(draw) {
+ draw();
+ g.flip();
+ draw();
+ g.flip();
+ }
+
+ /**
+ * Clear all buffers
+ */
+ function clearAll() {
+ drawAll(() => g.clear());
+ }
+
+ // use unbuffered graphics for UI stuff
+ function showMessage(message, title) {
+ Bangle.setLCDMode();
+ return E.showMessage(message, title);
+ }
+
+ function showPrompt(prompt, options) {
+ Bangle.setLCDMode();
+ return E.showPrompt(prompt, options);
+ }
+
+ function showMenu(menu) {
+ Bangle.setLCDMode();
+ return E.showMenu(menu);
+ }
+
+ const sign = (n) => n<0?-1:1; // we don't really care about zero
+
+ /**
+ * Play the game, using a ball with radius size
+ * @param size {number}
+ */
+ function playMaze(size) {
+ const r = size;
+ // ball mass, weight, "drag"
+ // Yes, larger maze = larger ball = heavier ball
+ // (atm our physics is so oversimplified that mass cancels out though)
+ const m = rho*(r*r*r), w = G*m, d = C*w;
+
+ // number of columns/rows
+ const cols = Math.round(sW/(r*2.5)),
+ rows = Math.round(sH/(r*2.5));
+ // width & height of one column/row in pixels
+ const cW = sW/cols, rH = sH/rows;
+
+ // list of rooms, every room can have one or more wall bits set
+ // actual layout: 0 1 2
+ // 3 4 5
+ // this means that for room with index "i": (except edge cases!)
+ // i-1 = room to the left
+ // i+1 = room to the right
+ // i-cols = room above
+ // i+cols = room below
+ let rooms = new Uint8Array(rows*cols);
+ // shortest route from start to finish
+ let route;
+
+ let x, y, // current position
+ px, py, ppx, ppy, // previous positions (for erasing old image)
+ vx, vy; // velocity
+
+ function start() {
+ // start in top left corner
+ x = cW/2;
+ y = rH/2;
+ vx = vy = 0;
+ ppx = px = x;
+ ppy = py = y;
+
+ generateMaze(); // this shows unbuffered progress messages
+ if (settings.cheat && r>1) findRoute(); // not enough memory for r==1 :-(
+
+ Bangle.setLCDMode("doublebuffered");
+ clearAll();
+ drawAll(drawMaze);
+ intervalID = setInterval(tick, 100);
+ }
+
+ // Position conversions
+ // index: index of room in rooms[]
+ // rowcol: position measured in roomsizes
+ // xy: position measured in pixels
+ /**
+ * Index from RowCol
+ * @param row {number}
+ * @param col {number}
+ * @returns {number} rooms[] index
+ */
+ function iFromRC(row, col) {
+ return row*cols+col;
+ }
+
+ /**
+ * RowCol from index
+ * @param index {number}
+ * @returns {(number)[]} [row,column]
+ */
+ function rcFromI(index) {
+ return [
+ Math.floor(index/cols),
+ index%cols,
+ ];
+ }
+
+ /**
+ * RowCol from Xy
+ * @param x {number}
+ * @param y {number}
+ * @returns {(number)[]} [row,column]
+ */
+ function rcFromXy(x, y) {
+ return [
+ Math.floor(y/sH*rows),
+ Math.floor(x/sW*cols),
+ ];
+ }
+
+ /**
+ * Link another room up
+ * @param index {number} Dig from already linked room with this index
+ * @param dir {number} in this direction
+ * @return {number} index of room we just linked up
+ */
+ function dig(index, dir) {
+ rooms[index] &= ~dir;
+ let neighbour;
+ switch(dir) {
+ case LEFT:
+ neighbour = index-1;
+ rooms[neighbour] &= ~RIGHT;
+ break;
+ case RIGHT:
+ neighbour = index+1;
+ rooms[neighbour] &= ~LEFT;
+ break;
+ case TOP:
+ neighbour = index-cols;
+ rooms[neighbour] &= ~BOTTOM;
+ break;
+ case BOTTOM:
+ neighbour = index+cols;
+ rooms[neighbour] &= ~TOP;
+ break;
+ }
+ rooms[neighbour] |= LINKED;
+ return neighbour;
+ }
+
+ /**
+ * Generate the maze
+ */
+ function generateMaze() {
+ // Maze generation basically works like this:
+ // 1. Start with all rooms set to completely walled off and "unlinked"
+ // 2. Then mark a room as "linked", and add it to the "to do" list
+ // 3. When the "to do" list is empty, we're done
+ // 4. pick a random room from the list
+ // 5. if all adjacent rooms are linked -> remove room from list, goto 3
+ // 6. pick a random unlinked adjacent room
+ // 7. remove the walls between the rooms
+ // 8. mark the adjacent room as linked and add it to the "to do" list
+ // 9. go to 4
+ let pdotnum = 0;
+ const title = "Please wait",
+ message = "Generating maze\n",
+ showProgress = (done, total) => {
+ const dotnum = Math.floor(done/total*10);
+ if (dotnum>pdotnum) {
+ const dots = ".".repeat(dotnum)+" ".repeat(10-dotnum);
+ showMessage(message+dots, title);
+ pdotnum = dotnum;
+ }
+ };
+ showProgress(0, 100);
+ // start with all rooms completely walled off
+ rooms.fill(TOP|LEFT|BOTTOM|RIGHT);
+ const
+ // is room at row,col already linked?
+ linked = (row, col) => !!(rooms[iFromRC(row, col)]&LINKED),
+ // pick random array element
+ pickRandom = (arr) => arr[Math.floor(Math.random()*arr.length)];
+ // starting with top-right room seems to generate more interesting mazes
+ rooms[cols] |= LINKED;
+ let todo = [cols], done = 1;
+ while(todo.length) {
+ const index = pickRandom(todo);
+ const rc = rcFromI(index),
+ row = rc[0], col = rc[1];
+ let sides = [];
+ if ((col>0) && !linked(row, col-1)) sides.push(LEFT);
+ if ((col0) && !linked(row-1, col)) sides.push(TOP);
+ if ((row0 && !(walls&LEFT) && dist[i-1]>d+1) {
+ dist[i-1] = d+1;
+ todo.push(i-1);
+ }
+ if (row>0 && !(walls&TOP) && dist[i-cols]>d+1) {
+ dist[i-cols] = d+1;
+ todo.push(i-cols);
+ }
+ if (cold+1) {
+ dist[i+1] = d+1;
+ todo.push(i+1);
+ }
+ if (rowd+1) {
+ dist[i+cols] = d+1;
+ todo.push(i+cols);
+ }
+ }
+
+ route = [rooms.length-1];
+ while(true) {
+ const i = route[0], d = dist[i], walls = rooms[i],
+ rc = rcFromI(i),
+ row = rc[0], col = rc[1];
+ if (i===0) { break; }
+ if (col0 && !(walls&TOP) && dist[i-cols]0 && !(walls&LEFT) && dist[i-1] {
+ const rc = rcFromI(i),
+ row = rc[0], col = rc[1],
+ x = (col+0.5)*cW, y = (row+0.5)*rH;
+ g.lineTo(x, y);
+ });
+ }
+
+ /**
+ * Move the ball
+ */
+ function move() {
+ const a = Bangle.getAccel();
+ const fx = (-a.x*w)-(sign(vx)*d*a.z), fy = (-a.y*w)-(sign(vy)*d*a.z);
+ vx += fx/m;
+ vy += fy/m;
+ const s = Math.ceil(Math.max(Math.abs(vx), Math.abs(vy)));
+ for(let n = s; n>0; n--) {
+ x += vx/s;
+ y += vy/s;
+ bounce();
+ }
+ if (x>sW-cW && y>sH-rH) win();
+ }
+
+ /**
+ * Check whether we hit any walls, and if so: Bounce.
+ *
+ * Bounce = reverse velocity in bounce direction, multiply with elasticity
+ * Also apply drag in perpendicular direction ("friction with the wall")
+ */
+ function bounce() {
+ const row = Math.floor(y/sH*rows), col = Math.floor(x/sW*cols),
+ i = row*cols+col, walls = rooms[i];
+ const left = col*cW,
+ right = (col+1)*cW,
+ top = row*rH,
+ bottom = (row+1)*rH;
+ let bounced = false;
+ if (vx<0) {
+ if ((walls&LEFT) && x<=left+r) {
+ x += (1+e)*(left+r-x);
+ const fy = sign(vy)*d*Math.abs(vx);
+ vy -= fy/m;
+ vx = -vx*e;
+ bounced = true;
+ }
+ } else {
+ if ((walls&RIGHT) && x>=right-r) {
+ x -= (1+e)*(x+r-right);
+ const fy = sign(vy)*d*Math.abs(vx);
+ vy -= fy/m;
+ vx = -vx*e;
+ bounced = true;
+ }
+ }
+ if (vy<0) {
+ if ((walls&TOP) && y<=top+r) {
+ y += (1+e)*(top+r-y);
+ const fx = sign(vx)*d*Math.abs(vy);
+ vx -= fx/m;
+ vy = -vy*e;
+ bounced = true;
+ }
+ } else {
+ if ((walls&BOTTOM) && y>=bottom-r) {
+ y -= (1+e)*(y+r-bottom);
+ const fx = sign(vx)*d*Math.abs(vy);
+ vx -= fx/m;
+ vy = -vy*e;
+ bounced = true;
+ }
+ }
+ if (bounced) return;
+ let cx, cy;
+ if ((rooms[i-1]&TOP) || rooms[i-cols]&LEFT) {
+ if ((x-left)*(x-left)+(y-top)*(y-top)<=r*r) {
+ cx = left;
+ cy = top;
+ }
+ }
+ else if ((rooms[i-1]&BOTTOM) || rooms[i+cols]&LEFT) {
+ if ((x-left)*(x-left)+(bottom-y)*(bottom-y)<=r*r) {
+ cx = left;
+ cy = bottom;
+ }
+ }
+ else if ((rooms[i+1]&TOP) || rooms[i-cols]&RIGHT) {
+ if ((right-x)*(right-x)+(y-top)*(y-top)<=r*r) {
+ cx = right;
+ cy = top;
+ }
+ }
+ else if ((rooms[i+1]&BOTTOM) || rooms[i+cols]&RIGHT) {
+ if ((right-x)*(right-x)+(bottom-y)*(bottom-y)<=r*r) {
+ cx = right;
+ cy = bottom;
+ }
+ }
+ if (!cx) return;
+ let nx = x-cx, ny = y-cy;
+ const l = Math.sqrt(nx*nx+ny*ny);
+ nx /= l;
+ ny /= l;
+ const p = vx*nx+vy*ny;
+ vx -= 2*p*nx*e;
+ vy -= 2*p*ny*e;
+ }
+
+ /**
+ * You reached the bottom-right corner, you win!
+ */
+ function win() {
+ clearInterval(intervalID);
+ Bangle.buzz().then(askAgain);
+ }
+
+ /**
+ * You solved the maze, try the next one?
+ */
+ function askAgain() {
+ const nextLevel = (size>minSize)?"next level":"again";
+ const nextSize = (size>minSize)?sizes[sizes.indexOf(size)+1]:size;
+ showPrompt(`Well done!\n\nPlay ${nextLevel}?`,
+ {"title": "Congratulations!"})
+ .then(function(again) {
+ if (again) {
+ playMaze(nextSize);
+ } else {
+ startGame();
+ }
+ });
+ }
+
+ function tick() {
+ ppx = px;
+ ppy = py;
+ px = x;
+ py = y;
+ move();
+ drawUpdate();
+ }
+
+ start();
+ }
+
+ /**
+ * Ask player what size maze they would like to play
+ */
+ function startGame() {
+ let menu = {
+ "": {
+ title: "Select Maze Size",
+ selected: sizes.indexOf(settings.size || defaultSize),
+ },
+ };
+ sizes.filter(s => s>=minSize).forEach(size => {
+ let name = sizeNames[size];
+ if (size {
+ // remember chosen size
+ settings.size = size;
+ require("Storage").write("ballmaze.json", settings);
+ playMaze(size);
+ };
+ });
+ menu["< Exit"] = () => load();
+ showMenu(menu);
+ }
+
+ startGame();
+})();
diff --git a/apps/ballmaze/icon.js b/apps/ballmaze/icon.js
new file mode 100644
index 000000000..10b5a502e
--- /dev/null
+++ b/apps/ballmaze/icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwhC/AH4AU9wAOCw0OC5/gFyowHC+Hs5gACC7HhiMRjwXSCoIADC5wCB4MSkIXDGIoXKiUikQwJC5PhCwIXFGAgXJFwRHEGAnOC5HhC5IwC5gXJIw4XF4AXKFwwXEGAoXCiKlFMAzNCgDpDC4QAKcgZJBC6wADF6kAhgXP5xfEC58SC4iNCC4nhC5McC4S/DC6a9DC4IACC5MhC4XOC5HuLxPMC4PuC5IwHkUeC44ABA4IACFw5cBC5owEkUhjwXPGAyMCC5wxDLgIACC54ADC94AGC7sOCx/gC4owQCwwA/AH4AMA"))
diff --git a/apps/ballmaze/icon.png b/apps/ballmaze/icon.png
new file mode 100644
index 000000000..44697db4b
Binary files /dev/null and b/apps/ballmaze/icon.png differ
diff --git a/apps/ballmaze/maze.png b/apps/ballmaze/maze.png
new file mode 100644
index 000000000..7bda56d9b
Binary files /dev/null and b/apps/ballmaze/maze.png differ
diff --git a/apps/ballmaze/size_select.png b/apps/ballmaze/size_select.png
new file mode 100644
index 000000000..cac278820
Binary files /dev/null and b/apps/ballmaze/size_select.png differ
diff --git a/apps/balltastic/ChangeLog b/apps/balltastic/ChangeLog
new file mode 100644
index 000000000..5a62086c2
--- /dev/null
+++ b/apps/balltastic/ChangeLog
@@ -0,0 +1 @@
+0.01: Initial version of Balltastic released! Happy!
diff --git a/apps/balltastic/app-icon.js b/apps/balltastic/app-icon.js
new file mode 100644
index 000000000..f25b6e067
--- /dev/null
+++ b/apps/balltastic/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwkEogAIkUzmciBpIVIkYWBAAUyCx0hiIXFAAMkCxhUBC4fzDAYWLiAXFAAP//5KKoMRC4UTC4k/DAPzJJERiKcCC5H/GA4uBWwp6DC4YwHCwMBDI0SMAYwHoIWBiXxdIwYCMJCjBiM/C46VDC4M/GAkRgMf//ySAQAEgKrDC4lBgMCHIQXHSwxICIwIuBAAIXIGAYABiQXBkEBTYcgC473FkQXBiETTQZ4IgECC4cholCiJGDMAIXIWgIXCmMkC4JGDJBbEDC4UACwn/mAtGSYsxilCgIXFSAqDBkMRiIFBkcxiUiC4sxXowIBC4QGBkIXBiJ2EFwsDBIPyC4ILBgMRiUyiCmJgSCC+YXDgAXDR4YuEcAn/MAIXEmcgBoXyFwjIEMAQXFkIOCUgoXF+J3CC4cxBwR1IQQx3BkUzmUSBQKkFC5IuBkVDJAJeGRwLhHFwUkC4Mxl6lFC48gFwYXCmcTOwomBC4swYIMikU0C4UxkJ3FC40xFoIXCogXBmaxDC5MyCwUiogXDmIXTJASSBC4kRU4oXDkgXFmQwDNwIWEBoIXFJAYKBZggWFC4YWCC4g7BkIWBkYWBBYYXCkYXDJAYjDkQUEEYZGEGA4XIIwwwGDAQuOGAomCFo4uGGARoBE4ZOGFxAABBwgAICxAABCyxJBGJJFJJRgVNPggsMA="))
diff --git a/apps/balltastic/app.js b/apps/balltastic/app.js
new file mode 100644
index 000000000..6c1de940c
--- /dev/null
+++ b/apps/balltastic/app.js
@@ -0,0 +1,186 @@
+Bangle.setLCDBrightness(1);
+Bangle.setLCDMode("doublebuffered");
+
+let points = 0;
+let level = 1;
+let levelSpeedStart = 0.8;
+let nextLevelPoints = 20;
+let levelSpeedFactor = 0.2;
+let counterWidth = 10;
+let gWidth = g.getWidth() - counterWidth;
+let gHeight = g.getHeight();
+let counter = 160;
+let counterMax = 160;
+let ballDims = 20;
+let ballx = g.getWidth() / 2 - ballDims;
+let bally = g.getHeight() / 2 - ballDims;
+let dotx = g.getWidth() / 2;
+let doty = g.getWidth() / 2;
+let ballBuzzTime = 5;
+let ballSpeedFactor = 40;
+let redrawspeed = 5;
+let dotwidth = 5;
+let running = false;
+let drawInterval;
+let xBuzzed = false;
+let yBuzzed = false;
+
+let BALL = require("heatshrink").decompress(
+ atob(
+ "ikUyAROvkQ3v4405AIYHBGq9KpMhktz1/W7feAJAtBEZ9jhkhs0ZgkQ8lKxW+jAdB516627E4X8AIPWzelmolKlpJBjMFEYIpC4kQ0YBBqWKynTFYPe7gpE3ec6gnHkNFrXL7372u2E4WjhGCAIliqWrUIPeKoIpB7h9HoUoqWq999///FIJ3BhGDEIIBBgFBAoWCoUI3vY62aQIW7ymSJooLBEoIADwkQEYVhEoInEGIOjR4O1y/OrIrBUYdr198iH/74nF88cE4gpCA4MY8k59CzBAINrx2164nBtduufPWYIlF++/xkxNoMAAIJPBoSdB52a30ZkNGE4IvBoUpwkxLIOMyWEmAmE7+MqKbEsLLBH4P3zw1BAYJFBFIMY8sQ4cx44nB0tVHYITBEoO967lDgDDC1tVQ4QBD37xBjMmJ4I3BE4IxBPoOMuSrBHYL1BJYbrDvfPLoYBD889jMlEoMhkpJBwkRE4O+jB7B405LoJPEYYUx0xPG7/3vxvBmOnrXsdIOc6jxBE4JfBvfwHIafDFoMRgh3H99+zsUDIOMqWU2YlBAAO1/AnBToN76EhgpTBFYKPBGIIhBEovOrWliuc2YlBE4oABE4etu2UyVrpqJBMoKvBEIPnjvWze97ATBE4YPBEopRC64BC27nBzn0znTAIOlimtq21y4BCEoM1HYOMqIVBE44AB0tVCYIBEigVBE4U1GYIFBymywkwEoJzHABIRBMIIXBWoIDCqOEmOEiABCmIjPAA51BFoVSEoUwAIIZNA"
+ )
+);
+
+function reset() {
+ g.clear();
+ level = 1;
+ points = 0;
+ ballx = g.getWidth() / 2 - ballDims;
+ bally = g.getHeight() / 2 - ballDims;
+ counter = counterMax;
+ createRandomDot();
+ drawInterval = setInterval(play, redrawspeed);
+ running = true;
+}
+
+function collide() {
+ try {
+ Bangle.buzz(ballBuzzTime, 0.8);
+ } catch (e) {}
+}
+
+function createRandomDot() {
+ dotx = Math.floor(
+ Math.random() * Math.floor(gWidth - dotwidth / 2) + dotwidth / 2
+ );
+ doty = Math.floor(
+ Math.random() * Math.floor(gHeight - dotwidth / 2) + dotwidth / 2
+ );
+}
+
+function checkIfDotEaten() {
+ if (
+ ballx + ballDims > dotx &&
+ ballx <= dotx + dotwidth &&
+ bally + ballDims > doty &&
+ bally <= doty + dotwidth
+ ) {
+ collide();
+ createRandomDot();
+ counter = counterMax;
+ points++;
+
+ if (points % nextLevelPoints == 0) {
+ level++;
+ }
+ }
+}
+
+function drawLevelText() {
+ g.setColor("#26b6c7");
+ g.setFontAlign(0, 0);
+ g.setFont("4x6", 5);
+ g.drawString("Level " + level, 120, 80);
+}
+
+function draw() {
+ //bg
+ g.setColor("#71c6cf");
+ g.fillRect(0, 0, g.getWidth(), g.getHeight());
+
+ //counter
+ drawCounter();
+
+ //draw level
+ drawLevelText();
+
+ //dot
+ g.setColor("#ff0000");
+ g.fillCircle(dotx, doty, dotwidth);
+
+ //ball
+ g.drawImage(BALL, ballx, bally);
+
+ g.flip();
+}
+
+function drawCounter() {
+ g.setColor("#000000");
+ g.fillRect(g.getWidth() - counterWidth, 0, g.getWidth(), gHeight);
+
+ if(counter < 40 ) g.setColor("#fc0303");
+ else if (counter < 80 ) g.setColor("#fc9803");
+ else g.setColor("#0318fc");
+
+ g.fillRect(
+ g.getWidth() - counterWidth,
+ gHeight,
+ g.getWidth(),
+ gHeight - counter
+ );
+}
+
+function checkCollision() {
+ if (ballx < 0) {
+ ballx = 0;
+ if (!xBuzzed) collide();
+ xBuzzed = true;
+ } else if (ballx > gWidth - ballDims) {
+ ballx = gWidth - ballDims;
+ if (!xBuzzed) collide();
+ xBuzzed = true;
+ } else {
+ xBuzzed = false;
+ }
+
+ if (bally < 0) {
+ bally = 0;
+ if (!yBuzzed) collide();
+ yBuzzed = true;
+ } else if (bally > gHeight - ballDims) {
+ bally = gHeight - ballDims;
+ if (!yBuzzed) collide();
+ yBuzzed = true;
+ } else {
+ yBuzzed = false;
+ }
+}
+
+function count() {
+ counter -= levelSpeedStart + level * levelSpeedFactor;
+ if (counter <= 0) {
+ running = false;
+ clearInterval(drawInterval);
+ setTimeout(function(){ E.showMessage("Press Button 1\nto restart.", "Gameover!");},50);
+ }
+}
+
+function accel(values) {
+ ballx -= values.x * ballSpeedFactor;
+ bally -= values.y * ballSpeedFactor;
+}
+
+function play() {
+ if (running) {
+ accel(Bangle.getAccel());
+ checkCollision();
+ checkIfDotEaten();
+ count();
+ draw();
+ }
+}
+
+setTimeout(() => {
+ reset();
+ drawInterval = setInterval(play, redrawspeed);
+
+ setWatch(
+ () => {
+ if(!running) reset();
+ },
+ BTN1,
+ { repeat: true }
+ );
+
+ running = true;
+}, 10);
diff --git a/apps/balltastic/app.png b/apps/balltastic/app.png
new file mode 100644
index 000000000..0f95e056f
Binary files /dev/null and b/apps/balltastic/app.png differ
diff --git a/apps/banglerun/ChangeLog b/apps/banglerun/ChangeLog
new file mode 100755
index 000000000..b0dfafa4e
--- /dev/null
+++ b/apps/banglerun/ChangeLog
@@ -0,0 +1,2 @@
+0.01: First release
+0.02: Bugfix time: Reset minutes to 0 when hitting 60
diff --git a/apps/banglerun/app-icon.js b/apps/banglerun/app-icon.js
new file mode 100644
index 000000000..0ccbedab4
--- /dev/null
+++ b/apps/banglerun/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwMB/4ACx4ED/0DApP8AqAXB84GDg/DAgXj/+DCAUABgIFB4EAv4FCwEAj0PAoJPBgwFEgEfDgMOAoM/AoMegFAAoP8jkA8F/AoM8gP4DgP4nBvD/F4KQfwuAFE+A/CAoPgAofx8A/CKYRwELIIFDLII6BAoZSBLIYeC/0BwAFDgfAGAQFBHgf8g4BBIIUH/wFBSYMPAoXwAog/Bj4FEv4FDDQQCBQoQFCZYYFi/6KE/+P/4A="))
diff --git a/apps/banglerun/app.js b/apps/banglerun/app.js
new file mode 100644
index 000000000..41680295c
--- /dev/null
+++ b/apps/banglerun/app.js
@@ -0,0 +1,314 @@
+/** Global constants */
+const DEG_TO_RAD = Math.PI / 180;
+const EARTH_RADIUS = 6371008.8;
+
+/** Utilities for handling vectors */
+class Vector {
+ static magnitude(a) {
+ let sum = 0;
+ for (const key of Object.keys(a)) {
+ sum += a[key] * a[key];
+ }
+ return Math.sqrt(sum);
+ }
+
+ static add(a, b) {
+ const result = {};
+ for (const key of Object.keys(a)) {
+ result[key] = a[key] + b[key];
+ }
+ return result;
+ }
+
+ static sub(a, b) {
+ const result = {};
+ for (const key of Object.keys(a)) {
+ result[key] = a[key] - b[key];
+ }
+ return result;
+ }
+
+ static multiplyScalar(a, x) {
+ const result = {};
+ for (const key of Object.keys(a)) {
+ result[key] = a[key] * x;
+ }
+ return result;
+ }
+
+ static divideScalar(a, x) {
+ const result = {};
+ for (const key of Object.keys(a)) {
+ result[key] = a[key] / x;
+ }
+ return result;
+ }
+}
+
+/** Interquartile range filter, to detect outliers */
+class IqrFilter {
+ constructor(size, threshold) {
+ const q = Math.floor(size / 4);
+ this._buffer = [];
+ this._size = 4 * q + 2;
+ this._i1 = q;
+ this._i3 = 3 * q + 1;
+ this._threshold = threshold;
+ }
+
+ isReady() {
+ return this._buffer.length === this._size;
+ }
+
+ isOutlier(point) {
+ let result = true;
+ if (this._buffer.length === this._size) {
+ result = false;
+ for (const key of Object.keys(point)) {
+ const data = this._buffer.map(item => item[key]);
+ data.sort((a, b) => (a - b) / Math.abs(a - b));
+ const q1 = data[this._i1];
+ const q3 = data[this._i3];
+ const iqr = q3 - q1;
+ const lower = q1 - this._threshold * iqr;
+ const upper = q3 + this._threshold * iqr;
+ if (point[key] < lower || point[key] > upper) {
+ result = true;
+ break;
+ }
+ }
+ }
+ this._buffer.push(point);
+ this._buffer = this._buffer.slice(-this._size);
+ return result;
+ }
+}
+
+/** Process GPS data */
+class Gps {
+ constructor() {
+ this._lastCall = Date.now();
+ this._lastValid = 0;
+ this._coords = null;
+ this._filter = new IqrFilter(10, 1.5);
+ this._shift = { x: 0, y: 0, z: 0 };
+ }
+
+ isReady() {
+ return this._filter.isReady();
+ }
+
+ getDistance(gps) {
+ const time = Date.now();
+ const interval = (time - this._lastCall) / 1000;
+ this._lastCall = time;
+
+ if (!gps.fix) {
+ return { t: interval, d: 0 };
+ }
+
+ const p = gps.lat * DEG_TO_RAD;
+ const q = gps.lon * DEG_TO_RAD;
+ const coords = {
+ x: EARTH_RADIUS * Math.sin(p) * Math.cos(q),
+ y: EARTH_RADIUS * Math.sin(p) * Math.sin(q),
+ z: EARTH_RADIUS * Math.cos(p),
+ };
+
+ if (!this._coords) {
+ this._coords = coords;
+ this._lastValid = time;
+ return { t: interval, d: 0 };
+ }
+
+ const ds = Vector.sub(coords, this._coords);
+ const dt = (time - this._lastValid) / 1000;
+ const v = Vector.divideScalar(ds, dt);
+
+ if (this._filter.isOutlier(v)) {
+ return { t: interval, d: 0 };
+ }
+
+ this._shift = Vector.add(this._shift, ds);
+ const length = Vector.magnitude(this._shift);
+ const remainder = length % 10;
+ const distance = length - remainder;
+
+ this._coords = coords;
+ this._lastValid = time;
+ if (distance > 0) {
+ this._shift = Vector.multiplyScalar(this._shift, remainder / length);
+ }
+
+ return { t: interval, d: distance };
+ }
+}
+
+/** Process step counter data */
+class Step {
+ constructor(size) {
+ this._buffer = [];
+ this._size = size;
+ }
+
+ getCadence() {
+ this._buffer.push(Date.now() / 1000);
+ this._buffer = this._buffer.slice(-this._size);
+ const interval = this._buffer[this._buffer.length - 1] - this._buffer[0];
+ return interval ? Math.round(60 * (this._buffer.length - 1) / interval) : 0;
+ }
+}
+
+const gps = new Gps();
+const step = new Step(10);
+
+let totDist = 0;
+let totTime = 0;
+let totSteps = 0;
+
+let speed = 0;
+let cadence = 0;
+let heartRate = 0;
+
+let gpsReady = false;
+let hrmReady = false;
+let running = false;
+
+function formatClock(date) {
+ return ('0' + date.getHours()).substr(-2) + ':' + ('0' + date.getMinutes()).substr(-2);
+}
+
+function formatDistance(m) {
+ return ('0' + (m / 1000).toFixed(2) + ' km').substr(-7);
+}
+
+function formatTime(s) {
+ const hrs = Math.floor(s / 3600);
+ const min = Math.floor(s / 60) % 60;
+ const sec = Math.floor(s % 60);
+ return (hrs ? hrs + ':' : '') + ('0' + min).substr(-2) + `:` + ('0' + sec).substr(-2);
+}
+
+function formatSpeed(kmh) {
+ if (kmh <= 0.6) {
+ return `__'__"`;
+ }
+ const skm = 3600 / kmh;
+ const min = Math.floor(skm / 60);
+ const sec = Math.floor(skm % 60);
+ return ('0' + min).substr(-2) + `'` + ('0' + sec).substr(-2) + `"`;
+}
+
+function drawBackground() {
+ g.setColor(running ? 0x00E0 : 0x0000);
+ g.fillRect(0, 30, 240, 240);
+
+ g.setColor(0xFFFF);
+ g.setFontAlign(0, -1, 0);
+ g.setFont('6x8', 2);
+
+ g.drawString('DISTANCE', 120, 50);
+ g.drawString('TIME', 60, 100);
+ g.drawString('PACE', 180, 100);
+ g.drawString('STEPS', 60, 150);
+ g.drawString('STP/m', 180, 150);
+ g.drawString('SPEED', 40, 200);
+ g.drawString('HEART', 120, 200);
+ g.drawString('CADENCE', 200, 200);
+}
+
+function draw() {
+ const totSpeed = totTime ? 3.6 * totDist / totTime : 0;
+ const totCadence = totTime ? Math.round(60 * totSteps / totTime) : 0;
+
+ g.setColor(running ? 0x00E0 : 0x0000);
+ g.fillRect(0, 30, 240, 50);
+ g.fillRect(0, 70, 240, 100);
+ g.fillRect(0, 120, 240, 150);
+ g.fillRect(0, 170, 240, 200);
+ g.fillRect(0, 220, 240, 240);
+
+ g.setFont('6x8', 2);
+
+ g.setFontAlign(-1, -1, 0);
+ g.setColor(gpsReady ? 0x07E0 : 0xF800);
+ g.drawString(' GPS', 6, 30);
+
+ g.setFontAlign(1, -1, 0);
+ g.setColor(0xFFFF);
+ g.drawString(formatClock(new Date()), 234, 30);
+
+ g.setFontAlign(0, -1, 0);
+ g.setFontVector(20);
+ g.drawString(formatDistance(totDist), 120, 70);
+ g.drawString(formatTime(totTime), 60, 120);
+ g.drawString(formatSpeed(totSpeed), 180, 120);
+ g.drawString(totSteps, 60, 170);
+ g.drawString(totCadence, 180, 170);
+
+ g.setFont('6x8', 2);
+ g.drawString(formatSpeed(speed), 40, 220);
+
+ g.setColor(hrmReady ? 0x07E0 : 0xF800);
+ g.drawString(heartRate, 120, 220);
+
+ g.setColor(0xFFFF);
+ g.drawString(cadence, 200, 220);
+}
+
+function handleGps(coords) {
+ const step = gps.getDistance(coords);
+ gpsReady = coords.fix > 0 && gps.isReady();
+ speed = isFinite(gps.speed) ? gps.speed : 0;
+ if (running) {
+ totDist += step.d;
+ totTime += step.t;
+ }
+}
+
+function handleHrm(hrm) {
+ hrmReady = hrm.confidence > 50;
+ heartRate = hrm.bpm;
+}
+
+function handleStep() {
+ cadence = step.getCadence();
+ if (running) {
+ totSteps += 1;
+ }
+}
+
+function start() {
+ running = true;
+ drawBackground();
+ draw();
+}
+
+function stop() {
+ if (!running) {
+ totDist = 0;
+ totTime = 0;
+ totSteps = 0;
+ }
+ running = false;
+ drawBackground();
+ draw();
+}
+
+Bangle.on('GPS', handleGps);
+Bangle.on('HRM', handleHrm);
+Bangle.on('step', handleStep);
+
+Bangle.setGPSPower(1);
+Bangle.setHRMPower(1);
+
+g.clear();
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+drawBackground();
+draw();
+
+setInterval(draw, 500);
+
+setWatch(start, BTN1, { repeat: true });
+setWatch(stop, BTN3, { repeat: true });
diff --git a/apps/banglerun/banglerun.png b/apps/banglerun/banglerun.png
new file mode 100644
index 000000000..bf2cd8af3
Binary files /dev/null and b/apps/banglerun/banglerun.png differ
diff --git a/apps/barclock/ChangeLog b/apps/barclock/ChangeLog
new file mode 100644
index 000000000..616ee66e9
--- /dev/null
+++ b/apps/barclock/ChangeLog
@@ -0,0 +1,5 @@
+0.01: Created Bar Clock
+0.02: Apply locale, 12-hour setting
+0.03: Fix dates drawing over each other at midnight
+0.04: Small bugfix
+0.05: Clock does not start if app Languages is not installed
\ No newline at end of file
diff --git a/apps/barclock/clock-bar-icon.js b/apps/barclock/clock-bar-icon.js
new file mode 100644
index 000000000..29bf0f481
--- /dev/null
+++ b/apps/barclock/clock-bar-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwgJC/AD8Mgfwh/AhgFFngHBOIM8AovMDIXA5gFFDoUAmYjDAocMSoMz/4FF//P/g1CAopTLDAIABwAFGAH4AfA"))
diff --git a/apps/barclock/clock-bar.js b/apps/barclock/clock-bar.js
new file mode 100644
index 000000000..0f2609298
--- /dev/null
+++ b/apps/barclock/clock-bar.js
@@ -0,0 +1,171 @@
+/* jshint esversion: 6 */
+/**
+ * A simple digital clock showing seconds as a bar
+ **/
+{
+ // Check settings for what type our clock should be
+ const is12Hour = (require('Storage').readJSON('setting.json', 1) || {})['12hour']
+ let locale = require('locale')
+ { // add some more info to locale
+ let date = new Date()
+ date.setFullYear(1111)
+ date.setMonth(1, 3) // februari: months are zero-indexed
+ const localized = locale.date(date, true)
+ locale.dayFirst = /3.*2/.test(localized)
+
+ locale.hasMeridian = false
+ if(typeof locale.meridian === 'function') { // function does not exists if languages app is not installed
+ locale.hasMeridian = (locale.meridian(date) !== '')
+ }
+
+ }
+ const screen = {
+ width: g.getWidth(),
+ height: g.getWidth(),
+ middle: g.getWidth() / 2,
+ center: g.getHeight() / 2,
+ }
+
+ // hardcoded "settings"
+ const settings = {
+ time: {
+ color: -1,
+ font: '6x8',
+ size: (is12Hour && locale.hasMeridian) ? 6 : 8,
+ middle: screen.middle,
+ center: screen.center,
+ ampm: {
+ color: -1,
+ font: '6x8',
+ size: 2,
+ },
+ },
+ date: {
+ color: -1,
+ font: 'Vector',
+ size: 20,
+ middle: screen.height - 20, // at bottom of screen
+ center: screen.center,
+ },
+ bar: {
+ color: -1,
+ top: 155, // just below time
+ thickness: 6, // matches 24h time "pixel" size
+ },
+ }
+
+ const SECONDS_PER_MINUTE = 60
+
+ const timeText = function (date) {
+ if (!is12Hour) {
+ return locale.time(date, true)
+ }
+ const date12 = new Date(date.getTime())
+ const hours = date12.getHours()
+ if (hours === 0) {
+ date12.setHours(12)
+ } else if (hours > 12) {
+ date12.setHours(hours - 12)
+ }
+ return locale.time(date12, true)
+ }
+ const ampmText = function (date) {
+ return is12Hour ? locale.meridian(date) : ''
+ }
+
+ const dateText = function (date) {
+ const dayName = locale.dow(date, true),
+ month = locale.month(date, true),
+ day = date.getDate()
+ const dayMonth = locale.dayFirst ? `${day} ${month}` : `${month} ${day}`
+ return `${dayName} ${dayMonth}`
+ }
+
+ const drawDateTime = function (date) {
+ const t = settings.time
+ g.setColor(t.color)
+ g.setFont(t.font, t.size)
+ g.setFontAlign(0, 0) // centered
+ g.drawString(timeText(date), t.center, t.middle, true)
+ if (is12Hour && locale.hasMeridian) {
+ const a = settings.time.ampm
+ g.setColor(a.color)
+ g.setFont(a.font, a.size)
+ g.setFontAlign(1, -1) // right top
+ // at right edge of screen, aligned with time bottom
+ const left = screen.width - a.size * 2,
+ top = t.middle + t.size - a.size
+ g.drawString(ampmText(date), left, top, true)
+ }
+
+ const d = settings.date
+ g.setColor(d.color)
+ g.setFont(d.font, d.size)
+ g.setFontAlign(0, 0) // centered
+ g.drawString(dateText(date), d.center, d.middle, true)
+ }
+
+ const drawBar = function (date) {
+ const b = settings.bar
+ const seconds = date.getSeconds()
+ if (seconds === 0) {
+ // zero-size rect stills draws one line of pixels, we don't want that
+ return
+ }
+ const fraction = seconds / SECONDS_PER_MINUTE,
+ width = fraction * screen.width
+ g.setColor(b.color)
+ g.fillRect(0, b.top, width, b.top + b.thickness)
+ }
+
+ const clearScreen = function () {
+ g.setColor(0)
+ const timeTop = settings.time.middle - (settings.time.size * 4)
+ g.fillRect(0, timeTop, screen.width, screen.height)
+ }
+
+ let lastSeconds
+ const tick = function () {
+ g.reset()
+ const date = new Date()
+ const seconds = date.getSeconds()
+ if (lastSeconds > seconds) {
+ // new minute
+ clearScreen()
+ drawDateTime(date)
+ }
+ // the bar only gets larger, so drawing on top of the previous one is fine
+ drawBar(date)
+
+ lastSeconds = seconds
+ }
+
+ let iTick
+ const start = function () {
+ lastSeconds = 99 // force redraw
+ tick()
+ iTick = setInterval(tick, 1000)
+ }
+ const stop = function () {
+ if (iTick) {
+ clearInterval(iTick)
+ iTick = undefined
+ }
+ }
+
+ // clean app screen
+ g.clear()
+ Bangle.loadWidgets()
+ Bangle.drawWidgets()
+ // Show launcher when middle button pressed
+ setWatch(Bangle.showLauncher, BTN2, {repeat: false, edge: 'falling'})
+
+ Bangle.on('lcdPower', function (on) {
+ if (on) {
+ start()
+ } else {
+ stop()
+ }
+ })
+ start()
+}
diff --git a/apps/barclock/clock-bar.png b/apps/barclock/clock-bar.png
new file mode 100644
index 000000000..a580cae69
Binary files /dev/null and b/apps/barclock/clock-bar.png differ
diff --git a/apps/batchart/ChangeLog b/apps/batchart/ChangeLog
new file mode 100644
index 000000000..31c386684
--- /dev/null
+++ b/apps/batchart/ChangeLog
@@ -0,0 +1,10 @@
+0.01: New app and widget
+0.02: Widget stores data to file (1 dataset/10min)
+0.03: Rotate log files once a week.
+0.04: chart in the app is now active.
+0.05: Display temperature and LCD state in chart
+0.06: Fixes widget events and charting of component states
+0.07: Improve logging and charting of component states and add widget icon
+0.08: Fix for Home button in the app and README added.
+0.09: Fix failing dismissal of Gadgetbridge notifications, record (coarse) bluetooth state
+0.10: Remove widget icon and improve listener and setInterval handling for widget (might help with https://github.com/espruino/BangleApps/issues/381)
\ No newline at end of file
diff --git a/apps/batchart/README.md b/apps/batchart/README.md
new file mode 100644
index 000000000..0ce2c646d
--- /dev/null
+++ b/apps/batchart/README.md
@@ -0,0 +1,67 @@
+# Summary
+
+Battery Chart contains a widget that records the battery usage as well as information that might influence this usage.
+
+The app that comes with provides a graph that accumulates this information in a single screen.
+
+## How the widget works
+
+The widget records data in a fixed interval of ten minutes.
+
+When this timespan has passed, it saves the following information to a file called `bclogx` where `x` is
+
+the current day retrieved by `new Date().getDay()`:
+
+- Battery percentage
+- Temperature (of the die)
+- LCD state
+- Compass state
+- HRM state
+- GPS state
+
+After seven days the logging rolls over and the previous data is overwritten.
+
+To properly handle the roll-over, the day of the previous logging operation is stored in `bcprvday`.
+
+The value is changed with the first recording operation of the new day.
+
+## How the App works
+
+### Events
+
+The app charts the last 144 (6/h * 24h) datapoints that have been recorded.
+
+If for the current day the 144 events have not been reached the list is padded with
+
+events from the previous `bclog` file(s).
+
+### Graph
+
+The graph then contains the battery percentage (left y-axis) and the temperature (right y-axis).
+
+In case the recorded temperature is outside the limits of the graph, the value is set to a minimum of 19 or a maximum of 41 and thus should be clearly visible outside of the graph's boundaries for the y-axis.
+
+The states of the various SoC devices are depicted below the graph. If at the time of recording the device was enabled a marker in the respective color is set, if not the pixels for this point in time stay black.
+
+If a device was not enabled during the 144 selected events, the name is not displayed.
+
+## File schema
+
+You can download the `bclog` files for your own analysis. They are `CSV` files without header rows and contain
+
+```
+timestamp,batteryPercentage,temperatureInDegreeC,deviceStates
+```
+
+with the `deviceStates` resembling a flag set consisting of
+
+```
+const switchableConsumers = {
+ none: 0,
+ lcd: 1,
+ compass: 2,
+ bluetooth: 4,
+ gps: 8,
+ hrm: 16
+};
+```
diff --git a/apps/batchart/app-icon.js b/apps/batchart/app-icon.js
new file mode 100644
index 000000000..b41629e01
--- /dev/null
+++ b/apps/batchart/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+AH4A/AH4AS64AIF/4pZABYuuGDIv/F/4v/F9+Gw0rAQIASF7YxTF7cxwAvtrdVF9qQTF/4vMYCQvcYCQvcSCQvdqpgQF7oEBYJ4veAoNbF9uGmMrrgvsw2AGILFKF8IACrYxJF8gxDSowvmBwWAF9oPGF9NbmIvtCAovqMAgvqCIgvrrdVF9oSDF9iPuF7crACxf/F++wFqmG2AvXGCouZAH4A/AGY"))
diff --git a/apps/batchart/app.js b/apps/batchart/app.js
new file mode 100644
index 000000000..472fb3a8a
--- /dev/null
+++ b/apps/batchart/app.js
@@ -0,0 +1,246 @@
+const GraphXZero = 40;
+const GraphYZero = 180;
+const GraphY100 = 80;
+
+const GraphMarkerOffset = 5;
+const MaxValueCount = 144;
+const GraphXMax = GraphXZero + MaxValueCount;
+
+const GraphLcdY = GraphYZero + 10;
+const GraphCompassY = GraphYZero + 16;
+const GraphBluetoothY = GraphYZero + 22;
+const GraphGpsY = GraphYZero + 28;
+const GraphHrmY = GraphYZero + 34;
+
+const Storage = require("Storage");
+
+function renderCoordinateSystem() {
+ g.setFont("6x8", 1);
+
+ // Left Y axis (Battery)
+ g.setColor(1, 1, 0);
+ g.drawLine(GraphXZero, GraphYZero + GraphMarkerOffset, GraphXZero, GraphY100);
+ g.drawString("%", 39, GraphY100 - 10);
+
+ g.setFontAlign(1, -1, 0);
+ g.drawString("100", 30, GraphY100 - GraphMarkerOffset);
+ g.drawLine(GraphXZero - GraphMarkerOffset, GraphY100, GraphXZero, GraphY100);
+
+ g.drawString("50", 30, GraphYZero - 50 - GraphMarkerOffset);
+ g.drawLine(GraphXZero - GraphMarkerOffset, 130, GraphXZero, 130);
+
+ g.drawString("0", 30, GraphYZero - GraphMarkerOffset);
+
+ g.setColor(1,1,1);
+ g.setFontAlign(1, -1, 0);
+ g.drawLine(GraphXZero - GraphMarkerOffset, GraphYZero, GraphXMax + GraphMarkerOffset, GraphYZero);
+
+ // Right Y axis (Temperature)
+ g.setColor(0.4, 0.4, 1);
+ g.drawLine(GraphXMax, GraphYZero + GraphMarkerOffset, GraphXMax, GraphY100);
+ g.drawString("°C", GraphXMax + GraphMarkerOffset, GraphY100 - 10);
+ g.setFontAlign(-1, -1, 0);
+ g.drawString("20", GraphXMax + 2 * GraphMarkerOffset, GraphYZero - GraphMarkerOffset);
+
+ g.drawLine(GraphXMax + GraphMarkerOffset, 130, GraphXMax, 130);
+ g.drawString("30", GraphXMax + 2 * GraphMarkerOffset, GraphYZero - 50 - GraphMarkerOffset);
+
+ g.drawLine(GraphXMax + GraphMarkerOffset, 80, GraphXMax, 80);
+ g.drawString("40", GraphXMax + 2 * GraphMarkerOffset, GraphY100 - GraphMarkerOffset);
+
+ g.setColor(1,1,1);
+}
+
+function decrementDay(dayToDecrement) {
+ return dayToDecrement === 0 ? 6 : dayToDecrement-1;
+}
+
+function loadData() {
+ const startingDay = new Date().getDay();
+
+ // Load data for the current day
+ let logFileName = "bclog" + startingDay;
+
+ let dataLines = loadLinesFromFile(MaxValueCount, logFileName);
+
+ // Top up to MaxValueCount from previous days as required
+ let previousDay = decrementDay(startingDay);
+ while (dataLines.length < MaxValueCount && previousDay !== startingDay) {
+ let topUpLogFileName = "bclog" + previousDay;
+ let remainingLines = MaxValueCount - dataLines.length;
+ let topUpLines = loadLinesFromFile(remainingLines, topUpLogFileName);
+
+ if(topUpLines) {
+ dataLines = topUpLines.concat(dataLines);
+ }
+
+ previousDay = decrementDay(previousDay);
+ }
+
+ return dataLines;
+}
+
+function loadLinesFromFile(requestedLineCount, fileName) {
+ let allLines = [];
+ let returnLines = [];
+
+ var readFile = Storage.open(fileName, "r");
+
+ while ((nextLine = readFile.readLine())) {
+ if(nextLine) {
+ allLines.push(nextLine);
+ }
+ }
+
+ readFile = null;
+
+ if (allLines.length <= 0) return;
+
+ let linesToReadCount = Math.min(requestedLineCount, allLines.length);
+ let startingLineIndex = Math.max(0, allLines.length - requestedLineCount - 1);
+
+ for (let i = startingLineIndex; i < linesToReadCount + startingLineIndex; i++) {
+ if(allLines[i]) {
+ returnLines.push(allLines[i]);
+ }
+ }
+
+ allLines = null;
+
+ return returnLines;
+}
+
+function renderData(dataArray) {
+ const switchableConsumers = {
+ none: 0,
+ lcd: 1,
+ compass: 2,
+ bluetooth: 4,
+ gps: 8,
+ hrm: 16
+ };
+
+ //const timestampIndex = 0;
+ const batteryIndex = 1;
+ const temperatureIndex = 2;
+ const switchabelsIndex = 3;
+
+ const minTemperature = 20;
+ const maxTemparature = 40;
+
+ const belowMinIndicatorValue = minTemperature - 1;
+ const aboveMaxIndicatorValue = maxTemparature + 1;
+
+ var allConsumers = switchableConsumers.none | switchableConsumers.lcd | switchableConsumers.compass | switchableConsumers.bluetooth | switchableConsumers.gps | switchableConsumers.hrm;
+
+ for (let i = 0; i < dataArray.length; i++) {
+ const element = dataArray[i];
+
+ var dataInfo = element.split(",");
+
+ // Battery percentage
+ g.setColor(1, 1, 0);
+ g.setPixel(GraphXZero + i, GraphYZero - parseInt(dataInfo[batteryIndex]));
+
+ // Temperature
+ g.setColor(0.4, 0.4, 1);
+
+ let datapointTemp = parseFloat(dataInfo[temperatureIndex]);
+
+ if (datapointTemp < minTemperature) {
+ datapointTemp = belowMinIndicatorValue;
+ }
+ if (datapointTemp > maxTemparature) {
+ datapointTemp = aboveMaxIndicatorValue;
+ }
+
+ // Scale down the range of 20 - 40°C to a 100px y-axis, where 1px = .25°
+ let scaledTemp = Math.floor(((datapointTemp * 100) - 2000) / 20) + ((((datapointTemp * 100) - 2000) % 100) / 25);
+
+ g.setPixel(GraphXZero + i, GraphYZero - scaledTemp);
+
+ // LCD state
+ if (parseInt(dataInfo[switchabelsIndex]) & switchableConsumers.lcd) {
+ g.setColor(1, 1, 1);
+ g.setFontAlign(1, -1, 0);
+ g.drawString("LCD", GraphXZero - GraphMarkerOffset, GraphLcdY - 2, true);
+ g.drawLine(GraphXZero + i, GraphLcdY, GraphXZero + i, GraphLcdY + 1);
+ }
+
+ // Compass state
+ if (parseInt(dataInfo[switchabelsIndex]) & switchableConsumers.compass) {
+ g.setColor(0, 1, 0);
+ g.setFontAlign(-1, -1, 0);
+ g.drawString("Compass", GraphXMax + GraphMarkerOffset, GraphCompassY - 2, true);
+ g.drawLine(GraphXZero + i, GraphCompassY, GraphXZero + i, GraphCompassY + 1);
+ }
+
+ // Bluetooth state
+ if (parseInt(dataInfo[switchabelsIndex]) & switchableConsumers.bluetooth) {
+ g.setColor(0, 0, 1);
+ g.setFontAlign(1, -1, 0);
+ g.drawString("BLE", GraphXZero - GraphMarkerOffset, GraphBluetoothY - 2, true);
+ g.drawLine(GraphXZero + i, GraphBluetoothY, GraphXZero + i, GraphBluetoothY + 1);
+ }
+
+ // Gps state
+ if (parseInt(dataInfo[switchabelsIndex]) & switchableConsumers.gps) {
+ g.setColor(0.8, 0.5, 0.24);
+ g.setFontAlign(-1, -1, 0);
+ g.drawString("GPS", GraphXMax + GraphMarkerOffset, GraphGpsY - 2, true);
+ g.drawLine(GraphXZero + i, GraphGpsY, GraphXZero + i, GraphGpsY + 1);
+ }
+
+ // Hrm state
+ if (parseInt(dataInfo[switchabelsIndex]) & switchableConsumers.hrm) {
+ g.setColor(1, 0, 0);
+ g.setFontAlign(1, -1, 0);
+ g.drawString("HRM", GraphXZero - GraphMarkerOffset, GraphHrmY - 2, true);
+ g.drawLine(GraphXZero + i, GraphHrmY, GraphXZero + i, GraphHrmY + 1);
+ }
+ }
+
+ dataArray = null;
+}
+
+function renderHomeIcon() {
+ //Home for Btn2
+ g.setColor(1, 1, 1);
+ g.drawLine(220, 118, 227, 110);
+ g.drawLine(227, 110, 234, 118);
+
+ g.drawPoly([222,117,222,125,232,125,232,117], false);
+ g.drawRect(226,120,229,125);
+}
+
+function renderBatteryChart() {
+ renderCoordinateSystem();
+ let data = loadData();
+ renderData(data);
+ data = null;
+}
+
+// Show launcher when middle button pressed
+function switchOffApp(){
+ Bangle.showLauncher();
+}
+
+// special function to handle display switch on
+Bangle.on('lcdPower', (on) => {
+ if (on) {
+ g.clear();
+ Bangle.loadWidgets();
+ Bangle.drawWidgets();
+ renderBatteryChart();
+ }
+});
+
+setWatch(switchOffApp, BTN2, {edge:"falling", debounce:50, repeat:true});
+
+g.clear();
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+
+renderHomeIcon();
+
+renderBatteryChart();
diff --git a/apps/batchart/app.png b/apps/batchart/app.png
new file mode 100644
index 000000000..9a60d1004
Binary files /dev/null and b/apps/batchart/app.png differ
diff --git a/apps/batchart/widget.js b/apps/batchart/widget.js
new file mode 100644
index 000000000..d6e00b283
--- /dev/null
+++ b/apps/batchart/widget.js
@@ -0,0 +1,124 @@
+(() => {
+ let recordingInterval = null;
+ const Storage = require("Storage");
+
+ const switchableConsumers = {
+ none: 0,
+ lcd: 1,
+ compass: 2,
+ bluetooth: 4,
+ gps: 8,
+ hrm: 16
+ };
+
+ var batChartFile; // file for battery percentage recording
+ const recordingInterval10Min = 60 * 10 * 1000;
+ const recordingInterval1Min = 60 * 1000; //For testing
+ const recordingInterval10S = 10 * 1000; //For testing
+
+ var compassEventReceived = false;
+ var gpsEventReceived = false;
+ var hrmEventReceived = false;
+
+ function draw() {
+ // void
+ }
+
+ function batteryChartOnMag() {
+ compassEventReceived = true;
+ // Stop handling events when no longer necessarry
+ Bangle.removeListener("mag", batteryChartOnMag);
+ }
+
+ function batterChartOnGps() {
+ gpsEventReceived = true;
+ Bangle.removeListener("GPS", batterChartOnGps);
+ }
+
+ function batteryChartOnHrm() {
+ hrmEventReceived = true;
+ Bangle.removeListener("HRM", batteryChartOnHrm);
+ }
+
+ function getEnabledConsumersValue() {
+ // Wait for an event from each of the devices to see if they are switched on
+ var enabledConsumers = switchableConsumers.none;
+
+ Bangle.on('mag', batteryChartOnMag);
+ Bangle.on('GPS', batterChartOnGps);
+ Bangle.on('HRM', batteryChartOnHrm);
+
+ // Wait two seconds, that should be enough for each of the events to get raised once
+ setTimeout(() => {
+ Bangle.removeListener('mag', batteryChartOnMag);
+ Bangle.removeListener('GPS', batterChartOnGps);
+ Bangle.removeListener('HRM', batteryChartOnHrm);
+ }, 2000);
+
+ if (Bangle.isLCDOn())
+ enabledConsumers = enabledConsumers | switchableConsumers.lcd;
+ if (compassEventReceived)
+ enabledConsumers = enabledConsumers | switchableConsumers.compass;
+ if (gpsEventReceived)
+ enabledConsumers = enabledConsumers | switchableConsumers.gps;
+ if (hrmEventReceived)
+ enabledConsumers = enabledConsumers | switchableConsumers.hrm;
+
+ // Very coarse first approach to check if the BLE device is on.
+ if (NRF.getSecurityStatus().connected)
+ enabledConsumers = enabledConsumers | switchableConsumers.bluetooth;
+
+ // Reset the event registration vars
+ compassEventReceived = false;
+ gpsEventReceived = false;
+ hrmEventReceived = false;
+
+ return enabledConsumers.toString();
+ }
+
+ function logBatteryData() {
+ const previousWriteLogName = "bcprvday";
+ const previousWriteDay = parseInt(Storage.open(previousWriteLogName, "r").readLine());
+ const currentWriteDay = new Date().getDay();
+
+ const logFileName = "bclog" + currentWriteDay;
+
+ // Change log target on day change
+ if (!isNaN(previousWriteDay) && previousWriteDay != currentWriteDay) {
+ //Remove a log file containing data from a week ago
+ Storage.open(logFileName, "r").erase();
+ Storage.open(previousWriteLogName, "w").write(parseInt(currentWriteDay));
+ }
+
+ var bcLogFileA = Storage.open(logFileName, "a");
+ if (bcLogFileA) {
+ let logTime = getTime().toFixed(0);
+ let logPercent = E.getBattery();
+ let logTemperature = E.getTemperature();
+ let logConsumers = getEnabledConsumersValue();
+
+ let logString = [logTime, logPercent, logTemperature, logConsumers].join(",");
+
+ bcLogFileA.write(logString + "\n");
+ }
+ }
+
+ function reload() {
+ console.log("Reloading BatteryChart widget");
+ WIDGETS["batchart"].width = 0;
+
+ if (recordingInterval) {
+ clearInterval(recordingInterval);
+ recordingInterval = null;
+ }
+
+ recordingInterval = setInterval(logBatteryData, recordingInterval10Min);
+ }
+
+ // add the widget
+ WIDGETS["batchart"] = {
+ area: "tl", width: 0, draw: draw, reload: reload
+ };
+
+ reload();
+})();
\ No newline at end of file
diff --git a/apps/bclock/clock-binary.js b/apps/bclock/clock-binary.js
index 98191f364..833aa00f6 100644
--- a/apps/bclock/clock-binary.js
+++ b/apps/bclock/clock-binary.js
@@ -6,98 +6,98 @@ const colpos = canvasWidth / numberOfColumns - 10;
const binSize = (canvasWidth / numberOfColumns) / 3;
const findBinary = target => {
- return [
- [0, 0, 0, 0], // 0
- [1, 0, 0, 0], // 1
- [0, 1, 0, 0], // 2
- [1, 1, 0, 0], // 3
- [0, 0, 1, 0], // 4
- [1, 0, 1, 0], // 5
- [0, 1, 1, 0], // 6
- [1, 1, 1, 0], // 7
- [0, 0, 0, 1], // 8
- [1, 0, 0, 1], // 9
- ][target];
+ return [
+ [0, 0, 0, 0], // 0
+ [1, 0, 0, 0], // 1
+ [0, 1, 0, 0], // 2
+ [1, 1, 0, 0], // 3
+ [0, 0, 1, 0], // 4
+ [1, 0, 1, 0], // 5
+ [0, 1, 1, 0], // 6
+ [1, 1, 1, 0], // 7
+ [0, 0, 0, 1], // 8
+ [1, 0, 0, 1], // 9
+ ][target];
};
const getCurrentTime = () => {
- const flattenArray = (array = []) => [].concat.apply([], array);
- const format = number => {
- const numberStr = number.toString();
- return numberStr.length === 1 ? ["0", numberStr] : numberStr.split("");
- };
- const now = new Date();
- return flattenArray([now.getHours(), now.getMinutes(), now.getSeconds()].map(format));
+ const flattenArray = (array = []) => [].concat.apply([], array);
+ const format = number => {
+ const numberStr = number.toString();
+ return numberStr.length === 1 ? ["0", numberStr] : numberStr.split("");
+ };
+ const now = new Date();
+ return flattenArray([now.getHours(), now.getMinutes(), now.getSeconds()].map(format));
};
let prevFrame = [];
const drawColumn = (position = 0, column = [0, 0, 0, 0]) => {
- const maxDotsPerColumn = [2, 4, 3, 4, 3, 4];
+ const maxDotsPerColumn = [2, 4, 3, 4, 3, 4];
- const columnPos = position * colpos;
- let pos = colpos / 2 + 45;
- const frame = column.reverse();
- const drawDot = fn => g[fn]((columnPos + colpos / 2), pos, binSize);
+ const columnPos = position * colpos;
+ let pos = colpos / 2 + 45;
+ const frame = column.reverse();
+ const drawDot = fn => g[fn]((columnPos + colpos / 2), pos, binSize);
- for (let i = 0; i < frame.length; i += 1) {
- if (i + maxDotsPerColumn[position] >= 4 || drawFullGrid) {
- if (prevFrame && prevFrame[position] && prevFrame[position][i]) {
- if (frame[i] !== prevFrame[position][i]) {
- // subsequent draw
- g.clearRect((columnPos + colpos / 2) - 15, pos - 15, (columnPos + colpos / 2) + 20, pos + 20);
- if (frame[i]) {
- drawDot('fillCircle');
- } else {
- drawDot('drawCircle');
- }
- }
- } else {
- // First draw
- if (frame[i]) {
- drawDot('fillCircle');
- } else {
- drawDot('drawCircle');
- }
- }
+ for (let i = 0; i < frame.length; i += 1) {
+ if (i + maxDotsPerColumn[position] >= 4 || drawFullGrid) {
+ if (prevFrame && prevFrame[position] && prevFrame[position][i]) {
+ if (frame[i] !== prevFrame[position][i]) {
+ // subsequent draw
+ g.clearRect((columnPos + colpos / 2) - 15, pos - 15, (columnPos + colpos / 2) + 20, pos + 20);
+ if (frame[i]) {
+ drawDot('fillCircle');
+ } else {
+ drawDot('drawCircle');
+ }
}
- pos += colpos;
+ } else {
+ // First draw
+ if (frame[i]) {
+ drawDot('fillCircle');
+ } else {
+ drawDot('drawCircle');
+ }
+ }
}
+ pos += colpos;
+ }
};
const drawClock = () => {
- const data = getCurrentTime().map(findBinary);
- for (let i = 0; i < data.length; i += 1) {
- drawColumn(i, data[i]);
- }
- prevFrame = data;
+ const data = getCurrentTime().map(findBinary);
+ for (let i = 0; i < data.length; i += 1) {
+ drawColumn(i, data[i]);
+ }
+ prevFrame = data;
};
// Themes
const drawTheme = (idx) => () => {
- idx += 1;
- const themes = [
- [[0, 0, 0], [1, 1, 1]],
- [[1, 1, 1], [0, 0, 0]],
- [[0, 0, 0], [1, 0, 0]],
- [[0, 0, 0], [0, 1, 0]],
- [[0, 0, 0], [0, 0, 1]],
- ];
- if (idx >= themes.length) idx = 0;
- const color = themes[idx];
- g.setBgColor.apply(g, color[0]);
- g.setColor.apply(g, color[1]);
- g.clear();
+ idx += 1;
+ const themes = [
+ [[0, 0, 0], [1, 1, 1]],
+ [[1, 1, 1], [0, 0, 0]],
+ [[0, 0, 0], [1, 0, 0]],
+ [[0, 0, 0], [0, 1, 0]],
+ [[0, 0, 0], [0, 0, 1]],
+ ];
+ if (idx >= themes.length) idx = 0;
+ const color = themes[idx];
+ g.setBgColor.apply(g, color[0]);
+ g.setColor.apply(g, color[1]);
+ g.clear();
};
const nextTheme = drawTheme(0);
setWatch(() => {
- prevFrame = [];
- Bangle.beep();
- nextTheme();
+ prevFrame = [];
+ Bangle.beep();
+ nextTheme();
}, BTN1, { repeat: true });
Bangle.on('lcdPower', on => {
- if (on) drawClock();
+ if (on) drawClock();
});
g.clear();
diff --git a/apps/beebclock/ChangeLog b/apps/beebclock/ChangeLog
new file mode 100644
index 000000000..14dd12220
--- /dev/null
+++ b/apps/beebclock/ChangeLog
@@ -0,0 +1,2 @@
+0.01: Initial commit. Not very efficient, and widgets not working for some reason.
+0.02: Fixes; widget support
diff --git a/apps/beebclock/beebclock-icon.js b/apps/beebclock/beebclock-icon.js
new file mode 100644
index 000000000..b4d173068
--- /dev/null
+++ b/apps/beebclock/beebclock-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwkHA4dQAgcFgPyl8QDxgNE0EAggXGAgcFDQ0TBgQXBkcgBQURCw8GBYUj+AEBI430AgI7BBAVgCIU/if0DoMC+UfiwLBgUyEQRyGgEzmPzCIQvCBwMPj4rCAwJECAAUD+MvkEQgMhkRABgEvkaKIJAXzj49BBYMBBIOm+IIBgMVPQxiBn8xkAIDAYMBj6TBSIYyFhUPBoJRCF4RlBAoJRBBggSBIIgAI0qhCFgUB/4WFTIYDDFwJMCCAUSifzDoYsGBQJIBfoM0kIEBn81168CfAwACKwMS+UT+ovC/8gmRRCGQqQBRgUjocyB4YYBI4QrEDwRdCfAQ4EsD5DAA5dCDYbMDCoTPCBAsQaYprHRosR0ICBB4ZtDEYJZHM4X/kMKFAwSGAocBn8hkX/NBMFEAJXDAQMD+IcBkcwBIZ1EHgP/BgIzD17QBDYPwI4kCn8/mcjkUyCAQlCVocB+IqDC4IVBmYWBkVAVAkvaIboDqAGBCwMyIwM/I4IVBoYHBI4qzDI4egLYURiaiCO4UAl4bCMIJLEEAUj//zlVQgynBmNC/5LBcQsA0BXBCoNCeQkDKQX1X5Ef+clTQIkCT4URiJYBXwYlEirHGOAkAJYIvHEAUTNoadBegn/EYUCB4IjDiRtCCoWgEwj8BCQMCCAQkBAoMhkZJDC4kFh/yNAMyifzE4U/kMf+RRGM4beCp/xibLBqERj6EDboQjCT4beDmMhQwRNEQIoACiISCIYILCgKNCXgQXFGYoTBC4a/DgcmBoRLCEAMDCQQPBbwxVBmLDDGwUCj/wHY4ADn8TBwbYD+3xCY8AhQlB+M/JwS3BGIXzj5RENAS1Cj86YQUB+U/KIdvmB6FIw8Qg3yl5KCgcyMAgZFiNPOwYXDAoURL45LCiSLD+YXBAoTXDAAbTIL4oJCCIRdEDA1gI4ooFgAA=="))
diff --git a/apps/beebclock/beebclock.js b/apps/beebclock/beebclock.js
new file mode 100644
index 000000000..6ed4f532e
--- /dev/null
+++ b/apps/beebclock/beebclock.js
@@ -0,0 +1,397 @@
+/* jshint esversion: 6 */
+// Beebclock
+// © 2020, Tom Gidden
+// https://github.com/tomgidden
+
+const storage = require("Storage");
+const filename = 'beebjson';
+
+require('FontTeletext10x18Ascii').add(Graphics);
+
+// Double height text
+Graphics.prototype.drawStringDH = function (txt, px, py, align, gw) {
+ let g2 = Graphics.createArrayBuffer(gw,18,1,{msb:true});
+ g2.setFontTeletext10x18Ascii();
+ let w = g2.stringWidth(txt);
+ let c = (w+3)>>2;
+ g2.drawString(txt);
+ let img = {width:w,height:1,transparent:0,buffer:new ArrayBuffer(c)};
+ let a = new Uint8Array(img.buffer);
+
+ let x;
+ switch (align) {
+ case 'C': x = px + (gw - w)/2; break;
+ case 'R': x = gw - w + px; break;
+ default: x = px;
+ }
+
+ for (var y=0;y<18;y++) {
+ a.set(new Uint8Array(g2.buffer,gw*y/8,c));
+ this.drawImage(img,x,py+y*2);
+ this.drawImage(img,x,py+1+y*2);
+ }
+};
+
+// Fill rectangle rotated around the centre
+Graphics.prototype.fillRotRect = function (sina, cosa, cx, cy, x0, x1, y0, y1) {
+ let fn = Math.ceil;
+ return this.fillPoly([
+ fn(cx - x0*cosa + y0*sina), fn(cy - x0*sina - y0*cosa),
+ fn(cx - x1*cosa + y0*sina), fn(cy - x1*sina - y0*cosa),
+ fn(cx - x1*cosa + y1*sina), fn(cy - x1*sina - y1*cosa),
+ fn(cx - x0*cosa + y1*sina), fn(cy - x0*sina - y1*cosa)
+ ]);
+};
+
+// Draw a line from r1,a to r2,a relative to cx+cy
+Graphics.prototype.drawRotLine = function (sina, cosa, cx, cy, r1, r2) {
+ return this.drawLine(
+ cx + r1*sina, cy - r1*cosa,
+ cx + r2*sina, cy - r2*cosa
+ );
+};
+
+
+(function(g) {
+ // Display modes
+ //
+ // 0: full-screen
+ // 1: with widgets
+ // 2: centred on Bangle (v.1), no widgets or time/date
+ // 3: centred with time above
+ // 4: centred with date above
+ // 5: centred with time and date above
+ let mode;
+
+ // R1, R2: Outer and inner radii of hour marks
+ // RC1, RC2: Outer and inner radii of hub
+ // CX, CY: Centre location, relative to buffer (not screen, necessarily)
+ // HW2, MW2: Half-width of hour and minute hand
+ // HR, MR: Length of hour and minute hand, relative to CX,CY
+ // M: Half-width of gap in hour marks
+ // HSCALE: Half-width of hour mark as function(0 {
+ const fw = R1 * 2;
+ const fh = R1 * 2;
+ const fw2 = R1;
+ const fh2 = R1;
+ let hs = [];
+
+ // Wipe the image and start with white
+ G.clear();
+ G.setColor(1,1,1);
+
+ // Draw the hour marks.
+ for (let h=1; h<=12; h++) {
+ hs[h] = HSCALE(h);
+ G.fillRotRect(ss[h], cs[h], CX, CY, -hs[h], hs[h], R2, R1);
+
+ }
+
+ // Draw the hub
+ G.fillCircle(CX, CY, RC1);
+
+ // Black
+ G.setColor(0,0,0);
+
+ // Clear the centre of the hub
+ G.fillCircle(CX, CY, RC2);
+
+ // Draw the gap in the hour marks
+ for (let h=1; h<=12; h++) {
+ G.fillRotRect(ss[h], cs[h], CX, CY, -M, M, R2-1, R1+1);
+ }
+
+ // Back to white for future draw operations
+ G.setColor(1,1,1);
+
+ // While the buffer remains full-screen, we may trim out the
+ // bottom of the image so we can shift the whole thing down for
+ // widgets.
+ const img = {width:GW,height:GH-TM,buffer:G.buffer};
+ return img;
+ };
+
+ let hours, minutes, seconds, date;
+
+ // Schedule event for calling at the start of the next second
+ const inOneSecond = (cb) => {
+ let now = new Date();
+ clearTimeout();
+ setTimeout(cb, 1000 - now.getMilliseconds());
+ };
+
+ // Schedule event for calling at the start of the next minute
+ const inOneMinute = (cb) => {
+ let now = new Date();
+ clearTimeout();
+ setTimeout(cb, 60000 - (now.getSeconds() * 1000 + now.getMilliseconds()));
+ };
+
+ // Draw a fat hour/minute hand
+ const drawHand = (G, a, w2, r1, r2) =>
+ G.fillRotRect(Math.sin(a), Math.cos(a), CX, CY, -w2, w2, r1, r2);
+
+ // Redraw function
+ const drawAll = (force) => {
+ let now = new Date();
+
+ if (!faceImg) force = true;
+
+ let face_changed = force;
+ let date_changed = false;
+
+ tmp = hours;
+ hours = now.getHours();
+ if (tmp !== hours)
+ face_changed = true;
+
+ tmp = minutes;
+ minutes = now.getMinutes();
+ if (tmp !== minutes)
+ face_changed = true;
+
+ // If the face has been updated and/or needs a redraw,
+ // face_changed is true.
+
+ let time_changed = face_changed;
+
+ // If the screen needs an update, regardless of whether the face
+ // needs a redraw, time_changed is true.
+
+ if (with_seconds) {
+ // If we're going by second, we always need an update.
+ seconds = now.getSeconds();
+ time_changed = true;
+ }
+
+ if (with_digital_date) {
+ // See if the date has changed. If it has, then we need a
+ // full-blown redraw of the screen and the face, plus text.
+ tmp = date;
+ date = now.getDate();
+ if (tmp !== date) {
+ date_changed = true;
+ face_changed = true; // Should have changed anyway with hour/minute rollover
+ }
+ }
+
+ if (face_changed) {
+ // Redraw the face and hands onto the buffer G1.
+ faceImg = drawFace(G1);
+ drawHand(G1, Math.PI*hours/6, HW2, RC1, HR);
+ drawHand(G1, Math.PI*minutes/30, MW2, RC1, MR);
+ }
+
+ // Has the time updated? If so, we'll need to draw something.
+ if (time_changed) {
+
+ // Are we adding text?
+ if (with_digital_date || with_digital_time) {
+
+ // Construct the date/time text to add above the face
+ let d = now.toString();
+ let da = d.toString().split(" ");
+ let txt;
+
+ if (with_digital_time) {
+ txt = da[4].substr(0, 5);
+ if (with_digital_date)
+ G1.drawStringDH(txt+',', 24, 0, 'L', GW);
+ else
+ G1.drawStringDH(txt, 0, 0, 'C', GW);
+ }
+
+ if (with_digital_date) {
+ let txt = [da[0], da[1], da[2]].join(" ");
+ if (with_digital_time)
+ G1.drawStringDH(txt, -24, 0, 'R', GW);
+ else
+ G1.drawStringDH(txt, 0, 0, 'C', GW);
+ }
+ }
+
+ // If the time has updated, we need to _at least_ draw the
+ // image to the screen.
+ g.setColor(1,1,1);
+ g.drawImage({width:GW,
+ height:GH-TM,
+ buffer:G1.buffer}, 0, TM);
+
+ // and possibly add the second hand
+ if (with_seconds) {
+ let a = 2.0 * Math.PI * seconds / 60.0;
+ g.drawRotLine(Math.sin(a), Math.cos(a), CX, CY+TM, RC1, R1);
+ }
+
+ // Clock chime on the hour.
+ if (hours >= 0 && minutes === 0)
+ try {
+ Bangle.buzz();
+ } catch (e) { }
+
+ // And draw widgets if we're in that mode
+ if (with_widgets)
+ Bangle.drawWidgets();
+ }
+
+ // Schedule to repeat this. A `setTimeout(1000)` isn't good
+ // enough, as all the above might've taken some milliseconds and
+ // we don't want to drift.
+ if (with_seconds)
+ inOneSecond(drawAll);
+ else
+ inOneMinute(drawAll);
+ };
+
+ const setButtons = () => {
+ const opts = { repeat: true, edge:'rising', debounce:30};
+
+ // BTN1: enable/disable second hand
+ setWatch(changeSeconds, BTN1, opts);
+
+ // BTN2: return to launcher
+ setWatch(Bangle.showLauncher, BTN2, { repeat:false, edge:'falling' });
+
+ // BTN3: change display mode
+ setWatch(function () { ++mode; setMode(); drawAll(true); }, BTN3, opts);
+ };
+
+ // Load display parameters based on `mode`
+ const setMode = () => {
+ // Normalize mode to 0 <= mode <= 5
+ mode = (6+mode) % 6;
+
+ // [R1, R2, RC1, RC2, HW2, MW3, HR, MR, M, HSCALE] =
+ const scales = [
+ [120, 84, 17, 12.4, 4.6, 2.2, 8, 2, 1, h => (3.0 + Math.ceil(h/1.5)) ],
+ [102, 70, 14.6, 10.7, 3.88, 1.8, 8, 2, 1, h => (2.4 + Math.ceil(h/1.6)) ],
+ ];
+
+ if (mode < 3) {
+ // Face without time/date text. Might have widgets though.
+ with_digital_time = with_digital_date = false;
+ with_widgets = (mode == 1);
+ }
+ else {
+ // Face with time/date text, but no widgets
+ with_digital_time = (mode-2)&1;
+ with_digital_date = (mode-2)&2;
+ with_widgets = false;
+ }
+
+ // Destructure the array to the global display parameters
+ let arr = scales[mode > 0 ? 1 : 0];
+ R1 = arr[0];
+ R2 = arr[1];
+ RC1 = arr[2];
+ RC2 = arr[3];
+ HW2 = arr[4];
+ MW2 = arr[5];
+ HR = R2 - arr[6];
+ MR = R1 - arr[7];
+ M = arr[8];
+ HSCALE = arr[9];
+ TM = with_widgets ? 36 : 0;
+
+ CX = GW/2;
+ CY = R1;
+
+ // If we're in the small-face + text regime, we're going to buffer
+ // the full screen but draw the clock face further down to give
+ // space for the text.
+ //
+ // Compare with modes 0 (full-screen) and 1 (with_widgets==true)
+ // where the face is drawn at the top of the buffer, but drawn
+ // lower down the screen (so CY doesn't move)
+ if (mode > 1) {
+ CY += 36;
+ }
+
+ // We only don't bother redrawing the face from modes 2 to 5, as
+ // they're the same.
+ if (!faceImg || mode<3) {
+ faceImg = undefined;
+ }
+
+ // Store the settings for next time
+ try {
+ storage.writeJSON(filename, [mode,with_seconds]);
+ } catch (e) {
+ console.log(e);
+ }
+
+ // Clear the screen: we need to make sure all parts are cleaned off.
+ g.clear();
+ };
+
+ const changeSeconds = () => {
+ with_seconds = !with_seconds;
+ drawAll(true);
+ };
+
+ Bangle.loadWidgets();
+
+ // Restore mode
+ try {
+ conf = storage.readJSON(filename);
+ mode = conf[0];
+ with_seconds = conf[1];
+ } catch (e) {
+ console.log(e);
+ mode = 1;
+ }
+
+ setButtons();
+ setMode();
+ drawAll();
+
+ Bangle.on('lcdPower', (on) => {
+ if (on) {
+ Bangle.loadWidgets();
+ Bangle.drawWidgets();
+ drawAll();
+ } else {
+ clearTimeout();
+ }
+ });
+
+})(g);
diff --git a/apps/beebclock/beebclock.png b/apps/beebclock/beebclock.png
new file mode 100644
index 000000000..447ec9a41
Binary files /dev/null and b/apps/beebclock/beebclock.png differ
diff --git a/apps/beer/app-icon.js b/apps/beer/app-icon.js
new file mode 100644
index 000000000..c700b3bd2
--- /dev/null
+++ b/apps/beer/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwghC/AB0O/4AG8AXNgYXHmAXl94XH+AXNn4XH/wXW+YX/C6oWHAAIXN7sz9vdAAoXN9sznvuAAXf/vuC53jC4Xd7wXQ93jn3u9vv9vt7wXT/4tBAgIXQ7wvCC4PgC5sO6czIQJfBC6PumaPDC6wwCC50NYAJcBVgIDBCxrAFbgYXP7yoDF6TADL4YXPVAIXCRyAXC7wXW9zwBC6cNC9zABC4gWQC653CR4fQC6x3TF6gXXI4M9d6wAEC9EN73dAAZfQgczAAkwC/4XXAH4"))
diff --git a/apps/beer/beercompass.png b/apps/beer/app.png
similarity index 100%
rename from apps/beer/beercompass.png
rename to apps/beer/app.png
diff --git a/apps/beer/beercompass.html b/apps/beer/custom.html
similarity index 94%
rename from apps/beer/beercompass.html
rename to apps/beer/custom.html
index 434f0f6a9..ab3f80b50 100644
--- a/apps/beer/beercompass.html
+++ b/apps/beer/custom.html
@@ -196,12 +196,10 @@ Bangle.on('mag', function(m) {
Bangle.setCompassPower(1);
Bangle.setGPSPower(1);
g.clear();`;
-var icon = `require("heatshrink").decompress(atob("mEwghC/AB0O/4AG8AXNgYXHmAXl94XH+AXNn4XH/wXW+YX/C6oWHAAIXN7sz9vdAAoXN9sznvuAAXf/vuC53jC4Xd7wXQ93jn3u9vv9vt7wXT/4tBAgIXQ7wvCC4PgC5sO6czIQJfBC6PumaPDC6wwCC50NYAJcBVgIDBCxrAFbgYXP7yoDF6TADL4YXPVAIXCRyAXC7wXW9zwBC6cNC9zABC4gWQC653CR4fQC6x3TF6gXXI4M9d6wAEC9EN73dAAZfQgczAAkwC/4XXAH4"))`;
sendCustomizedApp({
storage:[
- {name:"beer.app.js", content:app},
- {name:"beer.img", content:icon, evaluate:true},
+ {name:"beer.app.js", content:app}
]
});
});
diff --git a/apps/berlinc/ChangeLog b/apps/berlinc/ChangeLog
index 7819dbe2a..a33332bc4 100644
--- a/apps/berlinc/ChangeLog
+++ b/apps/berlinc/ChangeLog
@@ -1 +1,2 @@
0.02: Modified for use with new bootloader and firmware
+0.03: Shrinked size to avoid cut-off edges on the physical device. BTN3: show date. BTN1: show time in decimal.
diff --git a/apps/berlinc/README.md b/apps/berlinc/README.md
new file mode 100644
index 000000000..1f86ad73e
--- /dev/null
+++ b/apps/berlinc/README.md
@@ -0,0 +1,10 @@
+# Berlin Clock Watch Face
+
+This is a clock-face analogous to the [Berlin Clock](https://en.wikipedia.org/wiki/Mengenlehreuhr).
+
+## Usage
+
+* BTN1: toggle displaying the time in decimal figures (24 hour format) in the minutes fields. The first two fields are used for the hour and the last two fields for the minute. This might be a help when you're still familarizig yourself with this new way to express the time.
+* BTN2: start the launcher
+* BTN3: toggle displaying the current date (in ISO 8601 format) below the actual clock-face.
+
diff --git a/apps/berlinc/berlin-clock.js b/apps/berlinc/berlin-clock.js
index 93b584f66..3950147b8 100644
--- a/apps/berlinc/berlin-clock.js
+++ b/apps/berlinc/berlin-clock.js
@@ -1,58 +1,97 @@
-// place your const, vars, functions or classes here
-fields = [ 4 , 4 , 11 , 4 ];
-width = g.getWidth();
-height = g.getHeight();
-rowHeight = height/4;
+// Berlin Clock see https://en.wikipedia.org/wiki/Mengenlehreuhr
+// https://github.com/eska-muc/BangleApps
+const fields = [4, 4, 11, 4];
+const offset = 20;
+const width = g.getWidth() - 2 * offset;
+const height = g.getHeight() - 2 * offset;
+const rowHeight = height / 4;
+
+var show_date = false;
+var show_time = false;
+var yy = 0;
+
rowlights = [];
+time_digit = [];
function drawBerlinClock() {
- var now = new Date();
- rowlights[0] = Math.floor(now.getHours() / 5);
- rowlights[1] = now.getHours() % 5;
- rowlights[2] = Math.floor(now.getMinutes() / 5);
- rowlights[3] = now.getMinutes() % 5;
+ g.clear();
+ var now = new Date();
+
+ // show date below the clock
+ if (show_date) {
+ var yr = now.getFullYear();
+ var month = now.getMonth() + 1;
+ var day = now.getDate();
+ var dateString = `${yr}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`;
+ var strWidth = g.stringWidth(dateString);
+ g.setColor(1, 1, 1);
+ g.setFontAlign(-1,-1);
+ g.drawString(dateString, ( g.getWidth() - strWidth ) / 2, height + offset + 4);
+ }
+
+ rowlights[0] = Math.floor(now.getHours() / 5);
+ rowlights[1] = now.getHours() % 5;
+ rowlights[2] = Math.floor(now.getMinutes() / 5);
+ rowlights[3] = now.getMinutes() % 5;
- g.clear();
+ time_digit[0] = Math.floor(now.getHours() / 10);
+ time_digit[1] = now.getHours() % 10;
+ time_digit[2] = Math.floor(now.getMinutes() / 10);
+ time_digit[3] = now.getMinutes() % 10;
- g.drawRect(0,0,width,height);
- for (row = 0 ; row < 4 ; row++) {
- nfields = fields[row];
- boxWidth = width/nfields;
+ g.drawRect(offset, offset, width + offset, height + offset);
+ for (row = 0; row < 4; row++) {
+ nfields = fields[row];
+ boxWidth = width / nfields;
- for (col = 0 ; col < nfields ; col++) {
- x1 = col*boxWidth;
- y1 = row*rowHeight;
- x2 = (col+1)*boxWidth;
- y2 = (row+1)*rowHeight;
+ for (col = 0; col < nfields; col++) {
+ x1 = col * boxWidth + offset;
+ y1 = row * rowHeight + offset;
+ x2 = (col + 1) * boxWidth + offset;
+ y2 = (row + 1) * rowHeight + offset;
- g.setColor(1,1,1);
- g.drawRect(x1,y1,x2,y2);
- if (col {
g.clear();
if (on) {
- Bangle.drawWidgets();
- // call your app function here
- drawBerlinClock();
-}});
+ Bangle.drawWidgets();
+ // call your app function here
+ drawBerlinClock();
+ }
+});
// refesh every 15 sec
setInterval(drawBerlinClock, 15E3);
@@ -61,5 +100,9 @@ g.clear();
Bangle.loadWidgets();
Bangle.drawWidgets();
drawBerlinClock();
+// Toggle date display, when BTN3 is pressed
+setWatch(toggleTime,BTN1, { repeat : true, edge: "falling"});
+// Toggle date display, when BTN3 is pressed
+setWatch(toggleDate,BTN3, { repeat : true, edge: "falling"});
// Show launcher when middle button pressed
-setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
+setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" });
diff --git a/apps/binclock/ChangeLog b/apps/binclock/ChangeLog
new file mode 100644
index 000000000..2378e52f8
--- /dev/null
+++ b/apps/binclock/ChangeLog
@@ -0,0 +1,2 @@
+0.01: New App!
+0.02: Fixed bug where screen didn't clear so incorrect time displayed.
diff --git a/apps/binclock/app-icon.js b/apps/binclock/app-icon.js
new file mode 100644
index 000000000..206c1ee42
--- /dev/null
+++ b/apps/binclock/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwkEIf4A/AH8AgP/iAECiIJCj/xAgURBoUAn8gAYMP//wAgIMBBwX//4gCAIUAgf/EIUfC5QEBC5MCI4gNCEIPyAgRGDLQMwBIwEJEAYEFAH7v3dQTpDAZ6cDdIYDPdQbpDAZ8QYgTpDAZ5IEAaYAeM4cRTYSuQiABBiQCBbckjmQzFmcggUzGJkBBoMDQgcSkMAAIIXOgL8CC6gvRL4b2CL4MwTIotJAAJfJiIiCC5RfHF4LdHC4wvGAwIvHL5UDYQIuBF44A/AH4A/AH4AbA"))
diff --git a/apps/binclock/app.js b/apps/binclock/app.js
new file mode 100644
index 000000000..7808dfe45
--- /dev/null
+++ b/apps/binclock/app.js
@@ -0,0 +1,178 @@
+// Load fonts
+require("Font7x11Numeric7Seg").add(Graphics);
+// position on screen
+const X = 160, Y = 180;
+var displayTime = 0;
+var minuteLED = [0,0,0,0,0,0];
+var hourLED = [0,0,0,0,0];
+var prevMinute = [0,0,0,0,0,0];
+var prevHour = [0,0,0,0,0];
+
+
+function drawTime(d) {
+ // work out how to display the current time
+ var h = d.getHours(), m = d.getMinutes();
+ var time = (" "+h).substr(-2) + ":" + ("0"+m).substr(-2);
+ // draw the current time (4x size 7 segment)
+ g.setFont("7x11Numeric7Seg",4);
+ g.setFontAlign(1,1); // align right bottom
+ g.drawString(time, X, Y, true /*clear background*/);
+ // draw the seconds (2x size 7 segment)
+ g.setFont("7x11Numeric7Seg",2);
+ g.drawString(("0"+d.getSeconds()).substr(-2), X+30, Y, true /*clear background*/);
+}
+
+function updateHourArray(hours){
+
+ var j;
+ for(j=0;j 15){
+ hourLED[0] = 1;
+ hours = hours - 16;
+ }
+ if(hours > 7){
+ hourLED[1] = 1;
+ hours = hours - 8;
+ }
+ if(hours > 3){
+ hourLED[2] = 1;
+ hours = hours - 4;
+ }
+ if(hours > 1){
+ hourLED[3] = 1;
+ hours = hours - 2;
+ }
+ if(hours > 0){
+ hourLED[4] = 1;
+ }
+
+ return hourLED;
+
+}
+
+function updateMinuteArray(minutes){
+ var j;
+ for(j=0;j 31){
+ minuteLED[0] = 1;
+ minutes = minutes - 32;
+ }
+ if(minutes > 15){
+ minuteLED[1] = 1;
+ minutes = minutes - 16;
+ }
+ if(minutes > 7){
+ minuteLED[2] = 1;
+ minutes = minutes - 8;
+ }
+ if(minutes > 3){
+ minuteLED[3] = 1;
+ minutes = minutes - 4;
+ }
+ if(minutes > 1){
+ minuteLED[4] = 1;
+ minutes = minutes - 2;
+ }
+ if(minutes > 0){
+ minuteLED[5] = 1;
+ }
+
+ return minuteLED;
+
+}
+
+function draw(){
+
+ // work out how to display the current time
+ var d = new Date();
+ var h = d.getHours(), m = d.getMinutes();
+
+ updateHourArray(h);
+ updateMinuteArray(m);
+
+ var i;
+ //Draw hour circles
+ for(i=0; i{
+ if (secondInterval) clearInterval(secondInterval);
+ secondInterval = undefined;
+ if (on) {
+ setInterval(draw, 1000);
+ draw(); // draw immediately
+ }
+});
+// Load widgets
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+// Show launcher when middle button pressed
+setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" });
+setWatch(function() {
+ if(displayTime == 0){
+ displayTime = 1;
+ } else{
+ displayTime = 0;
+ }
+}, BTN, {edge:"rising", debounce:50, repeat:true});
diff --git a/apps/binclock/app.png b/apps/binclock/app.png
new file mode 100644
index 000000000..b22feb36b
Binary files /dev/null and b/apps/binclock/app.png differ
diff --git a/apps/blackjack/ChangeLog b/apps/blackjack/ChangeLog
new file mode 100644
index 000000000..c941d90e5
--- /dev/null
+++ b/apps/blackjack/ChangeLog
@@ -0,0 +1 @@
+0.01: New game! BTN4- Hit card, BTN5- Stand
\ No newline at end of file
diff --git a/apps/blackjack/blackjack-icon.js b/apps/blackjack/blackjack-icon.js
new file mode 100644
index 000000000..cb4d00cdd
--- /dev/null
+++ b/apps/blackjack/blackjack-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwgIQNgfAAgU///wAgMH/4dBAoMMAQMQAQMIAQMYAQ4RCApcPwAFDgIwBAoQ4BAoMP8EHwfghk//AXBuEMv38n+AjEMvl8/4FDvoFBmEMvF994FBg04vgdBAoMAAot4AoNgAoPwAoZFBAongAoPggyIBAoPAg0HwAFDh4BBAoUeh0PwOAg08AocDv/+Ao3DAod//a3BAorBDAohRBgf+AocBAokApgCBhzSCWIkHVYgYCWIngYwQrB/gFDgF//AFDD4QAD8AFEAAIA="))
\ No newline at end of file
diff --git a/apps/blackjack/blackjack.app.js b/apps/blackjack/blackjack.app.js
new file mode 100644
index 000000000..ccc437e58
--- /dev/null
+++ b/apps/blackjack/blackjack.app.js
@@ -0,0 +1,191 @@
+const Clubs = { width : 48, height : 48, bpp : 1,
+ buffer : require("heatshrink").decompress(atob("ACcP+AFDn/8Aod//wFD///AgUBAoOAApsDAoPAAr4vLI4pTEgP8L4M/wEH/5rB//gh//x/x//wj//9/3//4n4iBAAIZBAol/Aof+Apv5z4FP+OPAo41BAoX8I4Pj45HBAoPD4YFBLIOD4JZBRAMD4CKC/AFBj59Cg/gQYYFXAB4="))
+};
+
+const Spades = { width : 48, height : 48, bpp : 1,
+ buffer : require("heatshrink").decompress(atob("ABsBwAFDgfAAocH8AFDh/wAocf/AFDn/8Aod//wFD///FwYFBGAUDAoIwCg4FBGAUPAoIwCj4FBGAU/AoIwCv4FBGAQEBGAQuCGAQuCGAQFLHQQ8CAupHLL4prB+fPTgU/8fHVwbLLApbXFbpYFLdIoADA=="))
+};
+
+const Hearts = { width : 48, height : 48, bpp : 4,
+ buffer : require("heatshrink").decompress(atob("ADlVqtQBQ8FBYIKIrnMAAINGqoKC4okGCwYAB4AKDhgKE4oWKAAILDBQwYEBYwwDFwojFgoLHEgQ6H5hhCBZAkCBRAjLEgI6IC4YLIC5Y7BBZXBjgjVABYX/C8CnKABbXLABTvMC8sMC6fAC4KQURwIABRypgULwRgULwRIUCwhIRIwiRSRoZITCwx5POoowRCxAwNFxIwNCxQwLFxYwLCxgwJFxowJCxwwHFx4wHCyAwFFyIwFCyQwDFycAgoXBqAXTgFc4oWUJAJGUJARGVAEo"))
+};
+
+const Diamonds = { width : 48, height : 48, bpp : 4,
+ buffer : require("heatshrink").decompress(atob("AHUFC60M4AXV5nFIyvM5hGVC4JIUCwJIUIwRIUIwRIUCwZISIwgABqBGUJCQWFPKBGGJCFcC455OCw4wOOox5QIxB5NOpBIOFxZ5LCxYwKOpQwMIxh5KOxipLL6xgNR5QwMX5TvXPJZ1JJBpGLPJR1LJBZGNPJIWOJA5GOPJB1NJBIWQPIpGRJApGRPIoWSJAa8PJA5GTJAYWUJAJGVAAJGVAHo="))
+};
+
+
+var deck = [];
+var player = {Hand:[]};
+var computer = {Hand:[]};
+
+function createDeck() {
+ var suits = ["Spades", "Hearts", "Diamonds", "Clubs"];
+ var values = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];
+
+ var dck = [];
+ for (var i = 0 ; i < values.length; i++) {
+ for(var x = 0; x < suits.length; x++) {
+ dck.push({ Value: values[i], Suit: suits[x] });
+ }
+ }
+ return dck;
+}
+
+function shuffle(a) {
+ var j, x, i;
+ for (i = a.length - 1; i > 0; i--) {
+ j = Math.floor(Math.random() * (i + 1));
+ x = a[i];
+ a[i] = a[j];
+ a[j] = x;
+ }
+ return a;
+}
+
+function EndGameMessdage(msg){
+ g.drawString(msg, 155, 200);
+ setTimeout(function(){
+ startGame();
+ }, 2500);
+
+}
+
+function hitMe() {
+ player.Hand.push(deck.pop());
+ renderOnScreen(1);
+ var playerWeight = calcWeight(player.Hand, 0);
+
+ if(playerWeight == 21)
+ EndGameMessdage('WINNER');
+ else if(playerWeight > 21)
+ EndGameMessdage('LOOSER');
+}
+
+function calcWeight(hand, hideCard) {
+
+ if(hideCard === 1) {
+ if (hand[0].Value == "J" || hand[0].Value == "Q" || hand[0].Value == "K")
+ return "10 +";
+ else if (hand[0].Value == "A")
+ return "11 +";
+ else
+ return parseInt(hand[0].Value) +" +";
+ }
+ else {
+ var weight = 0;
+ for(i=0; i 21 || bangleWeight < playerWeight)
+ EndGameMessdage('WINNER');
+ else if(bangleWeight > playerWeight)
+ EndGameMessdage('LOOSER');
+}
+
+function renderOnScreen(HideCard) {
+ const fontName = "6x8";
+
+ g.clear(); // clear screen
+ g.reset(); // default draw styles
+ g.setFont(fontName, 1);
+
+ g.drawString('RST', 220, 35);
+ g.drawString('Hit', 60, 230);
+ g.drawString('Stand', 165, 230);
+
+ g.setFont(fontName, 3);
+ for(i=0; i scan()
+};
+
+function showMainMenu() {
+ menu["< Back"] = () => load();
+ return E.showMenu(menu);
+}
+
+function showDeviceInfo(device){
+ const deviceMenu = {
+ "": { "title": "Device Info" },
+ "name": {
+ value: device.name
+ },
+ "rssi": {
+ value: device.rssi
+ },
+ "manufacturer": {
+ value: device.manufacturer
+ }
+ };
+
+ deviceMenu[device.id] = () => {};
+ deviceMenu["< Back"] = () => showMainMenu();
+
+ return E.showMenu(deviceMenu);
+}
+
+function scan() {
+ menu = {
+ "": { "title": "BLE Detector" },
+ "RE-SCAN": () => scan()
+ };
+
+ waitMessage();
+
+ NRF.findDevices(devices => {
+ devices.forEach(device =>{
+ let deviceName = device.id.substring(0,17);
+
+ if (device.name) {
+ deviceName = device.name;
+ }
+
+ menu[deviceName] = () => showDeviceInfo(device);
+ });
+ showMainMenu(menu);
+ }, { active: true });
+}
+
+function waitMessage() {
+ E.showMenu();
+ E.showMessage("scanning");
+}
+
+scan();
+waitMessage();
\ No newline at end of file
diff --git a/apps/bledetect/bledetect.png b/apps/bledetect/bledetect.png
new file mode 100644
index 000000000..59d6a26ce
Binary files /dev/null and b/apps/bledetect/bledetect.png differ
diff --git a/apps/blescan/blescan.js b/apps/blescan/blescan.js
index b3c1dc721..0a85113bd 100644
--- a/apps/blescan/blescan.js
+++ b/apps/blescan/blescan.js
@@ -22,22 +22,22 @@ function draw() {
function scan() {
NRF.findDevices(devices => {
- for (let device of devices) {
+ for (let device of devices) {
- // Only display devices that advertise a name
+ // Only display devices that advertise a name
- if (device.name) {
- // Remove no devices found message if it is present
- if (menu[NODEVICE]) {
- delete menu[NODEVICE];
- }
- menu[device.name] = {
- value : device.rssi,
- onchange : () => {}
- };
+ if (device.name) {
+ // Remove no devices found message if it is present
+ if (menu[NODEVICE]) {
+ delete menu[NODEVICE];
}
+ menu[device.name] = {
+ value : device.rssi,
+ onchange : () => {}
+ };
}
- draw();
+ }
+ draw();
}, { active: true });
}
diff --git a/apps/blobclk/ChangeLog b/apps/blobclk/ChangeLog
index 1cfc59015..9715fc4ab 100644
--- a/apps/blobclk/ChangeLog
+++ b/apps/blobclk/ChangeLog
@@ -2,3 +2,4 @@
Only draw widgets after clearing screen - they update automatically
Remove 'faceUp' check as it's automatic
0.03: Modified for use with new bootloader and firmware
+0.04: Modified to account for changes in the behavior of Graphics.fillPoly
diff --git a/apps/blobclk/clock-blob.js b/apps/blobclk/clock-blob.js
index 48187d23c..76f10865f 100644
--- a/apps/blobclk/clock-blob.js
+++ b/apps/blobclk/clock-blob.js
@@ -1,103 +1,103 @@
const buf = Graphics.createArrayBuffer(144,200,1,{msb:true});
const NUMBERS = [
- [1,1,1,1,3,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1],//0
- [0,1,1,1,3,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1],//1
- [1,1,1,1,3,0,0,1,1,1,2,1,1,1,4,1,1,1,0,0,1,1,1,1,1],//2
- [1,1,1,1,3,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1],//3
- [1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,5,1,1,1,1,0,0,1,1,1],//4
- [1,1,1,1,1,1,1,1,0,0,5,1,1,1,3,0,0,1,1,1,1,1,1,1,1],//5
- [1,1,1,1,1,1,1,1,0,0,1,1,1,1,3,1,1,0,1,1,1,1,1,1,1],//6
- [1,1,1,1,3,0,0,1,1,1,0,2,1,1,1,0,1,1,1,0,0,1,1,1,0],//7
- [1,1,1,1,3,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1],//8
- [1,1,1,1,3,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1] //9
+ [1,1,1,1,3,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1],//0
+ [0,1,1,1,3,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1],//1
+ [1,1,1,1,3,0,0,1,1,1,2,1,1,1,4,1,1,1,0,0,1,1,1,1,1],//2
+ [1,1,1,1,3,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1],//3
+ [1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,5,1,1,1,1,0,0,1,1,1],//4
+ [1,1,1,1,1,1,1,1,0,0,5,1,1,1,3,0,0,1,1,1,1,1,1,1,1],//5
+ [1,1,1,1,1,1,1,1,0,0,1,1,1,1,3,1,1,0,1,1,1,1,1,1,1],//6
+ [1,1,1,1,3,0,0,1,1,1,0,2,1,1,1,0,1,1,1,0,0,1,1,1,0],//7
+ [1,1,1,1,3,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1],//8
+ [1,1,1,1,3,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1] //9
];
let intervalRef = null;
let digits = [-1,-1,-1,-1,-1,-1];
function flip() {
- g.setColor(1,1,1);
- g.drawImage({width:buf.getWidth(),height:buf.getHeight(),buffer:buf.buffer},55,26);
+ g.setColor(1,1,1);
+ g.drawImage({width:buf.getWidth(),height:buf.getHeight(),buffer:buf.buffer},55,26);
}
function drawPixel(ox,oy,x,y,r,p) {
- let x1 = ox+x*(r*2+1);
- let y1 = oy+y*(r*2+1);
- let xmid = x1+r;
- let ymid = y1+r;
- let x2 = xmid+r;
- let y2 = ymid+r;
- if (p > 0) {
- if (p > 1) {
- buf.setColor(0,0,0);
- buf.fillRect(x1,y1,x2,y2);
- }
- buf.setColor(1,1,1);
- } else {
- buf.setColor(0,0,0);
- }
- if (p < 2) {
- buf.fillRect(x1,y1,x2,y2);
- } else if (p === 2) {
- buf.fillPoly([xmid,y1,x2,y1,x2,y2,x1,y2,x1,ymid]);
- } else if (p === 3) {
- buf.fillPoly([x1,y1,xmid,y1,x2,ymid,x2,y2,x1,y2]);
- } else if (p === 4) {
- buf.fillPoly([x1,y1,x2,y1,x2,ymid,xmid,y2,x1,y2]);
- } else if (p === 5) {
- buf.fillPoly([x1,y1,x2,y1,x2,y2,xmid,y2,x1,ymid]);
+ let x1 = ox+x*(r*2);
+ let y1 = oy+y*(r*2);
+ let xmid = x1+r;
+ let ymid = y1+r;
+ let x2 = xmid+r;
+ let y2 = ymid+r;
+ if (p > 0) {
+ if (p > 1) {
+ buf.setColor(0,0,0);
+ buf.fillPoly([x1,y1,x2,y1,x2,y2,x1,y2]);
}
+ buf.setColor(1,1,1);
+ } else {
+ buf.setColor(0,0,0);
+ }
+ if (p < 2) {
+ buf.fillPoly([x1,y1,x2,y1,x2,y2,x1,y2]);
+ } else if (p === 2) {
+ buf.fillPoly([xmid,y1,x2,y1,x2,y2,x1,y2,x1,ymid]);
+ } else if (p === 3) {
+ buf.fillPoly([x1,y1,xmid,y1,x2,ymid,x2,y2,x1,y2]);
+ } else if (p === 4) {
+ buf.fillPoly([x1,y1,x2,y1,x2,ymid,xmid,y2,x1,y2]);
+ } else if (p === 5) {
+ buf.fillPoly([x1,y1,x2,y1,x2,y2,xmid,y2,x1,ymid]);
+ }
}
function redraw() {
- let time = new Date();
- let hours = time.getHours();
- let mins = time.getMinutes();
- let secs = time.getSeconds();
+ let time = new Date();
+ let hours = time.getHours();
+ let mins = time.getMinutes();
+ let secs = time.getSeconds();
- let newDigits = [Math.floor(hours/10),hours%10,Math.floor(mins/10),mins%10,Math.floor(secs/10),secs%10];
+ let newDigits = [Math.floor(hours/10),hours%10,Math.floor(mins/10),mins%10,Math.floor(secs/10),secs%10];
- for (var p = 0;p<25;p++) {
- var px = p%5;
- var py = Math.floor(p/5);
- if (digits[0] === -1 || NUMBERS[newDigits[0]][p] !== NUMBERS[digits[0]][p] ) {
- drawPixel(0,20,px,py,6,NUMBERS[newDigits[0]][p]);
- }
- if (digits[1] === -1 || NUMBERS[newDigits[1]][p] !== NUMBERS[digits[1]][p] ) {
- drawPixel(78,20,px,py,6,NUMBERS[newDigits[1]][p]);
- }
- if (digits[2] === -1 || NUMBERS[newDigits[2]][p] !== NUMBERS[digits[2]][p] ) {
- drawPixel(0,92,px,py,6,NUMBERS[newDigits[2]][p]);
- }
- if (digits[3] === -1 || NUMBERS[newDigits[3]][p] !== NUMBERS[digits[3]][p] ) {
- drawPixel(78,92,px,py,6,NUMBERS[newDigits[3]][p]);
- }
- if (digits[4] === -1 || NUMBERS[newDigits[4]][p] !== NUMBERS[digits[4]][p] ) {
- drawPixel(69,164,px,py,3,NUMBERS[newDigits[4]][p]);
- }
- if (digits[5] === -1 || NUMBERS[newDigits[5]][p] !== NUMBERS[digits[5]][p] ) {
- drawPixel(108,164,px,py,3,NUMBERS[newDigits[5]][p]);
- }
+ for (var p = 0;p<25;p++) {
+ var px = p%5;
+ var py = Math.floor(p/5);
+ if (digits[0] === -1 || NUMBERS[newDigits[0]][p] !== NUMBERS[digits[0]][p] ) {
+ drawPixel(0,20,px,py,6,NUMBERS[newDigits[0]][p]);
}
- digits = newDigits;
- flip();
+ if (digits[1] === -1 || NUMBERS[newDigits[1]][p] !== NUMBERS[digits[1]][p] ) {
+ drawPixel(78,20,px,py,6,NUMBERS[newDigits[1]][p]);
+ }
+ if (digits[2] === -1 || NUMBERS[newDigits[2]][p] !== NUMBERS[digits[2]][p] ) {
+ drawPixel(0,92,px,py,6,NUMBERS[newDigits[2]][p]);
+ }
+ if (digits[3] === -1 || NUMBERS[newDigits[3]][p] !== NUMBERS[digits[3]][p] ) {
+ drawPixel(78,92,px,py,6,NUMBERS[newDigits[3]][p]);
+ }
+ if (digits[4] === -1 || NUMBERS[newDigits[4]][p] !== NUMBERS[digits[4]][p] ) {
+ drawPixel(69,164,px,py,3,NUMBERS[newDigits[4]][p]);
+ }
+ if (digits[5] === -1 || NUMBERS[newDigits[5]][p] !== NUMBERS[digits[5]][p] ) {
+ drawPixel(108,164,px,py,3,NUMBERS[newDigits[5]][p]);
+ }
+ }
+ digits = newDigits;
+ flip();
}
function clearTimers() {
- if(intervalRef) {
- clearInterval(intervalRef);
- intervalRef = undefined;
- }
+ if(intervalRef) {
+ clearInterval(intervalRef);
+ intervalRef = undefined;
+ }
}
function startTimers() {
- g.clear();
- Bangle.drawWidgets();
- intervalRef = setInterval(redraw,1000);
- redraw();
+ g.clear();
+ Bangle.drawWidgets();
+ intervalRef = setInterval(redraw,1000);
+ redraw();
}
Bangle.loadWidgets();
startTimers();
Bangle.on('lcdPower',function(on) {
- if (on) {
- startTimers();
- } else {
- clearTimers();
- }
+ if (on) {
+ startTimers();
+ } else {
+ clearTimers();
+ }
});
// Show launcher when middle button pressed
setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
diff --git a/apps/boldclk/ChangeLog b/apps/boldclk/ChangeLog
index 7819dbe2a..0d02bf644 100644
--- a/apps/boldclk/ChangeLog
+++ b/apps/boldclk/ChangeLog
@@ -1 +1,2 @@
0.02: Modified for use with new bootloader and firmware
+0.03: Tweak for more efficient rendering, and firmware 2v06
diff --git a/apps/boldclk/bold_clock.js b/apps/boldclk/bold_clock.js
index 9ef95bb2e..b7eaa8968 100644
--- a/apps/boldclk/bold_clock.js
+++ b/apps/boldclk/bold_clock.js
@@ -1,12 +1,12 @@
var hour_hand = {
- width : 61, height : 8, bpp : 1,
- transparent : 0,
- buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////////////w=="))
+ width : 61, height : 8, bpp : 1,
+ transparent : 0,
+ buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////////////w=="))
};
var minute_hand = {
- width : 110, height : 4, bpp : 1,
- transparent : 0,
- buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////w=="))
+ width : 110, height : 4, bpp : 1,
+ transparent : 0,
+ buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////w=="))
};
//g.fillRect(0,24,239,239); // Apps area
@@ -16,125 +16,125 @@ const clock_center = {x:Math.floor((240-1)/2), y:24+Math.floor((239-24)/2)};
// ={ x: 119, y: 131 }
const radius = Math.floor((239-24+1)/2); // =108
-let tick0 = Graphics.createArrayBuffer(30,8,1);
+let tick0 = Graphics.createArrayBuffer(30,8,1,{msb:true});
tick0.fillRect(0,0,tick0.getWidth()-1, tick0.getHeight()-1);
-let tick5 = Graphics.createArrayBuffer(20,6,1);
+let tick5 = Graphics.createArrayBuffer(20,6,1,{msb:true});
tick5.fillRect(0,0,tick5.getWidth()-1, tick5.getHeight()-1);
-let tick1 = Graphics.createArrayBuffer(8,4,1);
+let tick1 = Graphics.createArrayBuffer(8,4,1,{msb:true});
tick1.fillRect(0,0,tick1.getWidth()-1, tick1.getHeight()-1);
function big_wheel_x(angle){
- return clock_center.x + radius * Math.cos(angle*p180);
+ return clock_center.x + radius * Math.cos(angle*p180);
}
function big_wheel_y(angle){
- return clock_center.y + radius * Math.sin(angle*p180);
+ return clock_center.y + radius * Math.sin(angle*p180);
}
function rotate_around_x(center_x, angle, tick){
- return center_x + Math.cos(angle*p180) * tick.getWidth()/2;
+ return center_x + Math.cos(angle*p180) * tick.getWidth()/2;
}
function rotate_around_y(center_y, angle, tick){
- return center_y + Math.sin(angle*p180) * tick.getWidth()/2;
+ return center_y + Math.sin(angle*p180) * tick.getWidth()/2;
}
function hour_pos_x(angle){
- return clock_center.x + Math.cos(angle*p180) * hour_hand.width/2;
+ return clock_center.x + Math.cos(angle*p180) * hour_hand.width/2;
}
function hour_pos_y(angle){
- return clock_center.y + Math.sin(angle*p180) * hour_hand.width/2;
+ return clock_center.y + Math.sin(angle*p180) * hour_hand.width/2;
}
function minute_pos_x(angle){
- return clock_center.x + Math.cos(angle*p180) * minute_hand.width/2;
+ return clock_center.x + Math.cos(angle*p180) * minute_hand.width/2;
}
function minute_pos_y(angle){
- return clock_center.y + Math.sin(angle*p180) * minute_hand.width/2;
+ return clock_center.y + Math.sin(angle*p180) * minute_hand.width/2;
}
function minute_angle(date){
- //let minutes = date.getMinutes() + date.getSeconds()/60;
- let minutes = date.getMinutes();
- return 6*minutes - 90;
+ //let minutes = date.getMinutes() + date.getSeconds()/60;
+ let minutes = date.getMinutes();
+ return 6*minutes - 90;
}
function hour_angle(date){
- let hours= date.getHours() + date.getMinutes()/60;
- return 30*hours - 90;
+ let hours= date.getHours() + date.getMinutes()/60;
+ return 30*hours - 90;
}
function draw_clock(){
- //console.log("draw_clock");
- let date = new Date();
- //g.clear();
- g.setBgColor(0,0,0);
- g.setColor(0,0,0);
- g.fillRect(0,24,239,239); // clear app area
- g.setColor(1,1,1);
+ //console.log("draw_clock");
+ let date = new Date();
+ //g.clear();
+ g.setBgColor(0,0,0);
+ g.setColor(0,0,0);
+ g.fillRect(0,24,239,239); // clear app area
+ g.setColor(1,1,1);
- // draw cross lines for testing
- // g.setColor(1,0,0);
- // g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y);
- // g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius);
+ // draw cross lines for testing
+ // g.setColor(1,0,0);
+ // g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y);
+ // g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius);
- g.setColor(1,1,1);
- let ticks = [0, 90, 180, 270];
- ticks.forEach((item)=>{
- let agl = item+180;
- g.drawImage(tick0.asImage(), rotate_around_x(big_wheel_x(item), agl, tick0), rotate_around_y(big_wheel_y(item), agl, tick0), {rotate:agl*p180});
- });
- ticks = [30, 60, 120, 150, 210, 240, 300, 330];
- ticks.forEach((item)=>{
- let agl = item+180;
- g.drawImage(tick5.asImage(), rotate_around_x(big_wheel_x(item), agl, tick5), rotate_around_y(big_wheel_y(item), agl, tick5), {rotate:agl*p180});
- });
+ g.setColor(1,1,1);
+ let ticks = [0, 90, 180, 270];
+ ticks.forEach((item)=>{
+ let agl = item+180;
+ g.drawImage(tick0.asImage(), rotate_around_x(big_wheel_x(item), agl, tick0), rotate_around_y(big_wheel_y(item), agl, tick0), {rotate:agl*p180});
+ });
+ ticks = [30, 60, 120, 150, 210, 240, 300, 330];
+ ticks.forEach((item)=>{
+ let agl = item+180;
+ g.drawImage(tick5.asImage(), rotate_around_x(big_wheel_x(item), agl, tick5), rotate_around_y(big_wheel_y(item), agl, tick5), {rotate:agl*p180});
+ });
- let hour_agl = hour_angle(date);
- let minute_agl = minute_angle(date);
- g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); //
- g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); //
- g.setColor(1,1,1);
- g.fillCircle(clock_center.x, clock_center.y, 6);
- g.setColor(0,0,0);
- g.fillCircle(clock_center.x, clock_center.y, 3);
+ let hour_agl = hour_angle(date);
+ let minute_agl = minute_angle(date);
+ g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); //
+ g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); //
+ g.setColor(1,1,1);
+ g.fillCircle(clock_center.x, clock_center.y, 6);
+ g.setColor(0,0,0);
+ g.fillCircle(clock_center.x, clock_center.y, 3);
- // draw minute ticks. Takes long time to draw!
- g.setColor(1,1,1);
- for (var i=0; i<60; i++){
- let agl = i*6+180;
- g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180});
- }
+ // draw minute ticks. Takes long time to draw!
+ g.setColor(1,1,1);
+ for (var i=0; i<60; i++){
+ let agl = i*6+180;
+ g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180});
+ }
- g.flip();
- //console.log(date);
+ g.flip();
+ //console.log(date);
}
function clearTimers(){
- //console.log("clearTimers");
- if(intervalRef) {
- clearInterval(intervalRef);
- intervalRef = null;
- //console.log("interval is cleared");
- }
+ //console.log("clearTimers");
+ if(intervalRef) {
+ clearInterval(intervalRef);
+ intervalRef = null;
+ //console.log("interval is cleared");
+ }
}
function startTimers(){
- //console.log("startTimers");
- if(intervalRef) clearTimers();
- intervalRef = setInterval(draw_clock, 60*1000);
- //console.log("interval is set");
- draw_clock();
+ //console.log("startTimers");
+ if(intervalRef) clearTimers();
+ intervalRef = setInterval(draw_clock, 60*1000);
+ //console.log("interval is set");
+ draw_clock();
}
Bangle.on('lcdPower', (on) => {
- if (on) {
- //console.log("lcdPower: on");
- Bangle.drawWidgets();
- startTimers();
- } else {
- //console.log("lcdPower: off");
- clearTimers();
- }
+ if (on) {
+ //console.log("lcdPower: on");
+ Bangle.drawWidgets();
+ startTimers();
+ } else {
+ //console.log("lcdPower: off");
+ clearTimers();
+ }
});
Bangle.on('faceUp',function(up){
- //console.log("faceUp: " + up + " LCD: " + Bangle.isLCDOn());
- if (up && !Bangle.isLCDOn()) {
- //console.log("faceUp and LCD off");
- clearTimers();
- Bangle.setLCDPower(true);
- }
+ //console.log("faceUp: " + up + " LCD: " + Bangle.isLCDOn());
+ if (up && !Bangle.isLCDOn()) {
+ //console.log("faceUp and LCD off");
+ clearTimers();
+ Bangle.setLCDPower(true);
+ }
});
g.clear();
diff --git a/apps/boot/ChangeLog b/apps/boot/ChangeLog
index 3bd9ec71c..17d35a36c 100644
--- a/apps/boot/ChangeLog
+++ b/apps/boot/ChangeLog
@@ -9,3 +9,12 @@
0.10: Stop users calling save() (fix #125)
If Debug info is set to 'show' don't move to Terminal if connected!
0.11: Added vibrate as beep workaround
+0.12: Add an event on BTN2 to open launcher when no clock detected (fix #147)
+0.13: Now automatically load *.boot.js at startup
+ Move alarm code into alarm.boot.js
+0.14: Move welcome loaders to *.boot.js
+0.15: Added BLE HID option for Joystick and bare Keyboard
+0.16: Detect out of memory errors and draw them onto the bottom of the screen in red
+0.17: Don't modify beep/buzz behaviour if firmware does it automatically
+0.18: Fix 'GPS time' checks for western hemisphere
+0.19: Tweaks to simplify code and lower memory usage
diff --git a/apps/boot/boot0.js b/apps/boot/boot0.js
index ad8ccb312..5e69a98ca 100644
--- a/apps/boot/boot0.js
+++ b/apps/boot/boot0.js
@@ -4,7 +4,9 @@ E.setFlags({pretokenise:1});
var s = require('Storage').readJSON('setting.json',1)||{};
if (s.ble!==false) {
if (s.HID) { // Human interface device
- Bangle.HID = E.toUint8Array(atob("BQEJBqEBhQIFBxngKecVACUBdQGVCIEClQF1CIEBlQV1AQUIGQEpBZEClQF1A5EBlQZ1CBUAJXMFBxkAKXOBAAkFFQAm/wB1CJUCsQLABQwJAaEBhQEVACUBdQGVAQm1gQIJtoECCbeBAgm4gQIJzYECCeKBAgnpgQIJ6oECwA=="));
+ if (s.HID=="joy") Bangle.HID = E.toUint8Array(atob("BQEJBKEBCQGhAAUJGQEpBRUAJQGVBXUBgQKVA3UBgQMFAQkwCTEVgSV/dQiVAoECwMA="));
+ else if (s.HID=="kb") Bangle.HID = E.toUint8Array(atob("BQEJBqEBBQcZ4CnnFQAlAXUBlQiBApUBdQiBAZUFdQEFCBkBKQWRApUBdQORAZUGdQgVACVzBQcZAClzgQAJBRUAJv8AdQiVArECwA=="));
+ else /*kbmedia*/Bangle.HID = E.toUint8Array(atob("BQEJBqEBhQIFBxngKecVACUBdQGVCIEClQF1CIEBlQV1AQUIGQEpBZEClQF1A5EBlQZ1CBUAJXMFBxkAKXOBAAkFFQAm/wB1CJUCsQLABQwJAaEBhQEVACUBdQGVAQm1gQIJtoECCbeBAgm4gQIJzYECCeKBAgnpgQIJ6oECwA=="));
NRF.setServices({}, {uart:true, hid:Bangle.HID});
}
}
@@ -19,45 +21,35 @@ if (s.blerepl===false) { // If not programmable, force terminal off Bluetooth
// Don't disconnect if something is already connected to us
if (s.ble===false && !NRF.getSecurityStatus().connected) NRF.sleep();
// Set time, vibrate, beep, etc
-if (!s.vibrate) Bangle.buzz=Promise.resolve;
-if (s.beep===false) Bangle.beep=Promise.resolve;
-else if (s.beep=="vib") Bangle.beep = function (time, freq) {
- return new Promise(function(resolve) {
- if ((0|freq)<=0) freq=4000;
- if ((0|time)<=0) time=200;
- if (time>5000) time=5000;
- analogWrite(D13,0.1,{freq:freq});
- setTimeout(function() {
- digitalWrite(D13,0);
- resolve();
- }, time);
- });
-};
+if (!Bangle.F_BEEPSET) {
+ if (!s.vibrate) Bangle.buzz=Promise.resolve;
+ if (s.beep===false) Bangle.beep=Promise.resolve;
+ else if (s.beep=="vib") Bangle.beep = function (time, freq) {
+ return new Promise(function(resolve) {
+ if ((0|freq)<=0) freq=4000;
+ if ((0|time)<=0) time=200;
+ if (time>5000) time=5000;
+ analogWrite(D13,0.1,{freq:freq});
+ setTimeout(function() {
+ digitalWrite(D13,0);
+ resolve();
+ }, time);
+ });
+ };
+}
Bangle.setLCDTimeout(s.timeout);
if (!s.timeout) Bangle.setLCDPower(1);
E.setTimeZone(s.timezone);
delete s;
+// Draw out of memory errors onto the screen
+E.on('errorFlag', function(errorFlags) {
+ g.reset(1).setColor("#ff0000").setFont("6x8").setFontAlign(0,1).drawString(errorFlags,g.getWidth()/2,g.getHeight()-1).flip();
+ print("Interpreter error:", errorFlags);
+ E.getErrorFlags(); // clear flags so we get called next time
+});
// stop users doing bad things!
global.save = function() { throw new Error("You can't use save() on Bangle.js without overwriting the bootloader!"); }
-// check for alarms
-var alarms = require('Storage').readJSON('alarm.json',1)||[];
-var time = new Date();
-var active = alarms.filter(a=>a.on&&(a.last!=time.getDate()));
-if (active.length) {
- active = active.sort((a,b)=>a.hr-b.hr);
- var hr = time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600);
- if (!require('Storage').read("alarm.js")) {
- console.log("No alarm app!");
- require('Storage').write('alarm.json',"[]")
- } else {
- var t = 3600000*(active[0].hr-hr);
- if (t<1000) t=1000;
- /* execute alarm at the correct time. We avoid execing immediately
- since this code will get called AGAIN when alarm.js is loaded. alarm.js
- will then clearInterval() to get rid of this call so it can proceed
- normally. */
- setTimeout(function() {
- load("alarm.js");
- },t);
- }
-}
+// Load *.boot.js files
+require('Storage').list(/\.boot\.js/).forEach(bootFile=>{
+ eval(require('Storage').read(bootFile));
+});
diff --git a/apps/boot/bootloader.js b/apps/boot/bootloader.js
index febc4fc19..df3718dcc 100644
--- a/apps/boot/bootloader.js
+++ b/apps/boot/bootloader.js
@@ -1,38 +1,43 @@
// This runs after a 'fresh' boot
-var settings=require("Storage").readJSON('setting.json',1)||{};
-if (!settings.welcomed && require("Storage").read("welcome.js")!==undefined) {
- setTimeout(()=>load("welcome.js"));
-} else {
- // load clock if specified
- var clockApp = settings.clock;
- if (clockApp) clockApp = require("Storage").read(clockApp)
- if (!clockApp) {
- var clockApps = require("Storage").list(/\.info$/).map(app=>require("Storage").readJSON(app,1)||{}).filter(app=>app.type=="clock").sort((a, b) => a.sortorder - b.sortorder);
- if (clockApps && clockApps.length > 0)
- clockApp = require("Storage").read(clockApps[0].src);
- delete clockApps;
- }
- if (!clockApp) clockApp='E.showMessage("No Clock Found")';
- delete settings;
- // check to see if our clock is wrong - if it is use GPS time
- if ((new Date()).getFullYear()==1970) {
- E.showMessage("Searching for\nGPS time");
- Bangle.on('GPS',function cb(g) {
- Bangle.setGPSPower(0);
- Bangle.removeListener("GPS",cb);
- if (!g.time || (g.time.getFullYear()<2000) ||
- (g.time.getFullYear()==2250)) {
- // GPS receiver's time not set - just boot clock anyway
- eval(clockApp);delete clockApp;
- return;
+var clockApp=(require("Storage").readJSON("setting.json",1)||{}).clock;
+if (clockApp) clockApp = require("Storage").read(clockApp);
+if (!clockApp) {
+ clockApp = require("Storage").list(/\.info$/)
+ .map(file => {
+ const app = require("Storage").readJSON(file,1);
+ if (app && app.type == "clock") {
+ return app;
}
- // We have a GPS time. Set time and reboot (to load alarms properly)
- setTime(g.time.getTime()/1000);
- load();
- });
- Bangle.setGPSPower(1);
- } else {
- eval(clockApp);
- delete clockApp;
- }
+ })
+ .filter(x=>x)
+ .sort((a, b) => a.sortorder - b.sortorder)[0];
+ if (clockApp)
+ clockApp = require("Storage").read(clockApp.src);
+}
+if (!clockApp) clockApp=`E.showMessage("No Clock Found");
+setWatch(() => {
+ Bangle.showLauncher();
+}, BTN2, {repeat:false,edge:"falling"});)
+`;
+// check to see if our clock is wrong - if it is use GPS time
+if ((new Date()).getFullYear()<2000) {
+ E.showMessage("Searching for\nGPS time");
+ Bangle.on("GPS",function cb(g) {
+ Bangle.setGPSPower(0);
+ Bangle.removeListener("GPS",cb);
+ if (!g.time || (g.time.getFullYear()<2000) ||
+ (g.time.getFullYear()>2200)) {
+ // GPS receiver's time not set - just boot clock anyway
+ eval(clockApp);
+ delete clockApp;
+ return;
+ }
+ // We have a GPS time. Set time and reboot (to load alarms properly)
+ setTime(g.time.getTime()/1000);
+ load();
+ });
+ Bangle.setGPSPower(1);
+} else {
+ eval(clockApp);
+ delete clockApp;
}
diff --git a/apps/boot/hid_info.txt b/apps/boot/hid_info.txt
new file mode 100644
index 000000000..873b50f63
--- /dev/null
+++ b/apps/boot/hid_info.txt
@@ -0,0 +1,88 @@
+
+## Joystick:
+
+https://github.com/espruino/BangleApps/issues/349#issuecomment-620231524
+
+```
+0x05, 0x01, // Usage Page (Generic Desktop)
+0x09, 0x04, // Usage (Joystick)
+0xA1, 0x01, // Collection (Application)
+ 0x09, 0x01, // Usage (Pointer)
+ 0xA1, 0x00, // Collection (Physical)
+ // Buttons
+ 0x05, 0x09, // Usage Page (Buttons)
+ 0x19, 0x01, // Usage Minimum (1)
+ 0x29, 0x05, // Usage Maximum (5)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x25, 0x01, // Logical Maximum (1)
+ 0x95, 0x05, // Report Count (5)
+ 0x75, 0x01, // Report Size (1)
+ 0x81, 0x02, // Input (Data, Variable, Absolute)
+
+ // padding bits
+ 0x95, 0x03, // Report Count (3)
+ 0x75, 0x01, // Report Size (1)
+ 0x81, 0x03, // Input (Constant)
+
+ // Stick
+ 0x05, 0x01, // Usage Page (Generic Desktop)
+ 0x09, 0x30, // Usage (X)
+ 0x09, 0x31, // Usage (Y)
+ 0x15, 0x81, // Logical Minimum (-127)
+ 0x25, 0x7f, // Logical Maximum (127)
+ 0x75, 0x08, // Report Size (8)
+ 0x95, 0x02, // Report Count (2)
+ 0x81, 0x02, // Input (Data, Variable, Absolute)
+ 0xC0, // End Collection (Physical)
+0xC0 // End Collection (Application)
+```
+
+## Keyboard
+
+http://www.espruino.com/BLE+Keyboard
+
+```
+0x05, 0x01, // Usage Page (Generic Desktop)
+0x09, 0x06, // Usage (Keyboard)
+0xA1, 0x01, // Collection (Application)
+0x05, 0x07, // Usage Page (Key Codes)
+0x19, 0xe0, // Usage Minimum (224)
+0x29, 0xe7, // Usage Maximum (231)
+0x15, 0x00, // Logical Minimum (0)
+0x25, 0x01, // Logical Maximum (1)
+0x75, 0x01, // Report Size (1)
+0x95, 0x08, // Report Count (8)
+0x81, 0x02, // Input (Data, Variable, Absolute)
+
+0x95, 0x01, // Report Count (1)
+0x75, 0x08, // Report Size (8)
+0x81, 0x01, // Input (Constant) reserved byte(1)
+
+0x95, 0x05, // Report Count (5)
+0x75, 0x01, // Report Size (1)
+0x05, 0x08, // Usage Page (Page# for LEDs)
+0x19, 0x01, // Usage Minimum (1)
+0x29, 0x05, // Usage Maximum (5)
+0x91, 0x02, // Output (Data, Variable, Absolute), Led report
+0x95, 0x01, // Report Count (1)
+0x75, 0x03, // Report Size (3)
+0x91, 0x01, // Output (Data, Variable, Absolute), Led report padding
+
+0x95, 0x06, // Report Count (6)
+0x75, 0x08, // Report Size (8)
+0x15, 0x00, // Logical Minimum (0)
+0x25, 0x73, // Logical Maximum (115 - include F13, etc)
+0x05, 0x07, // Usage Page (Key codes)
+0x19, 0x00, // Usage Minimum (0)
+0x29, 0x73, // Usage Maximum (115 - include F13, etc)
+0x81, 0x00, // Input (Data, Array) Key array(6 bytes)
+
+0x09, 0x05, // Usage (Vendor Defined)
+0x15, 0x00, // Logical Minimum (0)
+0x26, 0xFF, 0x00, // Logical Maximum (255)
+0x75, 0x08, // Report Count (2)
+0x95, 0x02, // Report Size (8 bit)
+0xB1, 0x02, // Feature (Data, Variable, Absolute)
+
+0xC0 // End Collection (Application)
+```
diff --git a/apps/buffgym/.eslintrc.json b/apps/buffgym/.eslintrc.json
new file mode 100644
index 000000000..aaae0a0cb
--- /dev/null
+++ b/apps/buffgym/.eslintrc.json
@@ -0,0 +1,35 @@
+{
+ "env": {
+ "browser": true,
+ "commonjs": true,
+ "es6": true
+ },
+ "extends": "eslint:recommended",
+ "globals": {
+ "Atomics": "readonly",
+ "SharedArrayBuffer": "readonly"
+ },
+ "parserOptions": {
+ "ecmaVersion": 2018
+ },
+ "rules": {
+ "indent": [
+ "error",
+ 2,
+ { "SwitchCase": 1 }
+ ],
+ "linebreak-style": [
+ "error",
+ "windows"
+ ],
+ "quotes": [
+ "error",
+ "double"
+ ]
+ /*,
+ "semi": [
+ "error",
+ "always"
+ ]*/
+ }
+}
\ No newline at end of file
diff --git a/apps/buffgym/ChangeLog b/apps/buffgym/ChangeLog
new file mode 100644
index 000000000..6efdd865a
--- /dev/null
+++ b/apps/buffgym/ChangeLog
@@ -0,0 +1,2 @@
+0.01: Create BuffGym app
+0.02: Add web interface for personalising workout
diff --git a/apps/buffgym/README.md b/apps/buffgym/README.md
new file mode 100644
index 000000000..bcadf22c4
--- /dev/null
+++ b/apps/buffgym/README.md
@@ -0,0 +1,60 @@
+# BuffGym
+
+This gym training assistant trains you on the famous [Stronglifts 5x5 workout](https://stronglifts.com/5x5) program.
+
+## Configuration
+
+### Setting your start weight values
+
+You will want to set your own starting weight values for your 5x5 training program. To do this is easy! After installing this app, go to the BangleJS app store, connect to your watch, and navigate to the `My Apps` tab. In there you will find this app in the list, and an icon (a down arrow) to the right of the app title. Click that icon to reveal a configuration page. Enter your weights and other details, and click upload. That is it, you are now ready to train!
+
+## Usage
+
+### Start screen
+
+When you start the app it will wait on a splash screen until you are ready to start the work out. Press any of the buttons to start
+
+
+
+### Workouts menu
+
+You are then presented with the workouts menu, use BTN1 to move up the list, and BTN3 to move down the list. Once you have made your selection, press BTN2 to select the workout.
+
+
+
+### Recording your training
+
+You will now begin moving through the exercises in the workout. You will see the exercise information on the display.
+
+
+
+1. At the top is the exercise name, e.g 'Squats'
+2. Next is the weight you must train
+3. In the center is where you record the number of *reps* you completed (more on that shortly)
+4. Below the *reps* value, is the target reps you must try to reach.
+5. Below the target reps is the current set you are training, out of the total sets for the exercise.
+6. The *reps* value is used to store what you achieved for the current set, you enter this after you have trained on your current set. To alter this value, use BTN1 to increase the value (it will stop at the maximum required reps) and BTN3 to decreas the value to a minimum of 0 (this is the default value). Pressing BTN2 will confirm your reps
+
+### Rest timers
+
+You will then be presented with a rest timer screen, it counts down and automatically moves to the next exercise when it reaches 0. You can cancel the timer early if you wish by pressing BTN2. If it is the last set of an exercise, you don't need to rest, so it lets you know you have completed all the sets in the exercise and can start the next exercise.
+
+
+
+
+### Workout completed
+
+Once all exercises are done, you are presented with a pat-on-the-back screen to tell you how awesome you are.
+
+
+
+## Features
+
+* If you successfully complete all reps and sets for an exercise, it will automatically update your weights for next time
+* Has a neat rest timer to make sure you are training optimally
+* Doesn't require a mobile phone, most 'smart watches' are just a visual presentation of the mobile phone app, this runs purley on the watch. So why not leave your phone and its distractions out of the gym!
+* Clear and simple user interface
+
+## Created by
+
+[Paul Cockrell](https://github.com/paulcockrell) April 2020.
diff --git a/apps/buffgym/buffgym-exercise.js b/apps/buffgym/buffgym-exercise.js
new file mode 100644
index 000000000..103ff99b7
--- /dev/null
+++ b/apps/buffgym/buffgym-exercise.js
@@ -0,0 +1,153 @@
+exports = class Exercise {
+ constructor(params) {
+ this.completed = false;
+ this.sets = [];
+ this.title = params.title;
+ this.weight = params.weight;
+ this.weightIncrement = params.weightIncrement;
+ this.unit = params.unit;
+ this.restPeriod = params.restPeriod;
+ this._originalRestPeriod = params.restPeriod;
+ this._restTimeout = null;
+ this._restInterval = null;
+ this._state = null;
+ }
+
+ get humanTitle() {
+ return `${this.title} ${this.weight}${this.unit}`;
+ }
+
+ get subTitle() {
+ const totalSets = this.sets.length;
+ const uncompletedSets = this.sets.filter((set) => !set.isCompleted()).length;
+ const currentSet = (totalSets - uncompletedSets) + 1;
+ return `Set ${currentSet} of ${totalSets}`;
+ }
+
+ decRestPeriod() {
+ this.restPeriod--;
+ }
+
+ addSet(set) {
+ this.sets.push(set);
+ }
+
+ currentSet() {
+ return this.sets.filter(set => !set.isCompleted())[0];
+ }
+
+ isLastSet() {
+ return this.sets.filter(set => !set.isCompleted()).length === 1;
+ }
+
+ isCompleted() {
+ return !!this.completed;
+ }
+
+ canSetCompleted() {
+ return this.sets.filter(set => set.isCompleted()).length === this.sets.length;
+ }
+
+ setCompleted() {
+ if (!this.canSetCompleted()) throw "All sets must be completed";
+ if (this.canProgress()) this.weight += this.weightIncrement;
+ this.completed = true;
+ }
+
+ canProgress() {
+ let completedRepsTotalSum = 0;
+ let targetRepsTotalSum = 0;
+ this.sets.forEach(set => completedRepsTotalSum += set.reps);
+ this.sets.forEach(set => targetRepsTotalSum += set.maxReps);
+
+ return (targetRepsTotalSum - completedRepsTotalSum) === 0;
+ }
+
+ startRestTimer(workout) {
+ this._restTimeout = setTimeout(() => {
+ this.next(workout);
+ }, 1000 * this.restPeriod);
+
+ this._restInterval = setInterval(() => {
+ this.decRestPeriod();
+
+ if (this.restPeriod < 0) {
+ this.resetRestTimer();
+ this.next();
+
+ return;
+ }
+
+ workout.emit("redraw");
+ }, 1000 );
+ }
+
+ resetRestTimer() {
+ clearTimeout(this._restTimeout);
+ clearInterval(this._restInterval);
+ this._restTimeout = null;
+ this._restInterval = null;
+ this.restPeriod = this._originalRestPeriod;
+ }
+
+ isRestTimerRunning() {
+ return this._restTimeout != null;
+ }
+
+ setupStartedButtons(workout) {
+ clearWatch();
+
+ setWatch(() => {
+ this.currentSet().incReps();
+ workout.emit("redraw");
+ }, BTN1, {repeat: true});
+
+ setWatch(workout.next.bind(workout), BTN2, {repeat: false});
+
+ setWatch(() => {
+ this.currentSet().decReps();
+ workout.emit("redraw");
+ }, BTN3, {repeat: true});
+ }
+
+ setupRestingButtons(workout) {
+ clearWatch();
+ setWatch(workout.next.bind(workout), BTN2, {repeat: false});
+ }
+
+ next(workout) {
+ const STARTED = 1;
+ const RESTING = 2;
+ const COMPLETED = 3;
+
+ switch(this._state) {
+ case null:
+ this._state = STARTED;
+ this.setupStartedButtons(workout);
+ break;
+ case STARTED:
+ this._state = RESTING;
+ this.startRestTimer(workout);
+ this.setupRestingButtons(workout);
+ break;
+ case RESTING:
+ this.resetRestTimer();
+ this.currentSet().setCompleted();
+
+ if (this.canSetCompleted()) {
+ this._state = COMPLETED;
+ this.setCompleted();
+ } else {
+ this._state = null;
+ }
+ // As we are changing state and require it to be reprocessed
+ // invoke the next step of workout
+ workout.next();
+ break;
+ default:
+ throw "Exercise: Attempting to move to an unknown state";
+ }
+
+ workout.emit("redraw");
+ }
+};
\ No newline at end of file
diff --git a/apps/buffgym/buffgym-icon.js b/apps/buffgym/buffgym-icon.js
new file mode 100644
index 000000000..9938c9030
--- /dev/null
+++ b/apps/buffgym/buffgym-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+ACPI5AUSADAtB5vNGFQtBAIfNF95hoF4wwoF5AwmF5BhmXYbAEF/6QbF1QwIF04qB54ADAwIwoF4oRKBoIvsB4gvZ58kkgCDFxoxaF5wuHGDQcMF5IwXDZwLDGDmlDIWlkgJDSwIABCRAwPDQohCFgIABDQIOCFwYABr4RCCQIvQDYguEAAwtFF5owJDZAvHFw4vFOYQvKFAowMBxIvFMQwvPAB4wFUQ4vJGDYvUGC4vNdgyuEGDIsNFwYwGNAgAPExAvMGIdfTIovfTpYvrfRCOkZ44ugF44NGF05gUFyQvKGIoueGKIufGJ4uhG5oupGItfr4vvAAgvlGAQvt/wrEF9oEGF841IF9QGHX0oGIAD8kAAYJOFzwEBBQoMFACA="))
diff --git a/apps/buffgym/buffgym-scrn1.png b/apps/buffgym/buffgym-scrn1.png
new file mode 100755
index 000000000..07b79386f
Binary files /dev/null and b/apps/buffgym/buffgym-scrn1.png differ
diff --git a/apps/buffgym/buffgym-scrn2.png b/apps/buffgym/buffgym-scrn2.png
new file mode 100755
index 000000000..ec70fb791
Binary files /dev/null and b/apps/buffgym/buffgym-scrn2.png differ
diff --git a/apps/buffgym/buffgym-scrn3.png b/apps/buffgym/buffgym-scrn3.png
new file mode 100755
index 000000000..0888fc507
Binary files /dev/null and b/apps/buffgym/buffgym-scrn3.png differ
diff --git a/apps/buffgym/buffgym-scrn4.png b/apps/buffgym/buffgym-scrn4.png
new file mode 100755
index 000000000..3078d25dc
Binary files /dev/null and b/apps/buffgym/buffgym-scrn4.png differ
diff --git a/apps/buffgym/buffgym-scrn5.png b/apps/buffgym/buffgym-scrn5.png
new file mode 100755
index 000000000..b34a5b124
Binary files /dev/null and b/apps/buffgym/buffgym-scrn5.png differ
diff --git a/apps/buffgym/buffgym-scrn6.png b/apps/buffgym/buffgym-scrn6.png
new file mode 100755
index 000000000..563426ad3
Binary files /dev/null and b/apps/buffgym/buffgym-scrn6.png differ
diff --git a/apps/buffgym/buffgym-set.js b/apps/buffgym/buffgym-set.js
new file mode 100644
index 000000000..efb3c2582
--- /dev/null
+++ b/apps/buffgym/buffgym-set.js
@@ -0,0 +1,28 @@
+exports = class Set {
+ constructor(maxReps) {
+ this.completed = false;
+ this.minReps = 0;
+ this.reps = 0;
+ this.maxReps = maxReps;
+ }
+
+ isCompleted() {
+ return !!this.completed;
+ }
+
+ setCompleted() {
+ this.completed = true;
+ }
+
+ incReps() {
+ if (this.completed) return;
+ if (this.reps >= this.maxReps) return;
+ this.reps++;
+ }
+
+ decReps() {
+ if (this.completed) return;
+ if (this.reps <= this.minReps) return;
+ this.reps--;
+ }
+};
\ No newline at end of file
diff --git a/apps/buffgym/buffgym-workout-a.json b/apps/buffgym/buffgym-workout-a.json
new file mode 100644
index 000000000..8eb8611d6
--- /dev/null
+++ b/apps/buffgym/buffgym-workout-a.json
@@ -0,0 +1,33 @@
+{
+ "title": "Workout A",
+ "exercises": [
+ {
+ "title": "Squats",
+ "weight": 40,
+ "unit": "Kg",
+ "sets": [5, 5, 5, 5, 5],
+ "restPeriod": 90
+ },
+ {
+ "title": "Overhead press",
+ "weight": 20,
+ "unit": "Kg",
+ "sets": [5, 5, 5, 5, 5],
+ "restPeriod": 90
+ },
+ {
+ "title": "Deadlift",
+ "weight": 20,
+ "unit": "Kg",
+ "sets": [5],
+ "restPeriod": 90
+ },
+ {
+ "title": "Pullups",
+ "weight": 0,
+ "unit": "Kg",
+ "sets": [10, 10, 10],
+ "restPeriod": 90
+ }
+ ]
+}
\ No newline at end of file
diff --git a/apps/buffgym/buffgym-workout-b.json b/apps/buffgym/buffgym-workout-b.json
new file mode 100644
index 000000000..43845a98b
--- /dev/null
+++ b/apps/buffgym/buffgym-workout-b.json
@@ -0,0 +1,33 @@
+{
+ "title": "Workout B",
+ "exercises": [
+ {
+ "title": "Squats",
+ "weight": 40,
+ "unit": "Kg",
+ "sets": [5, 5, 5, 5, 5],
+ "restPeriod": 90
+ },
+ {
+ "title": "Bench press",
+ "weight": 20,
+ "unit": "Kg",
+ "sets": [5, 5, 5, 5, 5],
+ "restPeriod": 90
+ },
+ {
+ "title": "Row",
+ "weight": 20,
+ "unit":"Kg",
+ "sets": [5, 5, 5, 5, 5],
+ "restPeriod": 90
+ },
+ {
+ "title": "Tricep extension",
+ "weight": 20,
+ "unit": "Kg",
+ "sets": [10, 10, 10],
+ "restPeriod": 90
+ }
+ ]
+}
\ No newline at end of file
diff --git a/apps/buffgym/buffgym-workout-index.json b/apps/buffgym/buffgym-workout-index.json
new file mode 100644
index 000000000..af74d5e3b
--- /dev/null
+++ b/apps/buffgym/buffgym-workout-index.json
@@ -0,0 +1,10 @@
+[
+ {
+ "title": "Workout A",
+ "file": "buffgym-workout-a.json"
+ },
+ {
+ "title": "Workout B",
+ "file": "buffgym-workout-b.json"
+ }
+]
\ No newline at end of file
diff --git a/apps/buffgym/buffgym-workout.js b/apps/buffgym/buffgym-workout.js
new file mode 100644
index 000000000..770ed5ffa
--- /dev/null
+++ b/apps/buffgym/buffgym-workout.js
@@ -0,0 +1,84 @@
+exports = class Workout {
+ constructor(params) {
+ this.title = params.title;
+ this.exercises = [];
+ this.completed = false;
+ this.on("redraw", params.redraw.bind(null, this));
+ }
+
+ addExercises(exercises) {
+ exercises.forEach(exercise => this.exercises.push(exercise));
+ }
+
+ currentExercise() {
+ return this.exercises.filter(exercise => !exercise.isCompleted())[0];
+ }
+
+ canComplete() {
+ return this.exercises.filter(exercise => exercise.isCompleted()).length === this.exercises.length;
+ }
+
+ setCompleted() {
+ if (!this.canComplete()) throw "All exercises must be completed";
+ this.completed = true;
+ }
+
+ isCompleted() {
+ return !!this.completed;
+ }
+
+ static fromJSON(workoutJSON, redraw) {
+ const Set = require("buffgym-set.js");
+ const Exercise = require("buffgym-exercise.js");
+ const workout = new this({
+ title: workoutJSON.title,
+ redraw: redraw,
+ });
+ const exercises = workoutJSON.exercises.map(exerciseJSON => {
+ const exercise = new Exercise({
+ title: exerciseJSON.title,
+ weight: exerciseJSON.weight,
+ weightIncrement: exerciseJSON.weightIncrement,
+ unit: exerciseJSON.unit,
+ restPeriod: exerciseJSON.restPeriod,
+ });
+ exerciseJSON.sets.forEach(setJSON => {
+ exercise.addSet(new Set(setJSON));
+ });
+
+ return exercise;
+ });
+
+ workout.addExercises(exercises);
+
+ return workout;
+ }
+
+ toJSON() {
+ return {
+ title: this.title,
+ exercises: this.exercises.map(exercise => {
+ return {
+ title: exercise.title,
+ weight: exercise.weight,
+ weightIncrement: exercise.weightIncrement,
+ unit: exercise.unit,
+ sets: exercise.sets.map(set => set.maxReps),
+ restPeriod: exercise.restPeriod,
+ };
+ }),
+ };
+ }
+
+ // State machine
+ next() {
+ if (this.canComplete()) {
+ this.setCompleted();
+ this.emit("redraw");
+ return;
+ }
+
+ // Call current exercise state machine
+ this.currentExercise().next(this);
+ }
+};
\ No newline at end of file
diff --git a/apps/buffgym/buffgym.app.js b/apps/buffgym/buffgym.app.js
new file mode 100755
index 000000000..7ed7db1bd
--- /dev/null
+++ b/apps/buffgym/buffgym.app.js
@@ -0,0 +1,261 @@
+/**
+ * BangleJS Stronglifts 5x5 training aid
+ *
+ * Original Author: Paul Cockrell https://github.com/paulcockrell
+ * Created: April 2020
+ *
+ * Inspired by:
+ * - Stronglifts 5x5 training workout https://stronglifts.com/5x5/
+ * - Stronglifts smart watch app
+ */
+
+Bangle.setLCDMode("120x120");
+
+const W = g.getWidth();
+const H = g.getHeight();
+const RED = "#d32e29";
+const PINK = "#f05a56";
+const WHITE = "#ffffff";
+
+function drawMenu(params) {
+ const hs = require("heatshrink");
+ const incImg = hs.decompress(atob("gsFwMAkM+oUA"));
+ const decImg = hs.decompress(atob("gsFwIEBnwCBA"));
+ const okImg = hs.decompress(atob("gsFwMAhGFo0A"));
+ const DEFAULT_PARAMS = {
+ showBTN1: false,
+ showBTN2: false,
+ showBTN3: false,
+ };
+ const p = Object.assign({}, DEFAULT_PARAMS, params);
+ if (p.showBTN1) g.drawImage(incImg, W - 10, 10);
+ if (p.showBTN2) g.drawImage(okImg, W - 10, 60);
+ if (p.showBTN3) g.drawImage(decImg, W - 10, 110);
+}
+
+function drawSet(exercise) {
+ const set = exercise.currentSet();
+ if (set.isCompleted()) return;
+
+ g.clear();
+
+ // Draw exercise title
+ g.setColor(PINK);
+ g.fillRect(15, 0, W - 15, 18);
+ g.setFontAlign(0, -1);
+ g.setFont("6x8", 1);
+ g.setColor(WHITE);
+ g.drawString(exercise.title, W / 2, 5);
+ g.setFont("6x8", 1);
+ g.drawString(exercise.weight + " " + exercise.unit, W / 2, 27);
+ // Draw completed reps counter
+ g.setFontAlign(0, 0);
+ g.setColor(PINK);
+ g.fillRect(15, 42, W - 15, 80);
+ g.setColor(WHITE);
+ g.setFont("6x8", 5);
+ g.drawString(set.reps, (W / 2) + 2, (H / 2) + 1);
+ g.setFont("6x8", 1);
+ const note = `Target reps: ${set.maxReps}`;
+ g.drawString(note, W / 2, H - 24);
+ // Draw sets monitor
+ g.drawString(exercise.subTitle, W / 2, H - 12);
+
+ drawMenu({showBTN1: true, showBTN2: true, showBTN3: true});
+
+ g.flip();
+}
+
+function drawWorkoutDone() {
+ const title1 = "You did";
+ const title2 = "GREAT!";
+ const msg = "That's the workout\ncompleted. Now eat\nsome food and\nget plenty of rest.";
+
+ clearWatch();
+ setWatch(Bangle.showLauncher, BTN2, {repeat: false});
+ drawMenu({showBTN2: true});
+
+ g.setFontAlign(0, -1);
+ g.setColor(WHITE);
+ g.setFont("6x8", 2);
+ g.drawString(title1, W / 2, 10);
+ g.drawString(title2, W / 2, 30);
+ g.setFont("6x8", 1);
+ g.drawString(msg, (W / 2) + 3, 70);
+ g.flip();
+}
+
+function drawSetComp(exercise) {
+ const title = "Good work";
+ const msg1= "No need to rest\nmove straight on\nto the next\nexercise.";
+ const msg2 = exercise.canProgress()?
+ "Your\nweight has been\nincreased for\nnext time!":
+ "You'll\nsmash it next\ntime!";
+
+ g.clear();
+ drawMenu({showBTN2: true});
+
+ g.setFontAlign(0, -1);
+ g.setColor(WHITE);
+ g.setFont("6x8", 2);
+ g.drawString(title, W / 2, 10);
+ g.setFont("6x8", 1);
+ g.drawString(msg1 + msg2, (W / 2) - 2, 45);
+
+ g.flip();
+}
+
+function drawRestTimer(exercise) {
+ g.clear();
+ drawMenu({showBTN2: true});
+ g.setFontAlign(0, -1);
+ g.setColor(PINK);
+ g.fillRect(15, 42, W - 15, 80);
+ g.setColor(WHITE);
+ g.setFont("6x8", 1);
+ g.drawString("Have a short\nrest period.", W / 2, 10);
+ g.setFont("6x8", 5);
+ g.drawString(exercise.restPeriod, (W / 2) + 2, (H / 2) - 19);
+ g.flip();
+}
+
+function redraw(workout) {
+ const exercise = workout.currentExercise();
+ g.clear();
+
+ if (workout.isCompleted()) {
+ saveWorkout(workout);
+ drawWorkoutDone();
+ return;
+ }
+
+ if (exercise.isRestTimerRunning()) {
+ if (exercise.isLastSet()) {
+ drawSetComp(exercise);
+ } else {
+ drawRestTimer(exercise);
+ }
+
+ return;
+ }
+
+ drawSet(exercise);
+}
+
+function drawWorkoutMenu(workouts, selWorkoutIdx) {
+ g.clear();
+ g.setFontAlign(0, -1);
+ g.setColor(WHITE);
+ g.setFont("6x8", 2);
+ g.drawString("BuffGym", W / 2, 10);
+
+ g.setFont("6x8", 1);
+ g.setFontAlign(-1, -1);
+ let selectedWorkout = workouts[selWorkoutIdx].title;
+ let yPos = 50;
+ workouts.forEach(workout => {
+ g.setColor("#f05a56");
+ g.fillRect(0, yPos, W, yPos + 11);
+ g.setColor("#ffffff");
+ if (selectedWorkout === workout.title) {
+ g.drawRect(0, yPos, W - 1, yPos + 11);
+ }
+ g.drawString(workout.title, 10, yPos + 2);
+ yPos += 15;
+ });
+ g.flip();
+}
+
+function setupMenu() {
+ clearWatch();
+ const workouts = getWorkoutIndex();
+ let selWorkoutIdx = 0;
+ drawWorkoutMenu(workouts, selWorkoutIdx);
+
+ setWatch(()=>{
+ selWorkoutIdx--;
+ if (selWorkoutIdx< 0) selWorkoutIdx = 0;
+ drawWorkoutMenu(workouts, selWorkoutIdx);
+ }, BTN1, {repeat: true});
+
+ setWatch(()=>{
+ const workout = buildWorkout(workouts[selWorkoutIdx].file);
+ workout.next();
+ }, BTN2, {repeat: false});
+
+ setWatch(()=>{
+ selWorkoutIdx++;
+ if (selWorkoutIdx > workouts.length - 1) selWorkoutIdx = workouts.length - 1;
+ drawWorkoutMenu(workouts, selWorkoutIdx);
+ }, BTN3, {repeat: true});
+}
+
+function drawSplash() {
+ g.reset();
+ g.setBgColor(RED);
+ g.clear();
+ g.setColor(WHITE);
+ g.setFontAlign(0,-1);
+ g.setFont("6x8", 2);
+ g.drawString("BuffGym", W / 2, 10);
+ g.setFont("6x8", 1);
+ g.drawString("5x5", W / 2, 42);
+ g.drawString("training app", W / 2, 55);
+ g.drawRect(19, 38, 100, 99);
+ const img = require("heatshrink").decompress(atob("lkdxH+AB/I5ASQACwpB5vNFkwpBAIfNFdZZkFYwskFZAsiFZBZiVYawEFf6ETFUwsIFUYmB54ADAwIskFYoRKBoIroB4grV58kkgCDFRotWFZwqHFiwYMFZIsTC5wLDFjGlCoWlkgJDRQIABCRAsLCwodCFAIABCwIOCFQYABr4RCCQIrMC4gqEAAwpFFZosFC5ArHFQ4rFNYQrGEgosMBxIrFLQwrLAB4sFSw4rFFjYrQFi4rNbASeEFjIoJFQYsGMAgAPEQgAIGwosCRoorbA="));
+ g.drawImage(img, 40, 70);
+ g.flip();
+
+ let flasher = false;
+ let bgCol, txtCol;
+ const i = setInterval(() => {
+ if (flasher) {
+ bgCol = WHITE;
+ txtCol = RED;
+ } else {
+ bgCol = RED;
+ txtCol = WHITE;
+ }
+ flasher = !flasher;
+ g.setColor(bgCol);
+ g.fillRect(0, 108, W, 120);
+ g.setColor(txtCol);
+ g.drawString("Press btn to begin", W / 2, 110);
+ g.flip();
+ }, 250);
+
+ setWatch(()=>{
+ clearInterval(i);
+ setupMenu();
+ }, BTN1, {repeat: false});
+
+ setWatch(()=>{
+ clearInterval(i);
+ setupMenu();
+ }, BTN2, {repeat: false});
+
+ setWatch(()=>{
+ clearInterval(i);
+ setupMenu();
+ }, BTN3, {repeat: false});
+}
+
+function getWorkoutIndex() {
+ const workoutIdx = require("Storage").readJSON("buffgym-workout-index.json");
+ return workoutIdx;
+}
+
+function buildWorkout(fName) {
+ const Workout = require("buffgym-workout.js");
+ const workoutJSON = require("Storage").readJSON(fName);
+ const workout = Workout.fromJSON(workoutJSON, redraw);
+
+ return workout;
+}
+
+function saveWorkout(workout) {
+ const fName = getWorkoutIndex().find(w => w.title === workout.title).file;
+ require("Storage").writeJSON(fName, workout.toJSON());
+}
+
+drawSplash();
\ No newline at end of file
diff --git a/apps/buffgym/buffgym.html b/apps/buffgym/buffgym.html
new file mode 100644
index 000000000..3c18932e9
--- /dev/null
+++ b/apps/buffgym/buffgym.html
@@ -0,0 +1,250 @@
+
+
+
+
+
+ BuffGym
+
+ Enter in your weights for each exercise, start light and keep consistent with your training. The weight increment field is how much the app will increase your weights for an exercise if you successfully complete all the reps and sets for an exercise. Make sure its a value that matches the weights in your gym.
+
+
+ For more information on how to train this program refer the Stronglifts website
+
+
+
+ Upload
+
+
+
+
+
+
diff --git a/apps/buffgym/buffgym.png b/apps/buffgym/buffgym.png
new file mode 100755
index 000000000..9bde64cc4
Binary files /dev/null and b/apps/buffgym/buffgym.png differ
diff --git a/apps/calculator/ChangeLog b/apps/calculator/ChangeLog
new file mode 100644
index 000000000..3b9b23270
--- /dev/null
+++ b/apps/calculator/ChangeLog
@@ -0,0 +1,2 @@
+0.01: New App!
+0.02: fix precision rounding issue + no reset when equals pressed
diff --git a/apps/calculator/README.md b/apps/calculator/README.md
new file mode 100644
index 000000000..b25d355bf
--- /dev/null
+++ b/apps/calculator/README.md
@@ -0,0 +1,23 @@
+# Calculator
+
+Basic calculator reminiscent of MacOs's one. Handy for small calculus.
+
+
+
+## Features
+
+- add / substract / divide / multiply
+- handles floats
+- basic memory button
+
+## Controls
+
+- UP: BTN1
+- DOWN: BTN3
+- LEFT: BTN4
+- RIGHT: BTN5
+- SELECT: BTN2
+
+## Creator
+
+
diff --git a/apps/calculator/app.js b/apps/calculator/app.js
new file mode 100644
index 000000000..a736b715d
--- /dev/null
+++ b/apps/calculator/app.js
@@ -0,0 +1,392 @@
+/**
+ * BangleJS Calculator
+ *
+ * Original Author: Frederic Rousseau https://github.com/fredericrous
+ * Created: April 2020
+ */
+
+g.clear();
+Graphics.prototype.setFont7x11Numeric7Seg = function() {
+ this.setFontCustom(atob("ACAB70AYAwBgC94AAAAAAAAAAB7wAAPQhhDCGELwAAAAhDCGEMIXvAAeACAEAIAQPeAA8CEMIYQwhA8AB70IYQwhhCB4AAAIAQAgBAB7wAHvQhhDCGEL3gAPAhDCGEMIXvAAe9CCEEIIQPeAA94EIIQQghA8AB70AYAwBgCAAAAHgQghBCCF7wAHvQhhDCGEIAAAPehBCCEEIAAAAA=="), 46, atob("AgAHBwcHBwcHBwcHAAAAAAAAAAcHBwcHBw=="), 11);
+};
+
+var DEFAULT_SELECTION = '5';
+var BOTTOM_MARGIN = 10;
+var RIGHT_MARGIN = 20;
+var COLORS = {
+ // [normal, selected]
+ DEFAULT: ['#7F8183', '#A6A6A7'],
+ OPERATOR: ['#F99D1C', '#CA7F2A'],
+ SPECIAL: ['#65686C', '#7F8183']
+};
+
+var keys = {
+ '0': {
+ xy: [0, 200, 120, 240],
+ trbl: '2.00'
+ },
+ '.': {
+ xy: [120, 200, 180, 240],
+ trbl: '3=.0'
+ },
+ '=': {
+ xy: [181, 200, 240, 240],
+ trbl: '+==.',
+ color: COLORS.OPERATOR
+ },
+ '1': {
+ xy: [0, 160, 60, 200],
+ trbl: '4201'
+ },
+ '2': {
+ xy: [60, 160, 120, 200],
+ trbl: '5301'
+ },
+ '3': {
+ xy: [120, 160, 180, 200],
+ trbl: '6+.2'
+ },
+ '+': {
+ xy: [181, 160, 240, 200],
+ trbl: '-+=3',
+ color: COLORS.OPERATOR
+ },
+ '4': {
+ xy: [0, 120, 60, 160],
+ trbl: '7514'
+ },
+ '5': {
+ xy: [60, 120, 120, 160],
+ trbl: '8624'
+ },
+ '6': {
+ xy: [120, 120, 180, 160],
+ trbl: '9-35'
+ },
+ '-': {
+ xy: [181, 120, 240, 160],
+ trbl: '*-+6',
+ color: COLORS.OPERATOR
+ },
+ '7': {
+ xy: [0, 80, 60, 120],
+ trbl: 'R847'
+ },
+ '8': {
+ xy: [60, 80, 120, 120],
+ trbl: 'N957'
+ },
+ '9': {
+ xy: [120, 80, 180, 120],
+ trbl: '%*68'
+ },
+ '*': {
+ xy: [181, 80, 240, 120],
+ trbl: '/*-9',
+ color: COLORS.OPERATOR
+ },
+ 'R': {
+ xy: [0, 40, 60, 79],
+ trbl: 'RN7R',
+ color: COLORS.SPECIAL,
+ val: 'AC'
+ },
+ 'N': {
+ xy: [60, 40, 120, 79],
+ trbl: 'N%8R',
+ color: COLORS.SPECIAL,
+ val: '+/-'
+ },
+ '%': {
+ xy: [120, 40, 180, 79],
+ trbl: '%/9N',
+ color: COLORS.SPECIAL
+ },
+ '/': {
+ xy: [181, 40, 240, 79],
+ trbl: '//*%',
+ color: COLORS.OPERATOR
+ }
+};
+
+var selected = DEFAULT_SELECTION;
+var prevSelected = DEFAULT_SELECTION;
+var prevNumber = null;
+var currNumber = null;
+var operator = null;
+var results = null;
+var isDecimal = false;
+var hasPressedEquals = false;
+
+function drawKey(name, k, selected) {
+ var rMargin = 0;
+ var bMargin = 0;
+ var color = k.color || COLORS.DEFAULT;
+ g.setColor(color[selected ? 1 : 0]);
+ g.setFont('Vector', 20);
+ g.fillRect(k.xy[0], k.xy[1], k.xy[2], k.xy[3]);
+ g.setColor(-1);
+ // correct margins to center the texts
+ if (name == '0') {
+ rMargin = (RIGHT_MARGIN * 2) - 7;
+ } else if (name === '/') {
+ rMargin = 5;
+ } else if (name === '*') {
+ bMargin = 5;
+ rMargin = 3;
+ } else if (name === '-') {
+ rMargin = 3;
+ } else if (name === 'R' || name === 'N') {
+ rMargin = k.val === 'C' ? 0 : -9;
+ } else if (name === '%') {
+ rMargin = -3;
+ }
+ g.drawString(k.val || name, k.xy[0] + RIGHT_MARGIN + rMargin, k.xy[1] + BOTTOM_MARGIN + bMargin);
+}
+
+function getIntWithPrecision(x) {
+ var xStr = x.toString();
+ var xRadix = xStr.indexOf('.');
+ var xPrecision = xRadix === -1 ? 0 : xStr.length - xRadix - 1;
+ return {
+ num: Number(xStr.replace('.', '')),
+ p: xPrecision
+ };
+}
+
+function multiply(x, y) {
+ var xNum = getIntWithPrecision(x);
+ var yNum = getIntWithPrecision(y);
+ return xNum.num * yNum.num / Math.pow(10, xNum.p + yNum.p);
+}
+
+function divide(x, y) {
+ var xNum = getIntWithPrecision(x);
+ var yNum = getIntWithPrecision(y);
+ return xNum.num / yNum.num / Math.pow(10, xNum.p - yNum.p);
+}
+
+function sum(x, y) {
+ let xNum = getIntWithPrecision(x);
+ let yNum = getIntWithPrecision(y);
+
+ let diffPrecision = Math.abs(xNum.p - yNum.p);
+ if (diffPrecision > 0) {
+ if (xNum.p > yNum.p) {
+ yNum.num = yNum.num * Math.pow(10, diffPrecision);
+ } else {
+ xNum.num = xNum.num * Math.pow(10, diffPrecision);
+ }
+ }
+ return (xNum.num + yNum.num) / Math.pow(10, Math.max(xNum.p, yNum.p));
+}
+
+function subtract(x, y) {
+ return sum(x, -y);
+}
+
+function doMath(x, y, operator) {
+ switch (operator) {
+ case '/':
+ return divide(x, y);
+ case '*':
+ return multiply(x, y);
+ case '+':
+ return sum(x, y);
+ case '-':
+ return subtract(x, y);
+ }
+}
+
+function displayOutput(num) {
+ var len;
+ var minusMarge = 0;
+ g.setColor(0);
+ g.fillRect(0, 0, 240, 39);
+ g.setColor(-1);
+ if (num === Infinity || num === -Infinity || isNaN(num)) {
+ // handle division by 0
+ if (num === Infinity) {
+ num = 'INFINITY';
+ } else if (num === -Infinity) {
+ num = '-INFINITY';
+ } else {
+ num = 'NOT A NUMBER';
+ minusMarge = -25;
+ }
+ len = (num + '').length;
+ currNumber = null;
+ results = null;
+ isDecimal = false;
+ hasPressedEquals = false;
+ prevNumber = null;
+ operator = null;
+ keys.R.val = 'AC';
+ drawKey('R', keys.R);
+ g.setFont('Vector', 22);
+ } else {
+ // might not be a number due to display of dot "."
+ var numNumeric = Number(num);
+
+ if (typeof num === 'string') {
+ if (num.indexOf('.') !== -1) {
+ // display a 0 before a lonely dot
+ if (numNumeric == 0) {
+ num = '0.';
+ }
+ } else {
+ // remove preceding 0
+ while (num.length > 1 && num[0] === '0')
+ num = num.substr(1);
+ }
+ }
+
+ len = (num + '').length;
+ if (numNumeric < 0 || (numNumeric === 0 && 1/numNumeric === -Infinity)) {
+ // minus is not available in font 7x11Numeric7Seg, we use Vector
+ g.setFont('Vector', 20);
+ g.drawString('-', 220 - (len * 15), 10);
+ minusMarge = 15;
+ }
+ g.setFont('7x11Numeric7Seg', 2);
+ }
+ g.drawString(num, 220 - (len * 15) + minusMarge, 10);
+}
+var wasPressedEquals = false;
+var hasPressedNumber = false;
+function calculatorLogic(x) {
+ if (wasPressedEquals && hasPressedNumber !== false) {
+ prevNumber = null;
+ currNumber = hasPressedNumber;
+ wasPressedEquals = false;
+ hasPressedNumber = false;
+ return;
+ }
+ if (hasPressedEquals) {
+ if (hasPressedNumber) {
+ prevNumber = null;
+ hasPressedNumber = false;
+ operator = null;
+ } else {
+ currNumber = null;
+ prevNumber = results;
+ }
+ hasPressedEquals = false;
+ wasPressedEquals = true;
+ }
+
+ if (currNumber == null && operator != null && '/*-+'.indexOf(x) !== -1) {
+ operator = x;
+ displayOutput(prevNumber);
+ } else if (prevNumber != null && currNumber != null && operator != null) {
+ // we execute the calculus only when there was a previous number entered before and an operator
+ results = doMath(prevNumber, currNumber, operator);
+ operator = x;
+ prevNumber = results;
+ currNumber = null;
+ displayOutput(results);
+ } else if (prevNumber == null && currNumber != null && operator == null) {
+ // no operator yet, save the current number for later use when an operator is pressed
+ operator = x;
+ prevNumber = currNumber;
+ currNumber = null;
+ displayOutput(prevNumber);
+ } else if (prevNumber == null && currNumber == null && operator == null) {
+ displayOutput(0);
+ }
+}
+
+function buttonPress(val) {
+ switch (val) {
+ case 'R':
+ currNumber = null;
+ results = null;
+ isDecimal = false;
+ hasPressedEquals = false;
+ if (keys.R.val == 'AC') {
+ prevNumber = null;
+ operator = null;
+ } else {
+ keys.R.val = 'AC';
+ drawKey('R', keys.R, true);
+ }
+ wasPressedEquals = false;
+ hasPressedNumber = false;
+ displayOutput(0);
+ break;
+ case '%':
+ if (results != null) {
+ displayOutput(results /= 100);
+ } else if (currNumber != null) {
+ displayOutput(currNumber /= 100);
+ }
+ hasPressedNumber = false;
+ break;
+ case 'N':
+ if (results != null) {
+ displayOutput(results *= -1);
+ } else {
+ displayOutput(currNumber *= -1);
+ }
+ break;
+ case '/':
+ case '*':
+ case '-':
+ case '+':
+ calculatorLogic(val);
+ hasPressedNumber = false;
+ break;
+ case '.':
+ keys.R.val = 'C';
+ drawKey('R', keys.R);
+ isDecimal = true;
+ displayOutput(currNumber == null ? 0 + '.' : currNumber + '.');
+ break;
+ case '=':
+ if (prevNumber != null && currNumber != null && operator != null) {
+ results = doMath(prevNumber, currNumber, operator);
+ prevNumber = results;
+ displayOutput(results);
+ hasPressedEquals = 1;
+ }
+ hasPressedNumber = false;
+ break;
+ default:
+ keys.R.val = 'C';
+ drawKey('R', keys.R);
+ const is0Negative = (currNumber === 0 && 1/currNumber === -Infinity);
+ if (isDecimal) {
+ currNumber = currNumber == null || hasPressedEquals === 1 ? 0 + '.' + val : currNumber + '.' + val;
+ isDecimal = false;
+ } else {
+ currNumber = currNumber == null || hasPressedEquals === 1 ? val : (is0Negative ? '-' + val : currNumber + val);
+ }
+ if (hasPressedEquals === 1) {
+ hasPressedEquals = 2;
+ }
+ hasPressedNumber = currNumber;
+ displayOutput(currNumber);
+ break;
+ }
+}
+
+for (var k in keys) {
+ if (keys.hasOwnProperty(k)) {
+ drawKey(k, keys[k], k == '5');
+ }
+}
+g.setFont('7x11Numeric7Seg', 2.8);
+g.drawString('0', 205, 10);
+
+function moveDirection(d) {
+ drawKey(selected, keys[selected]);
+ prevSelected = selected;
+ selected = (d === 0 && selected == '0' && prevSelected === '1') ? '1' : keys[selected].trbl[d];
+ drawKey(selected, keys[selected], true);
+}
+
+setWatch(_ => moveDirection(0), BTN1, {repeat: true, debounce: 100});
+setWatch(_ => moveDirection(2), BTN3, {repeat: true, debounce: 100});
+setWatch(_ => moveDirection(3), BTN4, {repeat: true, debounce: 100});
+setWatch(_ => moveDirection(1), BTN5, {repeat: true, debounce: 100});
+setWatch(_ => buttonPress(selected), BTN2, {repeat: true, debounce: 100});
diff --git a/apps/calculator/calculator-icon.js b/apps/calculator/calculator-icon.js
new file mode 100644
index 000000000..94158e7d2
--- /dev/null
+++ b/apps/calculator/calculator-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwhBC/AC8r6/XlYvr64CEF9UrMIIv/R/7vTMwIAmlUklQGDroAFqwHGBRgJBqwMDq+k5nNABAWDC4QZFERAvGBQOBF5I0FCYNW1mImWs6+sDoQsDAYIJEAAeB2eB1mBA4QvF43P6/GF4mB6+BAQYlEro3BAAI3FDAezBYgvE43O64DBF4hbCAAMrGAIiFBYRUEHogaBxA6CF4vXLwPHF4giEDIIkDDgI2BFoI6FBgYWCF5PPF4rSBKwVWI4bAFFgdcYAykBX5HX53NFwfNfwIkDAQYAGBBAKCIIYABd4y9DAAJ9CAD9dF4gAGCIi8BABLXBBRQLEF4vHRwgvEERQ6DHpgvH66PB65fUBpZfJ4/G6wxBMIaPbL5QvB6/WF6hqNF5KPDF6jkGd6JeBF5AAdF4oAGDBeH1mHAAwIBF8esABQvdWQonDX4YvIYAq/GXobvNF4hfKCwwvF43GF5AXGL44vJLwgvE453DMIYuFR5JiHI4yPHRoaREIwpIFF7TvbR5BJCX5IvMADgvcroABF6vG4wvIX46DKBZYvEFwPHGAgZHERALRF4YuBHYIwEFxxfPF5CDDF6ZfLDAyPFFwovFKRYvV47vDAgIvRR5aOFL4orCFwbvHADYvEAA4YLdRYvQ45eBR5C6UF5vHX4LvJF8PGZYXXGAYvnLYYvfZ4xfXd6AvKGAK/RDAKNTF4wAG44="))
diff --git a/apps/calculator/calculator.png b/apps/calculator/calculator.png
new file mode 100644
index 000000000..8362c9200
Binary files /dev/null and b/apps/calculator/calculator.png differ
diff --git a/apps/calculator/tests.html b/apps/calculator/tests.html
new file mode 100644
index 000000000..1cbfdf617
--- /dev/null
+++ b/apps/calculator/tests.html
@@ -0,0 +1,273 @@
+
+
+
+
+
+ Calculator tests
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/calendar/ChangeLog b/apps/calendar/ChangeLog
new file mode 100644
index 000000000..3cf79ffe8
--- /dev/null
+++ b/apps/calendar/ChangeLog
@@ -0,0 +1 @@
+0.01: Basic calendar
diff --git a/apps/calendar/README.md b/apps/calendar/README.md
new file mode 100644
index 000000000..19a60afc0
--- /dev/null
+++ b/apps/calendar/README.md
@@ -0,0 +1,8 @@
+# Calendar
+
+Basic calendar
+
+## Usage
+
+- Use `BTN4` (left screen tap) to go to the previous month
+- Use `BTN5` (right screen tap) to go to the next month
diff --git a/apps/calendar/calendar-icon.js b/apps/calendar/calendar-icon.js
new file mode 100644
index 000000000..ed1bf3667
--- /dev/null
+++ b/apps/calendar/calendar-icon.js
@@ -0,0 +1,5 @@
+require("heatshrink").decompress(
+ atob(
+ "mEwxH+AH4A/ADuIUCARRDhgePCKIv13YAEDoYJFAA4RJFyQvcGBYRGy4dDy4uLCJgv/DoOBDgOBF5oRLF6IeBDgIvNCJYvQDwQuNCJovRADov/F9OsAEgv/F/4vhwIACAqYv/F/4vnd94vvX/4v/F/7vvF96//F/4v/d94v/F/4wsFxQwjFxgA/AH4A/AH4AZA=="
+ )
+)
diff --git a/apps/calendar/calendar.js b/apps/calendar/calendar.js
new file mode 100644
index 000000000..720986162
--- /dev/null
+++ b/apps/calendar/calendar.js
@@ -0,0 +1,160 @@
+const maxX = 240;
+const maxY = 240;
+const rowN = 7;
+const colN = 7;
+const headerH = maxY / 7;
+const rowH = (maxY - headerH) / rowN;
+const colW = maxX / colN;
+const color1 = "#035AA6";
+const color2 = "#4192D9";
+const color3 = "#026873";
+const color4 = "#038C8C";
+const color5 = "#03A696";
+const black = "#000000";
+const white = "#ffffff";
+const gray1 = "#444444";
+const gray2 = "#888888";
+const gray3 = "#bbbbbb";
+const red = "#d41706";
+
+function drawCalendar(date) {
+ g.setBgColor(color4);
+ g.clearRect(0, 0, maxX, maxY);
+ g.setBgColor(color1);
+ g.clearRect(0, 0, maxX, headerH);
+ g.setBgColor(color2);
+ g.clearRect(0, headerH, maxX, headerH + rowH);
+ g.setBgColor(color3);
+ g.clearRect(colW * 5, headerH + rowH, maxX, maxY);
+ for (let y = headerH; y < maxY; y += rowH) {
+ g.drawLine(0, y, maxX, y);
+ }
+ for (let x = 0; x < maxX; x += colW) {
+ g.drawLine(x, headerH, x, maxY);
+ }
+
+ const month = date.getMonth();
+ const year = date.getFullYear();
+ const monthMap = {
+ 0: "January",
+ 1: "February",
+ 2: "March",
+ 3: "April",
+ 4: "May",
+ 5: "June",
+ 6: "July",
+ 7: "August",
+ 8: "September",
+ 9: "October",
+ 10: "November",
+ 11: "December"
+ };
+ g.setFontAlign(0, 0);
+ g.setFont("6x8", 2);
+ g.setColor(white);
+ g.drawString(`${monthMap[month]} ${year}`, maxX / 2, headerH / 2);
+ g.drawPoly([10, headerH / 2, 20, 10, 20, headerH - 10], true);
+ g.drawPoly(
+ [maxX - 10, headerH / 2, maxX - 20, 10, maxX - 20, headerH - 10],
+ true
+ );
+
+ g.setFont("6x8", 2);
+ const dowLbls = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
+ dowLbls.forEach((lbl, i) => {
+ g.drawString(lbl, i * colW + colW / 2, headerH + rowH / 2);
+ });
+
+ date.setDate(1);
+ const dow = date.getDay();
+ const dowNorm = dow === 0 ? 7 : dow;
+
+ const monthMaxDayMap = {
+ 0: 31,
+ 1: (2020 - year) % 4 === 0 ? 29 : 28,
+ 2: 31,
+ 3: 30,
+ 4: 31,
+ 5: 30,
+ 6: 31,
+ 7: 31,
+ 8: 30,
+ 9: 31,
+ 10: 30,
+ 11: 31
+ };
+
+ let days = [];
+ let nextMonthDay = 1;
+ let thisMonthDay = 51;
+ let prevMonthDay = monthMaxDayMap[month > 0 ? month - 1 : 11] - dowNorm;
+ for (let i = 0; i < colN * (rowN - 1) + 1; i++) {
+ if (i < dowNorm) {
+ days.push(prevMonthDay);
+ prevMonthDay++;
+ } else if (thisMonthDay <= monthMaxDayMap[month] + 50) {
+ days.push(thisMonthDay);
+ thisMonthDay++;
+ } else {
+ days.push(nextMonthDay);
+ nextMonthDay++;
+ }
+ }
+
+ let i = 0;
+ for (y = 0; y < rowN - 1; y++) {
+ for (x = 0; x < colN; x++) {
+ i++;
+ const day = days[i];
+ const isToday =
+ today.year === year && today.month === month && today.day === day - 50;
+ if (isToday) {
+ g.setColor(red);
+ g.drawRect(
+ x * colW,
+ y * rowH + headerH + rowH,
+ x * colW + colW - 1,
+ y * rowH + headerH + rowH + rowH
+ );
+ }
+ g.setColor(day < 50 ? gray3 : white);
+ g.drawString(
+ (day > 50 ? day - 50 : day).toString(),
+ x * colW + colW / 2,
+ headerH + rowH + y * rowH + rowH / 2
+ );
+ }
+ }
+}
+
+const date = new Date();
+const today = {
+ day: date.getDate(),
+ month: date.getMonth(),
+ year: date.getFullYear()
+};
+drawCalendar(date);
+clearWatch();
+setWatch(
+ () => {
+ const month = date.getMonth();
+ const prevMonth = month > 0 ? month - 1 : 11;
+ if (prevMonth === 11) date.setFullYear(date.getFullYear() - 1);
+ date.setMonth(prevMonth);
+ drawCalendar(date);
+ },
+ BTN4,
+ { repeat: true }
+);
+setWatch(
+ () => {
+ const month = date.getMonth();
+ const prevMonth = month < 11 ? month + 1 : 0;
+ if (prevMonth === 0) date.setFullYear(date.getFullYear() + 1);
+ date.setMonth(month + 1);
+ drawCalendar(date);
+ },
+ BTN5,
+ { repeat: true }
+);
+setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" });
diff --git a/apps/calendar/calendar.png b/apps/calendar/calendar.png
new file mode 100644
index 000000000..056cab3b7
Binary files /dev/null and b/apps/calendar/calendar.png differ
diff --git a/apps/chrono/chrono-icon.js b/apps/chrono/chrono-icon.js
new file mode 100644
index 000000000..580713825
--- /dev/null
+++ b/apps/chrono/chrono-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwglihGIxAWUwADBDCYTDhAXSFwQEGIxowBL4QXTx///AXWF6qnBwCTDO6EIF4KnEDwLWO/4QFx7FNdwQQEGwP4GBYUB/4QBDIYXMIgQAEDIIKCVwItJFggFEx4uKCAQUBX4QDC/B2KhASCAQP/AQQcDLpQlCLgQsCCoIGBC5IkCFon/xwxCDgIXJFwYxFHIR3ILwIkBCIeIFwQHBHgReIJAgCBOoP+MYZIHhB1EDgIRBA4ZIJC4LrEMYvoAgQXJxHvI4gtDC5OIF4QSDbYY3EC5QAKG4QXNPwg0BSBAJCIQhLCDwgXKIAwXUMo4XPFwrwKC4YOCUooVCR453DIxIXJU4IqDxwXJa45FDdgxnEC40IC4TbINQYXIRQZwDAAXv/xuBCwoXBVAgXDA4wXGSARcEC4o7BRwx4DOon+C4YiCLwxIDDAobDEYJGIGAYYBxDAD9AJDC5IwCDIYACJARGIDAapDaooWLDAZhEAoIWNMggADCqAAPA"))
\ No newline at end of file
diff --git a/apps/chrono/chrono.js b/apps/chrono/chrono.js
new file mode 100644
index 000000000..cd50b8a22
--- /dev/null
+++ b/apps/chrono/chrono.js
@@ -0,0 +1,73 @@
+function msToTime(duration) {
+ var milliseconds = parseInt((duration % 1000) / 100),
+ seconds = Math.floor((duration / 1000) % 60),
+ minutes = Math.floor((duration / (1000 * 60)) % 60),
+ hours = Math.floor((duration / (1000 * 60 * 60)) % 24);
+
+ hours = (hours < 10) ? "0" + hours : hours;
+ minutes = (minutes < 10) ? "0" + minutes : minutes;
+ seconds = (seconds < 10) ? "0" + seconds : seconds;
+
+ return hours + ":" + minutes + ":" + seconds;
+}
+
+
+var counter = 0;
+var started = false;
+
+function drawInterface() {
+ g.clear();
+ g.setFontAlign(0, 0);
+ g.setFont("6x8", 2);
+ g.drawString("+5m", g.getWidth() - 30, 30);
+ g.drawString("+30s", g.getWidth() - 30, g.getHeight() / 2);
+ g.drawString("+5s", g.getWidth() - 30, g.getHeight() - 30);
+
+ g.setFontAlign(0, 0); // center font
+ g.setFont("6x8", 3);
+ // draw the current counter value
+
+ g.drawString(msToTime(counter * 1000), g.getWidth() / 2 - 30, g.getHeight() / 2);
+ // optional - this keeps the watch LCD lit up
+ g.flip();
+}
+
+function countDown() {
+ if (counter > 0) {
+ if (started) {
+ counter--;
+ drawInterface();
+ }
+ } else {
+ if (started) {
+ Bangle.buzz();
+ }
+ }
+}
+
+setWatch((p) => {
+ if (p.time - p.lastTime < 0.1) {
+ counter = 0;
+ started = false;
+ } else {
+ counter += 60 * 5;
+ }
+ drawInterface();
+}, BTN1, { repeat: true });
+
+setWatch(() => {
+ counter += 30;
+ drawInterface();
+}, BTN2, { repeat: true });
+
+setWatch(() => {
+ counter += 5;
+ drawInterface();
+}, BTN3, { repeat: true });
+
+Bangle.on('touch', function (button) {
+ started = !started;
+});
+
+var interval = setInterval(countDown, 1000);
+drawInterface();
\ No newline at end of file
diff --git a/apps/chrono/chrono.png b/apps/chrono/chrono.png
new file mode 100644
index 000000000..c1aaf180d
Binary files /dev/null and b/apps/chrono/chrono.png differ
diff --git a/apps/chronowid/ChangeLog b/apps/chronowid/ChangeLog
new file mode 100644
index 000000000..e173467a1
--- /dev/null
+++ b/apps/chronowid/ChangeLog
@@ -0,0 +1,3 @@
+0.01: New widget and app!
+0.02: Setting to reset values, timer buzzes at 00:00 and not later (see readme)
+0.03: Display only minutes:seconds when less than 1 hour left
\ No newline at end of file
diff --git a/apps/chronowid/README.md b/apps/chronowid/README.md
new file mode 100644
index 000000000..f422dd956
--- /dev/null
+++ b/apps/chronowid/README.md
@@ -0,0 +1,38 @@
+# Chronometer Widget
+
+Chronometer (timer) that runs as a widget.
+The advantage is, that you can still see your normal watchface and other widgets when the timer is running.
+The widget is always active, but only shown when the timer is on.
+Hours, minutes, seconds and timer status can be set with an app.
+
+Depending on when you start the timer, it may alert up to 0,999 seconds early. This is because it checks only for full seconds. When there is less than one seconds left, it buzzes. This cannot be avoided without checking more than every second, which I would like to avoid.
+
+## Screenshots
+
+TBD
+
+## Features
+
+* Using other apps does not interrupt the timer, no need to keep the widget open (BUT: there will be no buzz when the time is up, for that the widget has to be loaded)
+* Target time is saved to a file and timer picks up again when widget is loaded again.
+
+## Settings
+
+There are no settings section in the settings app, timer can be set using an app.
+
+* Reset values: Reset hours, minutes, seconds to 0; set timer on to false; write to settings file
+* Hours: Set the hours for the timer
+* Minutes: Set the minutes for the timer
+* Seconds: Set the seconds for the timer
+* Timer on: Starts the timer and displays the widget when set to 'On'. You have to leave the app to load the widget which starts the timer. The widget is always there, but only visible when timer is on.
+
+
+## Releases
+
+* Offifical app loader: https://github.com/espruino/BangleApps/tree/master/apps/chronowid (https://banglejs.com/apps/)
+* Forked app loader: https://github.com/Purple-Tentacle/BangleApps/tree/master/apps/chronowid (https://purple-tentacle.github.io/BangleApps/index.html#)
+* Development: https://github.com/Purple-Tentacle/BangleAppsDev/tree/master/apps/chronowid
+
+## Requests
+
+If you have any feature requests, please write here: http://forum.espruino.com/conversations/345972/
\ No newline at end of file
diff --git a/apps/chronowid/app-icon.js b/apps/chronowid/app-icon.js
new file mode 100644
index 000000000..db2010218
--- /dev/null
+++ b/apps/chronowid/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwIFCn/8BYYFRABcD4AFFgIFCh/wgeAAoP//8HCYMDAoPD8EAg4FB8PwgEf+EP/H4HQOAgP8uEAvwfBv0ggBFCn4CB/EBwEfgEB+AFBh+AgfgAoI1BIoQJB4AHBAoXgg4uBAIIFCCYQFGh5rDJQJUBK4IFCNYIFVDoopDGoJiBHYYFKVYRZBWIYDBA4IFBNIQzBG4IbBToKkBAQKVFUIYICVoQUCXIQmCYoIsCaITqDAoLvDNYUAA="))
\ No newline at end of file
diff --git a/apps/chronowid/app.js b/apps/chronowid/app.js
new file mode 100644
index 000000000..0cacdee23
--- /dev/null
+++ b/apps/chronowid/app.js
@@ -0,0 +1,98 @@
+g.clear();
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+
+const storage = require('Storage');
+const boolFormat = v => v ? "On" : "Off";
+let settingsChronowid;
+
+function updateSettings() {
+ var now = new Date();
+ const goal = new Date(now.getFullYear(), now.getMonth(), now.getDate(),
+ now.getHours() + settingsChronowid.hours, now.getMinutes() + settingsChronowid.minutes, now.getSeconds() + settingsChronowid.seconds);
+ settingsChronowid.goal = goal.getTime();
+ storage.writeJSON('chronowid.json', settingsChronowid);
+}
+
+function resetSettings() {
+ settingsChronowid = {
+ hours : 0,
+ minutes : 0,
+ seconds : 0,
+ started : false,
+ counter : 0,
+ goal : 0,
+ };
+ updateSettings();
+}
+
+settingsChronowid = storage.readJSON('chronowid.json',1);
+if (!settingsChronowid) resetSettings();
+
+E.on('kill', () => {
+ updateSettings();
+});
+
+function showMenu() {
+ const timerMenu = {
+ '': {
+ 'title': 'Set timer',
+ 'predraw': function() {
+ timerMenu.hours.value = settingsChronowid.hours;
+ timerMenu.minutes.value = settingsChronowid.minutes;
+ timerMenu.seconds.value = settingsChronowid.seconds;
+ timerMenu.started.value = settingsChronowid.started;
+ }
+ },
+ 'Reset values': function() {
+ settingsChronowid.hours = 0;
+ settingsChronowid.minutes = 0;
+ settingsChronowid.seconds = 0;
+ settingsChronowid.started = false;
+ updateSettings();
+ showMenu();
+ },
+ 'Hours': {
+ value: settingsChronowid.hours,
+ min: 0,
+ max: 24,
+ step: 1,
+ onchange: v => {
+ settingsChronowid.hours = v;
+ updateSettings();
+ }
+ },
+ 'Minutes': {
+ value: settingsChronowid.minutes,
+ min: 0,
+ max: 59,
+ step: 1,
+ onchange: v => {
+ settingsChronowid.minutes = v;
+ updateSettings();
+ }
+ },
+ 'Seconds': {
+ value: settingsChronowid.seconds,
+ min: 0,
+ max: 59,
+ step: 1,
+ onchange: v => {
+ settingsChronowid.seconds = v;
+ updateSettings();
+ }
+ },
+ 'Timer on': {
+ value: settingsChronowid.started,
+ format: boolFormat,
+ onchange: v => {
+ settingsChronowid.started = v;
+ updateSettings();
+ }
+ },
+ };
+ timerMenu['-Exit-'] = ()=>{load();};
+ return E.showMenu(timerMenu);
+}
+
+showMenu();
\ No newline at end of file
diff --git a/apps/chronowid/app.png b/apps/chronowid/app.png
new file mode 100644
index 000000000..5ac7a480c
Binary files /dev/null and b/apps/chronowid/app.png differ
diff --git a/apps/chronowid/widget.js b/apps/chronowid/widget.js
new file mode 100644
index 000000000..f0e785efd
--- /dev/null
+++ b/apps/chronowid/widget.js
@@ -0,0 +1,93 @@
+(() => {
+ const storage = require('Storage');
+ settingsChronowid = storage.readJSON("chronowid.json",1)||{}; //read settingsChronowid from file
+ var height = 23;
+ var width = 58;
+ var interval = 0; //used for the 1 second interval timer
+ var now = new Date();
+
+ var time = 0;
+ var diff = settingsChronowid.goal - now;
+
+ //Convert ms to time
+ function getTime(t) {
+ var milliseconds = parseInt((t % 1000) / 100),
+ seconds = Math.floor((t / 1000) % 60),
+ minutes = Math.floor((t / (1000 * 60)) % 60),
+ hours = Math.floor((t / (1000 * 60 * 60)) % 24);
+
+ hours = (hours < 10) ? "0" + hours : hours;
+ minutes = (minutes < 10) ? "0" + minutes : minutes;
+ seconds = (seconds < 10) ? "0" + seconds : seconds;
+
+ return hours + ":" + minutes + ":" + seconds;
+ }
+
+ function printDebug() {
+ print ("Nowtime: " + getTime(now));
+ print ("Now: " + now);
+ print ("Goaltime: " + getTime(settingsChronowid.goal));
+ print ("Goal: " + settingsChronowid.goal);
+ print("Difftime: " + getTime(diff));
+ print("Diff: " + diff);
+ print ("Started: " + settingsChronowid.started);
+ print ("----");
+ }
+
+ //counts down, calculates and displays
+ function countDown() {
+ now = new Date();
+ diff = settingsChronowid.goal - now; //calculate difference
+ WIDGETS["chronowid"].draw();
+ //time is up
+ if (settingsChronowid.started && diff < 1000) {
+ Bangle.buzz(1500);
+ //write timer off to file
+ settingsChronowid.started = false;
+ storage.writeJSON('chronowid.json', settingsChronowid);
+ clearInterval(interval); //stop interval
+ }
+ //printDebug();
+ }
+
+ // draw your widget
+ function draw() {
+ if (!settingsChronowid.started) {
+ width = 0;
+ return; //do not draw anything if timer is not started
+ }
+ g.reset();
+ if (diff >= 0) {
+ if (diff < 3600000) { //less than 1 hour left
+ width = 58;
+ g.clearRect(this.x,this.y,this.x+width,this.y+height);
+ g.setFont("6x8", 2);
+ g.drawString(getTime(diff).substring(3), this.x+1, this.y+5); //remove hour part 00:00:00 -> 00:00
+ }
+ if (diff >= 3600000) { //one hour or more left
+ width = 48;
+ g.clearRect(this.x,this.y,this.x+width,this.y+height);
+ g.setFont("6x8", 1);
+ g.drawString(getTime(diff), this.x+1, this.y+((height/2)-4)); //display hour 00:00:00
+ }
+ }
+ // not needed anymoe, because we check if diff < 1000 now, so 00:00 is displayed.
+ // else {
+ // width = 58;
+ // g.clearRect(this.x,this.y,this.x+width,this.y+height);
+ // g.setFont("6x8", 2);
+ // g.drawString("END", this.x+15, this.y+5);
+ // }
+ }
+
+ if (settingsChronowid.started) interval = setInterval(countDown, 1000); //start countdown each second
+
+ // add the widget
+ WIDGETS["chronowid"]={area:"bl",width:width,draw:draw,reload:function() {
+ reload();
+ Bangle.drawWidgets(); // relayout all widgets
+ }};
+
+ //printDebug();
+ countDown();
+})();
\ No newline at end of file
diff --git a/apps/clickms/click-master.js b/apps/clickms/click-master.js
index b9f76364b..55027e733 100644
--- a/apps/clickms/click-master.js
+++ b/apps/clickms/click-master.js
@@ -7,12 +7,12 @@ setWatch(x=>{
},BTN1,{repeat:true});
function updateAdvertising() {
-try {
- NRF.setAdvertising({},{
- manufacturer: 0x0590,
- manufacturerData: new Uint8Array([mycounter>>8,mycounter&255])
- });
-} catch(e){}
+ try {
+ NRF.setAdvertising({},{
+ manufacturer: 0x0590,
+ manufacturerData: new Uint8Array([mycounter>>8,mycounter&255])
+ });
+ } catch(e){}
}
function drawPlayers() {
diff --git a/apps/cliock/ChangeLog b/apps/cliock/ChangeLog
new file mode 100644
index 000000000..59f07c400
--- /dev/null
+++ b/apps/cliock/ChangeLog
@@ -0,0 +1,2 @@
+0.07: Submitted to App Loader
+0.08: Fixes issue where face would redraw on wake leading to all memory being used and watch crashing.
diff --git a/apps/cliock/app-icon.js b/apps/cliock/app-icon.js
new file mode 100644
index 000000000..fab023339
--- /dev/null
+++ b/apps/cliock/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("kEgwkBiIA/ACBhLB6gqKB6g//B6I4DiDqCB40QB4MBAoIXDB40BAIIPNG44PLAoQvMB5RPEB5JvEBAav1f7wA/ABoA=="))
diff --git a/apps/cliock/app.js b/apps/cliock/app.js
new file mode 100644
index 000000000..a94b7264d
--- /dev/null
+++ b/apps/cliock/app.js
@@ -0,0 +1,51 @@
+var fontsize = 3;
+var locale = require("locale");
+var marginTop = 40;
+var flag = false;
+var WeekDays = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
+
+function drawAll(){
+ updateTime();
+ updateRest(new Date());
+}
+
+function updateRest(now){
+ let date = locale.date(now,false);
+ writeLine(WeekDays[now.getDay()],1);
+ writeLine(date,2);
+}
+function updateTime(){
+ if (!Bangle.isLCDOn()) return;
+ let now = new Date();
+ let h = now.getHours();
+ let m = now.getMinutes();
+ h = h>=10?h:"0"+h;
+ m = m>=10?m:"0"+m;
+ writeLine(h+":"+m,0);
+ writeLine(flag?" ":"_",3);
+ flag = !flag;
+ if(now.getMinutes() == 0)
+ updateRest(now);
+}
+function writeLineStart(line){
+ g.drawString(">",4,marginTop+line*30);
+}
+function writeLine(str,line){
+ g.setFont("6x8",fontsize);
+ g.setColor(0,1,0);
+ g.setFontAlign(-1,-1);
+ g.clearRect(0,marginTop+line*30,((str.length+1)*20),marginTop+25+line*30);
+ writeLineStart(line);
+ g.drawString(str,25,marginTop+line*30);
+}
+
+g.clear();
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+drawAll();
+Bangle.on('lcdPower',function(on) {
+ if (on)
+ drawAll();
+});
+var click = setInterval(updateTime, 1000);
+setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
diff --git a/apps/cliock/app.png b/apps/cliock/app.png
new file mode 100644
index 000000000..4ad2d056d
Binary files /dev/null and b/apps/cliock/app.png differ
diff --git a/apps/clock2x3/clock2x3-app.js b/apps/clock2x3/clock2x3-app.js
index 511a7662b..4caec28cb 100644
--- a/apps/clock2x3/clock2x3-app.js
+++ b/apps/clock2x3/clock2x3-app.js
@@ -14,9 +14,9 @@ const x21=x20+pw+ps;
const x30=x21+pw+ds;
const x31=x30+pw+ps;
const xSpace=[[x00,x01], // all pixel x spacing
- [x10,x11],
- [x20,x21],
- [x30,x31]];
+ [x10,x11],
+ [x20,x21],
+ [x30,x31]];
const y0=oy; // y spacing
const y1=y0+pw+ps;
@@ -24,35 +24,35 @@ const y2=y1+pw+ps;
const ySpace=[y0, y1, y2];
const pixels = [[[0,0], // digit on/off pixels
- [1,1],
- [1,1]],
- [[0,1], // digit 1
- [0,1],
- [0,1]],
- [[0,1],
- [1,0],
- [1,1]],
- [[1,1],
- [0,1],
- [1,1]],
- [[1,0],
- [1,1],
- [0,1]],
- [[1,1],
- [1,0],
- [0,1]],
- [[1,0],
- [1,1],
- [1,1]],
- [[1,1],
- [0,1],
- [0,1]],
- [[1,1],
- [1,1],
- [1,1]],
- [[1,1],
- [1,1],
- [0,1]]];
+ [1,1],
+ [1,1]],
+[[0,1], // digit 1
+ [0,1],
+ [0,1]],
+[[0,1],
+ [1,0],
+ [1,1]],
+[[1,1],
+ [0,1],
+ [1,1]],
+[[1,0],
+ [1,1],
+ [0,1]],
+[[1,1],
+ [1,0],
+ [0,1]],
+[[1,0],
+ [1,1],
+ [1,1]],
+[[1,1],
+ [0,1],
+ [0,1]],
+[[1,1],
+ [1,1],
+ [1,1]],
+[[1,1],
+ [1,1],
+ [0,1]]];
let idTimeout = null;
diff --git a/apps/compass/ChangeLog b/apps/compass/ChangeLog
new file mode 100644
index 000000000..e70a5688b
--- /dev/null
+++ b/apps/compass/ChangeLog
@@ -0,0 +1,3 @@
+0.01: New App!
+0.02: Show text if uncalibrated
+0.03: Eliminate flickering
\ No newline at end of file
diff --git a/apps/compass/compass.js b/apps/compass/compass.js
index 10895e3cd..9b7ed56b7 100644
--- a/apps/compass/compass.js
+++ b/apps/compass/compass.js
@@ -1,34 +1,60 @@
-g.clear();
-g.setColor(0,0.5,1);
-g.fillCircle(120,130,80,80);
-g.setColor(0,0,0);
-g.fillCircle(120,130,70,70);
-
-function arrow(r,c) {
- r=r*Math.PI/180;
- var p = Math.PI/2;
- g.setColor(c);
- g.fillPoly([
- 120+60*Math.sin(r), 130-60*Math.cos(r),
- 120+10*Math.sin(r+p), 130-10*Math.cos(r+p),
- 120+10*Math.sin(r+-p), 130-10*Math.cos(r-p),
- ]);
-}
-
-var oldHeading = 0;
-Bangle.on('mag', function(m) {
- if (!Bangle.isLCDOn()) return;
- g.setFont("6x8",3);
- g.setColor(0);
- g.fillRect(70,0,170,24);
- g.setColor(0xffff);
- g.setFontAlign(0,0);
- g.drawString(isNaN(m.heading)?"---":Math.round(m.heading),120,12);
- g.setColor(0,0,0);
- arrow(oldHeading,0);
- arrow(oldHeading+180,0);
- arrow(m.heading,0xF800);
- arrow(m.heading+180,0x001F);
- oldHeading = m.heading;
-});
-Bangle.setCompassPower(1);
+var tg = Graphics.createArrayBuffer(120,20,1,{msb:true});
+var timg = {
+ width:tg.getWidth(),
+ height:tg.getHeight(),
+ bpp:1,
+ buffer:tg.buffer
+};
+
+var ag = Graphics.createArrayBuffer(160,160,2,{msb:true});
+var aimg = {
+ width:ag.getWidth(),
+ height:ag.getHeight(),
+ bpp:2,
+ buffer:ag.buffer,
+ palette:new Uint16Array([0,0x03FF,0xF800,0x001F])
+};
+ag.setColor(1);
+ag.fillCircle(80,80,79,79);
+ag.setColor(0);
+ag.fillCircle(80,80,69,69);
+
+function arrow(r,c) {
+ r=r*Math.PI/180;
+ var p = Math.PI/2;
+ ag.setColor(c);
+ ag.fillPoly([
+ 80+60*Math.sin(r), 80-60*Math.cos(r),
+ 80+10*Math.sin(r+p), 80-10*Math.cos(r+p),
+ 80+10*Math.sin(r-p), 80-10*Math.cos(r-p),
+ ]);
+}
+
+var oldHeading = 0;
+Bangle.on('mag', function(m) {
+ if (!Bangle.isLCDOn()) return;
+ tg.clear();
+ tg.setFont("6x8",1);
+ tg.setColor(1);
+ if (isNaN(m.heading)) {
+ tg.setFontAlign(0,-1);
+ tg.setFont("6x8",1);
+ tg.drawString("Uncalibrated",60,4);
+ tg.drawString("turn 360° around",60,12);
+ }
+ else {
+ tg.setFontAlign(0,0);
+ tg.setFont("6x8",2);
+ tg.drawString(Math.round(m.heading),60,12);
+ }
+ g.drawImage(timg,0,0,{scale:2});
+
+ ag.setColor(0);
+ arrow(oldHeading,0);
+ arrow(oldHeading+180,0);
+ arrow(m.heading,2);
+ arrow(m.heading+180,3);
+ g.drawImage(aimg,40,50);
+ oldHeading = m.heading;
+});
+Bangle.setCompassPower(1);
diff --git a/apps/cprassist/ChangeLog b/apps/cprassist/ChangeLog
new file mode 100644
index 000000000..5560f00bc
--- /dev/null
+++ b/apps/cprassist/ChangeLog
@@ -0,0 +1 @@
+0.01: New App!
diff --git a/apps/cprassist/README.md b/apps/cprassist/README.md
new file mode 100644
index 000000000..569f61149
--- /dev/null
+++ b/apps/cprassist/README.md
@@ -0,0 +1,24 @@
+# CPR Assist
+
+Provides assistance while performing a CPR
+
+## Usage
+
+The app alternates between the phases for
+chest compression and rescue breaths in an in an endless loop.
+In the chest compression phase the the watch will provide a
+buzz at a rate of 100 rpm for 30 repetitions.
+A longer buzz introduces an interval of 4 seconds to perform
+2 rescue breaths.
+A ratio of chest compressions to rescue breaths is also
+displayed in the bottom of the screen.
+
+The number of repetitions for chest compression and
+rescue breaths, the rpm rate and the duration of the
+rescue breath phase can be adjusted in the settings.
+See e.g. [CPR on Wikipedia](https://en.wikipedia.org/wiki/Cardiopulmonary_resuscitation)
+for futher information and updates on the recommendations.
+
+## Attributions
+
+Icon source: https://commons.wikimedia.org/wiki/File:ISO_7010_E003_-_First_aid_sign.svg
diff --git a/apps/cprassist/cprassist-icon.js b/apps/cprassist/cprassist-icon.js
new file mode 100644
index 000000000..ec4667a8c
--- /dev/null
+++ b/apps/cprassist/cprassist-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwhC/AH4Arg93AB1wC/dxkQACi4XRuf/AAU3C/4X/C+sTmYABn4XD+YICmIXJl4TDAA/yC/4X/C+LXXAAdzC4c3BQgX/C/4X0uMiAAUXC6IAKC+wA/AH4AkA=="))
diff --git a/apps/cprassist/cprassist-icon.png b/apps/cprassist/cprassist-icon.png
new file mode 100644
index 000000000..c39962aaa
Binary files /dev/null and b/apps/cprassist/cprassist-icon.png differ
diff --git a/apps/cprassist/cprassist.js b/apps/cprassist/cprassist.js
new file mode 100644
index 000000000..862ae54d6
--- /dev/null
+++ b/apps/cprassist/cprassist.js
@@ -0,0 +1,79 @@
+const SETTINGS_FILE = 'cprassist.settings.json';
+const SHORT_BUZZ_PERIOD = 80;
+const LONG_BUZZ_PERIOD = 800;
+
+Bangle.setLCDTimeout(undefined); // do not deaktivate display while running this app
+
+let settings;
+
+function setting(key) {
+ const DEFAULTS = {
+ 'compression_count': 30,
+ 'breath_count': 2,
+ 'compression_rpm': 100,
+ 'breath_period_sec': 4
+ };
+ if (!settings) {
+ const storage = require("Storage");
+ settings = storage.readJSON(SETTINGS_FILE, 1) || {};
+ }
+ return (key in settings)
+ ? settings[key]
+ : DEFAULTS[key];
+}
+
+let counter = setting('compression_count');
+
+function provideFeedback() {
+ let period = counter > 0
+ ? SHORT_BUZZ_PERIOD
+ : LONG_BUZZ_PERIOD;
+ try {
+ Bangle.buzz(period, 1.0);
+ } catch(err) {
+ }
+}
+
+function drawHeart() {
+ g.fillCircle(40, 92, 12);
+ g.fillCircle(60, 92, 12);
+ g.fillPoly([29, 98, 50, 120, 71, 98]);
+}
+
+function updateScreen() {
+ const colors = [0xFFFF, 0x9492];
+ g.reset().clearRect(0, 50, 250, 150);
+ if (counter > 0) {
+ g.setFont("Vector", 40).setFontAlign(0, 0);
+ g.setColor(colors[counter%2]);
+ drawHeart();
+ g.drawString(counter + "", g.getWidth()/2, 100);
+ } else {
+ g.setFont("Vector", 20).setFontAlign(0, 0);
+ g.drawString("RESCUE", g.getWidth()/2, 70);
+ g.drawString("BREATHS", g.getWidth()/2, 120);
+ }
+}
+
+function tick() {
+ provideFeedback();
+ updateScreen();
+ if (counter == 0) {
+ var reset = function() {
+ counter = setting('compression_count');
+ clearInterval(interval);
+ interval = setInterval(tick, 60000/setting('compression_rpm'));
+ };
+ clearInterval(interval);
+ interval = setInterval(reset, setting('breath_period_sec')*1000);
+ }
+ counter -= 1;
+}
+
+interval = setInterval(tick, 60000/setting('compression_rpm'));
+
+g.clear(1).setFont("6x8");
+g.drawString(setting('compression_count') + ' / ' + setting('breath_count'), 30, 200);
+
+Bangle.loadWidgets();
+Bangle.drawWidgets();
diff --git a/apps/cprassist/settings.js b/apps/cprassist/settings.js
new file mode 100644
index 000000000..5776baa0b
--- /dev/null
+++ b/apps/cprassist/settings.js
@@ -0,0 +1,64 @@
+// This file should contain exactly one function, which shows the app's settings
+/**
+ * @param {function} back Use back() to return to settings menu
+ */
+(function(back) {
+ const SETTINGS_FILE = 'cprassist.settings.json';
+
+ // initialize with default settings...
+ let s = {
+ 'compression_count': 30,
+ 'breath_count': 2,
+ 'compression_rpm': 100,
+ 'breath_period_sec': 4
+ };
+ // ...and overwrite them with any saved values
+ // This way saved values are preserved if a new version adds more settings
+ const storage = require('Storage');
+ const saved = storage.readJSON(SETTINGS_FILE, 1) || {};
+ for (const key in saved) {
+ s[key] = saved[key];
+ }
+
+ // creates a function to safe a specific setting
+ function save(key) {
+ return function(value) {
+ s[key] = value;
+ storage.write(SETTINGS_FILE, s);
+ };
+ }
+
+ const menu = {
+ '': { 'title': 'CPR Assist' },
+ '< Back': back,
+ 'chest compr.': {
+ value: s.compression_count,
+ min: 1,
+ max: 200,
+ step: 1,
+ onchange: save('compression_count'),
+ },
+ 'rescue breaths': {
+ value: s.breath_count,
+ min: 0,
+ max: 100,
+ step: 1,
+ onchange: save('breath_count'),
+ },
+ 'rpm': {
+ value: s.compression_rpm,
+ min: 1,
+ max: 200,
+ step: 10,
+ onchange: save('compression_rpm'),
+ },
+ 'breaths period': {
+ value: s.breath_period_sec,
+ min: 1,
+ max: 60,
+ step: 1,
+ onchange: save('breath_period_sec'),
+ }
+ };
+ E.showMenu(menu);
+});
diff --git a/apps/cube/cube-icon.js b/apps/cube/cube-icon.js
index 5ff0a2154..72a4ba4d9 100644
--- a/apps/cube/cube-icon.js
+++ b/apps/cube/cube-icon.js
@@ -1 +1 @@
- require("heatshrink").decompress(atob("/4AYv4CB+YdZABPvEkYA/AGv3EkfPAQP+DrI"))
+require("heatshrink").decompress(atob("/4AYv4CB+YdZABPvEkYA/AGv3EkfPAQP+DrI"))
diff --git a/apps/cube/cube.js b/apps/cube/cube.js
index 7e0e70edf..426171469 100644
--- a/apps/cube/cube.js
+++ b/apps/cube/cube.js
@@ -2,9 +2,9 @@ var rx = 0, ry = 0;
function draw() {
var rcx=Math.cos(rx),
- rsx=Math.sin(rx),
- rcy=Math.cos(ry),
- rsy=Math.sin(ry);
+ rsx=Math.sin(rx),
+ rcy=Math.cos(ry),
+ rsy=Math.sin(ry);
function p(x,y,z) {
var t;
t = x*rcy + z*rsy;
diff --git a/apps/custom/custom.html b/apps/custom/custom.html
new file mode 100644
index 000000000..5a5dbbecd
--- /dev/null
+++ b/apps/custom/custom.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Type your javascript code here
+
+ Then click Upload
+
+
+
+
diff --git a/apps/custom/custom.png b/apps/custom/custom.png
new file mode 100644
index 000000000..722ceb9ee
Binary files /dev/null and b/apps/custom/custom.png differ
diff --git a/apps/dane/ChangeLog b/apps/dane/ChangeLog
new file mode 100644
index 000000000..419109ec1
--- /dev/null
+++ b/apps/dane/ChangeLog
@@ -0,0 +1,5 @@
+0.01: New App!
+0.04: Added Icon to watchface
+0.05: bugfix
+0.06: moved and resized icon
+0.07: Added Description
\ No newline at end of file
diff --git a/apps/dane/app-icon.js b/apps/dane/app-icon.js
new file mode 100644
index 000000000..4deb12640
--- /dev/null
+++ b/apps/dane/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("l8wxH+AH4A/AH4A/AFUvl8Cu4AEgUCBQIrfFQMRAAe/Aw4xbDYIlBiUS7AjCAAY5BBYMSiJkBGC4sCicTiRQJHoUSCAIwBF6sv30SikUiRMMMIISD7AvTl/YiYtPF40TF6R4BicVFqAWDF4MViaPRIwQWTF4O/IwiKRCoMRUiZHEDJ5cXJAxeOOQuQhQuShWQJIe/JJkviIuC74tTFwORRqKLD+3cmVLpsLFZtNAANKhXeDYKNOu4uEmdlDwVNBoNlsoDDmoKBhYQChcyFycVFwOTFwJcBpomBhYjCmouBAwYMCmZdBa4d3FyonBKoIoCAwIECLooucEIIjCRIYuFms1Lqq7CFwS7DLQQsDhYrBHIZdHXZkCdQpQDXoIQDFwIDBeoQQCpYuSl8RFwMT70KCRYAIhUSFwMTiMvFxm/CQUSFyp5Did3Fxi8DOBwuLDSEv7ETfoRCNDI13DIMT34ZPIYSgOaxJ3SIgZeTC7COBdgMCC58vOoakWiQvQFoQTBFqgvEiURF5gRDOKIdIDwMRiO/axMCBoMRLQItXF4Z9B7F3BxF37BZBAAQnRIYobDMAKqIl5aDAA5zJFwaCBAA6PBFxQQEAAYKBFxjSCU4IECA4YuJCAoAEFx0UikTAAIEBAwQuKCIoADFxsCI5RdiUAoAEVgIVJABRDHAH4A/AH4A/ADAA="))
\ No newline at end of file
diff --git a/apps/dane/app.js b/apps/dane/app.js
new file mode 100644
index 000000000..5f7a48fbc
--- /dev/null
+++ b/apps/dane/app.js
@@ -0,0 +1,163 @@
+const font = "6x8";
+const timeFontSize = 4;
+const dateFontSize = 3;
+const smallFontSize = 2;
+const yOffset = 23;
+const xyCenter = g.getWidth()/2;
+const cornerSize = 14;
+const cornerOffset = 3;
+const borderWidth = 1;
+const yposTime = 27+yOffset;
+const yposDate = 65+yOffset;
+
+const mainColor = "#26dafd";
+const mainColorDark = "#029dbb";
+const mainColorLight = "#8bebfe";
+
+const secondaryColor = "#df9527";
+const secondaryColorDark = "#8b5c15";
+const secondaryColorLight = "#ecc180";
+
+const success = "#00ff00";
+const successDark = "#000900";
+const successLight = "#060f06";
+
+const alert = "#ff0000";
+const alertDark = "#090000";
+const alertLight = "#0f0606";
+
+var img = {
+ width : 120, height : 120, bpp : 8,
+ transparent : 254,
+ buffer : require("heatshrink").decompress(atob("/wA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AAdCABhN/OFM8ABU2P35zkM4U2hkAABwSBCwJ6/OjZxBgxyPABAZBPgJ6/OqbnBOg8rAAJyNCBEGhk2PX51PmBhHOhEGmwACPRQXFCoL1DOP51HdIh0IhkwnhcDAAoKBm0wDwYdEDwp5/Oo8MKxjQEABwiEkp5/Oxs2OpBTDOgwjOEyEMPHrJFJwxPCmx0QPRM8PIQpJFQjs8JZLEDJa55EUYMGFpMwPG5ICgzsQUrimCkryKnh40OyYxfPAQxIGQMGPGZ2EIZJ2iPCLxyOwRBMO0Z4/IIp2yPH4/Dhg9JHwJ2nPAg5Mgx3sFgMwgEqHhMMO1B4EeBQ7EO1U8HZSzBni0rHh0AmyzqHPB4FmDwLgC1BHGsMB4J3uWxY/Ed2ivBO1h4DmxAOG00MV2jwYmBBld354DmB3LeEo0Bgzu9eCMGIcYzOm1DoZ3wPAUMeF4yNg8Bnp3zGYM3gEHO5U2eEIhBdxcHg52zO4U9gJ3JPAMMO8U2O5k3odEO+VEPAKxBO5UAnh3tHgM9oh30AAMNO4tWO4s2O79CoUGdxcHn1EotFO+NFO4M3O5R4BgxXBO708dxR3BhB2Co1AO+J4BnCzBO/U4OwdAoIACN8goDAAVAow2Bnx3FAApTBnh3fmx3FljuFO4NGsmzAAWPxOJstlLpGJx4LGBIWJSIgIBCIVBsuPFYYsCsjwCO+ApEO5NlJAJ0BAAllegwRCPAwJC2YVEOIJ/BAAOJT4YoDeAVEhB3roVCdwsrqx3IJgJSDZYNlcoTbGNo53EDop3GBglBoB3KJAhUBmx3mmR3Fn53ILYjlDA4LQCMwYKDO4SCCDYQkEFQILDO40yd5h3nAAkHhx3BoB3EN4ZWHOgIGBPQQKE2YLBOIh3SnEHPBJ37boZWEOYJnCO44LBxKGCO5AWBAAZ4BO/53GDYhcGOQp8DNwoPBQ4Z3GAAINBAANlO/53TB4J3EAogREsrwCd59FO/53FPAhlHLggVENw4QCSRQABoB3/O5ZWGMIIABNAJ8BAAIMEPomPCAJ3Nox3+hB3HAAZeCKwQOCdwTwDO5ATCRYR38PAJ3Pox3HNIOPNIZ8BQozjBBpB+BO44cFoFAO6E8O782PBR3GJoIADdohpCAoIoEPAQJBO4YKCeAZ3FB4IVBAAVkeAJ3vnh3Mnx3BZgZ6DJoLmFOwoABO4ZpBsoLFx53CRQQqEAAKbBO/0HnFFotAoBvDNo4AXD4opEAAIyBGwNEm53Lg1CO79Cgx3MohBBoxyeACZ2Boh2KO+M3H4NFO2R3OgEAmx2ePAU2EoJ4Jho/Boh3zGoNDO5k8O90HodDO2Z3Boc9O5cMoR3hoUMO5UBO4J40GoM3gJ3IZAM2O0DwNg8Anp33IoMkO5M8O8c8O5IyBmFCO+lCoRELgwOBGUcMGRUAGUZDSO5TuleBozDPGQzBmxDKd0jwPmB31IRLunGocGVhh4wGIM8dxUMIE4nBmw2IVoZ3ymDuyG4cMG5TwwdxYIBmw+qHBjwvU4S2Khg9rWJrwuFoM2HhMGHfSyCWdlCOxU8O9p4LA4M2PFQqCgx2IHIZ2sPBy1CH8x2/PGwlBnkMO3p4zEYU8dpMGO2q8EIoJGFAwMwPEIhCmx2HGAMGVMZIYmBABg54GeQQtiOw7sCO25KEnkMIYJMEYAJKdFQQpHAAMMUgR25PAlCmx5GAoR5BFLM8gx1IUIh27PAp5BJYRUCKIgoXEYZ0EToZ2/PA7MBeYZ5DmBPWoTtBOos2ngxFO/5FGPQUwPAcMO64cEOhB2xnh3XPITPDKCocBDYZ1JPCEwO78MO7JbEZKqTGABhBLnk2O78Amw1KJBp3bmwaCHIwASDoJ3ggw+aO4c8O+M8hgbBhg2UIB0wIKx3DDQI2YLYLZCACEMZIIADO8YAEhgAEGgoAHlZ3bDgQAWlYaCO8QmDH7B3WmAcCGyoXCO9AAZgEMICdCoUMGrh3DPDp3iICR3/d+42BO8J2cO/53/IDU8GykGO/88O+g1ggB2dIIgAdO64AeO/cwmwACGyoZDADU8VqhBPEoIADoQATG7IuUGsBCjHswA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A1"))
+}
+
+
+function drawTopLeftCorner(x,y) {
+ g.setColor(mainColor);
+ var x1 = x-cornerOffset;
+ var y1 = y-cornerOffset;
+ g.fillRect(x1,y1,x1+cornerSize,y1+cornerSize);
+ g.setColor("#000000");
+ g.fillRect(x,y,x+cornerSize-cornerOffset,y+cornerSize-cornerOffset);
+}
+function drawTopRightCorner(x,y) {
+ g.setColor(mainColor);
+ var x1 = x+cornerOffset;
+ var y1 = y-cornerOffset;
+ g.fillRect(x1,y1,x1-cornerSize,y1+cornerSize);
+ g.setColor("#000000");
+ g.fillRect(x,y,x-cornerSize-cornerOffset,y+cornerSize-cornerOffset);
+}
+function drawBottomLeftCorner(x,y) {
+ g.setColor(mainColor);
+ var x1 = x-cornerOffset;
+ var y1 = y+cornerOffset;
+ g.fillRect(x1,y1,x1+cornerSize,y1-cornerSize);
+ g.setColor("#000000");
+ g.fillRect(x,y,x+cornerSize-cornerOffset,y-cornerSize+cornerOffset);
+}
+function drawBottomRightCorner(x,y) {
+ g.setColor(mainColor);
+ var x1 = x+cornerOffset;
+ var y1 = y+cornerOffset;
+ g.fillRect(x1,y1,x1-cornerSize,y1-cornerSize);
+ g.setColor("#000000");
+ g.fillRect(x,y,x-cornerSize+cornerOffset,y-cornerSize+cornerOffset);
+}
+
+function drawFrame(x1,y1,x2,y2) {
+ drawTopLeftCorner(x1,y1);
+ drawTopRightCorner(x2,y1);
+ drawBottomLeftCorner(x1,y2);
+ drawBottomRightCorner(x2,y2);
+ g.setColor(mainColorDark);
+ g.drawRect(x1,y1,x2,y2);
+ g.setColor("#000000");
+ g.fillRect(x1+borderWidth,y1+borderWidth,x2-borderWidth,y2-borderWidth);
+}
+function drawTopFrame(x1,y1,x2,y2) {
+
+ drawBottomLeftCorner(x1,y2);
+ drawBottomRightCorner(x2,y2);
+ g.setColor(mainColorDark);
+ g.drawRect(x1,y1,x2,y2);
+ g.setColor("#000000");
+ g.fillRect(x1+borderWidth,y1+borderWidth,x2-borderWidth,y2-borderWidth);
+}
+function drawBottomFrame(x1,y1,x2,y2) {
+ drawTopLeftCorner(x1,y1);
+ drawTopRightCorner(x2,y1);
+ g.setColor(mainColorDark);
+ g.drawRect(x1,y1,x2,y2);
+ g.setColor("#000000");
+ g.fillRect(x1+borderWidth,y1+borderWidth,x2-borderWidth,y2-borderWidth);
+}
+
+function getUTCTime(d) {
+ return d.toUTCString().split(' ')[4].split(':').map(function(d){return Number(d);});
+}
+
+
+
+
+
+function drawTimeText() {
+ g.setFontAlign(0, 0);
+ var d = new Date();
+ var da = d.toString().split(" ");
+ var dutc = getUTCTime(d);
+
+ var time = da[4].split(":");
+ var hours = time[0],
+ minutes = time[1],
+ seconds = time[2];
+ g.setColor(mainColor);
+ g.setFont(font, timeFontSize);
+ g.drawString(`${hours}:${minutes}:${seconds}`, xyCenter, yposTime, true);
+ g.setFont(font, smallFontSize);
+}
+function drawDateText() {
+ g.setFontAlign(0, 0);
+ var d = new Date();
+ g.setFont(font, dateFontSize);
+ g.drawString(`${d.getDate()}.${d.getMonth()+1}.${d.getFullYear()}`, xyCenter, yposDate, true);
+}
+
+
+
+function drawClock() {
+ // main frame
+ drawFrame(3,10+yOffset,g.getWidth()-3,g.getHeight()-3);
+ // time frame
+ drawTopFrame(20,10+yOffset,220,46+yOffset);
+ // date frame
+ drawTopFrame(28,46+yOffset,212,46+yOffset+35);
+
+ // texts
+ drawTimeText();
+ drawDateText();
+ g.drawImage(img,g.getWidth()/2-(img.width/2),g.getHeight()/2);
+}
+function updateClock() {
+ drawTimeText();
+ drawDateText();
+}
+
+
+Bangle.on('lcdPower', function(on) {
+ if (on) drawClock();
+});
+g.clear();
+
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+
+
+drawClock();
+
+
+setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
+
+// refesh every 100 milliseconds
+setInterval(updateClock, 100);
diff --git a/apps/dane/app.png b/apps/dane/app.png
new file mode 100644
index 000000000..ee4f8403a
Binary files /dev/null and b/apps/dane/app.png differ
diff --git a/apps/daysl/ChangeLog b/apps/daysl/ChangeLog
new file mode 100644
index 000000000..c3faf0092
--- /dev/null
+++ b/apps/daysl/ChangeLog
@@ -0,0 +1,3 @@
+0.01: New Widget!
+0.02: Improved calculation, new image for app
+0.03: Improved display of number
diff --git a/apps/daysl/app-icon.js b/apps/daysl/app-icon.js
new file mode 100644
index 000000000..bdc0da744
--- /dev/null
+++ b/apps/daysl/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwgmIAH4A/AH4A/AEEAAAgGOC/4XLAgoGIDgYXTwEIBY4JEAw8YCIOAEY4+EAwwTCL44XNO5IX/C6i6LC8YABa5AXOF67vIwA5DAw5GDMhg7HjAXWIwQLFZIoGNC/4XKAH4A/AH4A/ADoA="))
\ No newline at end of file
diff --git a/apps/daysl/app.js b/apps/daysl/app.js
new file mode 100644
index 000000000..56f85e615
--- /dev/null
+++ b/apps/daysl/app.js
@@ -0,0 +1,67 @@
+g.clear();
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+
+const storage = require('Storage');
+let settings;
+
+function updateSettings() {
+ storage.write('daysleft.json', settings);
+}
+
+function resetSettings() {
+ settings = {
+ day : 17,
+ month : 6,
+ year: 1981
+ };
+ updateSettings();
+}
+
+settings = storage.readJSON('daysleft.json',1);
+if (!settings) resetSettings();
+
+function showMenu() {
+ const datemenu = {
+ '': {
+ 'title': 'Set Date',
+ 'predraw': function() {
+ datemenu.Date.value = settings.day;
+ datemenu.Month.value = settings.month;
+ datemenu.Year.value = settings.year;
+ }
+ },
+ 'Day': {
+ value: settings.day,
+ min: 1,
+ max: 31,
+ step: 1,
+ onchange: v => {
+ settings.day = v;
+ updateSettings();
+ }
+ },
+ 'Month': {
+ value: settings.month,
+ min: 1,
+ max: 12,
+ step: 1,
+ onchange: v => {
+ settings.month = v;
+ updateSettings();
+ }
+ },
+ 'Year': {
+ value: settings.year,
+ step: 1,
+ onchange: v => {
+ settings.year = v;
+ updateSettings();
+ }
+ }
+ };
+ datemenu['-Exit-'] = ()=>{load();};
+ return E.showMenu(datemenu);
+}
+
+showMenu();
\ No newline at end of file
diff --git a/apps/daysl/app.png b/apps/daysl/app.png
new file mode 100644
index 000000000..42839ae59
Binary files /dev/null and b/apps/daysl/app.png differ
diff --git a/apps/daysl/widget.js b/apps/daysl/widget.js
new file mode 100644
index 000000000..4edbc3230
--- /dev/null
+++ b/apps/daysl/widget.js
@@ -0,0 +1,84 @@
+const storage = require('Storage');
+let settings;
+let height = 23;
+let width = 34;
+
+var debug = 0; //1 = show debug info
+
+//write settings to file
+function updateSettings() {
+ storage.write('daysleft.json', settings);
+}
+
+//Define standard settings
+function resetSettings() {
+ settings = {
+ day : 17,
+ month : 6,
+ year: 2020
+ };
+ updateSettings();
+}
+
+settings = storage.readJSON('daysleft.json',1); //read storage
+if (!settings) resetSettings(); //if settings file was not found, set to standard
+
+var dd = settings.day,
+ mm = settings.month-1, //-1 because month is zero-based
+ yy = settings.year;
+
+const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
+const targetDate = new Date(yy, mm, dd); //is 00:00
+const today = new Date(); //includes current time
+
+const currentYear = today.getFullYear();
+const currentMonth = today.getMonth();
+const currentDay = today.getDate();
+const todayMorning = new Date (currentYear, currentMonth, currentDay, 0, 0, 0); //create date object with today, but 00:00:00
+
+const diffDays = (targetDate - todayMorning) / oneDay; //calculate day difference
+
+function drawWidget() {
+ if (debug == 1) g.drawRect(this.x,this.y,this.x+width,this.y+height); //draw rectangle around widget area
+ g.reset();
+
+ //define font size and string position
+ //small if number has more than 3 digits (positive number)
+ if (diffDays >= 1000) {
+ g.setFont("6x8", 1);
+ g.drawString(diffDays,this.x+10,this.y+7);
+ }
+ //large if number has 3 digits (positive number)
+ if (diffDays <= 999 && diffDays >= 100) {
+ g.setFont("6x8", 2);
+ g.drawString(diffDays,this.x,this.y+4);
+ }
+ //large if number has 2 digits (positive number)
+ if (diffDays <= 99 && diffDays >= 10) {
+ g.setFont("6x8", 2);
+ g.drawString(diffDays,this.x+6,this.y+4);
+ }
+ //large if number has 1 digit (positive number)
+ if (diffDays <= 9 && diffDays >= 0) {
+ g.setFont("6x8", 2);
+ g.drawString(diffDays,this.x+13,this.y+4);
+ }
+ //large if number has 1 digit (negative number)
+ if (diffDays <= -1 && diffDays >= -9) {
+ g.setFont("6x8", 2);
+ g.drawString(diffDays,this.x+5,this.y+4);
+ }
+ //large if number has 2 digits (negative number)
+ if (diffDays <= -10 && diffDays >= -99) {
+ g.setFont("6x8", 2);
+ g.drawString(diffDays,this.x,this.y+4);
+ }
+ //large if number has 3 digits or more (negative number)
+ if (diffDays <= -100) {
+ g.setFont("6x8", 1);
+ g.drawString(diffDays,this.x,this.y+7);
+ }
+}
+
+//draw widget
+WIDGETS["daysl"]={area:"tl",width:width,draw:drawWidget};
\ No newline at end of file
diff --git a/apps/dclock/ChangeLog b/apps/dclock/ChangeLog
new file mode 100644
index 000000000..edf7da4c2
--- /dev/null
+++ b/apps/dclock/ChangeLog
@@ -0,0 +1,9 @@
+0.01: branched from simple clock and added seconds
+0.02: add timestamp (tst)
+0.03: fix timestamp round to whole number
+0.04: add iso datetime and move day of the week (d) / month names (m)
+0.05: add beats (@)
+0.06: tidy up
+0.07: add days in current month (md) and days since new moon (l)
+0.08: update icon
+0.09: Use localised month and day of the week from locale
diff --git a/apps/dclock/clock-dev-icon.js b/apps/dclock/clock-dev-icon.js
new file mode 100644
index 000000000..f36dcaee3
--- /dev/null
+++ b/apps/dclock/clock-dev-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwkEIf4A5/8wgf/AwUB/8gh/zA4QMCl/xA4cAichgIaBiEDgMgmECDQMAkMA+EgiYvDkQJBkcQgMQDwMggUiiECG4MikEBmQWCgURiEREQIXBCIMxkIIBAoMSiQ4BGoIABKgPykRSBI4JfC+c/iARBl8zmBfEAAUvIgIAUkbAtgalB+ADDBIKSBHgUgmYJCAAa6BmCoBAYMiBIMRC4UQmEAAoQvFmUDAYUSmcxWIKMBEQKrBOw0yh8wmcyj4nBIYQDB+cwBAQA/ABUxgUDkBqBgchkMiiUikMRgSOBkR3BkEhC4MgiQHBiADBC4UQAYMRiUxkECAAITBC4MSiUQF4MTiQTBBAIDBkcCiMxkUTAYIvCAH4A/AH4AKiIPPgMxiESgUQgECgMBdAMiiUgC48ikUBiEBiIXDGQURiIbBF48RkAvCEwIvCkERgQMBRHpDBOoRhBNoJOBJIkiKYMjgcTOoMhLQMQmMDDIMjQQInEC4MhiUSkQHCC4MAkAXCiUjiZ5UiR5jLwLaBAQJ1BAgIAMCgMxMwMgkciAoMjC5pqBRwPxCoMiiUyGBsgiBBBiESVAKzBf+YACA=="))
\ No newline at end of file
diff --git a/apps/dclock/clock-dev.js b/apps/dclock/clock-dev.js
new file mode 100644
index 000000000..d2c08726a
--- /dev/null
+++ b/apps/dclock/clock-dev.js
@@ -0,0 +1,112 @@
+var locale = require("locale");
+/* jshint esversion: 6 */
+const timeFontSize = 4;
+const dateFontSize = 3;
+const smallFontSize = 2;
+const font = "6x8";
+
+const xyCenter = g.getWidth() / 2;
+const yposTime = 50;
+const yposDate = 85;
+const yposTst = 115;
+const yposDml = 170;
+const yposDayMonth = 195;
+const yposGMT = 220;
+
+// Check settings for what type our clock should be
+var is12Hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"];
+
+function getUTCTime(d) {
+ return d.toUTCString().split(' ')[4].split(':').map(function(d){return Number(d)});
+}
+
+function drawSimpleClock() {
+ // get date
+ var d = new Date();
+ var da = d.toString().split(" ");
+ var dutc = getUTCTime(d);
+
+ g.reset(); // default draw styles
+ // drawSting centered
+ g.setFontAlign(0, 0);
+
+ // draw time
+ var time = da[4].split(":");
+ var hours = time[0],
+ minutes = time[1],
+ seconds = time[2];
+
+ var meridian = "";
+ if (is12Hour) {
+ hours = parseInt(hours,10);
+ meridian = "AM";
+ if (hours == 0) {
+ hours = 12;
+ meridian = "AM";
+ } else if (hours >= 12) {
+ meridian = "PM";
+ if (hours>12) hours -= 12;
+ }
+ hours = (" "+hours).substr(-2);
+ }
+
+ // Time
+ g.setFont(font, timeFontSize);
+ g.drawString(`${hours}:${minutes}:${seconds}`, xyCenter, yposTime, true);
+ g.setFont(font, smallFontSize);
+ g.drawString(meridian, xyCenter + 102, yposTime + 10, true);
+
+ // Date String
+ g.setFont(font, dateFontSize);
+ g.drawString(`${d.getFullYear()}-${d.getMonth()+1}-${d.getDate()}`, xyCenter, yposDate, true);
+
+ // Timestamp
+ var tst = Math.round(d.getTime());
+ g.setFont(font, smallFontSize);
+ g.drawString(`tst:${tst}`, xyCenter, yposTst, true);
+
+ //Days in month
+ var dom = new Date(d.getFullYear(), d.getMonth()+1, 0).getDate();
+
+ //Days since full moon
+ var knownnew = new Date(2020,02,24,09,28,0);
+
+ // Get millisecond difference and divide down to cycles
+ var cycles = (d.getTime()-knownnew.getTime())/1000/60/60/24/29.53;
+
+ // Multiply decimal component back into days since new moon
+ var sincenew = (cycles % 1)*29.53;
+
+ // Draw days in month and sime since new moon
+ g.setFont(font, smallFontSize);
+ g.drawString(`md:${dom} l:${sincenew.toFixed(2)}`, xyCenter, yposDml, true);
+
+ // draw Month name, Day of the week and beats
+ var beats = Math.floor((((dutc[0] + 1) % 24) + dutc[1] / 60 + dutc[2] / 3600) * 1000 / 24);
+ g.setFont(font, smallFontSize);
+ g.drawString(`m:${locale.month(d,true)} d:${locale.dow(d,true)} @${beats}`, xyCenter, yposDayMonth, true);
+
+ // draw gmt
+ var gmt = da[5];
+ g.setFont(font, smallFontSize);
+ g.drawString(gmt, xyCenter, yposGMT, true);
+}
+
+// handle switch display on by pressing BTN1
+Bangle.on('lcdPower', function(on) {
+ if (on) drawSimpleClock();
+});
+
+// clean app screen
+g.clear();
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+
+// refesh every 100 milliseconds
+setInterval(drawSimpleClock, 100);
+
+// draw now
+drawSimpleClock();
+
+// Show launcher when middle button pressed
+setWatch(Bangle.showLauncher, BTN2, {repeat:false,edge:"falling"});
\ No newline at end of file
diff --git a/apps/dclock/clock-dev.png b/apps/dclock/clock-dev.png
new file mode 100644
index 000000000..0cfbff44c
Binary files /dev/null and b/apps/dclock/clock-dev.png differ
diff --git a/apps/demoapp/app.js b/apps/demoapp/app.js
index cb3136196..13c043587 100644
--- a/apps/demoapp/app.js
+++ b/apps/demoapp/app.js
@@ -27,22 +27,22 @@ var scenes = [
"| __|_ -| . | _| | | | | . |\n"+
"|____|___| _|_| |___|_|_|_|___|\n"+
" |_| espruino.com\n\n",
- "The JavaScript Interpreter for uCs\n",
- " * On-chip JS Interpreter",
- " * GPS, Acclerometer, Compass",
- " * 64 MHz, 64kB RAM, 512kB + 4MB Flash",
- " * 240x240 IPS LCD",
- " * Speaker & Vibration motor",
- " * Bluetooth LE",
- " * 1 week battery life",
- "",
- "Includes:",
- " * Tensorflow AI",
- " * Bluetooth LE central & periph",
- " * Graphics Library",
- " * VT100 terminal",
- "","",""
- ];
+ "The JavaScript Interpreter for uCs\n",
+ " * On-chip JS Interpreter",
+ " * GPS, Acclerometer, Compass",
+ " * 64 MHz, 64kB RAM, 512kB + 4MB Flash",
+ " * 240x240 IPS LCD",
+ " * Speaker & Vibration motor",
+ " * Bluetooth LE",
+ " * 1 week battery life",
+ "",
+ "Includes:",
+ " * Tensorflow AI",
+ " * Bluetooth LE central & periph",
+ " * Graphics Library",
+ " * VT100 terminal",
+ "","",""
+ ];
var n=0;
var i = setInterval(function() {
Terminal.println(txt[n]);
@@ -62,19 +62,19 @@ var scenes = [
function() {
var img = require("heatshrink").decompress(atob("oNBxH+5wA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AHGpAAoQKv4ADCBQAeqsrAAejBw9/B4oABqt/IGepHw5CEQspALH5hBC5pAvv4/MAALFkIBWpPI6IHqpAu0Z3GfYOpRYdPQEhALYIp2FBYNVI4JAvvL4LH0yBYAFJAQQQ5Ay1JAFftBAQBYxCDv+qIGiCHIQiGnIBfOv5BJIQRAyIJkrvKEkIBrFBB4qEGIGRCNYsZAQIQV/IZDEiICRCDQVJAUIQVPC4lVIF6yJQYpAZ5t/FYvNIBepqtVIJGjIDoqBDY2pdYo3DfAhBIQLmpvIcDvIrC5oJEIAhTCGQmj5qgEC4t5e7YrBqt5BI6UFBg15v4XHbQwAQb4oAKv7NKABdVRoYATUAwnICqjZFIMdVE4+jXI4XGYCxBFFZN/M5OpCxUrvJ/ZFYmjvNVAAY+KCwpDBC6YAV5vNC9oA/AH4A/AHYA=="));
- g.clear();
- y = 0;
- var step = 4;
- var i = setInterval(function() {
- y+=step;
g.clear();
- g.drawImage(img,60,60,{rotate:Math.sin(y*0.03)*0.5});
- g.flip();
- }, 20);
- Bangle.setLCDMode("120x120");
- return function() {
- if (i) clearInterval(i);
- };
+ y = 0;
+ var step = 4;
+ var i = setInterval(function() {
+ y+=step;
+ g.clear();
+ g.drawImage(img,60,60,{rotate:Math.sin(y*0.03)*0.5});
+ g.flip();
+ }, 20);
+ Bangle.setLCDMode("120x120");
+ return function() {
+ if (i) clearInterval(i);
+ };
},
function() {
var rx = 0, ry = 0;
@@ -82,9 +82,9 @@ var scenes = [
// draw a cube
function draw() {
var rcx=Math.cos(rx),
- rsx=Math.sin(rx),
- rcy=Math.cos(ry),
- rsy=Math.sin(ry);
+ rsx=Math.sin(rx),
+ rcy=Math.cos(ry),
+ rsy=Math.sin(ry);
// Project 3D coordinates into 2D
function p(x,y,z) {
var t;
@@ -149,7 +149,7 @@ var scenes = [
y+=step;
g.scroll(0,1);
g.drawImage(img,Math.random()*240,Math.random()*240,
- {rotate:Math.random()*6.3, scale:0.5+Math.random()});
+ {rotate:Math.random()*6.3, scale:0.5+Math.random()});
}, 1);
Bangle.setLCDMode();
return function() {
diff --git a/apps/devstopwatch/ChangeLog b/apps/devstopwatch/ChangeLog
new file mode 100644
index 000000000..e7c9e714a
--- /dev/null
+++ b/apps/devstopwatch/ChangeLog
@@ -0,0 +1 @@
+0.01: App created
diff --git a/apps/devstopwatch/app-icon.js b/apps/devstopwatch/app-icon.js
new file mode 100644
index 000000000..c31177034
--- /dev/null
+++ b/apps/devstopwatch/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AAc1AAwvpApIv/SDTCteV6MuSRY8bEowEGAxYuXKRYODBQYwWJ5KOINxTkVWxZaFMQoARrNZAg4SPCZgcJDSQQDFy4vEBhFlsoVRFzAvEGIowXPBoKBxIADDCJeMBxYvEGApgTqdTAQYOJF4wwDDRwgGC4gvKwetAAgvFDwYvRNhQACvunF4enDZ4vUAgmD04ADF64ACZZQFDvoAEDZwvNCwt3u4FFSwgvWEQQCFBgwLIDZAvbAAgvgAYIkIFpQLEF6IsFC6AaJCiBjGF6IWUMA55XMCgwSIiowMDpYuYPAwaDAoQhHBIYuWC4ocNCSQdMRwofGBIqeNABubAAIFFAAwSIGLwHDBxgwcKwoLJGMSQKAH4A/AH4A+"))
diff --git a/apps/devstopwatch/app.js b/apps/devstopwatch/app.js
new file mode 100644
index 000000000..cf7186c98
--- /dev/null
+++ b/apps/devstopwatch/app.js
@@ -0,0 +1,159 @@
+const EMPTY_LAP = '--:--:---';
+const EMPTY_H = '00:00:000';
+const MAX_LAPS = 6;
+const XY_CENTER = g.getWidth() / 2;
+const Y_CHRONO = 40;
+const Y_HEADER = 80;
+const Y_LAPS = 125;
+const Y_BTN3 = 225;
+const FONT = '6x8';
+const CHRONO = '/* C H R O N O */';
+
+var laps = [EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP];
+var started = false;
+var reset = false;
+var whenStarted;
+var whenStartedTotal;
+var currentLapIndex = 1;
+var currentLap = '';
+var chronoInterval;
+
+// Set laps.
+setWatch(() => {
+
+ reset = false;
+
+ if (started) {
+ changeLap();
+ } else {
+ if (!reset) {
+ chronoInterval = setInterval(chronometer, 10);
+ }
+ }
+}, BTN1, { repeat: true, edge: 'rising' });
+
+// Reset chronometre.
+setWatch(() => { resetChrono(); }, BTN3, { repeat: true, edge: 'rising' });
+
+// Show launcher when middle button pressed.
+setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: 'falling' });
+
+function resetChrono() {
+ laps = [EMPTY_H, EMPTY_H, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP, EMPTY_LAP];
+ started = false;
+ reset = true;
+ currentLapIndex = 1;
+ currentLap = '';
+
+ if (chronoInterval !== undefined) {
+ clearInterval(chronoInterval);
+ }
+
+ printChrono();
+}
+
+function chronometer() {
+
+ if (!started) {
+ var rightNow = Date.now();
+ whenStarted = rightNow;
+ whenStartedTotal = rightNow;
+ started = true;
+ reset = false;
+ }
+
+ currentLap = calculateLap(whenStarted);
+ total = calculateLap(whenStartedTotal);
+
+ laps[0] = total;
+ laps[1] = currentLap;
+ printChrono();
+}
+
+function changeLap() {
+
+ currentLapIndex++;
+
+ if ((currentLapIndex) > MAX_LAPS) {
+ currentLapIndex = 2;
+ }
+
+ laps[currentLapIndex] = currentLap;
+ whenStarted = Date.now();
+}
+
+function calculateLap(whenStarted) {
+
+ var now = Date.now();
+ var diffTime = now - whenStarted;
+ var dateDiffTime = new Date(diffTime);
+
+ var millis = padStart(dateDiffTime.getMilliseconds().toString(), 3);
+ var seconds = padStart(dateDiffTime.getSeconds().toString(), 2);
+ var minutes = padStart(dateDiffTime.getMinutes().toString(), 2);
+
+ return `${minutes}:${seconds}:${millis}`;
+}
+
+function printChrono() {
+
+ g.reset();
+ g.setFontAlign(0, 0);
+
+ var print = '';
+
+ g.setFont(FONT, 2);
+ print = CHRONO;
+ g.drawString(print, XY_CENTER, Y_CHRONO, true);
+
+ g.setColor(0, 220, 0);
+ g.setFont(FONT, 3);
+ print = ` T ${laps[0]}\n`;
+ print += ` C ${laps[1]}\n`;
+ g.drawString(print, XY_CENTER, Y_HEADER, true);
+
+ g.setColor(255, 255, 255);
+ g.setFont(FONT, 2);
+
+ for (var i = 2; i < MAX_LAPS + 1; i++) {
+
+ g.setColor(255, 255, 255);
+ let suffix = ' ';
+ if (currentLapIndex === i) {
+ let suffix = '*';
+ g.setColor(255, 200, 0);
+ }
+
+ const lapLine = `L${i - 1} ${laps[i]} ${suffix}\n`;
+ g.drawString(lapLine, XY_CENTER, Y_LAPS + (15 * (i - 1)), true);
+ }
+
+ g.setColor(255, 255, 255);
+ g.setFont(FONT, 1);
+ print = 'Press 3 to reset';
+ g.drawString(print, XY_CENTER, Y_BTN3, true);
+
+ g.flip();
+}
+
+function padStart(value, size) {
+
+ var result = '';
+ var pads = size - value.length;
+
+ if (pads > 0) {
+ for (var i = 0; i < pads; i++) {
+ result += '0';
+ }
+ }
+
+ result += value;
+ return result;
+}
+
+// Clean app screen.
+g.clear();
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+
+resetChrono();
diff --git a/apps/devstopwatch/app.png b/apps/devstopwatch/app.png
new file mode 100644
index 000000000..b0feeebc9
Binary files /dev/null and b/apps/devstopwatch/app.png differ
diff --git a/apps/dotclock/ChangeLog b/apps/dotclock/ChangeLog
new file mode 100644
index 000000000..26f95bbde
--- /dev/null
+++ b/apps/dotclock/ChangeLog
@@ -0,0 +1 @@
+0.01: Based on the Analog Clock app, minimal dot interface
\ No newline at end of file
diff --git a/apps/dotclock/clock-dot-icon.js b/apps/dotclock/clock-dot-icon.js
new file mode 100644
index 000000000..7098cb51f
--- /dev/null
+++ b/apps/dotclock/clock-dot-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwkBIf4A/AGUJyAXtACeZBCAOJh/wC6IADC4gA/XEINJC64A/AHcP+ACD/4CBTB0Ph8A+ACBAIKoKC65HKC4gA/AAfACysM5gvjTBgNKC64A/AEWZBCAXdADa4XaH4A/AAgA=="))
diff --git a/apps/dotclock/clock-dot.js b/apps/dotclock/clock-dot.js
new file mode 100644
index 000000000..a4b3f260f
--- /dev/null
+++ b/apps/dotclock/clock-dot.js
@@ -0,0 +1,162 @@
+let g;
+let Bangle;
+
+const locale = require('locale');
+const p = Math.PI / 2;
+const pRad = Math.PI / 180;
+const faceWidth = 100; // watch face radius
+let timer = null;
+let currentDate = new Date();
+let hourRadius = 60;
+let minRadius = 80;
+const centerPx = g.getWidth() / 2;
+
+const seconds = (angle) => {
+ const a = angle * pRad;
+ const x = centerPx + Math.sin(a) * faceWidth;
+ const y = centerPx - Math.cos(a) * faceWidth;
+
+ // if 15 degrees, make hour marker larger
+ const radius = (angle % 15) ? 2 : 4;
+ g.fillCircle(x, y, radius);
+};
+
+const hourDot = (angle,radius) => {
+ const a = angle * pRad;
+ const x = centerPx + Math.sin(a) * hourRadius;
+ const y = centerPx - Math.cos(a) * hourRadius;
+ g.fillCircle(x, y, radius);
+};
+
+const minDot = (angle,radius) => {
+ const a = angle * pRad;
+ const x = centerPx + Math.sin(a) * minRadius;
+ const y = centerPx - Math.cos(a) * minRadius;
+ g.fillCircle(x, y, radius);
+};
+
+const drawAll = () => {
+ g.clear();
+ currentDate = new Date();
+ // draw hands first
+ onMinute();
+ // draw seconds
+ const currentSec = currentDate.getSeconds();
+ // draw all secs
+
+ for (let i = 0; i < 60; i++) {
+ if (i > currentSec) {
+ g.setColor(0, 0, 0.6);
+ } else {
+ g.setColor(0.3, 0.3, 1);
+ }
+ seconds((360 * i) / 60);
+ }
+ onSecond();
+};
+
+const resetSeconds = () => {
+ g.setColor(0, 0, 0.6);
+ for (let i = 0; i < 60; i++) {
+ seconds((360 * i) / 60);
+ }
+};
+
+const drawMin = () => {
+ g.setColor(0.5, 0.5, 0.5);
+ for (let i = 0; i < 60; i++) {
+ minDot((360 * i) / 60,1);
+ }
+};
+
+const drawHour = () => {
+ g.setColor(0.5, 0.5, 0.5);
+ for (let i = 0; i < 12; i++) {
+ hourDot((360 * 5 * i) / 60,1);
+ }
+};
+
+const onSecond = () => {
+ g.setColor(0.3, 0.3, 1);
+ seconds((360 * currentDate.getSeconds()) / 60);
+ if (currentDate.getSeconds() === 59) {
+ resetSeconds();
+ onMinute();
+ }
+ g.setColor(1, 0.7, 0.2);
+ currentDate = new Date();
+ seconds((360 * currentDate.getSeconds()) / 60);
+ g.setColor(1, 1, 1);
+};
+
+const drawDate = () => {
+ g.reset();
+ g.setColor(1, 1, 1);
+ g.setFont('6x8', 2);
+
+ const dayString = locale.dow(currentDate, true);
+ // pad left date
+ const dateString = ((currentDate.getDate() < 10) ? '0' : '') + currentDate.getDate().toString();
+ const dateDisplay = `${dayString} ${dateString}`;
+ // console.log(`${dayString}|${dateString}`);
+ // center date
+ const l = (g.getWidth() - g.stringWidth(dateDisplay)) / 2;
+ const t = centerPx - 6 ;
+ g.drawString(dateDisplay, l, t);
+ // console.log(l, t);
+};
+const onMinute = () => {
+ if (currentDate.getHours() === 0 && currentDate.getMinutes() === 0) {
+ g.clear();
+ resetSeconds();
+ }
+ // clear existing hands
+ g.setColor(0, 0, 0);
+ hourDot((360 * currentDate.getHours()) / 12,4);
+ minDot((360 * currentDate.getMinutes()) / 60,3);
+
+ // Hour
+ drawHour();
+ // Minute
+ drawMin();
+
+ // get new date, then draw new hands
+ currentDate = new Date();
+ g.setColor(1, 0, 0);
+ // Hour
+ hourDot((360 * currentDate.getHours()) / 12,4);
+ g.setColor(1, 0.9, 0.9);
+ // Minute
+ minDot((360 * currentDate.getMinutes()) / 60,3);
+ if (currentDate.getHours() >= 0 && currentDate.getMinutes() === 0) {
+ Bangle.buzz();
+ }
+ drawDate();
+};
+
+const startTimers = () => {
+ timer = setInterval(onSecond, 1000);
+};
+
+Bangle.on('lcdPower', (on) => {
+ if (on) {
+ // g.clear();
+ drawAll();
+ startTimers();
+ Bangle.drawWidgets();
+ } else {
+ if (timer) {
+ clearInterval(timer);
+ }
+ }
+});
+
+g.clear();
+resetSeconds();
+startTimers();
+drawAll();
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+
+// Show launcher when middle button pressed
+setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" });
diff --git a/apps/dotclock/clock-dot.png b/apps/dotclock/clock-dot.png
new file mode 100644
index 000000000..702ac9065
Binary files /dev/null and b/apps/dotclock/clock-dot.png differ
diff --git a/apps/dotmatrixclock/ChangeLog b/apps/dotmatrixclock/ChangeLog
new file mode 100644
index 000000000..7ab9e14a9
--- /dev/null
+++ b/apps/dotmatrixclock/ChangeLog
@@ -0,0 +1 @@
+0.01: Create dotmatrix clock app
diff --git a/apps/dotmatrixclock/README.md b/apps/dotmatrixclock/README.md
new file mode 100644
index 000000000..3af48efc6
--- /dev/null
+++ b/apps/dotmatrixclock/README.md
@@ -0,0 +1,28 @@
+# Dotmatrix clock
+
+A clock face simulating the classic dotmatrix displays. Shows time, date, compass, and heart rate.
+
+
+
+## Features
+
+* Easy to read digits
+* Simulated white-on-blue dotmatrix display
+* Compass
+* Heart rate monitor
+* Multiple colour palletes, swipe to change
+
+## Usage
+
+### Sensor readings
+
+When the display is activated by 'flipping' the watch up, the compass and heart sensors will be activated automatically, but if
+you activate the LCD through a button press, then the sensors will remain off until you press button-1.
+
+### Colours
+
+The display defaults to blue, but you can change this to orange by swiping the screen
+
+## Requests
+
+If you have any feature requests, please send an email to the author paulcockrell@gmail.com`
diff --git a/apps/dotmatrixclock/app.js b/apps/dotmatrixclock/app.js
new file mode 100755
index 000000000..ba34d4885
--- /dev/null
+++ b/apps/dotmatrixclock/app.js
@@ -0,0 +1,354 @@
+/**
+ * BangleJS DotMatrixCLOCK
+ *
+ * + Original Author: Paul Cockrell https://github.com/paulcockrell
+ * + Created: May 2020
+ */
+const storage = require('Storage');
+const settings = (storage.readJSON('setting.json', 1) || {});
+const is12Hour = settings["12hour"] || false;
+const timeout = settings.timeout || 20;
+
+const font7x7 = {
+ "empty": "00000000",
+ "0": "3E61514945433E",
+ "1": "1808080808081C",
+ "2": "7E01013E40407F",
+ "3": "7E01013E01017E",
+ "4": "4141417F010101",
+ "5": "7F40407E01017E",
+ "6": "3E40407E41413E",
+ "7": "3F010202040408",
+ "8": "3E41413E41413E",
+ "9": "3E41413F01013E",
+};
+
+const font5x5 = {
+ "empty": "00000000",
+ "-": "0000FF0000",
+ "0": "0E1915130E",
+ "1": "0C0404040E",
+ "2": "1E010E101F",
+ "3": "1E010E011E",
+ "4": "11111F0101",
+ "5": "1F101E011E",
+ "6": "0E101E110E",
+ "7": "1F01020408",
+ "8": "0E110E110E",
+ "9": "0E110F010E",
+ "A": "040A0E1111",
+ "B": "1E111E111E",
+ "C": "0F1010100F",
+ "D": "1E1111111E",
+ "E": "1F101E101F",
+ "F": "1F101E1010",
+ "G": "0F1013110E",
+ "H": "11111F1111",
+ "I": "0E0404040E",
+ "J": "1F0404140C",
+ "L": "101010101F",
+ "M": "111B151111",
+ "N": "1119151311",
+ "O": "0E1111110E",
+ "P": "1E111E1010",
+ "R": "1E111E1111",
+ "S": "0F100E011E",
+ "T": "1F04040404",
+ "U": "111111110E",
+ "V": "1111110A04",
+ "W": "111115150A",
+ "Y": "110A040404",
+};
+
+// Char renderer
+const COLORS = {
+ blue: {
+ BG: "#0297fe",
+ DARK: "#3b3ce8",
+ LIGHT: "#E9ffff",
+ },
+ orange: {
+ BG: "#f7b336",
+ DARK: "#ac721e",
+ LIGHT: "#f6fc0f",
+ }
+};
+
+let selectedColor = "blue";
+let displayTimeoutRef, sensorTimeoutRef;
+
+// Example
+// binToHex(["0111110", "1000000", "1000000", "1111110", "1000001", "1000001", "0111110"])
+function binToHex(bins) {
+ return bins.map(bin => ("00" + (parseInt(bin, 2).toString(16))).substr(-2).toUpperCase()).join("");
+}
+
+// Example
+// hexToBin("3E40407E41413E")
+function hexToBin(hexStr) {
+ const regEx = new RegExp("..", "g");
+ const bin = hexStr
+ .replace(regEx, el => el + '_')
+ .slice(0, -1)
+ .split('_')
+ .map(hex => ("00000000" + (parseInt(hex, 16)).toString(2)).substr(-8));
+
+ return bin;
+}
+
+function drawPixel(opts) {
+ g.setColor(opts.color);
+ g.fillRect(opts.x, opts.y, opts.x + opts.w, opts.y + opts.h);
+}
+
+function drawGrid(pos, dims, charAsBin, opts) {
+ const defaultOpts = {
+ pxlW: 5,
+ pxlH: 5,
+ gap: 1,
+ offColor: COLORS[selectedColor].DARK,
+ onColor: COLORS[selectedColor].LIGHT
+ };
+ const pxl = Object.assign({}, defaultOpts, opts);
+
+ for (let rowY = 0; rowY < dims.rows; rowY++) {
+ const y = pos.y + ((pxl.pxlH + pxl.gap) * rowY);
+
+ for (let colX = 7; colX > (7 - dims.cols); colX--) {
+ const x = pos.x + ((pxl.pxlW + pxl.gap) * colX);
+ const color = (charAsBin && parseInt(charAsBin[rowY][colX])) ? pxl.onColor : pxl.offColor;
+
+ drawPixel({
+ x: x,
+ y: y,
+ w: pxl.pxlW,
+ h: pxl.pxlH,
+ color: color,
+ });
+ }
+ }
+}
+
+function drawFont(str, font, x, y) {
+ let fontMap, rows, cols;
+
+ switch(font) {
+ case "7x7":
+ fontMap = font7x7;
+ rows = cols = 7;
+ break;
+ case "5x5":
+ fontMap = font5x5;
+ rows = cols = 5;
+ break;
+ default:
+ throw "Unknown font type: " + font;
+ }
+
+ const pxlW = 2;
+ const pxlH = 2;
+ const gap = 2;
+ const gutter = 3;
+ const charArr = str.split("");
+ const gridWidthTotal = (rows * (pxlW + gap)) + gutter;
+ for (let i = 0; i < charArr.length; i++) {
+ const charAsBin = fontMap.hasOwnProperty(charArr[i])?
+ hexToBin(fontMap[charArr[i]]):
+ fontMap.empty;
+
+ drawGrid(
+ {x: x + (i * gridWidthTotal), y: y},
+ {rows: rows, cols: cols},
+ charAsBin,
+ {pxlW: pxlW, pxlH: pxlH, gap: gap}
+ );
+ }
+}
+
+function drawTitles() {
+ g.setColor("#ffffff");
+ g.setFont("6x8");
+ g.drawString("COMPASS", 52, 49);
+ g.drawString("HEART", 122, 49);
+ g.drawString("TIME", 52, 94);
+ g.drawString("DATE", 52, 144);
+}
+
+function drawCompass(lastHeading) {
+ const directions = [
+ 'N',
+ 'NE',
+ 'E',
+ 'SE',
+ 'S',
+ 'SW',
+ 'W',
+ 'NW'
+ ];
+ const cps = Bangle.getCompass();
+ let angle = cps.heading;
+ let heading = angle?
+ directions[Math.round(((angle %= 360) < 0 ? angle + 360 : angle) / 45) % 8]:
+ "-- ";
+
+ heading = (heading + " ").slice(0, 3);
+ if (lastHeading != heading) drawFont(heading, "5x5", 40, 67);
+ setTimeout(drawCompass.bind(null, heading), 1000 * 2);
+}
+
+function drawHeart(hrm) {
+ drawFont((" " + (hrm ? hrm.bpm : "---")).slice(-3), "5x5", 109, 67);
+}
+
+function drawTime(lastHrs, lastMns, toggle) {
+ const date = new Date();
+ const h = date.getHours();
+ const hrs = ("00" + ((is12Hour && h > 12) ? h - 12 : h)).substr(-2);
+ const mns = ("00" + date.getMinutes()).substr(-2);
+
+ if (lastHrs != hrs) {
+ drawFont(hrs, "7x7", 48, 109);
+ }
+ if (lastMns != mns) {
+ drawFont(mns, "7x7", 124, 109);
+ }
+
+ const color = toggle? COLORS[selectedColor].LIGHT : COLORS[selectedColor].DARK;
+
+ // This should toggle on/off per second
+ drawPixel({
+ color: color,
+ x: 118, y: 118,
+ w: 2, h: 2,
+ });
+ drawPixel({
+ color: color,
+ x: 118, y: 125,
+ w: 2, h: 2,
+ });
+
+ setTimeout(drawTime.bind(null, hrs, mns, !toggle), 1000);
+}
+
+function drawDate(lastDate) {
+ const locale = require('locale');
+ const date = new Date();
+
+ if (lastDate != date.toISOString().split('T')[0]) {
+ const dow = locale.dow(date, 1).toUpperCase();
+ const dayNum = ("00" + date.getDate()).slice(-2);
+ const mon = locale.month(date).toUpperCase().slice(0, 3);
+ const yr = date.getFullYear().toString().slice(-2);
+ drawFont(dow + " " + dayNum, "5x5", 40, 159);
+ drawFont(mon + " " + yr, "5x5", 40, 189);
+ }
+
+ setTimeout(drawDate.bind(null, date.toISOString().split('T')), 1000 * 60);
+}
+
+function setSensors(state) {
+ // Already reading sensors and trying to activate sensors, do nothing
+ if (sensorTimeoutRef && state === 1) return;
+
+ // If we are activating the sensors, turn them off again in one minute
+ if (state === 1) {
+ sensorTimeoutRef = setTimeout(() => { setSensors(0); }, 1000 * 60);
+ } else {
+ if (sensorTimeoutRef) {
+ clearInterval(sensorTimeoutRef);
+ sensorTimeoutRef = null;
+ }
+ // Bit nasty, but we only redraw the heart value on sensor callback
+ // but we want to blank out when sensor is off, but no callback for
+ // that so force redraw here
+ drawHeart();
+ }
+
+ Bangle.setHRMPower(state);
+ Bangle.setCompassPower(state);
+}
+
+function drawScreen() {
+ g.setBgColor(COLORS[selectedColor].BG);
+ g.clearRect(0, 24, g.getWidth(), g.getHeight());
+
+ // Draw components
+ drawTitles();
+ drawCompass();
+ drawHeart();
+ drawTime();
+ drawDate();
+}
+
+function clearTimers(){
+ if (displayTimeoutRef) {
+ clearInterval(displayTimeoutRef);
+ displayTimeoutRef = null;
+ }
+
+ if (sensorTimeoutRef) {
+ clearInterval(sensorTimeoutRef);
+ sensorTimeoutRef = null;
+ }
+}
+
+function resetDisplayTimeout() {
+ if (displayTimeoutRef) clearInterval(displayTimeoutRef);
+ Bangle.setLCDPower(true);
+
+ displayTimeoutRef = setTimeout(() => {
+ if (Bangle.isLCDOn()) Bangle.setLCDPower(false);
+ clearTimers();
+ }, 1000 * timeout);
+}
+
+// Turn sensors on
+setSensors(1);
+
+// Reset screen
+g.clear();
+
+// Load and draw widgets
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+
+// Draw screen
+drawScreen();
+resetDisplayTimeout();
+
+// Setup callbacks
+Bangle.on('swipe', (sDir) => {
+ selectedColor = selectedColor === "blue" ? "orange" : "blue";
+ resetDisplayTimeout();
+ drawScreen();
+});
+
+Bangle.on('HRM', drawHeart);
+
+setWatch(() => {
+ setSensors(1);
+ resetDisplayTimeout();
+}, BTN1, {repeat: true, edge: "falling"});
+
+setWatch(() => {
+ setSensors(0);
+ clearTimers();
+ Bangle.setLCDMode();
+ Bangle.showLauncher();
+}, BTN2, {repeat: false, edge: "falling"});
+
+Bangle.on('lcdPower', (on) => {
+ if(on) {
+ resetDisplayTimeout();
+ } else {
+ clearTimers();
+ setSensors(0);
+ }
+});
+
+Bangle.on('faceUp', (up) => {
+ if (up && !Bangle.isLCDOn()) {
+ setSensors(1);
+ resetDisplayTimeout();
+ }
+});
\ No newline at end of file
diff --git a/apps/dotmatrixclock/dotmatrix-clock-screen-shot.png b/apps/dotmatrixclock/dotmatrix-clock-screen-shot.png
new file mode 100755
index 000000000..e6218f4c9
Binary files /dev/null and b/apps/dotmatrixclock/dotmatrix-clock-screen-shot.png differ
diff --git a/apps/dotmatrixclock/dotmatrixclock-icon.js b/apps/dotmatrixclock/dotmatrixclock-icon.js
new file mode 100644
index 000000000..8773839e1
--- /dev/null
+++ b/apps/dotmatrixclock/dotmatrixclock-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+AAmBAEgrFAAZelFo+s1krAEcAE4IuFHIIJBAEXXE4KSEF84nCF4WBgErBYoAfEoaTBF42zF8PXF5QNBi4AgMIYv/F9nX64CDAw4ACl8vBIgGGF/4AOEgKPfI4xfoF96P/R/6PdACAv/F/4v/F/4v/F8HX68Xl8vAwIDCBIQADBIQQDBoQQDF/4AOGQqPbLAxmGL5gGDF/4AfF/6PRBIQQDSwwv/ABwoCR7xYGMwxfhF94AeF/4vr1nXBoIAf64mCF4gJEF8IkCF4YABFYQLDAEItBwIuCF9InBF4iSBwMrAEgnBFwgACXsIADFo4ABqwAkFQg="))
diff --git a/apps/dotmatrixclock/dotmatrixclock.png b/apps/dotmatrixclock/dotmatrixclock.png
new file mode 100755
index 000000000..ab2637520
Binary files /dev/null and b/apps/dotmatrixclock/dotmatrixclock.png differ
diff --git a/apps/espruinoctrl/ChangeLog b/apps/espruinoctrl/ChangeLog
new file mode 100644
index 000000000..5560f00bc
--- /dev/null
+++ b/apps/espruinoctrl/ChangeLog
@@ -0,0 +1 @@
+0.01: New App!
diff --git a/apps/espruinoctrl/README.md b/apps/espruinoctrl/README.md
new file mode 100644
index 000000000..a7bca662c
--- /dev/null
+++ b/apps/espruinoctrl/README.md
@@ -0,0 +1,28 @@
+# Espruino Control
+
+Send commands to other Espruino devices via the Bluetooth UART interface.
+
+## Customising
+
+Click the customise button and you can customise your commands
+with 4 options:
+
+
+* **Title** - The title of the menu item that will be displayed
+* **Command** - The JS command to execute, eg. `LED.toggle()`
+* **MAC Address** - If specified, of the form `aa:bb:cc:dd:ee:ff`. The device
+with this address will be connected to directly. If not specified a menu
+showing available Espruino devices is popped up.
+* **RX** - If checked, the app will display any data received from the
+device being connected to. Use this if you want to print data - eg: `print(E.getBattery())`
+
+When done, click 'Upload'. Your changes will be saved to local storage
+so they'll be remembered next time you upload from the same device.s
+
+## Usage
+
+Simply load the app and you'll see a menu with the menu items
+you defined. Select one and you'll be able to connect to the device
+and send the command.
+
+If a command should wait for a response then
diff --git a/apps/espruinoctrl/app-icon.js b/apps/espruinoctrl/app-icon.js
new file mode 100644
index 000000000..70d2dd062
--- /dev/null
+++ b/apps/espruinoctrl/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwhH+AH4A/AH4A/AH4AFwIuuAAIllAAYIGF041IF34AKqwuuAANXF9QuCAANdGHqQgGBwvdGCIud5mjGB4udAAIwPFz3MSR61VFxQwNci4vGeh4uXGAguHGBK3WGA4AIegtXc69dGBxoBGAouWO4IwNe4gwZa4YwLFwikEFzAwLFwwwCFzQwKFw68YGB4AdF5AwmF5IwlF5QwkF5Yw/F8IwEL9WBB4IuuADwuzGxAugFAgliGBYutAH4A/AH4A/ADA="))
diff --git a/apps/espruinoctrl/app.png b/apps/espruinoctrl/app.png
new file mode 100644
index 000000000..900861e43
Binary files /dev/null and b/apps/espruinoctrl/app.png differ
diff --git a/apps/espruinoctrl/custom.html b/apps/espruinoctrl/custom.html
new file mode 100644
index 000000000..e6297cf2e
--- /dev/null
+++ b/apps/espruinoctrl/custom.html
@@ -0,0 +1,275 @@
+
+
+
+
+
+
+
+
+ Enter the menu items you'd like to see appear in the app below. MAC Address is the MAC address
+ of the device to use. If it isn't specified then a menu will be presented showing available devices.
+
+
+
+
+ Title
+ Command
+ MAC Address
+ RX
+
+
+
+
+
+
+
+ Upload to Bangle.js
+
+
+
+
+
+
diff --git a/apps/files/ChangeLog b/apps/files/ChangeLog
new file mode 100644
index 000000000..b4037a733
--- /dev/null
+++ b/apps/files/ChangeLog
@@ -0,0 +1,5 @@
+0.02: Fix deletion of apps - now use files list in app.info (fix #262)
+0.03: Add support for data files
+0.04: Add functionality to sort apps manually or alphabetically ascending/descending.
+0.05: Tweaks to help with memory usage
+0.06: Reduce memory usage
\ No newline at end of file
diff --git a/apps/files/files.js b/apps/files/files.js
index 31353cf96..9e6c97702 100644
--- a/apps/files/files.js
+++ b/apps/files/files.js
@@ -1,9 +1,7 @@
-const storage = require('Storage');
+const store = require('Storage');
const boolFormat = (v) => v ? "On" : "Off";
-let m;
-
function showMainMenu() {
const mainmenu = {
'': {
@@ -12,50 +10,104 @@ function showMainMenu() {
'Free': {
value: undefined,
format: (v) => {
- return storage.getFree();
+ return store.getFree();
},
onchange: () => {}
},
'Compact': () => {
E.showMessage('Compacting...');
try {
- storage.compact();
+ store.compact();
} catch (e) {
}
- m = showMainMenu();
+ showMainMenu();
},
- 'Apps': ()=> m = showApps(),
+ 'Apps': ()=> showApps(),
+ 'Sort Apps': () => showSortAppsMenu(),
'< Back': ()=> {load();}
};
- return E.showMenu(mainmenu);
+ E.showMenu(mainmenu);
}
-function eraseApp(app) {
+function isGlob(f) {
+ return /[?*]/.test(f);
+}
+
+function globToRegex(pattern) {
+ const ESCAPE = '.*+-?^${}()|[]\\';
+ const regex = pattern.replace(/./g, c => {
+ switch (c) {
+ case '?': return '.';
+ case '*': return '.*';
+ default: return ESCAPE.includes(c) ? ('\\' + c) : c;
+ }
+ });
+ return new RegExp('^'+regex+'$');
+}
+
+function eraseFiles(info) {
+ info.files.split(",").forEach(f=>store.erase(f));
+}
+
+function eraseData(info) {
+ if(!info.data) return;
+ const d=info.data.split(';'),
+ files=d[0].split(','),
+ sFiles=(d[1]||'').split(',');
+ let erase = f=>store.erase(f);
+ files.forEach(f=>{
+ if (!isGlob(f)) erase(f);
+ else store.list(globToRegex(f)).forEach(erase);
+ });
+ erase = sf=>store.open(sf,'r').erase();
+ sFiles.forEach(sf=>{
+ if (!isGlob(sf)) erase(sf);
+ else store.list(globToRegex(sf+'\u0001'))
+ .forEach(fs=>erase(fs.substring(0,fs.length-1)));
+ });
+}
+function eraseApp(app, files,data) {
E.showMessage('Erasing\n' + app.name + '...');
- storage.erase(app['']);
- storage.erase(app.icon);
- storage.erase(app.src);
+ var info = store.readJSON(app.id + ".info", 1)||{};
+ if (files) eraseFiles(info);
+ if (data) eraseData(info);
+}
+function eraseOne(app, files,data){
+ E.showPrompt('Erase\n'+app.name+'?').then((v) => {
+ if (v) {
+ Bangle.buzz(100, 1);
+ eraseApp(app, files, data);
+ showApps();
+ } else {
+ showAppMenu(app);
+ }
+ });
+}
+function eraseAll(apps, files,data) {
+ E.showPrompt('Erase all?').then((v) => {
+ if (v) {
+ Bangle.buzz(100, 1);
+ apps.forEach(app => eraseApp(app, files, data));
+ }
+ showApps();
+ });
}
function showAppMenu(app) {
- const appmenu = {
+ let appmenu = {
'': {
'title': app.name,
},
- '< Back': () => m = showApps(),
- 'Erase': () => {
- E.showPrompt('Erase\n' + app.name + '?').then((v) => {
- if (v) {
- Bangle.buzz(100, 1);
- eraseApp(app);
- m = showApps();
- } else {
- m = showAppMenu(app)
- }
- });
- }
+ '< Back': () => showApps(),
};
- return E.showMenu(appmenu);
+ if (app.hasData) {
+ appmenu['Erase Completely'] = () => eraseOne(app, true, true);
+ appmenu['Erase App,Keep Data'] = () => eraseOne(app, true, false);
+ appmenu['Only Erase Data'] = () => eraseOne(app, false, true);
+ } else {
+ appmenu['Erase'] = () => eraseOne(app, true, false);
+ }
+ E.showMenu(appmenu);
}
function showApps() {
@@ -63,30 +115,28 @@ function showApps() {
'': {
'title': 'Apps',
},
- '< Back': () => m = showMainMenu(),
+ '< Back': () => showMainMenu(),
};
- var list = storage.list(/\.info$/).filter((a)=> {
+ var list = store.list(/\.info$/).filter((a)=> {
return a !== 'setting.info';
- }).sort().map((app) => {
- var ret = storage.readJSON(app,1)||{};
- ret[''] = app;
- return ret;
- });
+ }).map((a)=> {
+ let app = store.readJSON(a, 1) || {};
+ return {id: app.id, name: app.name, hasData: !!app.data};
+ }).sort(sortHelper());
if (list.length > 0) {
list.reduce((menu, app) => {
- menu[app.name] = () => m = showAppMenu(app);
+ menu[app.name] = () => showAppMenu(app);
return menu;
}, appsmenu);
appsmenu['Erase All'] = () => {
- E.showPrompt('Erase all?').then((v) => {
- if (v) {
- Bangle.buzz(100, 1);
- for (var n = 0; n < list.length; n++)
- eraseApp(list[n]);
- }
- m = showApps();
+ E.showMenu({
+ '': {'title': 'Erase All'},
+ 'Erase Everything': () => eraseAll(list, true, true),
+ 'Erase Apps,Keep Data': () => eraseAll(list, true, false),
+ 'Only Erase Data': () => eraseAll(list, false, true),
+ '< Back': () => showApps(),
});
};
} else {
@@ -96,7 +146,82 @@ function showApps() {
onchange: ()=> {}
};
}
- return E.showMenu(appsmenu);
+ E.showMenu(appsmenu);
}
-m = showMainMenu();
+function showSortAppsMenu() {
+ const sorterMenu = {
+ '': {
+ 'title': 'App Sorter',
+ },
+ '< Back': () => showMainMenu(),
+ 'Sort: manually': ()=> showSortAppsManually(),
+ 'Sort: alph. ASC': () => {
+ E.showMessage('Sorting:\nAlphabetically\nascending ...');
+ sortAlphabet(false);
+ },
+ 'Sort: alph. DESC': () => {
+ E.showMessage('Sorting:\nAlphabetically\ndescending ...');
+ sortAlphabet(true);
+ }
+ };
+ E.showMenu(sorterMenu);
+}
+
+function showSortAppsManually() {
+ const appsSorterMenu = {
+ '': {
+ 'title': 'Sort: manually',
+ },
+ '< Back': () => showSortAppsMenu(),
+ };
+ let appList = getAppsList();
+ if (appList.length > 0) {
+ appList.reduce((menu, app) => {
+ menu[app.name] = {
+ value: app.sortorder || 0,
+ min: 0,
+ max: appList.length,
+ step: 1,
+ onchange: val => setSortorder(app, val)
+ };
+ return menu;
+ }, appsSorterMenu);
+ } else {
+ appsSorterMenu['...No Apps...'] = {
+ value: undefined,
+ format: ()=> '',
+ onchange: ()=> {}
+ };
+ }
+ E.showMenu(appsSorterMenu);
+}
+
+function setSortorder(app, val) {
+ app = store.readJSON(app.id + '.info', 1);
+ app.sortorder = val;
+ store.write(app.id + '.info', JSON.stringify(app));
+}
+
+function getAppsList() {
+ return store.list('.info').map((a)=> {
+ let app = store.readJSON(a, 1) || {};
+ if (app.type !== 'widget') {
+ return {id: app.id, name: app.name, sortorder: app.sortorder};
+ }
+ }).filter((a) => a).sort(sortHelper());
+}
+
+function sortAlphabet(desc) {
+ let appsSorted = desc ? getAppsList().reverse() : getAppsList();
+ appsSorted.forEach((a, i) => {
+ setSortorder(a, i);
+ });
+ showSortAppsMenu();
+}
+
+function sortHelper() {
+ return (a, b) => (a.name > b.name) - (a.name < b.name);
+}
+
+showMainMenu();
diff --git a/apps/findphone/ChangeLog b/apps/findphone/ChangeLog
new file mode 100644
index 000000000..9297fc6c7
--- /dev/null
+++ b/apps/findphone/ChangeLog
@@ -0,0 +1 @@
+0.01: First Version
\ No newline at end of file
diff --git a/apps/findphone/README.md b/apps/findphone/README.md
new file mode 100644
index 000000000..870847222
--- /dev/null
+++ b/apps/findphone/README.md
@@ -0,0 +1,9 @@
+# Find Phone
+
+Ring your phone via GadgetBridge if you lost it somewhere.
+
+1. Enable HID in settings
+2. Connect GadgetBridge
+3. Lose phone
+4. Open app
+5. Click any button or screen
diff --git a/apps/findphone/app-icon.js b/apps/findphone/app-icon.js
new file mode 100644
index 000000000..95a73755e
--- /dev/null
+++ b/apps/findphone/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwkCkQA/AEp0JCxkgC5KJMUpYXMgf/AA0wC5sPC4/wC/4XhxAXXwQXtlBIJC5URC4QwIC5PxFgQXT/QUCC6fwC4ZgIC5E/+EYCgJ4JC4/zwfwhAXTnGIC9pHXO66nY//4a63xFYTvUiJeCC6cAOxQXNFxIXllAWIC5oAKC+EDC48wC5oAKC9EBiAXokBGJgQXLMBQWMAH4AZA="))
\ No newline at end of file
diff --git a/apps/findphone/app.js b/apps/findphone/app.js
new file mode 100644
index 000000000..a532e3b50
--- /dev/null
+++ b/apps/findphone/app.js
@@ -0,0 +1,33 @@
+var storage = require('Storage');
+
+//notify your phone
+function find(){
+ Bluetooth.println(JSON.stringify({t:"findPhone", n:true}));
+}
+
+//init graphics
+g.clear();
+require("Font8x12").add(Graphics);
+g.setFont("8x12",3);
+g.setFontAlign(0,0);
+g.flip();
+
+//init settings
+const settings = storage.readJSON('setting.json',1) || { HID: false };
+
+//check if HID enabled and show message
+if (settings.HID=="kb" || settings.HID=="kbmedia") {
+ g.setColor(0x03E0);
+ g.drawString("click to find", g.getWidth()/2, g.getHeight()/2);
+
+ //register all buttons and screen to find phone
+ setWatch(find, BTN1);
+ setWatch(find, BTN2);
+ setWatch(find, BTN3);
+ setWatch(find, BTN4);
+ setWatch(find, BTN5);
+
+}else{
+ g.setColor(0xf800);
+ g.drawString("enable HID!", g.getWidth()/2, g.getHeight()/2);
+}
\ No newline at end of file
diff --git a/apps/findphone/app.png b/apps/findphone/app.png
new file mode 100644
index 000000000..70d891396
Binary files /dev/null and b/apps/findphone/app.png differ
diff --git a/apps/flagrse/README.md b/apps/flagrse/README.md
new file mode 100644
index 000000000..819ebde36
--- /dev/null
+++ b/apps/flagrse/README.md
@@ -0,0 +1,76 @@
+# Espruino Flag Raiser
+
+An app to send a command to another Espruino to cause it to raise a flag.
+
+For this to work, you need to upload the following code to another
+bluetooth Espruino device (the one with the flag attached) :
+
+```
+var FLAG_PIN = D14;
+
+var s = require("servo").connect(FLAG_PIN);
+s.move(1,3000); // move to position 1 over 3 seconds
+
+var timeout;
+function flag() {
+ if (timeout) clearTimeout();
+ s.move(0.2,2000);
+ timeout = setTimeout(function() {
+ timeout = undefined;
+ s.move(1,2000);
+ },2000);
+}
+
+setWatch(flag, BTN, {repeat:true});
+
+NRF.setServices({
+ "3e440001-f5bb-357d-719d-179272e4d4d9": {
+ "3e440002-f5bb-357d-719d-179272e4d4d9": {
+ value : [0],
+ maxLen : 1,
+ writable : true,
+ onWrite : function(evt) {
+ flag();
+ }
+ }
+ }
+}, { uart : false });
+NRF.setAdvertising({}, {name:"Flag"});
+```
+
+## Wiring
+
+This is designed for an [MDBT42Q Breakout board](http://www.espruino.com/MDBT42Q)
+but should work on any Bluetooth LE Espruino device - you just need to change `FLAG_PIN`
+to the name of the pin that's connected to the servo motor.
+
+However, as designed:
+
+* Get an [MDBT42Q Breakout board](http://www.espruino.com/MDBT42Q)
+* Connect `GND` to GND (black) of a 3.7v LiPo battery
+* Connect `Vin` to positive (red) of the battery
+* Take a servo motor and:
+ * Connect the Black wire to `GND` (LiPo GND)
+ * Connect the Red wire to `Vin` (LiPo 3.7v)
+ * Connect the White wire to `D14` on the MDBT42Q
+
+## How does it work?
+
+The code above changes the advertised name of the Espruino device to be
+`Flag` (which the app then searches for).
+
+Then, it adds a service UUID `3e440001-f5bb-357d-719d-179272e4d4d9` (this
+is just a random number we made up) with characteristic `3e440002-f5bb-357d-719d-179272e4d4d9`
+(the same UUID with the second 16 bits incremented). When the characteristic
+is written (with any data), `flag()` is called, which raises the flag.
+
+`flag()` itself uses the [servo module](http://www.espruino.com/Servo+Motors)
+to allow the servo motor to be controlled easily.
+
+You might find the [Espruino About Bluetooth LE page](http://www.espruino.com/About+Bluetooth+LE)
+is useful as an introduction to services and characteristics.
+
+### Don't want to use a servo motor?
+
+No problem, just replace `flag()` with a function that controls whatever you need
+it to.
diff --git a/apps/flagrse/app.js b/apps/flagrse/app.js
index e7e8e2445..e03e4fb07 100644
--- a/apps/flagrse/app.js
+++ b/apps/flagrse/app.js
@@ -5,15 +5,15 @@ function redraw() {
g.drawImage(img, 120-96, 120-96, {scale:2});
}
- // Code for button (Puck.js)
- var busy = false;
+// Code for button (Puck.js)
+var busy = false;
var lastTry = getTime();
function flag() {
E.showMessage("Working...");
if (busy && lastTry+5bbot))
gameStop();
});
@@ -100,7 +101,7 @@ Bangle.on('touch', function(button) {
if (!running) {
gameStart();
} else {
- birdvy -= 4;
+ birdvy -= 4;
}
});
diff --git a/apps/gallifr/ChangeLog b/apps/gallifr/ChangeLog
new file mode 100644
index 000000000..c785cbd67
--- /dev/null
+++ b/apps/gallifr/ChangeLog
@@ -0,0 +1 @@
+0.01: First released version
diff --git a/apps/gallifr/README.md b/apps/gallifr/README.md
new file mode 100644
index 000000000..b88a3cb53
--- /dev/null
+++ b/apps/gallifr/README.md
@@ -0,0 +1,20 @@
+# Time Traveller's Clock
+
+The time travelling wristwatch is for those who are so attuned to the ebb and flow of time that they no longer require antiquated numbers to read the time.
+
+For those that need some tuition in the ways of the time traveller, the light coloured segment of the pie chart provides a traditional readout of minute. The black sphere that revolves around the edge of the display provides an indication of the hour.
+
+## Features
+
+The following aspects are customisable using the App Loader Menu system:
+
+1. Colour; the dial has four colour schemes:
+- shades of green
+- shades of red
+- shades of blue
+- a 1980's scheme
+2. Widgets; these can be turned on or off - when turned off, the dial uses the whole screen and is slightly larger
+3. Decoration; for those attuned to the time streams, the dial itself reads 'time'. For those who don't need to be reminded what the dial is for, this can be optionally turned off.
+
+## Code description
+The code includes some functions that others may find useful in creating their own applications. These are explained in my robot-building blog [here](https://k9-build.blogspot.com/).
\ No newline at end of file
diff --git a/apps/gallifr/app-icon.js b/apps/gallifr/app-icon.js
new file mode 100644
index 000000000..f0b27e1c8
--- /dev/null
+++ b/apps/gallifr/app-icon.js
@@ -0,0 +1 @@
+E.toArrayBuffer(atob("MDAIAAAAAAAAAAAAAAAABgYAAAAAAAYGDAwSGBgYGBISBgAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAwMEhISGBgYHh4eHh4eHhgSDAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhgYEhIYGBgYEhIYHh4eHh4eHh4eHhgMAAAGAAAAAAAAAAAAAAAAAAAAAAAGAAASHh4eGBISEhISEhIYHh4eHh4eHh4eHh4eGAYABgAAAAAAAAAAAAAAAAAAAAYADBgeHh4eGBIYEhISEhIYHh4eHh4eHh4eHh4eHh4SAAYAAAAAAAAAAAAAAAAABgAMHh4eHh4eHhgSEhIYGBgYHh4eHh4eHh4eHh4eHh4eEgAGAAAAAAAAAAAAAAAGABIeHh4eHh4eHhgSGBgSEhIMEhgYHh4eHh4eHh4eHh4eHhIABgAAAAAAAAAAAAYAEh4eHh4eHh4eHh4SEgwAAAAAAAAAABIYHh4eHh4eHh4eHh4SAAYAAAAAAAAABgAMHh4eHh4eHh4eHhIGAAAMEhISGB4YEgAABhIeHh4eHh4eHh4eEgAGAAAAAAAAAAweHh4eHh4eHh4YDAAABhIYGBgYHh4eHhgGAAAMGB4eHh4eHh4eHhIABgAAAAAAABgeHh4eHh4eHhISGAAMGBgSEhIYHh4eHh4eDAASEgweHh4eHh4eHh4MAAAAAAYAEh4eHh4eHh4eBhIeDAAeHhISGBgYHh4eHh4eGAAGHhIAHh4eHh4eHh4YAAAAAAAGHh4eHh4eHh4GEh4YABgeHhgSEhIMEhgeHh4eHhgAEh4SBh4eHh4eHh4eEgAGBgAYHh4eHh4eHhISHh4MDB4eHhgSDAAAAAAMHh4eHh4AAB4eEgweHh4eHh4eHgAAAAYeHh4eHh4eGBIeHh4AEh4eHh4MABISGBgADB4eHh4SABgeHgwSHh4eHh4eHhIAABIeHh4eHh4eBh4eHhgAGB4eHhgADBgYHh4SABgeHh4YABgeHhgAHh4eHh4eHhgAABgeHh4eHh4SEh4eHhgAGB4eHhgAEhgYHh4YABgeHh4YABIeHh4MEh4eHh4eHh4MBh4eHh4eHh4MHh4eHhgAGB4eHhgAEhgYHh4YABgeHh4YABgeHh4YAB4eHh4eHh4SDB4eHh4eHhgSHh4eHhgAGB4eHh4ADBIYHh4MAB4eHh4YABgeHh4eDBIeHh4eHh4YEh4eHh4eHhIYHh4eHhgADB4eHh4YAAYSEgwAGB4eHh4SAAweHh4eEgYYHh4eHh4YGB4eHh4eHgwYHh4eHh4MAB4eHh4eGAYAAAYYHh4eHh4AEh4YGBgSAAAAABgeHh4eGB4eHh4eHgweHh4eHh4YABIeHh4eHh4YGB4eHh4eHhIAGB4eGAAAEgYSEgAYHh4eGB4eHh4eGBIeHh4eHh4eDAAYHh4eHh4eHh4eHh4eGAASHh4eGAAYHgwYHgYAHh4eGB4eHh4eGAweHh4eHh4MAAYAGB4eHh4eHh4eHh4YAAweHh4eEgAeHgwYHhIAGB4eHh4eHh4eGAweHh4eGAYMGB4MABIeHh4eHh4eHhIADB4eHh4eEgAeHgwYHhIAGB4eHh4eHh4eGAweHhgSEhgeHh4YAAAADBIYGBIMAAASHh4eHh4eGAAYHgweHgwGHh4eHh4eHh4eGAYeGBgeHh4eHh4MABgSDAAAAAAMEhgeHh4eHh4eHgwAEgwYEgAYHh4eGB4eHh4eGAAYHh4eHh4eHhgAGB4eHh4YGB4eHh4eHh4eHh4eHh4MAAAAABgeHh4YGB4eHh4YGAYSHh4eHh4eHgASHh4eHh4eHh4eHh4eHh4eHh4eHh4eEgwYHh4eHh4YEh4YEgwYHhIMHh4eHh4eDBIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eEhgeHh4eHh4SDBIAEh4eHh4AGB4eHh4YEh4eHh4eHh4YGB4eHh4eHh4eHh4eHh4eDB4eHh4eHh4MAAwYHh4eHh4SDB4eHhgGEhgYHh4YEhgSEhgYGB4eHh4eHh4eHh4SEh4eHh4eHh4GABgeHh4eHh4eABgeDAAAAAAABgwYHh4eHh4eGBIYHh4eHh4eHh4GHh4eHh4eHhgAABIeHh4eHh4eGAwGAAYAAAYGAAASHh4eHh4eHh4SEh4eHh4eHhIYHh4eHh4eHhIAAAAYHh4eHh4eGAAABgAAAAAAAAYAEh4eHh4eHh4eGBIeHh4eEhIeHh4eHh4eGAAABgASHh4eHh4eDAAGAAAAAAAAAAAGABgeHh4eHh4eHhIYHh4SBh4eHh4eHh4eEgAGAAYAGB4eHh4YAAAAAAAAAAAAAAAGABIeHh4eHh4eHh4SHhIGHh4eHh4eHh4YAAAAAAAABh4eHh4YAAYAAAAAAAAAAAAGAAweHh4eHh4eHh4YDBIeHh4eHh4eHh4GAAAAAAAGABIeHh4MAAAAAAAAAAAAAAAGAAYeHh4eHh4eHh4SGB4eHh4eHh4eHhIABgAAAAAABgASHhIABgAAAAAAAAAAAAAGAAweHh4eHh4eHh4eHh4eHh4eHh4eEgAGAAAAAAAAAAAADAYSAAAAAAAAAAAAAAAGABIeHh4eHh4eHh4eHh4eHh4eHh4YAAAAAAAAAAAAAAAAABIeBgAGAAAAAAAAAAAGABgeHh4eHh4eHh4eHh4eHh4eHhgAAAAAAAAAAAAAAAAAAAAYGAAAAAAAAAAAAAYADB4eHh4eHh4eHh4eHh4eHh4eEgAAAAAAAAAAAAAAAAAAAAAAEgwAAAAABgYGBgAAGB4eHh4eHh4eHh4eHh4eHh4SAAAAAAAAAAAAAAAAAAAAAAAAAAYGAAAAAAAAAAweHh4eHh4eHh4eHh4eHh4eGAYABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMDAwSGB4eHh4eHh4eHh4eHh4eHhgSAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMEhgeHh4eHh4eHh4eHh4eHh4YEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYMEhgYHh4eHh4eGBgSDAYAAAAGAAAAAAAAAAAAAAAA"))
\ No newline at end of file
diff --git a/apps/gallifr/app.js b/apps/gallifr/app.js
new file mode 100644
index 000000000..281988ad7
--- /dev/null
+++ b/apps/gallifr/app.js
@@ -0,0 +1,247 @@
+//
+// Time Travellers Watch
+// Written May 2020 by Richard Hopkins
+// based on a skeleton app by Gordon Williams
+//
+const locale = require('locale');
+let timer = null;
+let currentDate = new Date();
+const cirRad = 2*Math.PI;
+const proportion = 0.3; // relative size of hour hand
+const thickness = 4; // thickness of decorative lines
+// retrieve settings from menu
+let settings = require('Storage').readJSON('gallifr.json',1)||{};
+const decoration = !settings.decoration;
+const widgets = !settings.widgets;
+if (widgets) {
+ widgetHeight = 24;}
+else {
+ widgetHeight = 0;}
+const colours = ["green","red","blue","80s"];
+const colour = colours[settings.colour];
+const centerX = Math.round(g.getWidth() / 2);
+const centerY = widgetHeight + Math.round((g.getHeight()-widgetHeight) / 2);
+const radius = Math.round(Math.min(g.getWidth()/2,(g.getHeight()-widgetHeight) / 2));
+
+const drawSegment = (params) => {
+ angle1 = params.start/360*cirRad;
+ angle2 = (params.start + params.arc)/360*cirRad;
+ segRadius = Math.round(params.radius*radius);
+ x = centerX + (params.x * radius);
+ y = centerY - (params.y *radius);
+ g.setColor(0,0,0);
+ incr = cirRad/15;
+ for (i = angle1; i < angle2; i=i+incr) {
+ brush = thickness * (angle2-angle1) /angle2;
+ points = [
+ x + Math.sin(i) * (segRadius+brush),
+ y - Math.cos(i) * (segRadius+brush),
+ x + Math.sin(i+incr) * (segRadius+brush),
+ y - Math.cos(i+incr) * (segRadius+brush),
+ x + Math.sin(i+incr) * (segRadius-brush),
+ y - Math.cos(i+incr) * (segRadius-brush),
+ x + Math.sin(i) * (segRadius-brush),
+ y - Math.cos(i) * (segRadius-brush)
+ ];
+ g.fillPoly(points);
+ }
+};
+
+const drawThickLine = (params) => {
+ g.setColor(0,0,0);
+ from = {
+ x: centerX + (params.fromX * radius),
+ y: centerY - (params.fromY * radius)
+ };
+ to = {
+ x: centerX + (params.toX * radius),
+ y: centerY - (params.toY * radius)
+ };
+ vec = {};
+ vec.x = to.x - from.x;
+ vec.y = to.y - from.y;
+ pVec = {};
+ pVec.x = vec.y;
+ pVec.y = -vec.x;
+ length = Math.sqrt(pVec.x * pVec.x + pVec.y * pVec.y);
+ nVec = {};
+ nVec.x = pVec.x / length;
+ nVec.y = pVec.y / length;
+ array = [
+ from.x + nVec.x * thickness,
+ from.y + nVec.y * thickness,
+ from.x - nVec.x * thickness,
+ from.y - nVec.y * thickness,
+ to.x + nVec.x * thickness,
+ to.y + nVec.y * thickness,
+ to.x - nVec.x * thickness,
+ to.y - nVec.y * thickness
+ ];
+ g.fillPoly(array);
+};
+
+
+
+const drawHands = () => {
+ drawMinuteHand();
+ drawHourHand();
+ if (decoration) {
+ drawDecoration();
+ }
+};
+
+const drawDecoration = () => {
+ params = {
+ start: 210,
+ arc: 295,
+ radius: 0.7,
+ x: 0,
+ y: 0
+ };
+ drawSegment(params);
+ params = {
+ start: 290,
+ arc: 135,
+ radius: 0.4,
+ x: 0,
+ y: -0.7
+ };
+ drawSegment(params);
+ params = {
+ start: 0,
+ arc: 360,
+ radius: 0.4,
+ x: 0,
+ y: 0.3
+ };
+ drawSegment(params);
+ params = {
+ start: 0,
+ arc: 360,
+ radius: 0.15,
+ x: 0,
+ y: 0.3
+ };
+ drawSegment(params);
+ params = {
+ start: 0,
+ arc: 360,
+ radius: 0.15,
+ x: 0.7,
+ y: 0
+ };
+ drawSegment(params);
+ params = {
+ fromX: 0.4,
+ fromY: 0.2,
+ toX: 0.6,
+ toY: 0.1
+ };
+ drawThickLine(params);
+ params = {
+ fromX: -0.2,
+ fromY: -0.05,
+ toX: -0.7,
+ toY: -0.7
+ };
+ drawThickLine(params);
+ params = {
+ fromX: -0.3,
+ fromY: 0.05,
+ toX: -0.95,
+ toY: -0.3
+ };
+ drawThickLine(params);
+};
+
+const drawMinuteHand = () => {
+ angle = currentDate.getMinutes()/60 * cirRad;
+ //angle = currentDate.getSeconds()/60 * cirRad;
+ switch(colour) {
+ case "red":
+ g.setColor(1,0,0);
+ break;
+ case "green":
+ g.setColor(0,1,0);
+ break;
+ case "blue":
+ g.setColor(0,0,1);
+ break;
+ case "80s":
+ g.setColor(1,0,0);
+ break;
+ default:
+ g.setColor(0,1,0);
+ }
+
+ var points = [centerX,centerY];
+ for (i = 0; i < angle; i=i+cirRad/60) {
+ points.push(Math.round(centerX + Math.sin(i) * radius),
+ Math.round(centerY - Math.cos(i) * radius));
+ }
+ g.fillPoly(points);
+};
+
+const drawHourHand = () => {
+ g.setColor(0,0,0);
+ //angle = currentDate.getMinutes()/60 * cirRad;
+ angle = currentDate.getHours()/12 * cirRad;
+ g.fillCircle(
+ Math.round(centerX + Math.sin(angle) * radius * (1-proportion)),
+ Math.round(centerY - Math.cos(angle) * radius * (1-proportion)),
+ radius * proportion
+ );
+};
+
+const drawClockFace = () => {
+ switch(colour) {
+ case "red":
+ g.setColor(0.8,0.3,0);
+ break;
+ case "green":
+ g.setColor(0.1,0.7,0);
+ break;
+ case "blue":
+ g.setColor(0,0.3,0.8);
+ break;
+ case "80s":
+ g.setColor(1,1,1);
+ break;
+ default:
+ g.setColor(0.1,0.7,0);
+ }
+ g.fillCircle(centerX,centerY,radius*0.98);
+};
+
+const drawAll = () => {
+ currentDate = new Date();
+ g.clear();
+ if (widgets) {Bangle.drawWidgets();}
+ drawClockFace();
+ drawHands();
+};
+
+
+const startTimers = () => {
+ //timer = setInterval(drawAll, 1000);
+ timer = setInterval(drawAll, 1000*20);
+};
+
+Bangle.on('lcdPower', (on) => {
+ if (on) {
+ startTimers();
+ drawAll();
+ } else {
+ if (timer) {
+ clearInterval(timer);
+ }
+ }
+});
+
+g.clear();
+startTimers();
+Bangle.loadWidgets();
+drawAll();
+
+// Show launcher when middle button pressed
+setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" });
diff --git a/apps/gallifr/gallifr.png b/apps/gallifr/gallifr.png
new file mode 100644
index 000000000..9bb50e3cd
Binary files /dev/null and b/apps/gallifr/gallifr.png differ
diff --git a/apps/gallifr/settings.js b/apps/gallifr/settings.js
new file mode 100644
index 000000000..feb6b0ffc
--- /dev/null
+++ b/apps/gallifr/settings.js
@@ -0,0 +1,33 @@
+// make sure to enclose the function in parentheses
+(function (back) {
+ let settings = require('Storage').readJSON('gallifr.json',1)||{};
+ let colours = ["green","red","blue","80s"];
+ let onoff = ["on","off"];
+ function save(key, value) {
+ settings[key] = value;
+ require('Storage').writeJSON('gallifr.json',settings);
+ }
+ const appMenu = {
+ '': {'title': 'Clock Settings'},
+ '< Back': back,
+ 'Colour': {
+ value: 0|settings['colour'],
+ min:0,max:3,
+ format: m => colours[m],
+ onchange: m => {save('colour', m)}
+ },
+ 'Widgets': {
+ value: 0|settings['widgets'],
+ min:0,max:1,
+ format: m => onoff[m],
+ onchange: m => {save('widgets', m)}
+ },
+ 'Decoration': {
+ value: 0|settings['decoration'],
+ min:0,max:1,
+ format: m => onoff[m],
+ onchange: m => {save('decoration', m)}
+ }
+ };
+ E.showMenu(appMenu)
+})
diff --git a/apps/gbridge/ChangeLog b/apps/gbridge/ChangeLog
index 28789ec04..8277b3479 100644
--- a/apps/gbridge/ChangeLog
+++ b/apps/gbridge/ChangeLog
@@ -2,3 +2,15 @@
0.02: Increase contrast (darker notification background, white text)
0.03: Gadgetbridge widget now shows connection state
0.04: Tweaks for variable size widget system
+0.05: Show incoming call notification
+ Optimize animation, limit title length
+0.06: Gadgetbridge App 'Connected' state is no longer toggleable
+0.07: Move configuration to settings menu
+0.08: Don't turn on LCD at start of every song
+0.09: Update Bluetooth connection state automatically
+0.10: Make widget play well with other Gadgetbridge widgets/apps
+0.11: Report battery status on connect and at regular intervals
+0.12: Setting to show/hide icon
+0.13: Modified to use the 'notify' library
+0.14: Added 'find' event handling
+0.15: Don't keep LCD on while playing music
\ No newline at end of file
diff --git a/apps/gbridge/PROTOCOL.md b/apps/gbridge/PROTOCOL.md
new file mode 100644
index 000000000..1fd0ddb4a
--- /dev/null
+++ b/apps/gbridge/PROTOCOL.md
@@ -0,0 +1,178 @@
+# Watch -> Phone
+
+## show toast
+
+```
+{ "t": "info", "msg": "message" }
+```
+
+t can be one of "info", "warn", "error"
+
+## report battery level
+
+```
+{ "t": "status", "bat": 30, "volt": 30 }
+```
+
+* bat is in range 0 to 100
+* volt is optional and should be greater than 0
+
+## find phone
+
+```
+{ "t": "findPhone", "n": true }
+```
+
+n is an boolean and toggles the find phone function
+
+## control music player
+
+```
+{ "t": "music", "n": "play" }
+```
+
+n can be one of "play", "pause", "playpause", "next", "previous", "volumeup", "volumedown", "forward", "rewind"
+
+## control phone call
+
+```
+{ "t": "call", "n": "accept"}
+```
+
+n can be one of "accept", "end", "incoming", "outcoming", "reject", "start", "ignore"
+
+## react to notifications
+
+Send a response to a notification from phone
+
+```
+{
+ "t": "notify",
+ "n": "dismiss",
+ "id": 2,
+ "tel": "+491234",
+ "msg": "message",
+}
+```
+
+* n can be one of "dismiss", "dismiss all", "open", "mute", "reply"
+* id, tel and message are optional
+
+# Phone -> Watch
+
+## show notification
+
+```
+{
+ "t": "notify",
+ "id": 2,
+ "src": "app",
+ "title": "titel",
+ "subject": "subject",
+ "body": "message body",
+ "sender": "sender",
+ "tel": "+491234"
+ }
+```
+
+## notification deleted
+
+This event is send when the user skipped a notification
+
+```
+{ "t": "notify-", "id": 2 }
+```
+
+## set alarm
+
+```
+{
+ "t": "alarm",
+ "d": [
+ { "h": 13, "m": 37 },
+ { "h": 8, "m": 0 }
+ ]
+}
+```
+
+## call state changed
+
+```
+{
+ "t": "call",
+ "cmd": "accept",
+ "name": "name",
+ "number": "+491234"
+}
+```
+
+cmd can be one of "", "undefined", "accept", "incoming", "outgoing", "reject", "start", "end"
+
+## music state changed
+
+```
+{
+ "t": "musicstate",
+ "state": "play",
+ "position": 40,
+ "shuffle": 0,
+ "repeat": 1
+}
+```
+
+## set music info
+
+```
+{
+ "t": "musicinfo",
+ "artist": "artist",
+ "album": "album",
+ "track": "track",
+ "dur": 1,
+ "c": 2,
+ "n" 3
+}
+```
+
+* dur is the duration of the track
+* c is the track count
+* n is the track number
+
+## find device
+
+```
+{
+ "t": "find",
+ "n": true
+}
+```
+
+n toggles find device functionality
+
+## set constant vibration
+
+```
+{
+ "t": "vibrate",
+ "n": 2
+}
+```
+
+n is the intensity
+
+## send weather
+
+```
+{
+ "t": "weather",
+ "temp": 10,
+ "hum": 71,
+ "txt": "condition",
+ "wind": 13,
+ "loc": "location"
+}
+```
+
+* hum is the humidity
+* txt is the weather condition
+* loc is the location
diff --git a/apps/gbridge/app.js b/apps/gbridge/app.js
deleted file mode 100644
index 45dc0e33d..000000000
--- a/apps/gbridge/app.js
+++ /dev/null
@@ -1,19 +0,0 @@
-function gb(j) {
- Bluetooth.println(JSON.stringify(j));
-}
-
-var mainmenu = {
- "" : { "title" : "Gadgetbridge" },
- "Connected" : { value : NRF.getSecurityStatus().connected },
- "Find Phone" : function() { E.showMenu(findPhone); },
- "Exit" : ()=> {load();},
-};
-
-var findPhone = {
- "" : { "title" : "-- Find Phone --" },
- "On" : _=>gb({t:"findPhone",n:true}),
- "Off" : _=>gb({t:"findPhone",n:false}),
- "< Back" : function() { E.showMenu(mainmenu); },
-};
-
-E.showMenu(mainmenu);
diff --git a/apps/gbridge/settings.js b/apps/gbridge/settings.js
new file mode 100644
index 000000000..d1ecb594b
--- /dev/null
+++ b/apps/gbridge/settings.js
@@ -0,0 +1,44 @@
+(function(back) {
+ function gb(j) {
+ Bluetooth.println(JSON.stringify(j));
+ }
+ function settings() {
+ let settings = require('Storage').readJSON("gbridge.json", true) || {};
+ if (!("showIcon" in settings)) {
+ settings.showIcon = true;
+ }
+ return settings
+ }
+ function updateSetting(setting, value) {
+ let settings = require('Storage').readJSON("gbridge.json", true) || {};
+ settings[setting] = value
+ require('Storage').write('gbridge.json', settings);
+ }
+ function setIcon(visible) {
+ updateSetting('showIcon', visible);
+ // need to re-layout widgets
+ WIDGETS["gbridgew"].reload();
+ g.clear();
+ Bangle.drawWidgets();
+ }
+ var mainmenu = {
+ "" : { "title" : "Gadgetbridge" },
+ "Connected" : { value : NRF.getSecurityStatus().connected?"Yes":"No" },
+ "Show Icon" : {
+ value: settings().showIcon,
+ format: v => v?"Yes":"No",
+ onchange: setIcon
+ },
+ "Find Phone" : function() { E.showMenu(findPhone); },
+ "< Back" : back,
+ };
+
+ var findPhone = {
+ "" : { "title" : "-- Find Phone --" },
+ "On" : _=>gb({t:"findPhone",n:true}),
+ "Off" : _=>gb({t:"findPhone",n:false}),
+ "< Back" : function() { E.showMenu(mainmenu); },
+ };
+
+ E.showMenu(mainmenu);
+})
diff --git a/apps/gbridge/widget.js b/apps/gbridge/widget.js
index a787d7e0b..b2f169985 100644
--- a/apps/gbridge/widget.js
+++ b/apps/gbridge/widget.js
@@ -1,125 +1,146 @@
-(function() {
- var musicState = "stop";
- var musicInfo = {"artist":"","album":"","track":""};
- var scrollPos = 0;
- function gb(j) {
- Bluetooth.println(JSON.stringify(j));
- }
- function show(size,render) {
- var oldMode = Bangle.getLCDMode();
- Bangle.setLCDMode("direct");
- g.setClipRect(0,240,239,319);
- g.setColor("#222222");
- g.fillRect(1,241,238,318);
- render(320-size);
- g.setColor("#ffffff");
- g.fillRect(0,240,1,319);
- g.fillRect(238,240,239,319);
- g.fillRect(2,318,238,319);
- Bangle.setLCDPower(1); // light up
- Bangle.setLCDMode(oldMode); // clears cliprect
- function anim() {
- scrollPos-=2;
- if (scrollPos<-size) scrollPos=-size;
- Bangle.setLCDOffset(scrollPos);
- if (scrollPos>-size) setTimeout(anim,10);
- }
- anim();
- }
- function hide() {
- function anim() {
- scrollPos+=4;
- if (scrollPos>0) scrollPos=0;
- Bangle.setLCDOffset(scrollPos);
- if (scrollPos<0) setTimeout(anim,10);
- }
- anim();
- }
+(() => {
+ const state = {
+ music: "stop",
- Bangle.on('touch',function() {
- if (scrollPos) hide();
- });
- Bangle.on('swipe',function(dir) {
- if (musicState=="play") {
- gb({t:"music",n:dir>0?"next":"previous"});
- }
- });
- gb({t:"status",bat:E.getBattery()});
+ musicInfo: {
+ artist: "",
+ album: "",
+ track: ""
+ },
- global.GB = function(j) {
- switch (j.t) {
- case "notify":
- show(80,function(y) {
- // TODO: icon based on src?
- var x = 120;
- g.setFontAlign(0,0);
- g.setFont("6x8",1);
- g.setColor("#40d040");
- g.drawString(j.src,x,y+7);
- g.setColor("#ffffff");
- g.setFont("6x8",2);
- g.drawString(j.title,x,y+25);
- g.setFont("6x8",1);
- g.setColor("#ffffff");
- // split text up a word boundaries
- var txt = j.body.split("\n");
- var MAXCHARS = 38;
- for (var i=0;iMAXCHARS) {
- var p = MAXCHARS;
- while (p>MAXCHARS-8 && !" \t-_".includes(l[p]))
- p--;
- if (p==MAXCHARS-8) p=MAXCHARS;
- txt[i] = l.substr(0,p);
- txt.splice(i+1,0,l.substr(p));
- }
- }
- g.setFontAlign(-1,-1);
- g.drawString(txt.join("\n"),10,y+40);
- Bangle.buzz();
- });
- break;
- case "musicinfo":
- musicInfo = j;
- break;
- case "musicstate":
- musicState = j.state;
- if (musicState=="play")
- show(40,function(y) {
- g.setColor("#ffffff");
- g.drawImage( require("heatshrink").decompress(atob("jEYwILI/EAv/8gP/ARcMgOAASN8h+A/kfwP8n4CD/E/gHgjg/HA=")),8,y+8);
- g.setFontAlign(-1,-1);
- g.setFont("6x8",1);
- var x = 40;
- g.setFont("4x6",2);
- g.setColor("#ffffff");
- g.drawString(musicInfo.artist,x,y+8);
- g.setFont("6x8",1);
- g.setColor("#ffffff");
- g.drawString(musicInfo.track,x,y+22);
- });
- if (musicState=="pause")
- hide();
- break;
- }
+ scrollPos: 0
};
-function draw() {
- g.setColor(-1);
- if (NRF.getSecurityStatus().connected)
- g.drawImage(require("heatshrink").decompress(atob("i0WwgHExAABCIwJCBYwJEBYkIBQ2ACgvzCwoECx/z/AKDD4WD+YLBEIYKCx//+cvnAKCBwU/mc4/8/HYv//Ev+Y4EEAePn43DBQkzn4rCEIoABBIwKHO4cjmczK42I6mqlqEEBQeIBQaDED4IgDUhi6KaBbmIA==")),this.x+1,this.y+1);
- else
- g.drawImage(require("heatshrink").decompress(atob("i0WwQFC1WgAgYFDAgIFClQFCwEK1W/AoIPB1f+CAMq1f7/WqwQPB/fq1Gq1/+/4dC/2/CAIaB/YbBAAO///qAoX/B4QbBDQQ7BDQQrBAAWoIIIACIIIVC0ECB4cACAZiBAoRtCAoIDBA")),this.x+1,this.y+1);
-}
-function changed() {
- WIDGETS["gbridgew"].draw();
- g.flip();// turns screen on
-}
-NRF.on('connected',changed);
-NRF.on('disconnected',changed);
+ function settings() {
+ let settings = require('Storage').readJSON("gbridge.json", true) || {};
+ if (!("showIcon" in settings)) {
+ settings.showIcon = true;
+ }
+ return settings
+ }
-WIDGETS["gbridgew"]={area:"tl",width:24,draw:draw};
+ function gbSend(message) {
+ Bluetooth.println("");
+ Bluetooth.println(JSON.stringify(message));
+ }
+ function handleNotificationEvent(event) {
+ require("notify").show(event);
+ Bangle.buzz();
+ }
+
+ function updateMusic(options){
+ if (state.music === "play") {
+ require("notify").show(Object.assign({size:40, render:y => {
+ g.setColor(-1);
+ g.drawImage(require("heatshrink").decompress(atob("jEYwILI/EAv/8gP/ARcMgOAASN8h+A/kfwP8n4CD/E/gHgjg/HA=")), 8, y + 8);
+ g.setFontAlign(-1, -1);
+ var x = 40;
+ g.setFont("4x6", 2).drawString(state.musicInfo.artist, x, y + 8);
+ g.setFont("6x8", 1).drawString(state.musicInfo.track, x, y + 22);
+ }}, options));
+ }
+
+ if (state.music === "pause") {
+ require("notify").hide();
+ }
+ }
+ function handleMusicStateUpdate(event) {
+ if (state.music !== event.state) {
+ state.music = event.state
+ updateMusic({on: true});
+ }
+ }
+ function handleMusicInfoUpdate(event) {
+ state.musicInfo = event;
+ updateMusic({on: false});
+ }
+
+ function handleCallEvent(event) {
+ if (event.cmd === "accept") {
+ require("notify").show({
+ size: 55, title: event.name,
+ body: event.number, icon:require("heatshrink").decompress(atob("jEYwIMJj4CCwACJh4CCCIMOAQMGAQMHAQMDAQMBCIMB4PwgHz/EAn4CBj4CBg4CBgACCAAw="))});
+ Bangle.buzz();
+ }
+ }
+
+ function handleFindEvent(event) {
+ if (state.find) {
+ clearInterval(state.find);
+ delete state.find;
+ }
+ if (event.n)
+ state.find = setInterval(_=>{
+ Bangle.buzz();
+ setTimeout(_=>Bangle.beep(), 1000);
+ },2000);
+ }
+
+ var _GB = global.GB;
+ global.GB = (event) => {
+ switch (event.t) {
+ case "notify":
+ handleNotificationEvent(event);
+ break;
+ case "musicinfo":
+ handleMusicInfoUpdate(event);
+ break;
+ case "musicstate":
+ handleMusicStateUpdate(event);
+ break;
+ case "call":
+ handleCallEvent(event);
+ break;
+ case "find":
+ handleFindEvent(event);
+ break;
+ }
+ if(_GB)setTimeout(_GB,0,event);
+ };
+
+ Bangle.on("swipe", (dir) => {
+ if (state.music === "play") {
+ const command = dir > 0 ? "next" : "previous"
+ gbSend({ t: "music", n: command });
+ }
+ });
+
+ function draw() {
+ g.setColor(-1);
+ if (NRF.getSecurityStatus().connected)
+ g.drawImage(require("heatshrink").decompress(atob("i0WwgHExAABCIwJCBYwJEBYkIBQ2ACgvzCwoECx/z/AKDD4WD+YLBEIYKCx//+cvnAKCBwU/mc4/8/HYv//Ev+Y4EEAePn43DBQkzn4rCEIoABBIwKHO4cjmczK42I6mqlqEEBQeIBQaDED4IgDUhi6KaBbmIA==")), this.x + 1, this.y + 1);
+ else
+ g.drawImage(require("heatshrink").decompress(atob("i0WwQFC1WgAgYFDAgIFClQFCwEK1W/AoIPB1f+CAMq1f7/WqwQPB/fq1Gq1/+/4dC/2/CAIaB/YbBAAO///qAoX/B4QbBDQQ7BDQQrBAAWoIIIACIIIVC0ECB4cACAZiBAoRtCAoIDBA")), this.x + 1, this.y + 1);
+ }
+
+ function changedConnectionState() {
+ WIDGETS["gbridgew"].draw();
+ g.flip(); // turns screen on
+ }
+
+ function reload() {
+ NRF.removeListener("connect", changedConnectionState);
+ NRF.removeListener("disconnect", changedConnectionState);
+ if (settings().showIcon) {
+ WIDGETS["gbridgew"].width = 24;
+ WIDGETS["gbridgew"].draw = draw;
+ NRF.on("connect", changedConnectionState);
+ NRF.on("disconnect", changedConnectionState);
+ } else {
+ WIDGETS["gbridgew"].width = 0;
+ WIDGETS["gbridgew"].draw = ()=>{};
+ }
+ }
+
+ WIDGETS["gbridgew"] = {area: "tl", width: 24, draw: draw, reload: reload};
+ reload();
+
+ function sendBattery() {
+ gbSend({ t: "status", bat: E.getBattery() });
+ }
+
+ NRF.on("connect", () => setTimeout(sendBattery, 2000));
+ setInterval(sendBattery, 10*60*1000);
+ sendBattery();
})();
diff --git a/apps/getup/ChangeLog b/apps/getup/ChangeLog
new file mode 100644
index 000000000..9297fc6c7
--- /dev/null
+++ b/apps/getup/ChangeLog
@@ -0,0 +1 @@
+0.01: First Version
\ No newline at end of file
diff --git a/apps/getup/README.md b/apps/getup/README.md
new file mode 100644
index 000000000..b92bedb7c
--- /dev/null
+++ b/apps/getup/README.md
@@ -0,0 +1,7 @@
+# Get Up
+
+Reminds you to getup every x minutes (default: 20).
+
+Sitting to long is dangerous!
+
+Sit and move time configurable in settings.
diff --git a/apps/getup/app-icon.js b/apps/getup/app-icon.js
new file mode 100644
index 000000000..09010684e
--- /dev/null
+++ b/apps/getup/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A75wACCJugAAguaGBouFGCwuF53NFxem6PX6/R0wwVF4xgJEwOsFoMrlYDB1gwUL55dCFQIvE65hUL54jBRgQvF6JgaRxQpCF4SUC67BV5ouLF40yGAOBF64ANR4vXwJhCR6oABq4ACF5TvDAAOsL4LvS4wuGGBi6DGIYuSAAQvGMJiSC6JdSGAovPGAQAFXSQvDrgrBqwvMGAzqTF4d/F4owLADKQGmQv/F7eAF4UySQQwn0ZcCq0ylkySFYyDMEgvDvQwFAAYvk0aLBqy/CAAaUhSAi+BX4QzCAwJkgF4eAX4gzDSsIvDeIzFlGAhhEF9QAHBwIwvF8IwSF7oxMF8gALSEQwRF/4v/YH4v/GD4usAH4A/AH4ARA="))
diff --git a/apps/getup/app.js b/apps/getup/app.js
new file mode 100644
index 000000000..3a22aa410
--- /dev/null
+++ b/apps/getup/app.js
@@ -0,0 +1,45 @@
+//init settings
+const storage = require("Storage");
+const SETTINGS_FILE = 'getup.settings.json';
+
+function setting(key) {
+ const DEFAULTS = {
+ 'sitTime' : 20,
+ 'moveTime' : 1
+ }
+ if (!settings) {
+ loadSettings();
+ }
+ return (key in settings) ? settings[key] : DEFAULTS[key];
+}
+
+let settings;
+
+function loadSettings() {
+ settings = storage.readJSON(SETTINGS_FILE, 1) || {};
+}
+
+//vibrate, draw move message and start timer for sitting message
+function remind() {
+ Bangle.buzz(1000,1);
+ g.clear();
+ g.setFont("8x12",4);
+ g.setColor(0x03E0);
+ g.drawString("MOVE!", g.getWidth()/2, g.getHeight()/2);
+ setTimeout(print_message,setting("moveTime") * 60000);
+}
+//draw sitting message and start timer for reminder
+function print_message(){
+ g.clear();
+ g.setFont("8x12",2);
+ g.setColor(0xF800);
+ g.drawString("sitting is dangerous!", g.getWidth()/2, g.getHeight()/2);
+ setTimeout(remind,setting("sitTime") * 60000);
+}
+
+//init graphics
+require("Font8x12").add(Graphics);
+g.setFontAlign(0,0);
+g.flip();
+
+print_message();
diff --git a/apps/getup/app.png b/apps/getup/app.png
new file mode 100644
index 000000000..fec421183
Binary files /dev/null and b/apps/getup/app.png differ
diff --git a/apps/getup/settings.js b/apps/getup/settings.js
new file mode 100644
index 000000000..f34262f2a
--- /dev/null
+++ b/apps/getup/settings.js
@@ -0,0 +1,48 @@
+// This file should contain exactly one function, which shows the app's settings
+/**
+ * @param {function} back Use back() to return to settings menu
+ */
+(function(back) {
+ const SETTINGS_FILE = 'getup.settings.json';
+
+ // initialize with default settings...
+ let s = {
+ 'sitTime' : 20,
+ 'moveTime' : 1
+ };
+ // ...and overwrite them with any saved values
+ // This way saved values are preserved if a new version adds more settings
+ const storage = require('Storage');
+ const saved = storage.readJSON(SETTINGS_FILE, 1) || {};
+ for (const key in saved) {
+ s[key] = saved[key];
+ }
+
+ // creates a function to safe a specific setting, e.g. save('color')(1)
+ function save(key) {
+ return function (value) {
+ s[key] = value;
+ storage.write(SETTINGS_FILE, s);
+ };
+ }
+
+ const menu = {
+ '': { 'title': 'Get Up' },
+ '< Back': back,
+ 'Sit time (min)': {
+ value: s.sitTime,
+ min: 0,
+ max: 10000,
+ step: 1,
+ onchange: save('sitTime'),
+ },
+ 'Move time (min)': {
+ value: s.moveTime,
+ min: 0,
+ max: 5000,
+ step: 1,
+ onchange: save('moveTime'),
+ },
+ };
+ E.showMenu(menu);
+});
diff --git a/apps/gpsautotime/widget.js b/apps/gpsautotime/widget.js
new file mode 100644
index 000000000..a1d1b2b08
--- /dev/null
+++ b/apps/gpsautotime/widget.js
@@ -0,0 +1,33 @@
+(() => {
+ var lastTimeSet = 0;
+
+ Bangle.on('GPS',function(fix) {
+ if (fix.fix) {
+ var curTime = fix.time.getTime()/1000;
+ setTime(curTime);
+ lastTimeSet = curTime;
+
+ WIDGETS["gpsAutoTime"].draw(WIDGETS["gpsAutoTime"]);
+ }
+ });
+
+ // add your widget
+ WIDGETS["gpsAutoTime"]={
+ area:"tl", // tl (top left), tr (top right), bl (bottom left), br (bottom right)
+ width: 28, // width of the widget
+ draw: function() {
+ g.reset(); // reset the graphics context to defaults (color/font/etc)
+ g.setFont("6x8");
+ if ((getTime() - lastTimeSet) <= 60) {
+ // time is uptodate
+ g.setColor('#00ff00'); // green
+ }
+ g.drawString("auto", this.x, this.y);
+ g.drawString("time", this.x, this.y+10);
+ }
+ };
+
+ setInterval(function() {
+ WIDGETS["gpsAutoTime"].draw(WIDGETS["gpsAutoTime"]);
+ }, 1*60000); // update every minute
+})()
diff --git a/apps/gpsautotime/widget.png b/apps/gpsautotime/widget.png
new file mode 100644
index 000000000..6f6e23f2f
Binary files /dev/null and b/apps/gpsautotime/widget.png differ
diff --git a/apps/gpsinfo/ChangeLog b/apps/gpsinfo/ChangeLog
index 50d79e72d..90ace259c 100644
--- a/apps/gpsinfo/ChangeLog
+++ b/apps/gpsinfo/ChangeLog
@@ -1 +1,2 @@
0.02: Ensure screen doesn't display garbage at startup
+0.03: Show number of satellites while waiting for fix
\ No newline at end of file
diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js
index f7daf245a..836e3a71b 100644
--- a/apps/gpsinfo/gps-info.js
+++ b/apps/gpsinfo/gps-info.js
@@ -52,7 +52,11 @@ function onGPS(fix) {
g.setFont("6x8", 2);
g.drawString("Waiting for GPS", 120, 80);
nofix = (nofix+1) % 4;
- g.drawString(".".repeat(nofix) + " ".repeat(4-nofix), 120, 120)
+ g.drawString(".".repeat(nofix) + " ".repeat(4-nofix), 120, 120);
+ // Show number of satellites:
+ g.setFontAlign(0,0);
+ g.setFont("6x8");
+ g.drawString(fix.satellites+" satellites", 120, 100);
}
g.flip();
}
diff --git a/apps/gpsnav/ChangeLog b/apps/gpsnav/ChangeLog
new file mode 100644
index 000000000..d28ad53ac
--- /dev/null
+++ b/apps/gpsnav/ChangeLog
@@ -0,0 +1,4 @@
+0.01: New App!
+0.02: Add SCREENACCESS interface
+0.03: Add Waypoint Editor
+
diff --git a/apps/gpsnav/README.md b/apps/gpsnav/README.md
new file mode 100644
index 000000000..af239b233
--- /dev/null
+++ b/apps/gpsnav/README.md
@@ -0,0 +1,62 @@
+## gpsnav - navigate to waypoints
+
+The app is aimed at small boat navigation although it can also be used to mark the location of your car, bicycle etc and then get directions back to it. Please note that it would be foolish in the extreme to rely on this as your only boat navigation aid!
+
+The app displays direction of travel (course), speed, direction to waypoint (bearing) and distance to waypoint. The screen shot below is before the app has got a GPS fix.
+
+
+
+The large digits are the course and speed. The top of the display is a linear compass which displays the direction of travel when a fix is received and you are moving. The blue text is the name of the current waypoint. NONE means that there is no waypoint set and so bearing and distance will remain at 0. To select a waypoint, press BTN2 (middle) and wait for the blue text to turn white. Then use BTN1 and BTN3 to select a waypoint. The waypoint choice is fixed by pressing BTN2 again. In the screen shot below a waypoint giving the location of Stone Henge has been selected.
+
+
+
+The display shows that Stone Henge is 108.75Km from the location where I made the screenshot and the direction is 255 degrees - approximately west. The display shows that I am currently moving approximately north - albeit slowly!. The position of the blue circle indicates that I need to turn left to get on course to Stone Henge. When the circle and red triangle line up you are on course and course will equal bearing.
+
+### Marking Waypoints
+
+The app lets you mark your current location as follows. There are vacant slots in the waypoint file which can be allocated a location. In the distributed waypoint file these are labelled WP0 to WP4. Select one of these - WP2 is shown below.
+
+
+
+Bearing and distance are both zero as WP1 has currently no GPS location associated with it. To mark the location, press BTN2.
+
+
+
+The app indicates that WP2 is now marked by adding the prefix @ to it's name. The distance should be small as shown in the screen shot as you have just marked your current location.
+
+### Waypoint JSON file
+
+When the app is loaded from the app loader, a file named `waypoints.json` is loaded along with the javascript etc. The file has the following contents:
+
+```
+[
+ {
+ "name":"NONE"
+ },
+ {
+ "name":"No10",
+ "lat":51.5032,
+ "lon":-0.1269
+ },
+ {
+ "name":"Stone",
+ "lat":51.1788,
+ "lon":-1.8260
+ },
+ { "name":"WP0" },
+ { "name":"WP1" },
+ { "name":"WP2" },
+ { "name":"WP3" },
+ { "name":"WP4" }
+]
+```
+
+The file contains the initial NONE waypoint which is useful if you just want to display course and speed. The next two entries are waypoints to No 10 Downing Street and to Stone Henge - obtained from Google Maps. The last five entries are entries which can be *marked*.
+
+You add and delete entries using the Web IDE to load and then save the file from and to watch storage. The app itself does not limit the number of entries although it does load the entire file into RAM which will obviously limit this.
+
+### Waypoint Editor
+
+Clicking on the download icon of gpsnav in the app loader invokes the waypoint editor. The editor downloads and displays the current `waypoints.json` file. Clicking the `Edit` button beside an entry causes the entry to be deleted from the list and displayed in the edit boxes. It can be restored - by clicking the `Add waypoint` button. A new markable entry is created by using the `Add name` button. The edited `waypoints.json` file is uploaded to the Bangle by clicking the `Upload` button.
+
+*Please report bugs etc. by raising an issue [here](https://github.com/jeffmer/JeffsBangleAppsDev). *
\ No newline at end of file
diff --git a/apps/gpsnav/app-icon.js b/apps/gpsnav/app-icon.js
new file mode 100644
index 000000000..890981d5a
--- /dev/null
+++ b/apps/gpsnav/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwwhC/AFmACysDC9+IC6szC/8AgUgLwYXBPAgLDAA8kC5MyC5cyogXHmYiDURMkDAMzC4JgBmcyoAXMGANCC4YDBkgXMHwVEC4hQDC5kyF4kjJ4QAMOgMjC4eCohGNMARbCC4ODkilLAAQSBCYJ3EmYVLhAWCCgQaCAAUwCpowCFwYADIRAYHC4wZFRQIAGnAhJXgwAFxAYHwC9JFwiQCFhIZISAQwDX5sCoQTCDYUjUpAAFglElAXDmS9JAAtEoUyC4ckkbvMC4QQBC4YeBC5sEB4IXEkgfBJBkEH4QXCCYMkoQXMHwcIC4ZQCUpYMDC4oiBC5YEDC40AkCRNAAIXBCJ4X2URgAJhAXvCyoA/ACoA="))
\ No newline at end of file
diff --git a/apps/gpsnav/app.js b/apps/gpsnav/app.js
new file mode 100644
index 000000000..1e70b0cd3
--- /dev/null
+++ b/apps/gpsnav/app.js
@@ -0,0 +1,250 @@
+const Yoff = 40;
+var pal2color = new Uint16Array([0x0000,0xffff,0x07ff,0xC618],0,2);
+var buf = Graphics.createArrayBuffer(240,50,2,{msb:true});
+var candraw = true;
+
+function flip(b,y) {
+ g.drawImage({width:240,height:50,bpp:2,buffer:b.buffer, palette:pal2color},0,y);
+ b.clear();
+}
+
+var brg=0;
+var wpindex=0;
+const labels = ["N","NE","E","SE","S","SW","W","NW"];
+
+function drawCompass(course) {
+ if (!candraw) return;
+ buf.setColor(1);
+ buf.setFont("Vector",16);
+ var start = course-90;
+ if (start<0) start+=360;
+ buf.fillRect(28,45,212,49);
+ var xpos = 30;
+ var frag = 15 - start%15;
+ if (frag<15) xpos+=frag; else frag = 0;
+ for (var i=frag;i<=180-frag;i+=15){
+ var res = start + i;
+ if (res%90==0) {
+ buf.drawString(labels[Math.floor(res/45)%8],xpos-8,0);
+ buf.fillRect(xpos-2,25,xpos+2,45);
+ } else if (res%45==0) {
+ buf.drawString(labels[Math.floor(res/45)%8],xpos-12,0);
+ buf.fillRect(xpos-2,30,xpos+2,45);
+ } else if (res%15==0) {
+ buf.fillRect(xpos,35,xpos+1,45);
+ }
+ xpos+=15;
+ }
+ if (wpindex!=0) {
+ var bpos = brg - course;
+ if (bpos>180) bpos -=360;
+ if (bpos<-180) bpos +=360;
+ bpos+=120;
+ if (bpos<30) bpos = 14;
+ if (bpos>210) bpos = 226;
+ buf.setColor(2);
+ buf.fillCircle(bpos,40,8);
+ }
+ flip(buf,Yoff);
+}
+
+//displayed heading
+var heading = 0;
+function newHeading(m,h){
+ var s = Math.abs(m - h);
+ var delta = 1;
+ if (s<2) return h;
+ if (m > h){
+ if (s >= 180) { delta = -1; s = 360 - s;}
+ } else if (m <= h){
+ if (s < 180) delta = -1;
+ else s = 360 -s;
+ }
+ delta = delta * (1 + Math.round(s/15));
+ heading+=delta;
+ if (heading<0) heading += 360;
+ if (heading>360) heading -= 360;
+ return heading;
+}
+
+var course =0;
+var speed = 0;
+var satellites = 0;
+var wp;
+var dist=0;
+
+function radians(a) {
+ return a*Math.PI/180;
+}
+
+function degrees(a) {
+ var d = a*180/Math.PI;
+ return (d+360)%360;
+}
+
+function bearing(a,b){
+ var delta = radians(b.lon-a.lon);
+ var alat = radians(a.lat);
+ var blat = radians(b.lat);
+ var y = Math.sin(delta) * Math.cos(blat);
+ var x = Math.cos(alat)*Math.sin(blat) -
+ Math.sin(alat)*Math.cos(blat)*Math.cos(delta);
+ return Math.round(degrees(Math.atan2(y, x)));
+}
+
+function distance(a,b){
+ var x = radians(a.lon-b.lon) * Math.cos(radians((a.lat+b.lat)/2));
+ var y = radians(b.lat-a.lat);
+ return Math.round(Math.sqrt(x*x + y*y) * 6371000);
+}
+
+var selected = false;
+
+function drawN(){
+ buf.setColor(1);
+ buf.setFont("6x8",2);
+ buf.drawString("o",100,0);
+ buf.setFont("6x8",1);
+ buf.drawString("kph",220,40);
+ buf.setFont("Vector",40);
+ var cs = course.toString();
+ cs = course<10?"00"+cs : course<100 ?"0"+cs : cs;
+ buf.drawString(cs,10,0);
+ var txt = (speed<10) ? speed.toFixed(1) : Math.round(speed);
+ buf.drawString(txt,140,4);
+ flip(buf,Yoff+70);
+ buf.setColor(1);
+ buf.setFont("Vector",20);
+ var bs = brg.toString();
+ bs = brg<10?"00"+bs : brg<100 ?"0"+bs : bs;
+ buf.setColor(3);
+ buf.drawString("Brg: ",0,0);
+ buf.drawString("Dist: ",0,30);
+ buf.setColor(selected?1:2);
+ buf.drawString(wp.name,140,0);
+ buf.setColor(1);
+ buf.drawString(bs,60,0);
+ if (dist<1000)
+ buf.drawString(dist.toString()+"m",60,30);
+ else
+ buf.drawString((dist/1000).toFixed(2)+"Km",60,30);
+ flip(buf,Yoff+130);
+ g.setFont("6x8",1);
+ g.setColor(0,0,0);
+ g.fillRect(10,230,60,239);
+ g.setColor(1,1,1);
+ g.drawString("Sats " + satellites.toString(),10,230);
+}
+
+var savedfix;
+
+function onGPS(fix) {
+ savedfix = fix;
+ if (fix!==undefined){
+ course = isNaN(fix.course) ? course : Math.round(fix.course);
+ speed = isNaN(fix.speed) ? speed : fix.speed;
+ satellites = fix.satellites;
+ }
+ if (candraw) {
+ if (fix!==undefined && fix.fix==1){
+ dist = distance(fix,wp);
+ if (isNaN(dist)) dist = 0;
+ brg = bearing(fix,wp);
+ if (isNaN(brg)) brg = 0;
+ }
+ drawN();
+ }
+}
+
+var intervalRef;
+
+function stopdraw() {
+ candraw=false;
+ if(intervalRef) {clearInterval(intervalRef);}
+}
+
+function startTimers() {
+ candraw=true;
+ intervalRefSec = setInterval(function() {
+ newHeading(course,heading);
+ if (course!=heading) drawCompass(heading);
+ },200);
+}
+
+function drawAll(){
+ g.setColor(1,0.5,0.5);
+ g.fillPoly([120,Yoff+50,110,Yoff+70,130,Yoff+70]);
+ g.setColor(1,1,1);
+ drawN();
+ drawCompass(heading);
+}
+
+function startdraw(){
+ g.clear();
+ Bangle.drawWidgets();
+ startTimers();
+ drawAll();
+}
+
+function setButtons(){
+ setWatch(nextwp.bind(null,-1), BTN1, {repeat:true,edge:"falling"});
+ setWatch(doselect, BTN2, {repeat:true,edge:"falling"});
+ setWatch(nextwp.bind(null,1), BTN3, {repeat:true,edge:"falling"});
+}
+
+var SCREENACCESS = {
+ withApp:true,
+ request:function(){
+ this.withApp=false;
+ stopdraw();
+ clearWatch();
+ },
+ release:function(){
+ this.withApp=true;
+ startdraw();
+ setButtons();
+ }
+}
+
+Bangle.on('lcdPower',function(on) {
+ if (!SCREENACCESS.withApp) return;
+ if (on) {
+ startdraw();
+ } else {
+ stopdraw();
+ }
+});
+
+var waypoints = require("Storage").readJSON("waypoints.json")||[{name:"NONE"}];
+wp=waypoints[0];
+
+function nextwp(inc){
+ if (!selected) return;
+ wpindex+=inc;
+ if (wpindex>=waypoints.length) wpindex=0;
+ if (wpindex<0) wpindex = waypoints.length-1;
+ wp = waypoints[wpindex];
+ drawN();
+}
+
+function doselect(){
+ if (selected && waypoints[wpindex].lat===undefined && savedfix.fix) {
+ waypoints[wpindex] ={name:"@"+wp.name, lat:savedfix.lat, lon:savedfix.lon};
+ wp = waypoints[wpindex];
+ require("Storage").writeJSON("waypoints.json", waypoints);
+ }
+ selected=!selected;
+ drawN();
+}
+
+g.clear();
+Bangle.setLCDBrightness(1);
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+// load widgets can turn off GPS
+Bangle.setGPSPower(1);
+drawAll();
+startTimers();
+Bangle.on('GPS', onGPS);
+// Toggle selected
+setButtons();
diff --git a/apps/gpsnav/first_screen.jpg b/apps/gpsnav/first_screen.jpg
new file mode 100644
index 000000000..34fbe1b50
Binary files /dev/null and b/apps/gpsnav/first_screen.jpg differ
diff --git a/apps/gpsnav/gpsnav.jpg b/apps/gpsnav/gpsnav.jpg
new file mode 100644
index 000000000..975fe3903
Binary files /dev/null and b/apps/gpsnav/gpsnav.jpg differ
diff --git a/apps/gpsnav/icon.png b/apps/gpsnav/icon.png
new file mode 100644
index 000000000..f899683d1
Binary files /dev/null and b/apps/gpsnav/icon.png differ
diff --git a/apps/gpsnav/marked_screen.jpg b/apps/gpsnav/marked_screen.jpg
new file mode 100644
index 000000000..accd3b15f
Binary files /dev/null and b/apps/gpsnav/marked_screen.jpg differ
diff --git a/apps/gpsnav/select_screen.jpg b/apps/gpsnav/select_screen.jpg
new file mode 100644
index 000000000..8e42411b0
Binary files /dev/null and b/apps/gpsnav/select_screen.jpg differ
diff --git a/apps/gpsnav/waypoint_screen.jpg b/apps/gpsnav/waypoint_screen.jpg
new file mode 100644
index 000000000..f4c946ee6
Binary files /dev/null and b/apps/gpsnav/waypoint_screen.jpg differ
diff --git a/apps/gpsnav/waypoints.html b/apps/gpsnav/waypoints.html
new file mode 100644
index 000000000..483b933f4
--- /dev/null
+++ b/apps/gpsnav/waypoints.html
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+ List of waypoints
+
+
+
+ Name
+ Lat.
+ Long.
+ Actions
+
+
+
+
+
+
+
+ Add a new waypoint
+
+
+ Reload Upload
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/gpsnav/waypoints.json b/apps/gpsnav/waypoints.json
new file mode 100644
index 000000000..98a670c0d
--- /dev/null
+++ b/apps/gpsnav/waypoints.json
@@ -0,0 +1,20 @@
+[
+ {
+ "name":"NONE"
+ },
+ {
+ "name":"No10",
+ "lat":51.5032,
+ "lon":-0.1269
+ },
+ {
+ "name":"Stone",
+ "lat":51.1788,
+ "lon":-1.8260
+ },
+ { "name":"WP0" },
+ { "name":"WP1" },
+ { "name":"WP2" },
+ { "name":"WP3" },
+ { "name":"WP4" }
+]
\ No newline at end of file
diff --git a/apps/gpspoilog/ChangeLog b/apps/gpspoilog/ChangeLog
new file mode 100644
index 000000000..5560f00bc
--- /dev/null
+++ b/apps/gpspoilog/ChangeLog
@@ -0,0 +1 @@
+0.01: New App!
diff --git a/apps/gpspoilog/app-icon.js b/apps/gpspoilog/app-icon.js
new file mode 100644
index 000000000..89f8d1bd7
--- /dev/null
+++ b/apps/gpspoilog/app-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+AH4A/AEeGAAwttGMotLGMItPGLwuTGDQuVGDIfHq9RAAgvfDw+AFwtRq4weFZYAIwAvYJIguPSowvavl8F8qpFF6wwSF44AFvl9vo3GF8l80+t1unGAovkvovDvovrAAQvqR4IACR9TviGAovHABIuXF/4vgGAmAFx+AFzDxGACYvVGDAuWF+AwWFzAvwGCguaGCYucF+AwQFzwvwGBwugGBouiF+AwKF0gwJF0wwHF1AvwGAguqGAYusAH4A/AFI="))
diff --git a/apps/gpspoilog/app.js b/apps/gpspoilog/app.js
new file mode 100644
index 000000000..2da0c0e7e
--- /dev/null
+++ b/apps/gpspoilog/app.js
@@ -0,0 +1,67 @@
+var menuItems = {
+ "":{title:"GPS POI Log"},
+ " ":{value:"No Fix"},
+ "Tree" : ()=>addItem("Tree"),
+ "Gate" : ()=>addItem("Gate"),
+ "Flower" : ()=>addItem("Flower"),
+ "Plant" : ()=>addItem("Plant"),
+ "Bus Stop" : ()=>addItem("Bus Stop"),
+ "Pub" : ()=>addItem("Pub")
+};
+
+var menu = E.showMenu(menuItems);
+var gps = { fix : 0};
+var gpsCount = 0;
+var file = require("Storage").open("gpspoilog.csv","a");
+
+function setStatus(msg) {
+ menuItems[" "].value = msg;
+ menu.draw();
+}
+
+Bangle.on('GPS',function(g) {
+ gps = g;
+ gpsCount++;
+ var msg;
+ if (g.fix) {
+ msg = g.satellites + " Satellites";
+ } else {
+ msg = "No Fix";
+ }
+ setStatus(msg+" "+"-\\|/"[gpsCount&3]);
+});
+
+
+function addItem(name) {
+ if (!gps.fix) {
+ setStatus("Ignored - no fix");
+ return; // don't do anything as no fix
+ }
+ // The fields we want to put in out CSV file
+ var csv = [
+ 0|getTime(), // Time to the nearest second
+ gps.lat,
+ gps.lon,
+ gps.alt,
+ name
+ ];
+ // Write data here
+ file.write(csv.join(",")+"\n");
+ setStatus("Written");
+}
+
+
+Bangle.loadWidgets();
+Bangle.drawWidgets();
+Bangle.setGPSPower(1);
+
+
+
+function getData(callback) {
+ var f = require("Storage").open("gpspoilog.csv","r");
+ var l = f.readLine();
+ while (l!==undefined) {
+ callback(l);
+ l = f.readLine();
+ }
+}
diff --git a/apps/gpspoilog/app.png b/apps/gpspoilog/app.png
new file mode 100644
index 000000000..b323bb283
Binary files /dev/null and b/apps/gpspoilog/app.png differ
diff --git a/apps/gpspoilog/interface.html b/apps/gpspoilog/interface.html
new file mode 100644
index 000000000..ef3cc7688
--- /dev/null
+++ b/apps/gpspoilog/interface.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+ Save
+ Delete
+
+
+
+
+
diff --git a/apps/gpsrec/ChangeLog b/apps/gpsrec/ChangeLog
index 9a47bdd9a..8e4a8931c 100644
--- a/apps/gpsrec/ChangeLog
+++ b/apps/gpsrec/ChangeLog
@@ -4,3 +4,11 @@
0.04: Properly Fix GPS time display in gpsrec app
0.05: Tweaks for variable size widget system
0.06: Ensure widget update itself (fix #118) and change to using icons
+0.07: Added @jeffmer's awesome track viewer
+0.08: Don't overwrite existing settings on app update
+ Clean up recorded tracks on app removal
+0.09: Change default GPS period to 10 (1 is overkill for most uses and makes things slow)
+ Added RAM keyword to functions & other tweaks to speed up rendering
+ Going 'back' from track view now doesn't load again
+0.10: Can now graph altitude & speed
+0.11: Ensure we don't turn GPS off if it was previously on (eg from another app/widget)
diff --git a/apps/gpsrec/app-settings.json b/apps/gpsrec/app-settings.json
index 7e1c8ee72..4265e46ec 100644
--- a/apps/gpsrec/app-settings.json
+++ b/apps/gpsrec/app-settings.json
@@ -1,5 +1,5 @@
{
"recording":false,
"file":0,
- "period":1
+ "period":10
}
diff --git a/apps/gpsrec/app.js b/apps/gpsrec/app.js
index 58b4295a6..10aa0ebbf 100644
--- a/apps/gpsrec/app.js
+++ b/apps/gpsrec/app.js
@@ -60,7 +60,7 @@ function viewTracks() {
for (var n=0;n<36;n++) {
var f = require("Storage").open(getFN(n),"r");
if (f.readLine()!==undefined) {
- menu["Track "+n] = viewTrack.bind(null,n);
+ menu["Track "+n] = viewTrack.bind(null,n,false);
found = true;
}
}
@@ -70,27 +70,74 @@ function viewTracks() {
return E.showMenu(menu);
}
-function viewTrack(n) {
+function getTrackInfo(fn) {
+ "ram"
+ var filename = getFN(fn);
+ var minLat = 90;
+ var maxLat = -90;
+ var minLong = 180;
+ var maxLong = -180;
+ var starttime, duration=0;
+ var f = require("Storage").open(filename,"r");
+ if (f===undefined) return;
+ var l = f.readLine(f);
+ var nl = 0, c, n;
+ if (l!==undefined) {
+ c = l.split(",");
+ starttime = parseInt(c[0]);
+ }
+ // pushed this loop together to try and bump loading speed a little
+ while(l!==undefined) {
+ ++nl;c=l.split(",");
+ n = +c[1];if(n>maxLat)maxLat=n;if(nmaxLong)maxLong=n;if(nylen ? 200/xlen : 200/ylen;
+ return {
+ fn : fn,
+ filename : filename,
+ time : new Date(starttime),
+ records : nl,
+ minLat : minLat, maxLat : maxLat,
+ minLong : minLong, maxLong : maxLong,
+ lfactor : lfactor,
+ scale : scale,
+ duration : Math.round(duration/1000)
+ };
+}
+
+function asTime(v){
+ var mins = Math.floor(v/60);
+ var secs = v-mins*60;
+ return ""+mins.toString()+"m "+secs.toString()+"s";
+}
+
+function viewTrack(n, info) {
+ if (!info) {
+ E.showMessage("Loading...","GPS Track "+n);
+ info = getTrackInfo(n);
+ }
const menu = {
'': { 'title': 'GPS Track '+n }
};
- var trackCount = 0;
- var trackTime;
- var f = require("Storage").open(getFN(n),"r");
- var l = f.readLine();
- if (l!==undefined) {
- var c = l.split(",");
- trackTime = new Date(parseInt(c[0]));
- }
- while (l!==undefined) {
- trackCount++;
- // TODO: min/max/length of track?
- l = f.readLine();
- }
- if (trackTime)
- menu[" "+trackTime.toISOString().substr(0,16).replace("T"," ")] = function(){};
- menu[trackCount+" records"] = function(){};
- // TODO: option to draw it? Just scan through, project using min/max
+ if (info.time)
+ menu[info.time.toISOString().substr(0,16).replace("T"," ")] = function(){};
+ menu["Duration"] = { value : asTime(info.duration)};
+ menu["Records"] = { value : ""+info.records };
+ menu['Plot Map'] = function() {
+ plotTrack(info);
+ };
+ menu['Plot Alt.'] = function() {
+ plotGraph(info, "altitude");
+ };
+ menu['Plot Speed'] = function() {
+ plotGraph(info, "speed");
+ };
menu['Erase'] = function() {
E.showPrompt("Delete Track?").then(function(v) {
if (v) {
@@ -100,11 +147,164 @@ function viewTrack(n) {
f.erase();
viewTracks();
} else
- viewTrack(n);
+ viewTrack(n, info);
});
};
menu['< Back'] = viewTracks;
return E.showMenu(menu);
}
+function plotTrack(info) {
+ "ram"
+
+ function radians(a) {
+ return a*Math.PI/180;
+ }
+
+ function distance(lat1,long1,lat2,long2){
+ var x = radians(long1-long2) * Math.cos(radians((lat1+lat2)/2));
+ var y = radians(lat2-lat1);
+ return Math.sqrt(x*x + y*y) * 6371000;
+ }
+
+ E.showMenu(); // remove menu
+ g.setColor(1,0.5,0.5);
+ g.setFont("Vector",16);
+ g.fillRect(9,80,11,120);
+ g.fillPoly([9,60,19,80,0,80]);
+ g.setColor(1,1,1);
+ g.drawString("N",2,40);
+ g.drawString("Track"+info.fn.toString()+" - Loading",10,220);
+ g.setColor(0,0,0);
+ g.fillRect(0,220,239,239);
+ g.setColor(1,1,1);
+ g.drawString(asTime(info.duration),10,220);
+ var f = require("Storage").open(info.filename,"r");
+ if (f===undefined) return;
+ var l = f.readLine(f);
+ var ox=0;
+ var oy=0;
+ var olat,olong,dist=0;
+ var i=0;
+ var c = l.split(",");
+ var lat = +c[1];
+ var long = +c[2];
+ var x = 30 + Math.round((long-info.minLong)*info.lfactor*info.scale);
+ var y = 210 - Math.round((lat - info.minLat)*info.scale);
+ g.moveTo(x,y);
+ g.setColor(0,1,0);
+ g.fillCircle(x,y,5);
+ g.setColor(1,1,1);
+ l = f.readLine(f);
+ while(l!==undefined) {
+ c = l.split(",");
+ lat = +c[1];
+ long = +c[2];
+ x = 30 + Math.round((long-info.minLong)*info.lfactor*info.scale);
+ y = 210 - Math.round((lat - info.minLat)*info.scale);
+ g.lineTo(x,y);
+ var d = distance(olat,olong,lat,long);
+ if (!isNaN(d)) dist+=d;
+ olat = lat;
+ olong = long;
+ ox = x;
+ oy = y;
+ l = f.readLine(f);
+ }
+ g.setColor(1,0,0);
+ g.fillCircle(ox,oy,5);
+ g.setColor(1,1,1);
+ g.drawString(require("locale").distance(dist),120,220);
+ g.setFont("6x8",2);
+ g.setFontAlign(0,0,3);
+ g.drawString("Back",230,200);
+ setWatch(function() {
+ viewTrack(info.fn, info);
+ }, BTN3);
+ g.flip();
+}
+
+function plotGraph(info, style) {
+ "ram"
+ E.showMenu(); // remove menu
+ E.showMessage("Calculating...","GPS Track "+info.fn);
+ var filename = getFN(info.fn);
+ var infn = new Float32Array(200);
+ var infc = new Uint16Array(200);
+ var title;
+ var lt = 0; // last time
+ var tn = 0; // count for each time period
+ var strt, dur = info.duration;
+ var f = require("Storage").open(filename,"r");
+ if (f===undefined) return;
+ var l = f.readLine(f);
+ var nl = 0, c, i;
+ if (l!==undefined) {
+ c = l.split(",");
+ strt = c[0]/1000;
+ }
+ if (style=="altitude") {
+ title = "Altitude (m)";
+ while(l!==undefined) {
+ ++nl;c=l.split(",");
+ i = Math.round(200*(c[0]/1000 - strt)/dur);
+ infn[i]+=+c[3];
+ infc[i]++;
+ l = f.readLine(f);
+ }
+ } else if (style=="speed") {
+ title = "Speed (m/s)";
+ var p,lp = Bangle.project({lat:c[1],lon:c[2]});
+ var t,dx,dy,d,lt = c[0]/1000;
+ while(l!==undefined) {
+ ++nl;c=l.split(",");
+ i = Math.round(200*(c[0]/1000 - strt)/dur);
+ t = c[0]/1000;
+ p = Bangle.project({lat:c[1],lon:c[2]});
+ dx = p.x-lp.x;
+ dy = p.y-lp.y;
+ d = Math.sqrt(dx*dx+dy*dy);
+ if (t!=lt) {
+ infn[i]+=d / (t-lt); // speed
+ infc[i]++;
+ }
+ lp = p;
+ lt = t;
+ l = f.readLine(f);
+ }
+ } else throw new Error("Unknown type");
+ var min=100000,max=-100000;
+ for (var i=0;i0) infn[i]/=infc[i];
+ var n = infn[i];
+ if (n>max) max=n;
+ if (n 8) {
+ grid*=2;
+ }
+ // draw
+ g.clear(1).setFont("6x8",1);
+ var r = require("graph").drawLine(g, infn, {
+ x:4,y:0,
+ width: g.getWidth()-24,
+ height: g.getHeight()-8,
+ axes : true,
+ gridy : grid,
+ gridx : 50,
+ title: title,
+ xlabel : x=>Math.round(x*dur/(60*infn.length))+" min" // minutes
+ });
+ g.setFont("6x8",2);
+ g.setFontAlign(0,0,3);
+ g.drawString("Back",230,200);
+ setWatch(function() {
+ viewTrack(info.fn, info);
+ }, BTN3);
+ g.flip();
+}
+
showMainMenu();
diff --git a/apps/gpsrec/interface.html b/apps/gpsrec/interface.html
index b87d75b3c..bc8dc48e1 100644
--- a/apps/gpsrec/interface.html
+++ b/apps/gpsrec/interface.html
@@ -5,32 +5,9 @@
-
-
+
+
+
+