From b8a78616b4c0102dc6b5d05b448c804ef2945666 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 10 Jun 2019 17:16:48 +0000 Subject: [PATCH 001/121] can now setPassword on usernames with spaces (cherry picked from commit fab8989bc86f06835c3193d415be30995724559b) --- src/server/components/extensions/socialCommands.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index af999ba9..e1a25358 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -568,7 +568,10 @@ module.exports = { setPassword: async function (config) { let keys = Object.keys(config); - let username = keys[0]; + let username = keys[0] + .split('_') + .join(' '); + let hashedPassword = keys[1]; await io.setAsync({ From 83e7039106a0b1db93d39997f7e2c7f2ce9ee25b Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 30 Jul 2019 18:42:09 +0000 Subject: [PATCH 002/121] fixes #1203 (cherry picked from commit 3fd1def20356223c9a0c00d307aab60534d7fc64) --- src/server/security/ioRethink.js | 67 +++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/src/server/security/ioRethink.js b/src/server/security/ioRethink.js index eb754545..784e1b21 100644 --- a/src/server/security/ioRethink.js +++ b/src/server/security/ioRethink.js @@ -1,6 +1,12 @@ let r = require('rethinkdb'); let serverConfig = require('../config/serverConfig'); +const dbConfig = { + host: serverConfig.dbHost, + port: serverConfig.dbPort, + db: 'live' +}; + const tables = [ 'character', 'characterList', @@ -17,38 +23,39 @@ const tables = [ ]; module.exports = { - connection: null, - useDb: 'live', + staticCon: null, init: async function (cbReady) { - const dbConfig = { - host: serverConfig.dbHost, - port: serverConfig.dbPort - }; - - this.connection = await r.connect(dbConfig); + this.staticCon = await this.getConnection(); - await this.connection.use(this.useDb); await this.create(); cbReady(); }, + getConnection: async function () { + return await r.connect(dbConfig); + }, + create: async function () { + const con = await this.getConnection(); + try { - await r.dbCreate(this.useDb).run(this.connection); + await r.dbCreate(this.useDb).run(con); } catch (e) { } for (const table of tables) { try { - await r.tableCreate(table).run(this.connection); + await r.tableCreate(table).run(con); } catch (e) { if (!e.message.includes('already exists')) _.log(e); } } + + con.close(); }, getAsync: async function ({ @@ -57,15 +64,19 @@ module.exports = { isArray, noDefault }) { + const con = await this.getConnection(); + let res = await r.table(table) .get(key) - .run(this.connection); + .run(con); if (res) return res.value; else if (isArray && !noDefault) return []; + con.close(); + return res; }, @@ -75,8 +86,10 @@ module.exports = { isArray, noDefault }) { + const con = await this.getConnection(); + let res = await r.table(table) - .run(this.connection); + .run(con); res = await res.toArray(); @@ -85,6 +98,8 @@ module.exports = { else if (isArray && !noDefault) return []; + con.close(); + return res; }, @@ -94,6 +109,8 @@ module.exports = { value, conflict = 'update' }) { + const con = await this.getConnection(); + await r.table(table) .insert({ id, @@ -101,23 +118,29 @@ module.exports = { }, { conflict }) - .run(this.connection); + .run(con); + + con.close(); }, deleteAsync: async function ({ key, table }) { + const con = await this.getConnection(); + await r.table(table) .get(key) .delete() - .run(this.connection); + .run(con); + + con.close(); }, subscribe: function (table) { return r.table(table) .changes() - .run(this.connection); + .run(this.staticCon); }, append: async function ({ @@ -126,6 +149,8 @@ module.exports = { value, field }) { + const con = await this.getConnection(); + await r.table(table) .get(key) .update(row => { @@ -139,16 +164,22 @@ module.exports = { } ); }) - .run(this.connection); + .run(con); + + con.close(); }, exists: async function ({ table, key }) { + const con = await this.getConnection(); + let res = await r.table(table) .get(key) - .run(this.connection); + .run(con); + + con.close(); return !!res; } From 3e49ac62259f556b5008e8c8824cf2a585697cd8 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 27 Aug 2019 09:30:26 +0200 Subject: [PATCH 003/121] first tracking work --- src/server/components/auth.js | 3 +++ src/server/components/stats.js | 12 ++++++++++++ src/server/package-lock.json | 31 ++++++++++++++++++++++++++++--- src/server/package.json | 3 ++- src/server/security/ga.js | 34 ++++++++++++++++++++++++++++++++++ src/server/world/atlas.js | 13 +++++++++++++ 6 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/server/security/ga.js diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 2230712d..2b786d16 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -8,6 +8,7 @@ let loginRewards = require('../config/loginRewards'); let mail = require('../mail/mail'); let scheduler = require('../misc/scheduler'); let spirits = require('../config/spirits'); +let ga = require('../security/ga'); module.exports = { type: 'auth', @@ -285,6 +286,8 @@ module.exports = { this.username = msg.data.username; cons.logOut(this.obj); + this.gaTracker = ga.connect(this.username); + await this.getSkins(); this.accountInfo = await io.getAsync({ diff --git a/src/server/components/stats.js b/src/server/components/stats.js index b24fa3da..486d4900 100644 --- a/src/server/components/stats.js +++ b/src/server/components/stats.js @@ -333,6 +333,18 @@ module.exports = { }, kill: function (target) { + //Analytics Tracking + process.send({ + method: 'track', + serverId: this.obj.serverId, + obj: { + category: 'combat', + action: 'kill', + label: target.name, + value: 1 + } + }); + if (target.player) return; diff --git a/src/server/package-lock.json b/src/server/package-lock.json index 70d3b459..7977f4c4 100644 --- a/src/server/package-lock.json +++ b/src/server/package-lock.json @@ -976,9 +976,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash.noop": { "version": "3.0.1", @@ -1869,6 +1869,31 @@ } } }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/src/server/package.json b/src/server/package.json index 989789c4..d4c5ae29 100644 --- a/src/server/package.json +++ b/src/server/package.json @@ -11,7 +11,8 @@ "less-middleware": "^3.1.0", "rethinkdb": "^2.3.3", "socket.io": "^2.2.0", - "sqlite3": "^4.0.6" + "sqlite3": "^4.0.6", + "universal-analytics": "^0.4.20" }, "devDependencies": {} } diff --git a/src/server/security/ga.js b/src/server/security/ga.js new file mode 100644 index 00000000..677312b2 --- /dev/null +++ b/src/server/security/ga.js @@ -0,0 +1,34 @@ +const ua = require('universal-analytics'); + +//eslint-disable-next-line no-process-env +const analyticsId = process.env.ISLEWARD_GOOGLE_ANALYTICS_ID; + +const tracker = { + id: null, + ga: null, + + init: function (userId) { + this.id = userId; + this.ga = ua(analyticsId, userId, { strictCidFormat: false }); + }, + + track: function ({ category, action, label, value }) { + this.ga.event(category, action, label, value).send(); + } +}; + +const fakeTracker = { + track: function () {} +}; + +module.exports = { + connect: function (id) { + if (!analyticsId) + return fakeTracker; + + const builtTracker = extend({}, tracker); + builtTracker.init(id); + + return builtTracker; + } +}; diff --git a/src/server/world/atlas.js b/src/server/world/atlas.js index 21c50c74..c1cc194b 100644 --- a/src/server/world/atlas.js +++ b/src/server/world/atlas.js @@ -161,15 +161,27 @@ module.exports = { } }); }, + event: function (thread, message) { objects.sendEvent(message); }, + events: function (thread, message) { objects.sendEvents(message); }, + object: function (thread, message) { objects.updateObject(message); }, + + track: function (thread, message) { + let player = objects.objects.find(o => o.id === message.serverId); + if (!player) + return; + + player.auth.gaTracker.track(message.obj); + }, + callDifferentThread: function (thread, message) { let obj = connections.players.find(p => (p.name === message.playerName)); if (!obj) @@ -184,6 +196,7 @@ module.exports = { args: message.data.args }); }, + rezone: function (thread, message) { let obj = message.args.obj; obj.destroyed = false; From ca5ee169a2e46f668d4069dee9b175451d8f00f2 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 27 Aug 2019 09:33:57 +0200 Subject: [PATCH 004/121] fixed env name --- src/server/security/ga.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/security/ga.js b/src/server/security/ga.js index 677312b2..ea622251 100644 --- a/src/server/security/ga.js +++ b/src/server/security/ga.js @@ -1,7 +1,7 @@ const ua = require('universal-analytics'); //eslint-disable-next-line no-process-env -const analyticsId = process.env.ISLEWARD_GOOGLE_ANALYTICS_ID; +const analyticsId = process.env.IWD_GOOGLE_ANALYTICS_ID; const tracker = { id: null, From 74602ad0f5ccb93094f22eb72f22159f3c312d79 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 27 Aug 2019 11:33:55 +0200 Subject: [PATCH 005/121] small fix for tracker generation --- src/server/components/auth.js | 6 +++++- src/server/world/instancer.js | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 2b786d16..420fed1f 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -286,7 +286,7 @@ module.exports = { this.username = msg.data.username; cons.logOut(this.obj); - this.gaTracker = ga.connect(this.username); + this.initTracker(); await this.getSkins(); @@ -301,6 +301,10 @@ module.exports = { msg.callback(); }, + initTracker: function () { + this.gaTracker = ga.connect(this.username); + }, + register: async function (msg) { let credentials = msg.data; diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index 3d860a29..1e57fead 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -112,6 +112,8 @@ module.exports = { else { let o = objects.transferObject(obj); questBuilder.obtain(o); + + o.auth.initTracker(); } }, From b47239e1a2e198a0e9e1354419b32e37b3876982 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 27 Aug 2019 12:22:14 +0200 Subject: [PATCH 006/121] another fix for the tracker --- src/server/components/auth.js | 2 ++ src/server/world/instancer.js | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 420fed1f..edcc0d3e 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -449,6 +449,8 @@ module.exports = { serialize: true }); + this.initTracker(); + this.play({ data: { name: name diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index 1e57fead..3d860a29 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -112,8 +112,6 @@ module.exports = { else { let o = objects.transferObject(obj); questBuilder.obtain(o); - - o.auth.initTracker(); } }, From f5fb947a5899e2bcd8cafcd5d01b76adf5610b22 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Fri, 30 Aug 2019 05:50:25 +0200 Subject: [PATCH 007/121] quest tracking --- src/server/components/quests.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/server/components/quests.js b/src/server/components/quests.js index 7331580d..3fb8c7cb 100644 --- a/src/server/components/quests.js +++ b/src/server/components/quests.js @@ -38,6 +38,18 @@ module.exports = { if ((!quest) || (!quest.isReady)) return; + //Analytics Tracking + process.send({ + method: 'track', + serverId: this.obj.serverId, + obj: { + category: 'quest', + action: 'complete', + label: quest.name, + value: 1 + } + }); + quest.complete(); this.quests.spliceWhere(q => q === quest); From c5fa80eb5e2494a7b5c9ae7c8a5d7816304a9977 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sat, 31 Aug 2019 05:33:39 +0200 Subject: [PATCH 008/121] Death tracking --- src/server/components/auth.js | 13 +++++++++++++ src/server/components/player.js | 1 + src/server/components/quests.js | 12 +----------- src/server/components/stats.js | 12 +----------- 4 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index edcc0d3e..22cd3917 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -305,6 +305,19 @@ module.exports = { this.gaTracker = ga.connect(this.username); }, + track: function (category, action, label, value = 1) { + process.send({ + method: 'track', + serverId: this.obj.serverId, + obj: { + category, + action, + label, + value + } + }); + }, + register: async function (msg) { let credentials = msg.data; diff --git a/src/server/components/player.js b/src/server/components/player.js index 5f795a09..216b1c4a 100644 --- a/src/server/components/player.js +++ b/src/server/components/player.js @@ -199,6 +199,7 @@ module.exports = { } obj.fireEvent('onAfterDeath', source); + obj.auth.track('combat', 'death', source.name, 1); obj.spellbook.die(); obj.effects.die(); diff --git a/src/server/components/quests.js b/src/server/components/quests.js index 3fb8c7cb..880aac73 100644 --- a/src/server/components/quests.js +++ b/src/server/components/quests.js @@ -38,17 +38,7 @@ module.exports = { if ((!quest) || (!quest.isReady)) return; - //Analytics Tracking - process.send({ - method: 'track', - serverId: this.obj.serverId, - obj: { - category: 'quest', - action: 'complete', - label: quest.name, - value: 1 - } - }); + this.obj.auth.track('quest', 'complete', quest.name); quest.complete(); diff --git a/src/server/components/stats.js b/src/server/components/stats.js index 486d4900..4c22a869 100644 --- a/src/server/components/stats.js +++ b/src/server/components/stats.js @@ -333,17 +333,7 @@ module.exports = { }, kill: function (target) { - //Analytics Tracking - process.send({ - method: 'track', - serverId: this.obj.serverId, - obj: { - category: 'combat', - action: 'kill', - label: target.name, - value: 1 - } - }); + this.obj.auth.track('combat', 'kill', target.name); if (target.player) return; From 0d9aa7881039ef1adc63934840f1a94e6474c9e8 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 9 Sep 2019 20:36:36 +0200 Subject: [PATCH 009/121] fixes #1229 --- src/server/world/worker.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/server/world/worker.js b/src/server/world/worker.js index 1491115f..b094f4b4 100644 --- a/src/server/world/worker.js +++ b/src/server/world/worker.js @@ -49,22 +49,21 @@ let onDbReady = function () { global.gc(); }, 60000); - process.on('uncaughtException', function (e) { + process.on('uncaughtException', async function (e) { if (e.toString().indexOf('ERR_IPC_CHANNEL_CLOSED') > -1) return; _.log('Error Logged: ' + e.toString()); _.log(e.stack); - io.setAsync({ + await io.setAsync({ key: new Date(), table: 'error', - value: e.toString() + ' | ' + e.stack.toString(), - callback: function () { - process.send({ - event: 'onCrashed' - }); - } + value: e.toString() + ' | ' + e.stack.toString() + }); + + process.send({ + event: 'onCrashed' }); }); }; From 92fffa59bd6407d816ed68bfa803abbba8b661c4 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 9 Sep 2019 20:42:01 +0200 Subject: [PATCH 010/121] fixes #1230 --- src/server/security/ioRethink.js | 66 +++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/src/server/security/ioRethink.js b/src/server/security/ioRethink.js index 784e1b21..fb6861d9 100644 --- a/src/server/security/ioRethink.js +++ b/src/server/security/ioRethink.js @@ -111,14 +111,18 @@ module.exports = { }) { const con = await this.getConnection(); - await r.table(table) - .insert({ - id, - value - }, { - conflict - }) - .run(con); + try { + await r.table(table) + .insert({ + id, + value + }, { + conflict + }) + .run(con); + } catch (e) { + this.logError(e); + } con.close(); }, @@ -151,20 +155,24 @@ module.exports = { }) { const con = await this.getConnection(); - await r.table(table) - .get(key) - .update(row => { - return r.branch( - row('value').typeOf().eq('ARRAY'), - { - [field]: row('value').setUnion(value) - }, - { - [field]: value - } - ); - }) - .run(con); + try { + await r.table(table) + .get(key) + .update(row => { + return r.branch( + row('value').typeOf().eq('ARRAY'), + { + [field]: row('value').setUnion(value) + }, + { + [field]: value + } + ); + }) + .run(con); + } catch (e) { + this.logError(e); + } con.close(); }, @@ -182,5 +190,19 @@ module.exports = { con.close(); return !!res; + }, + + logError: async function (error) { + try { + await this.setAsync({ + key: new Date(), + table: 'error', + value: error.toString() + ' | ' + error.stack.toString() + }); + + process.send({ + event: 'onCrashed' + }); + } catch (e) {} } }; From 58d24e3184baea61c88aadb766e1d27f22a8ab27 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 10 Sep 2019 06:00:44 +0200 Subject: [PATCH 011/121] rethink db now logs stringified value of offending object in error table" --- src/server/security/ioRethink.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/server/security/ioRethink.js b/src/server/security/ioRethink.js index fb6861d9..4d35df7c 100644 --- a/src/server/security/ioRethink.js +++ b/src/server/security/ioRethink.js @@ -121,7 +121,7 @@ module.exports = { }) .run(con); } catch (e) { - this.logError(e); + this.logError(e, value); } con.close(); @@ -171,7 +171,7 @@ module.exports = { }) .run(con); } catch (e) { - this.logError(e); + this.logError(e, value); } con.close(); @@ -192,12 +192,14 @@ module.exports = { return !!res; }, - logError: async function (error) { + logError: async function (error, value) { try { + const stringValue = JSON.stringify(value); + await this.setAsync({ key: new Date(), table: 'error', - value: error.toString() + ' | ' + error.stack.toString() + value: error.toString() + ' | ' + error.stack.toString() + ' | ' + stringValue }); process.send({ From d47ecb02a7bd7e3539f3243586c42750d96c935e Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 10 Sep 2019 06:37:05 +0200 Subject: [PATCH 012/121] logging key and table in rethink instead due to undefined not serializing with objects (see previous commit) --- src/server/security/ioRethink.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/server/security/ioRethink.js b/src/server/security/ioRethink.js index 4d35df7c..57f4f59b 100644 --- a/src/server/security/ioRethink.js +++ b/src/server/security/ioRethink.js @@ -121,7 +121,7 @@ module.exports = { }) .run(con); } catch (e) { - this.logError(e, value); + this.logError(e, table, id); } con.close(); @@ -171,7 +171,7 @@ module.exports = { }) .run(con); } catch (e) { - this.logError(e, value); + this.logError(e, table, key); } con.close(); @@ -192,19 +192,19 @@ module.exports = { return !!res; }, - logError: async function (error, value) { + logError: async function (error, table, key) { try { - const stringValue = JSON.stringify(value); + const errorValue = `${error.toString()} | ${error.stack.toString()} | ${table} | ${key}`; await this.setAsync({ key: new Date(), table: 'error', - value: error.toString() + ' | ' + error.stack.toString() + ' | ' + stringValue - }); - - process.send({ - event: 'onCrashed' + value: errorValue }); } catch (e) {} + + process.send({ + event: 'onCrashed' + }); } }; From 552fbfda23f5aeb656d240d5ac4d895486a87162 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 1 Oct 2019 20:44:45 +0200 Subject: [PATCH 013/121] fixes #992 --- .../itemEffects/reduceRuneManaReserve.js | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/server/config/itemEffects/reduceRuneManaReserve.js b/src/server/config/itemEffects/reduceRuneManaReserve.js index 4d5cdc01..82a8d05f 100644 --- a/src/server/config/itemEffects/reduceRuneManaReserve.js +++ b/src/server/config/itemEffects/reduceRuneManaReserve.js @@ -20,13 +20,15 @@ module.exports = { if (!rolls) return; - let spell = this.spellbook.spells.find(s => s.active && s.name.toLowerCase() === rolls.rune); - if (!spell) + let spells = this.spellbook.spells.filter(s => s.active && s.name.toLowerCase() === rolls.rune); + if (!spells.length) return; - let spellReserve = spell.manaReserve.percentage; + spells.forEach(spell => { + let spellReserve = spell.manaReserve.percentage; - this.stats.addStat('manaReservePercent', -Math.min(spellReserve, (rolls.amount / 100))); + this.stats.addStat('manaReservePercent', -Math.min(spellReserve, (rolls.amount / 100))); + }); }, afterUnequipItem: function (item) { @@ -34,18 +36,20 @@ module.exports = { if (!rolls) return; - let spell = this.spellbook.spells.find(s => s.active && s.name.toLowerCase() === rolls.rune); - if (!spell) + let spells = this.spellbook.spells.filter(s => s.active && s.name.toLowerCase() === rolls.rune); + if (!spells.length) return; - let spellReserve = spell.manaReserve.percentage; + spells.forEach(spell => { + let spellReserve = spell.manaReserve.percentage; - let stats = this.stats; - let newReserve = stats.manaReservePercent + (Math.max(0, (spellReserve * 100) - rolls.amount) / 100) - spellReserve; + let stats = this.stats; + let newReserve = stats.manaReservePercent + (Math.max(0, (spellReserve * 100) - rolls.amount) / 100) - spellReserve; - stats.addStat('manaReservePercent', Math.min(spellReserve, (rolls.amount / 100))); - if (newReserve < 0) - this.spellbook.removeSpellById(spell.id); + stats.addStat('manaReservePercent', Math.min(spellReserve, (rolls.amount / 100))); + if (newReserve < 0) + this.spellbook.removeSpellById(spell.id); + }); } } }; From 349920228075a13c631d2f48387b123b379489ce Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 1 Oct 2019 21:20:52 +0200 Subject: [PATCH 014/121] added beforeSpawnParticles event for fireblast --- src/server/config/spells/spellFireblast.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/config/spells/spellFireblast.js b/src/server/config/spells/spellFireblast.js index 56bb1157..06eb6d93 100644 --- a/src/server/config/spells/spellFireblast.js +++ b/src/server/config/spells/spellFireblast.js @@ -18,6 +18,10 @@ module.exports = { let physics = obj.instance.physics; let syncer = obj.instance.syncer; + const particleConfig = extend({}, this.particles); + + this.obj.fireEvent('beforeSpawnParticles', this, particleConfig); + for (let i = x - radius; i <= x + radius; i++) { for (let j = y - radius; j <= y + radius; j++) { if (!physics.hasLos(~~x, ~~y, ~~i, ~~j)) @@ -29,7 +33,7 @@ module.exports = { components: [{ type: 'particles', ttl: 10, - blueprint: this.particles + blueprint: particleConfig }] }; From 1b63fe990abe77229e89790d010874bfb70cc434 Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Wed, 2 Oct 2019 18:50:24 +0000 Subject: [PATCH 015/121] fixes #1237 (cherry picked from commit e6e0af0f7bfba8cac17fd2c9e40db5e55ee11b21) --- src/server/combat/combat.js | 2 +- src/server/config/spells/spellProjectile.js | 1 + src/server/config/spells/spellTemplate.js | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server/combat/combat.js b/src/server/combat/combat.js index 91c05e9a..42b75a08 100644 --- a/src/server/combat/combat.js +++ b/src/server/combat/combat.js @@ -28,7 +28,7 @@ module.exports = { } } - if ((!blocked) && (!dodged)) { + if (!blocked && !dodged && !config.noScale) { if (config.statType) { let statValue = 0; let statType = config.statType; diff --git a/src/server/config/spells/spellProjectile.js b/src/server/config/spells/spellProjectile.js index 4226efc6..eb81f835 100644 --- a/src/server/config/spells/spellProjectile.js +++ b/src/server/config/spells/spellProjectile.js @@ -16,6 +16,7 @@ module.exports = { needLos: true, shootAll: false, + percentDamage: false, cast: function (action) { if (this.shootAll) { diff --git a/src/server/config/spells/spellTemplate.js b/src/server/config/spells/spellTemplate.js index 80ff8740..07054845 100644 --- a/src/server/config/spells/spellTemplate.js +++ b/src/server/config/spells/spellTemplate.js @@ -267,11 +267,15 @@ module.exports = { statType: this.statType, statMult: this.statMult, isAttack: this.isAttack, + noScale: this.noScale, noMitigate: noMitigate }; this.obj.fireEvent('onBeforeCalculateDamage', config); + if (this.percentDamage) + config.damage = target.stats.values.hpMax * this.damage; + let damage = combat.getDamage(config); return damage; From 05dc36426a82ec42ed17ba45b8b148b0d466613e Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Thu, 3 Oct 2019 11:56:38 +0000 Subject: [PATCH 016/121] refactored event notification handling a bit (cherry picked from commit e8d4c6d1752c0c62a86a05625cb07b87ebb38a5d) --- src/server/events/events.js | 63 ++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/src/server/events/events.js b/src/server/events/events.js index 8210f74e..61a3ee1c 100644 --- a/src/server/events/events.js +++ b/src/server/events/events.js @@ -187,6 +187,35 @@ module.exports = { delete config.event; }, + handleNotification: function (event, { msg, desc, event: triggerEvent }) { + if (msg) { + this.instance.syncer.queue('serverModule', { + module: 'cons', + method: 'emit', + msg: [ + 'event', + { + event: 'onGetMessages', + data: { + messages: { + class: 'color-pinkA', + message: msg + } + } + } + ] + }, 'server'); + } + + if (desc) { + event.config.descTimer = desc; + this.setEventDescription(event.config.name); + } + + if (triggerEvent && event.config.events[triggerEvent]) + event.config.events[triggerEvent](this, event); + }, + updateEvent: function (event) { const onTick = _.getDeepProperty(event, ['config', 'events', 'onTick']); if (onTick) @@ -222,35 +251,11 @@ module.exports = { } } - if (event.config.notifications) { - let n = event.config.notifications.find(f => (f.mark === event.age)); - if (n) { - this.instance.syncer.queue('serverModule', { - module: 'cons', - method: 'emit', - msg: [ - 'event', - { - event: 'onGetMessages', - data: { - messages: { - class: 'color-pinkA', - message: n.msg - } - } - } - ] - }, 'server'); - - if (n.has('desc')) { - event.config.descTimer = n.desc; - this.setEventDescription(event.config.name); - } - - if (n.event && event.config.events[n.event]) - event.config.events[n.event](this, event); - } - } + const notifications = event.config.notifications || []; + notifications.forEach(n => { + if (n.mark === event.age) + this.handleNotification(event, n); + }); event.age++; From d071bc625c09fc988e6fb44b72fea51e74d1c392 Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Thu, 3 Oct 2019 12:43:05 +0000 Subject: [PATCH 017/121] added a wait phase for events (cherry picked from commit d07fc0013e48fb2b8ed7de8a614421dbc3ddc39f) --- src/server/config/eventPhases/phaseWait.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/server/config/eventPhases/phaseWait.js diff --git a/src/server/config/eventPhases/phaseWait.js b/src/server/config/eventPhases/phaseWait.js new file mode 100644 index 00000000..a1311c09 --- /dev/null +++ b/src/server/config/eventPhases/phaseWait.js @@ -0,0 +1,3 @@ +module.exports = { + +}; From 148fdc8cd4dd6b11d6d526d15d64464a56cd9702 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Thu, 3 Oct 2019 20:08:05 +0200 Subject: [PATCH 018/121] soul's moor theming --- src/client/js/rendering/renderer.js | 17 +++++++++-------- src/client/ui/templates/characters/styles.less | 4 ++-- .../ui/templates/characters/template.html | 2 +- .../ui/templates/createCharacter/styles.less | 4 ++-- .../ui/templates/createCharacter/template.html | 2 +- src/client/ui/templates/login/styles.less | 10 +++++----- src/client/ui/templates/login/template.html | 2 +- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/client/js/rendering/renderer.js b/src/client/js/rendering/renderer.js index 4f2202e8..a6af8221 100644 --- a/src/client/js/rendering/renderer.js +++ b/src/client/js/rendering/renderer.js @@ -179,13 +179,13 @@ define([ for (let j = 0; j < h; j++) { let roll = Math.sin(((j * 0.2) % 5) + Math.cos(ii % 8)); - let tile = 5; + let tile = 61; if (roll < -0.2) - tile = 3; + tile = 63; else if (roll < 0.2) - tile = 4; + tile = 64; else if (roll < 0.5) - tile = 53; + tile = 34; let alpha = mRandom(); @@ -196,10 +196,11 @@ define([ if (mRandom() < 0.35) { tile = { - 5: 6, - 3: 0, - 4: 1, - 53: 54 + 61: 62, + 63: 64, + 64: 63, + 34: 33 + }[tile]; } diff --git a/src/client/ui/templates/characters/styles.less b/src/client/ui/templates/characters/styles.less index f490b964..c7ec76a5 100644 --- a/src/client/ui/templates/characters/styles.less +++ b/src/client/ui/templates/characters/styles.less @@ -103,7 +103,7 @@ } .btn { - background-color: @blueC; + background-color: @orangeC; width: calc((100% - (16px * 2)) / 3); float: left; margin-right: 16px; @@ -114,7 +114,7 @@ } &:hover { - background-color: @blueB; + background-color: @orangeB; } &.deleting { diff --git a/src/client/ui/templates/characters/template.html b/src/client/ui/templates/characters/template.html index b841e20a..af77a446 100644 --- a/src/client/ui/templates/characters/template.html +++ b/src/client/ui/templates/characters/template.html @@ -1,5 +1,5 @@
- +
loading characters...
diff --git a/src/client/ui/templates/createCharacter/styles.less b/src/client/ui/templates/createCharacter/styles.less index 41bb2af8..b21be9f5 100644 --- a/src/client/ui/templates/createCharacter/styles.less +++ b/src/client/ui/templates/createCharacter/styles.less @@ -128,7 +128,7 @@ } .btn { - background-color: @blueC; + background-color: @orangeC; width: calc((100% - @boxPadding) / 2); float: left; margin-right: @boxPadding; @@ -139,7 +139,7 @@ } &:hover { - background-color: @blueB; + background-color: @orangeB; } } diff --git a/src/client/ui/templates/createCharacter/template.html b/src/client/ui/templates/createCharacter/template.html index 546bcef6..544cb6d5 100644 --- a/src/client/ui/templates/createCharacter/template.html +++ b/src/client/ui/templates/createCharacter/template.html @@ -1,5 +1,5 @@
- +
name
diff --git a/src/client/ui/templates/login/styles.less b/src/client/ui/templates/login/styles.less index 89d8b2f8..e555adf7 100644 --- a/src/client/ui/templates/login/styles.less +++ b/src/client/ui/templates/login/styles.less @@ -41,7 +41,7 @@ .label { width: 30%; padding-top: 10px; - color: @green; + color: @yellow; } input { @@ -92,7 +92,7 @@ height: 35px; .btn { - background-color: @blueC; + background-color: @orangeC; width: calc((100% - @boxPadding) / 2); float: left; margin-right: @boxPadding; @@ -103,7 +103,7 @@ } &:hover { - background-color: @blueB; + background-color: @orangeB; } } } @@ -140,7 +140,7 @@ padding-right: 10px; width: 100%; margin-bottom: 10px; - background-color: @blueD; + background-color: @purpleC; color: @white; &:last-child { @@ -148,7 +148,7 @@ } &:hover { - background-color: @blueC; + background-color: @purpleA; } } } diff --git a/src/client/ui/templates/login/template.html b/src/client/ui/templates/login/template.html index 0aed83fc..d51f23f6 100644 --- a/src/client/ui/templates/login/template.html +++ b/src/client/ui/templates/login/template.html @@ -1,5 +1,5 @@
- +
username
From a2d12c63e6a2beb6024c49a01108c7e109b1115f Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Fri, 4 Oct 2019 22:18:31 +0200 Subject: [PATCH 019/121] another rethink serialization issue --- src/server/items/generator.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/items/generator.js b/src/server/items/generator.js index a44f17ae..3ecab142 100644 --- a/src/server/items/generator.js +++ b/src/server/items/generator.js @@ -59,10 +59,10 @@ module.exports = { currencyGenerators.forEach(g => g.generate(item, blueprint)); else if (blueprint.material) { item.material = true; - item.sprite = blueprint.sprite; - item.noDrop = blueprint.noDrop; - item.noSalvage = blueprint.noSalvage; - item.noDestroy = blueprint.noDestroy; + item.sprite = blueprint.sprite || null; + item.noDrop = blueprint.noDrop || null; + item.noSalvage = blueprint.noSalvage || null; + item.noDestroy = blueprint.noDestroy || null; materialGenerators.forEach(g => g.generate(item, blueprint)); } else if (blueprint.type === 'mtx') { item = extend({}, blueprint); From 1218a0059ff43dac284ab84876f644e1aa807247 Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Sat, 12 Oct 2019 13:14:17 +0200 Subject: [PATCH 020/121] fixed an issue caused by a merge --- src/server/config/spells/spellFireblast.js | 4 ---- src/server/security/ioRethink.js | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/server/config/spells/spellFireblast.js b/src/server/config/spells/spellFireblast.js index 513ce13d..9f5813c9 100644 --- a/src/server/config/spells/spellFireblast.js +++ b/src/server/config/spells/spellFireblast.js @@ -17,10 +17,6 @@ module.exports = { this.obj.fireEvent('beforeSpawnParticles', this, particleConfig); - const particleConfig = extend({}, this.particles); - - this.obj.fireEvent('beforeSpawnParticles', this, particleConfig); - for (let i = x - radius; i <= x + radius; i++) { for (let j = y - radius; j <= y + radius; j++) { if (!physics.hasLos(~~x, ~~y, ~~i, ~~j)) diff --git a/src/server/security/ioRethink.js b/src/server/security/ioRethink.js index e44ce2e2..91e41532 100644 --- a/src/server/security/ioRethink.js +++ b/src/server/security/ioRethink.js @@ -128,8 +128,6 @@ module.exports = { key, table }) { - const con = await this.getConnection(); - await r.table(table) .get(key) .delete() @@ -172,8 +170,6 @@ module.exports = { table, key }) { - const con = await this.getConnection(); - let res = await r.table(table) .get(key) .run(); From c5c9c97a03258d20886f3637d19239f711806cc4 Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Tue, 15 Oct 2019 21:29:44 +0200 Subject: [PATCH 021/121] removed mail for now --- src/client/ui/templates/inventory/inventory.js | 4 ++-- src/server/components/inventory.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/client/ui/templates/inventory/inventory.js b/src/client/ui/templates/inventory/inventory.js index 595b5848..afe5b13f 100644 --- a/src/client/ui/templates/inventory/inventory.js +++ b/src/client/ui/templates/inventory/inventory.js @@ -365,8 +365,8 @@ define([ if (item.quantity > 1) config.push(menuItems.split); - if ((!item.noDrop) && (!item.quest)) - config.push(menuItems.mail); + //if ((!item.noDrop) && (!item.quest)) + // config.push(menuItems.mail); if (isMobile) this.hideTooltip(null, this.hoverItem); diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index c10668e2..fef8f2d8 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -522,6 +522,7 @@ module.exports = { }, mailItem: async function (msg) { + return; let item = this.findItem(msg.itemId); if ((!item) || (item.noDrop) || (item.quest)) { this.resolveCallback(msg); From 7115a4a9974f8728500e40a6eac37b53af0306c8 Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Fri, 8 Nov 2019 19:00:50 +0200 Subject: [PATCH 022/121] undid souls moor theming --- src/client/js/rendering/renderer.js | 17 ++-- .../ui/templates/characters/styles.less | 29 +++--- .../ui/templates/characters/template.html | 2 +- .../ui/templates/createCharacter/styles.less | 32 +++++-- .../templates/createCharacter/template.html | 2 +- src/client/ui/templates/login/styles.less | 95 +++++++++---------- src/client/ui/templates/login/template.html | 2 +- 7 files changed, 94 insertions(+), 85 deletions(-) diff --git a/src/client/js/rendering/renderer.js b/src/client/js/rendering/renderer.js index 2071fdac..6d983ac8 100644 --- a/src/client/js/rendering/renderer.js +++ b/src/client/js/rendering/renderer.js @@ -179,13 +179,13 @@ define([ for (let j = 0; j < h; j++) { let roll = Math.sin(((j * 0.2) % 5) + Math.cos(ii % 8)); - let tile = 61; + let tile = 5; if (roll < -0.2) - tile = 63; + tile = 3; else if (roll < 0.2) - tile = 64; + tile = 4; else if (roll < 0.5) - tile = 34; + tile = 53; let alpha = mRandom(); @@ -196,11 +196,10 @@ define([ if (mRandom() < 0.35) { tile = { - 61: 62, - 63: 64, - 64: 63, - 34: 33 - + 5: 6, + 3: 0, + 4: 1, + 53: 54 }[tile]; } diff --git a/src/client/ui/templates/characters/styles.less b/src/client/ui/templates/characters/styles.less index c7ec76a5..7f60536b 100644 --- a/src/client/ui/templates/characters/styles.less +++ b/src/client/ui/templates/characters/styles.less @@ -1,16 +1,11 @@ @import "../../../css/colors.less"; - @leftWidth: 400px; @rightWidth: 400px; @boxPadding: 35px; - @logoWidth: 559px; @logoHeight: 200px; - @boxHeight: 300px; - @messageHeight: @boxPadding; - @totalWidth: (@leftWidth + @rightWidth + @boxPadding); @totalHeight: (@logoHeight + @boxHeight + (@boxPadding * 3) + @messageHeight); @@ -25,7 +20,8 @@ margin-bottom: (@boxPadding * 2); } - .left, .right { + .left, + .right { height: @boxHeight; float: left; background-color: #3a3b4a; @@ -50,7 +46,9 @@ &.selected { background-color: fade(@white, 25%); } + } + } .right { @@ -74,6 +72,7 @@ image-rendering: crisp-edges; display: none; } + } .info { @@ -100,10 +99,11 @@ text-align: right; color: darken(@white, 25%); } + } .btn { - background-color: @orangeC; + background-color: @blueC; width: calc((100% - (16px * 2)) / 3); float: left; margin-right: 16px; @@ -114,18 +114,20 @@ } &:hover { - background-color: @orangeB; + background-color: @blueB; } &.deleting { background-color: @red; color: @white; } + } .spacer-h { height: 91px; } + } .message { @@ -135,12 +137,12 @@ float: left; text-align: center; color: @white; - filter: - drop-shadow(0px -2px 0px @blackD) - drop-shadow(0px 2px 0px @blackD) - drop-shadow(2px 0px 0px @blackD) - drop-shadow(-2px 0px 0px @blackD); + filter: drop-shadow(0px -2px 0px @blackD) + drop-shadow(0px 2px 0px @blackD) + drop-shadow(2px 0px 0px @blackD) + drop-shadow(-2px 0px 0px @blackD); } + } .mobile .uiCharacters { @@ -149,4 +151,5 @@ .logo { display: none; } + } diff --git a/src/client/ui/templates/characters/template.html b/src/client/ui/templates/characters/template.html index af77a446..b841e20a 100644 --- a/src/client/ui/templates/characters/template.html +++ b/src/client/ui/templates/characters/template.html @@ -1,5 +1,5 @@
- +
loading characters...
diff --git a/src/client/ui/templates/createCharacter/styles.less b/src/client/ui/templates/createCharacter/styles.less index b21be9f5..f39a94bd 100644 --- a/src/client/ui/templates/createCharacter/styles.less +++ b/src/client/ui/templates/createCharacter/styles.less @@ -1,13 +1,9 @@ @import "../../../css/colors.less"; - @boxHeight: 276px; @boxPadding: 27px; - @logoWidth: 559px; @logoHeight: 200px; - @messageHeight: @boxPadding; - @totalWidth: (@logoWidth + (@boxPadding * 2) + 427px); @totalHeight: (@logoHeight + @boxHeight + (@boxPadding * 3) + @messageHeight); @@ -28,7 +24,8 @@ width: 613px; background-color: #3a3b4a; - .left, .right { + .left, + .right { float: left; height: 100%; } @@ -37,17 +34,18 @@ width: calc(100% - (@boxPadding * 2) - 160px); padding: @boxPadding 0px @boxPadding @boxPadding; - .txtClass, .txtCostume { + .txtClass, + .txtCostume { cursor: pointer; -webkit-user-select: none; &:active { background-color: darken(@gray, 20%); } + } .txtClass { - } .label { @@ -83,6 +81,7 @@ &:hover { background-color: @grayC; } + } .txtCostume { @@ -92,7 +91,9 @@ align-items: center; padding: 0px; } - } + + } + } .right { @@ -117,6 +118,7 @@ image-rendering: crisp-edges; background: url('../../../images/charas.png') -64px 0px; } + } .textbox { @@ -128,7 +130,7 @@ } .btn { - background-color: @orangeC; + background-color: @blueC; width: calc((100% - @boxPadding) / 2); float: left; margin-right: @boxPadding; @@ -139,8 +141,9 @@ } &:hover { - background-color: @orangeB; + background-color: @blueB; } + } .message { @@ -151,6 +154,7 @@ text-align: center; color: @redA; } + } .box-right { @@ -195,6 +199,7 @@ &:after { content: ' ✔'; } + } &.disabled { @@ -204,10 +209,15 @@ &:hover { color: @white; } + } + } + } + } + } .mobile .uiCreateCharacter { @@ -228,9 +238,11 @@ .skinBox { height: 70px; } + } .box-right { width: 45%; } + } diff --git a/src/client/ui/templates/createCharacter/template.html b/src/client/ui/templates/createCharacter/template.html index 544cb6d5..546bcef6 100644 --- a/src/client/ui/templates/createCharacter/template.html +++ b/src/client/ui/templates/createCharacter/template.html @@ -1,5 +1,5 @@
- +
name
diff --git a/src/client/ui/templates/login/styles.less b/src/client/ui/templates/login/styles.less index e555adf7..60fca2e5 100644 --- a/src/client/ui/templates/login/styles.less +++ b/src/client/ui/templates/login/styles.less @@ -1,16 +1,11 @@ @import "../../../css/colors.less"; - @leftWidth: 400px; @rightWidth: 400px; @boxPadding: 16px; - @logoWidth: 559px; @logoHeight: 200px; - @boxHeight: 169px; - @messageHeight: @boxPadding; - @totalWidth: @rightWidth; @totalHeight: (@logoHeight + @boxHeight + (@boxPadding * 3) + @messageHeight); @@ -30,34 +25,37 @@ .right { height: @boxHeight; background-color: #3a3b4a; - width: @rightWidth; padding: @boxPadding; - .label, input { + .label, + input { float: left; } .label { width: 30%; padding-top: 10px; - color: @yellow; + color: @green; } input { width: 70%; } - input, .textbox, input:-webkit-autofill { - box-shadow: 0 0 0px 1000px darken(@gray, 15%) inset; + input, + .textbox, + input:-webkit-autofill { + box-shadow: 0 0 0px 1000px darken(@gray, 15%) inset; color: @white; -webkit-text-fill-color: @white; margin-bottom: @boxPadding; } /* We duplicate this for firefox which doesn't like the webkit selector */ - input, .textbox { - box-shadow: 0 0 0px 1000px darken(@gray, 15%) inset; + input, + .textbox { + box-shadow: 0 0 0px 1000px darken(@gray, 15%) inset; color: @white; -webkit-text-fill-color: @white; margin-bottom: @boxPadding; @@ -71,20 +69,16 @@ float: left; text-align: center; color: @orange; - - filter: - brightness(100%) - drop-shadow(0px -4px 0px @blackD) - drop-shadow(0px 4px 0px @blackD) - drop-shadow(4px 0px 0px @blackD) - drop-shadow(-4px 0px 0px @blackD); - - -moz-filter: - brightness(100%) - drop-shadow(0px -4px 0px @blackD) - drop-shadow(0px 4px 0px @blackD) - drop-shadow(4px 0px 0px @blackD) - drop-shadow(-4px 0px 0px @blackD); + filter: brightness(100%) + drop-shadow(0px -4px 0px @blackD) + drop-shadow(0px 4px 0px @blackD) + drop-shadow(4px 0px 0px @blackD) + drop-shadow(-4px 0px 0px @blackD); + -moz-filter: brightness(100%) + drop-shadow(0px -4px 0px @blackD) + drop-shadow(0px 4px 0px @blackD) + drop-shadow(4px 0px 0px @blackD) + drop-shadow(-4px 0px 0px @blackD); } .top-buttons { @@ -92,7 +86,7 @@ height: 35px; .btn { - background-color: @orangeC; + background-color: @blueC; width: calc((100% - @boxPadding) / 2); float: left; margin-right: @boxPadding; @@ -103,10 +97,13 @@ } &:hover { - background-color: @orangeB; + background-color: @blueB; } + } + } + } .news { @@ -116,17 +113,16 @@ width: 600px; text-align: center; cursor: pointer; - - filter: - drop-shadow(0px -4px 0px @blackD) - drop-shadow(0px 4px 0px @blackD) - drop-shadow(4px 0px 0px @blackD) - drop-shadow(-4px 0px 0px @blackD); + filter: drop-shadow(0px -4px 0px @blackD) + drop-shadow(0px 4px 0px @blackD) + drop-shadow(4px 0px 0px @blackD) + drop-shadow(-4px 0px 0px @blackD); } .spacer-h { height: 61px; } + } .uiLoginExtra { @@ -140,7 +136,7 @@ padding-right: 10px; width: 100%; margin-bottom: 10px; - background-color: @purpleC; + background-color: @blueD; color: @white; &:last-child { @@ -148,9 +144,11 @@ } &:hover { - background-color: @purpleA; + background-color: @blueC; } + } + } .version { @@ -159,21 +157,18 @@ bottom: 10px; color: @yellow; cursor: pointer; - - filter: - brightness(100%) - drop-shadow(0px -4px 0px @blackD) - drop-shadow(0px 4px 0px @blackD) - drop-shadow(4px 0px 0px @blackD) - drop-shadow(-4px 0px 0px @blackD); - - -moz-filter: - brightness(100%) - drop-shadow(0px -4px 0px @blackD) - drop-shadow(0px 4px 0px @blackD) - drop-shadow(4px 0px 0px @blackD) - drop-shadow(-4px 0px 0px @blackD); + filter: brightness(100%) + drop-shadow(0px -4px 0px @blackD) + drop-shadow(0px 4px 0px @blackD) + drop-shadow(4px 0px 0px @blackD) + drop-shadow(-4px 0px 0px @blackD); + -moz-filter: brightness(100%) + drop-shadow(0px -4px 0px @blackD) + drop-shadow(0px 4px 0px @blackD) + drop-shadow(4px 0px 0px @blackD) + drop-shadow(-4px 0px 0px @blackD); } + } .mobile .uiLogin { diff --git a/src/client/ui/templates/login/template.html b/src/client/ui/templates/login/template.html index abae6004..b63cf8fc 100644 --- a/src/client/ui/templates/login/template.html +++ b/src/client/ui/templates/login/template.html @@ -1,5 +1,5 @@
- +
username
From fd843f42d7b392635b44cff0556e836a73a809a0 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sun, 8 Dec 2019 16:34:24 +0200 Subject: [PATCH 023/121] changed stinkstooth to spawn with a spawnCd --- src/server/config/maps/sewer/zone.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/maps/sewer/zone.js b/src/server/config/maps/sewer/zone.js index 1064de5d..db5ebd7e 100644 --- a/src/server/config/maps/sewer/zone.js +++ b/src/server/config/maps/sewer/zone.js @@ -67,7 +67,7 @@ module.exports = { fjolgard: 15 }, level: 13, - cron: '*/10 * * * *', + spawnCd: 1714, regular: { hpMult: 10, From 794e500ceb8597d8ac4cee24df58f17c31168b0a Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 9 Dec 2019 06:20:58 +0200 Subject: [PATCH 024/121] hotfix for ww and ambush drops, asvald autotalk, thumper autoQ and some balance --- src/server/config/maps/fjolarok/map.json | 2 +- src/server/config/maps/fjolarok/zone.js | 7 +-- src/server/config/maps/sewer/zone.js | 51 ++++++++++++++++++- .../config/quests/templates/questLootGen.js | 51 ++++++++++++------- src/server/config/spellsConfig.js | 2 + src/server/config/zoneBase.js | 2 +- src/server/items/generators/spellbook.js | 2 +- 7 files changed, 90 insertions(+), 27 deletions(-) diff --git a/src/server/config/maps/fjolarok/map.json b/src/server/config/maps/fjolarok/map.json index f5dbad12..69dac144 100644 --- a/src/server/config/maps/fjolarok/map.json +++ b/src/server/config/maps/fjolarok/map.json @@ -1409,7 +1409,7 @@ { "height":24, "id":899, - "name":"shopVetch", + "name":"shopAsvald", "rotation":0, "type":"", "visible":true, diff --git a/src/server/config/maps/fjolarok/zone.js b/src/server/config/maps/fjolarok/zone.js index f3940d4b..4e5130b8 100644 --- a/src/server/config/maps/fjolarok/zone.js +++ b/src/server/config/maps/fjolarok/zone.js @@ -592,7 +592,6 @@ module.exports = { }, thumper: { level: 5, - cron: '0 * * * *', regular: { hpMult: 3, dmgMult: 3, @@ -604,11 +603,7 @@ module.exports = { } }, rare: { - count: 0 - }, - questItem: { - name: "Rabbit's Foot", - sprite: [0, 1] + chance: 100 } }, elk: { diff --git a/src/server/config/maps/sewer/zone.js b/src/server/config/maps/sewer/zone.js index db5ebd7e..b1953901 100644 --- a/src/server/config/maps/sewer/zone.js +++ b/src/server/config/maps/sewer/zone.js @@ -2,6 +2,9 @@ const balance = { rat: { clawChance: 3 }, + giantRat: { + clawChance: 5 + }, stinktooth: { runestoneChance: 10, recipeChance: 3, @@ -10,6 +13,9 @@ const balance = { bandit: { keyChance: 1 }, + direRat: { + clawChance: 7 + }, bera: { recipeChance: 3, keyChance: 3 @@ -61,6 +67,36 @@ module.exports = { } }, + 'giant rat': { + faction: 'fjolgard', + grantRep: { + fjolgard: 6 + }, + level: 12, + + regular: { + hpMult: 2, + dmgMult: 1.2, + + drops: { + rolls: 1, + noRandom: true, + alsoRandom: true, + blueprints: [{ + chance: balance.giantRat.clawChance, + name: 'Rat Claw', + material: true, + sprite: [3, 0], + spritesheet: 'images/materials.png' + }] + } + }, + + rare: { + count: 0 + } + }, + stinktooth: { faction: 'hostile', grantRep: { @@ -201,7 +237,20 @@ module.exports = { regular: { hpMult: 5, - dmgMult: 1.2 + dmgMult: 1.2, + + drops: { + rolls: 1, + noRandom: true, + alsoRandom: true, + blueprints: [{ + chance: balance.direRat.clawChance, + name: 'Rat Claw', + material: true, + sprite: [3, 0], + spritesheet: 'images/materials.png' + }] + } }, rare: { diff --git a/src/server/config/quests/templates/questLootGen.js b/src/server/config/quests/templates/questLootGen.js index 49bec196..7da56b13 100644 --- a/src/server/config/quests/templates/questLootGen.js +++ b/src/server/config/quests/templates/questLootGen.js @@ -1,3 +1,9 @@ +const resetQuest = q => { + q.mobName = null; + q.mobType = null; + q.item = null; +}; + module.exports = { type: 'lootGen', @@ -9,32 +15,43 @@ module.exports = { item: null, build: function () { - if ((!this.mobName) || (!this.item)) { + //If we're not in the correct zone, don't do this check, it'll just crash the server + // since the mob won't be available (most likely) in the zoneFile + if (this.obj.zoneName === this.zoneName) { let mobTypes = this.obj.instance.spawners.zone.mobs; - let keys = Object.keys(mobTypes).filter(function (m) { - let mobBlueprint = mobTypes[m]; + if (this.mobType && this.item) { + //Check if the zoneFile changed + const mobBlueprint = mobTypes[this.mobType]; + if (!mobBlueprint || !mobBlueprint.questItem || mobBlueprint.questItem.name !== this.item.name) + resetQuest(this); + } - return ( - (m !== 'default') && + if (!this.mobName || !this.item) { + let keys = Object.keys(mobTypes).filter(function (m) { + let mobBlueprint = mobTypes[m]; + + return ( + (m !== 'default') && (mobBlueprint.questItem) && (mobBlueprint.level <= (this.obj.stats.values.level * 1.35)) - ); - }, this); + ); + }, this); - //No level appropriate mobs found - if (keys.length === 0) - return false; + //No level appropriate mobs found + if (keys.length === 0) + return false; - this.mobType = keys[~~(Math.random() * keys.length)]; - let needMax = 8; - this.mobName = this.mobType.replace(/\w\S*/g, function (txt) { - return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); - }); + this.mobType = keys[~~(Math.random() * keys.length)]; + let needMax = 8; + this.mobName = this.mobType.replace(/\w\S*/g, function (txt) { + return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); + }); - this.need = Math.max(1, ~~((needMax * 0.2) + (Math.random() * needMax * 0.8))); + this.need = Math.max(1, ~~((needMax * 0.2) + (Math.random() * needMax * 0.8))); - this.item = mobTypes[this.mobType].questItem || mobTypes.default.questItem; + this.item = mobTypes[this.mobType].questItem || mobTypes.default.questItem; + } } this.name = this.item.name + ' Gatherer'; diff --git a/src/server/config/spellsConfig.js b/src/server/config/spellsConfig.js index 264139b8..f1ea2494 100644 --- a/src/server/config/spellsConfig.js +++ b/src/server/config/spellsConfig.js @@ -130,6 +130,7 @@ let spells = { cdMax: 12, castTimeMax: 2, manaCost: 7, + noDrop: true, random: { i_range: [1, 2.5], damage: [4, 15] @@ -155,6 +156,7 @@ let spells = { castTimeMax: 7, range: 10, manaCost: 7, + noDrop: true, random: { damage: [8, 28], i_stunDuration: [4, 6] diff --git a/src/server/config/zoneBase.js b/src/server/config/zoneBase.js index 7116728c..a6183b2b 100644 --- a/src/server/config/zoneBase.js +++ b/src/server/config/zoneBase.js @@ -33,7 +33,7 @@ module.exports = { drops: { chance: 100, - rolls: 1, + rolls: 2, magicFind: 2000 } }, diff --git a/src/server/items/generators/spellbook.js b/src/server/items/generators/spellbook.js index 231132aa..855dae6d 100644 --- a/src/server/items/generators/spellbook.js +++ b/src/server/items/generators/spellbook.js @@ -9,7 +9,7 @@ module.exports = { let spellName = blueprint.spellName; if (!spellName) { - let spellList = Object.keys(spellsConfig.spells).filter(s => ((!spellsConfig.spells[s].auto) && (!s.noDrop))); + let spellList = Object.keys(spellsConfig.spells).filter(s => !spellsConfig.spells[s].auto && !spellsConfig.spells[s].noDrop); spellName = spellList[~~(Math.random() * spellList.length)]; } From 8fc04f8bc30fad7f1b54b77b3ae65b1e4f545ef4 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 9 Dec 2019 19:25:51 +0200 Subject: [PATCH 025/121] fixed a stash crash with undefined quantity items --- src/server/components/stash.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/components/stash.js b/src/server/components/stash.js index 3919b30e..0e654a67 100644 --- a/src/server/components/stash.js +++ b/src/server/components/stash.js @@ -27,7 +27,7 @@ module.exports = { exists = true; if (!existItem.quantity) existItem.quantity = 1; - existItem.quantity += item.quantity; + existItem.quantity += (item.quantity || 1); //We modify the old object because it gets sent to the client item.id = existItem.id; @@ -58,7 +58,7 @@ module.exports = { if (!this.active) return; else if (this.items.length >= 50) { - let isMaterial = this.items.some(stashedItem => item.name === stashedItem.name && item.quantity); + let isMaterial = this.items.some(stashedItem => item.name === stashedItem.name && (item.quantity || item.material)); if (!isMaterial) { this.obj.instance.syncer.queue('onGetMessages', { id: this.obj.id, From b9e4014c27f3cce3d29591d3379a3a98aba8e12e Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 9 Dec 2019 19:26:50 +0200 Subject: [PATCH 026/121] added an exit for stinktooth side rooms --- src/server/config/maps/sewer/map.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/config/maps/sewer/map.json b/src/server/config/maps/sewer/map.json index 3fcdc9aa..d0b19593 100644 --- a/src/server/config/maps/sewer/map.json +++ b/src/server/config/maps/sewer/map.json @@ -3,7 +3,7 @@ "infinite":false, "layers":[ { - "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 541, 537, 537, 537, 541, 537, 541, 537, 541, 537, 537, 537, 541, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 541, 541, 541, 539, 541, 541, 541, 539, 541, 539, 541, 539, 541, 541, 541, 539, 541, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 541, 541, 539, 392, 347, 347, 347, 347, 392, 392, 347, 392, 392, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 541, 541, 541, 541, 347, 392, 392, 347, 347, 392, 392, 392, 392, 392, 392, 392, 347, 392, 392, 392, 392, 541, 541, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 539, 541, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 347, 539, 541, 539, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 539, 539, 539, 539, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 539, 539, 539, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 539, 539, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 539, 539, 347, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 539, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 539, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 0, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 0, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 0, 347, 347, 347, 392, 347, 347, 347, 347, 347, 347, 347, 392, 347, 347, 347, 0, 347, 347, 347, 347, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 347, 392, 347, 347, 347, 347, 0, 0, 173, 173, 0, 0, 0, 0, 0, 0, 0, 173, 173, 0, 0, 347, 347, 347, 347, 347, 392, 0, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 0, 0, 0, 392, 347, 347, 347, 347, 347, 347, 392, 347, 347, 347, 347, 347, 392, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 173, 173, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 173, 173, 173, 173, 173, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 0, 347, 347, 392, 347, 392, 392, 392, 347, 347, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 459, 347, 347, 347, 347, 347, 347, 347, 347, 347, 459, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 539, 539, 539, 347, 347, 392, 347, 347, 347, 347, 539, 539, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 539, 539, 539, 347, 347, 347, 392, 347, 347, 392, 539, 539, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 539, 539, 539, 347, 347, 347, 347, 347, 347, 347, 539, 539, 539, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 539, 539, 539, 392, 347, 347, 347, 347, 347, 347, 539, 539, 539, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 539, 539, 392, 347, 347, 347, 347, 347, 392, 539, 539, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 539, 541, 539, 392, 347, 347, 347, 347, 347, 392, 539, 541, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 537, 541, 539, 347, 347, 347, 347, 347, 539, 541, 537, 541, 539, 392, 392, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 392, 392, 539, 541, 537, 541, 539, 392, 347, 347, 347, 347, 539, 541, 537, 541, 539, 392, 392, 392, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 392, 541, 541, 537, 541, 541, 392, 347, 347, 347, 392, 541, 541, 537, 541, 541, 392, 392, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 541, 537, 537, 537, 541, 392, 347, 347, 347, 392, 541, 537, 537, 537, 541, 392, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 392, 392, 541, 537, 537, 537, 541, 392, 347, 347, 347, 392, 541, 537, 537, 537, 541, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 541, 537, 537, 537, 541, 347, 347, 347, 347, 347, 541, 537, 537, 537, 541, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 541, 392, 347, 347, 347, 347, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 523, 0, 392, 392, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 0, 392, 392, 392, 392, 392, 392, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 392, 537, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 539, 392, 392, 392, 392, 392, 539, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 347, 347, 347, 347, 392, 347, 392, 392, 537, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 539, 392, 392, 392, 392, 392, 392, 539, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 347, 347, 347, 347, 347, 347, 347, 347, 392, 537, 537, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 347, 347, 347, 392, 537, 537, 537, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 539, 541, 541, 539, 541, 541, 541, 541, 541, 541, 541, 541, 539, 539, 541, 541, 541, 541, 541, 541, 541, 541, 539, 541, 539, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 539, 541, 539, 541, 541, 541, 541, 541, 541, 541, 541, 541, 539, 541, 541, 541, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 537, 537, 537, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 539, 392, 392, 392, 392, 539, 541, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 541, 537, 541, 537, 537, 541, 541, 537, 537, 541, 541, 541, 541, 541, 537, 541, 541, 541, 537, 537, 541, 541, 537, 537, 537, 537, 541, 541, 541, 537, 541, 541, 537, 537, 537, 537, 541, 537, 537, 541, 541, 537, 537, 537, 541, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 537, 537, 537, 392, 392, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 537, 537, 537, 537, 541, 537, 537, 537, 537, 537, 537, 541, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 537, 537, 537, 537, 537, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 392, 347, 392, 537, 537, 537, 392, 392, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 541, 539, 539, 392, 392, 392, 392, 539, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 373, 373, 373, 392, 392, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 539, 541, 537, 537, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 539, 539, 392, 392, 392, 392, 541, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 347, 392, 537, 537, 537, 392, 392, 392, 392, 347, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 392, 541, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 537, 537, 537, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 537, 537, 537, 537, 537, 537, 537, 373, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 392, 539, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 173, 173, 0, 173, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 539, 541, 537, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 537, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 0, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 347, 347, 392, 392, 392, 537, 537, 537, 392, 392, 392, 347, 347, 347, 347, 347, 347, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 0, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 539, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 537, 537, 537, 537, 392, 392, 392, 392, 392, 392, 347, 347, 347, 392, 347, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 347, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 0, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 373, 373, 373, 392, 392, 392, 392, 347, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 347, 373, 373, 373, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 0, 537, 537, 537, 541, 541, 539, 539, 392, 392, 392, 392, 539, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 537, 537, 537, 537, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 537, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 537, 537, 537, 537, 537, 537, 537, 537, 537, 347, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 539, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 373, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 392, 392, 392, 539, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 537, 537, 537, 537, 537, 537, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 537, 373, 373, 373, 392, 392, 392, 392, 539, 541, 541, 537, 537, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 0, 0, 523, 0, 0, 173, 0, 392, 392, 392, 539, 541, 537, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 537, 537, 537, 537, 537, 537, 537, 537, 373, 373, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 539, 541, 537, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 0, 0, 0, 0, 0, 0, 0, 537, 537, 373, 373, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 392, 392, 392, 392, 0, 537, 537, 537, 537, 392, 392, 392, 392, 392, 392, 392, 392, 537, 537, 537, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 392, 392, 392, 392, 0, 537, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 537, 537, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 541, 541, 539, 541, 541, 539, 539, 541, 539, 541, 541, 541, 539, 541, 539, 541, 541, 541, 541, 541, 537, 537, 537, 347, 347, 347, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 0, 0, 537, 392, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 392, 392, 0, 0, 537, 537, 392, 537, 504, 504, 504, 504, 504, 511, 511, 537, 392, 392, 392, 392, 537, 537, 537, 537, 541, 537, 539, 539, 392, 392, 392, 392, 539, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 392, 537, 504, 504, 504, 504, 504, 414, 511, 537, 392, 392, 392, 392, 392, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 537, 504, 504, 504, 504, 504, 414, 511, 537, 392, 392, 392, 392, 392, 537, 537, 537, 541, 541, 539, 539, 392, 392, 392, 392, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 537, 537, 537, 537, 537, 537, 537, 173, 392, 392, 392, 392, 0, 537, 537, 537, 541, 541, 539, 539, 539, 392, 392, 392, 392, 539, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 433, 433, 433, 433, 437, 433, 433, 433, 437, 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 537, 414, 414, 504, 504, 504, 414, 414, 392, 392, 392, 392, 392, 537, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 428, 428, 365, 433, 410, 410, 410, 428, 433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 392, 537, 414, 414, 504, 504, 504, 414, 414, 392, 392, 392, 392, 392, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352, 0, 347, 347, 347, 347, 347, 347, 347, 347, 428, 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 392, 392, 537, 504, 504, 504, 504, 504, 504, 504, 392, 392, 392, 0, 392, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 428, 428, 428, 428, 428, 428, 428, 428, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 537, 537, 537, 537, 537, 504, 504, 504, 504, 504, 504, 504, 537, 392, 392, 392, 392, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 373, 0, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 537, 504, 504, 504, 537, 504, 504, 504, 504, 504, 504, 504, 537, 392, 392, 392, 537, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 365, 365, 410, 412, 410, 365, 347, 0, 0, 373, 373, 373, 373, 373, 499, 499, 499, 500, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 537, 504, 504, 504, 414, 414, 414, 504, 504, 504, 414, 414, 537, 392, 392, 392, 537, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 539, 541, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 537, 504, 504, 504, 537, 414, 414, 504, 504, 504, 414, 414, 537, 392, 392, 537, 537, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 539, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 392, 392, 537, 537, 537, 537, 537, 537, 537, 537, 414, 517, 537, 537, 537, 392, 392, 537, 537, 537, 537, 537, 541, 541, 539, 539, 539, 392, 392, 392, 539, 541, 537, 537, 537, 541, 0, 0, 0, 0, 0, 0, 0, 541, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 414, 0, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 542, 542, 542, 542, 542, 542, 540, 539, 537, 538, 0, 0, 414, 414, 415, 415, 415, 415, 416, 416, 416, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 537, 541, 0, 0, 0, 0, 0, 0, 0, 539, 0, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 537, 392, 0, 0, 0, 0, 0, 173, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 538, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 392, 392, 392, 392, 539, 541, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 392, 0, 392, 392, 392, 392, 392, 392, 392, 392, 392, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 392, 392, 392, 392, 392, 539, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 433, 433, 433, 412, 412, 416, 392, 416, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 537, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 538, 538, 538, 538, 538, 538, 542, 542, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 537, 537, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 539, 539, 541, 541, 537, 537, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 541, 539, 541, 541, 541, 539, 539, 539, 541, 541, 541, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 541, 541, 537, 541, 541, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 541, 537, 537, 537, 541, 537, 541, 537, 541, 537, 537, 537, 541, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 541, 541, 541, 539, 541, 541, 541, 539, 541, 539, 541, 539, 541, 541, 541, 539, 541, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 541, 541, 539, 392, 347, 347, 347, 347, 392, 392, 347, 392, 392, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 541, 541, 541, 541, 347, 392, 392, 347, 347, 392, 392, 392, 392, 392, 392, 392, 347, 392, 392, 392, 392, 541, 541, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 539, 541, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 347, 539, 541, 539, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 539, 539, 539, 539, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 539, 539, 539, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 539, 539, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 539, 539, 347, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 539, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 539, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 0, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 0, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 0, 347, 347, 347, 392, 347, 347, 347, 347, 347, 347, 347, 392, 347, 347, 347, 0, 347, 347, 347, 347, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 347, 392, 347, 347, 347, 347, 0, 0, 173, 173, 0, 0, 0, 0, 0, 0, 0, 173, 173, 0, 0, 347, 347, 347, 347, 347, 392, 0, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 0, 0, 173, 392, 347, 347, 347, 347, 347, 347, 392, 347, 347, 347, 347, 347, 392, 347, 347, 347, 347, 347, 347, 347, 173, 0, 0, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 0, 173, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 173, 0, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 173, 173, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 347, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 173, 173, 173, 173, 173, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 0, 347, 347, 392, 347, 392, 392, 392, 347, 347, 0, 347, 347, 347, 347, 347, 347, 347, 347, 392, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 392, 347, 347, 347, 347, 392, 392, 459, 347, 347, 347, 347, 347, 347, 347, 347, 347, 459, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 539, 539, 539, 347, 347, 392, 347, 347, 347, 347, 539, 539, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 539, 539, 539, 347, 347, 347, 392, 347, 347, 392, 539, 539, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 347, 347, 347, 347, 347, 347, 347, 392, 392, 539, 539, 539, 347, 347, 347, 347, 347, 347, 347, 539, 539, 539, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 347, 347, 347, 347, 347, 347, 347, 392, 392, 539, 539, 539, 392, 347, 347, 347, 347, 347, 347, 539, 539, 539, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 347, 347, 347, 347, 392, 392, 392, 539, 539, 539, 392, 347, 347, 347, 347, 347, 392, 539, 539, 539, 392, 392, 347, 347, 347, 347, 347, 347, 347, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 347, 347, 392, 392, 392, 392, 539, 541, 539, 392, 347, 347, 347, 347, 347, 392, 539, 541, 539, 392, 392, 347, 347, 347, 347, 347, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 347, 347, 392, 392, 392, 539, 541, 537, 541, 539, 347, 347, 347, 347, 347, 539, 541, 537, 541, 539, 392, 392, 347, 347, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 347, 347, 392, 392, 392, 539, 541, 537, 541, 539, 392, 347, 347, 347, 347, 539, 541, 537, 541, 539, 392, 392, 392, 347, 392, 347, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 347, 392, 392, 392, 541, 541, 537, 541, 541, 392, 347, 347, 347, 392, 541, 541, 537, 541, 541, 392, 392, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 347, 347, 392, 392, 541, 537, 537, 537, 541, 392, 347, 347, 347, 392, 541, 537, 537, 537, 541, 392, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 392, 392, 541, 537, 537, 537, 541, 392, 347, 347, 347, 392, 541, 537, 537, 537, 541, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 541, 537, 537, 537, 541, 347, 347, 347, 347, 347, 541, 537, 537, 537, 541, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 541, 392, 347, 347, 347, 347, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 523, 0, 392, 392, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 0, 392, 392, 392, 392, 392, 392, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 392, 537, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 539, 392, 392, 392, 392, 392, 539, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 347, 347, 347, 347, 392, 347, 392, 392, 537, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 539, 392, 392, 392, 392, 392, 392, 539, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 347, 347, 347, 347, 347, 347, 347, 347, 392, 537, 537, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 347, 347, 347, 392, 537, 537, 537, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 539, 541, 541, 539, 541, 541, 541, 541, 541, 541, 541, 541, 539, 539, 541, 541, 541, 541, 541, 541, 541, 541, 539, 541, 539, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 539, 541, 539, 541, 541, 541, 541, 541, 541, 541, 541, 541, 539, 541, 541, 541, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 537, 537, 537, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 539, 392, 392, 392, 392, 539, 541, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 541, 537, 541, 537, 537, 541, 541, 537, 537, 541, 541, 541, 541, 541, 537, 541, 541, 541, 537, 537, 541, 541, 537, 537, 537, 537, 541, 541, 541, 537, 541, 541, 537, 537, 537, 537, 541, 537, 537, 541, 541, 537, 537, 537, 541, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 537, 537, 537, 392, 392, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 392, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 537, 537, 537, 537, 541, 537, 537, 537, 537, 537, 537, 541, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 537, 537, 537, 537, 537, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 392, 347, 392, 537, 537, 537, 392, 392, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 541, 539, 539, 392, 392, 392, 392, 539, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 373, 373, 373, 392, 392, 347, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 539, 541, 537, 537, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 539, 539, 392, 392, 392, 392, 541, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 347, 392, 537, 537, 537, 392, 392, 392, 392, 347, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 392, 541, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 537, 537, 537, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 537, 537, 537, 537, 537, 537, 537, 373, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 392, 539, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 173, 173, 0, 173, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 539, 541, 537, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 537, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 0, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 347, 347, 392, 392, 392, 537, 537, 537, 392, 392, 392, 347, 347, 347, 347, 347, 347, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 0, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 539, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 537, 537, 537, 537, 392, 392, 392, 392, 392, 392, 347, 347, 347, 392, 347, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 347, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 0, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 373, 373, 373, 392, 392, 392, 392, 347, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 347, 373, 373, 373, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 0, 537, 537, 537, 541, 541, 539, 539, 392, 392, 392, 392, 539, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 537, 537, 537, 537, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 537, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 537, 537, 537, 537, 537, 0, 347, 347, 347, 347, 347, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 537, 537, 537, 537, 537, 537, 537, 537, 537, 347, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 539, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 373, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 537, 537, 347, 347, 347, 347, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 392, 392, 392, 539, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 537, 537, 537, 537, 537, 537, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 537, 373, 373, 373, 392, 392, 392, 392, 539, 541, 541, 537, 537, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 0, 0, 523, 0, 0, 173, 0, 392, 392, 392, 539, 541, 537, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 0, 537, 537, 537, 537, 537, 537, 537, 537, 373, 373, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 539, 541, 537, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 0, 0, 0, 0, 0, 0, 0, 537, 537, 373, 373, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 392, 392, 392, 392, 392, 392, 392, 0, 537, 537, 537, 537, 392, 392, 392, 392, 392, 392, 392, 392, 537, 537, 537, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 541, 541, 537, 537, 347, 347, 347, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 392, 392, 392, 392, 392, 392, 0, 537, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 537, 537, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 541, 541, 539, 541, 541, 539, 539, 541, 539, 541, 541, 541, 539, 541, 539, 541, 541, 541, 541, 541, 537, 537, 537, 347, 347, 347, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 347, 392, 392, 392, 0, 0, 537, 392, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 347, 392, 392, 392, 0, 0, 537, 537, 392, 537, 504, 504, 504, 504, 504, 511, 511, 537, 392, 392, 392, 392, 537, 537, 537, 537, 541, 537, 539, 539, 392, 392, 392, 392, 539, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 392, 537, 504, 504, 504, 504, 504, 414, 511, 537, 392, 392, 392, 392, 392, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 537, 504, 504, 504, 504, 504, 414, 511, 537, 392, 392, 392, 392, 392, 537, 537, 537, 541, 541, 539, 539, 392, 392, 392, 392, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 537, 537, 537, 537, 537, 537, 537, 173, 392, 392, 392, 392, 0, 537, 537, 537, 541, 541, 539, 539, 539, 392, 392, 392, 392, 539, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 433, 433, 433, 433, 437, 433, 433, 433, 437, 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 537, 414, 414, 504, 504, 504, 414, 414, 392, 392, 392, 392, 392, 537, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 428, 428, 365, 433, 410, 410, 410, 428, 433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 392, 392, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 392, 392, 392, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 392, 537, 414, 414, 504, 504, 504, 414, 414, 392, 392, 392, 392, 392, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352, 0, 347, 347, 347, 347, 347, 347, 347, 347, 428, 428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 392, 392, 537, 504, 504, 504, 504, 504, 504, 504, 392, 392, 392, 0, 392, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 392, 392, 539, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 428, 428, 428, 428, 428, 428, 428, 428, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 537, 537, 537, 537, 537, 504, 504, 504, 504, 504, 504, 504, 537, 392, 392, 392, 392, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 373, 0, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 537, 504, 504, 504, 537, 504, 504, 504, 504, 504, 504, 504, 537, 392, 392, 392, 537, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 347, 347, 347, 365, 365, 410, 412, 410, 365, 347, 0, 0, 373, 373, 373, 373, 373, 499, 499, 499, 500, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 537, 504, 504, 504, 414, 414, 414, 504, 504, 504, 414, 414, 537, 392, 392, 392, 537, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 539, 541, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 537, 504, 504, 504, 537, 414, 414, 504, 504, 504, 414, 414, 537, 392, 392, 537, 537, 537, 537, 537, 537, 541, 541, 539, 392, 392, 392, 539, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 392, 392, 537, 537, 537, 537, 537, 537, 537, 537, 414, 517, 537, 537, 537, 392, 392, 537, 537, 537, 537, 537, 541, 541, 539, 539, 539, 392, 392, 392, 539, 541, 537, 537, 537, 541, 0, 0, 0, 0, 0, 0, 0, 541, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 414, 0, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 542, 542, 542, 542, 542, 542, 540, 539, 537, 538, 0, 0, 414, 414, 415, 415, 415, 415, 416, 416, 416, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 0, 0, 0, 0, 0, 0, 0, 392, 392, 392, 392, 392, 392, 392, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 541, 539, 392, 392, 392, 392, 539, 541, 541, 537, 537, 541, 0, 0, 0, 0, 0, 0, 0, 539, 0, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 392, 392, 537, 392, 0, 0, 0, 0, 0, 173, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 392, 541, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, 540, 540, 540, 540, 540, 540, 540, 538, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 392, 392, 392, 392, 539, 541, 541, 541, 537, 537, 0, 0, 0, 0, 0, 0, 0, 392, 0, 392, 392, 392, 392, 392, 392, 392, 392, 392, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 392, 392, 392, 392, 392, 539, 541, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 433, 433, 433, 412, 412, 416, 392, 416, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 537, 539, 392, 392, 392, 392, 392, 539, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 541, 539, 539, 392, 392, 392, 392, 539, 541, 541, 541, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 538, 538, 538, 538, 538, 538, 542, 542, 541, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 537, 537, 537, 537, 541, 537, 541, 539, 392, 392, 392, 392, 539, 539, 541, 541, 537, 537, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 541, 539, 541, 541, 541, 539, 539, 539, 541, 541, 541, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 541, 541, 537, 541, 541, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 537, 537, 537, 537, 537, 537, 537, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "height":120, "id":55, "name":"tiles", @@ -27,7 +27,7 @@ "y":0 }, { - "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 196, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 13, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 13, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 13, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 13, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 196, 0, 0, 0, 0, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 0, 0, 0, 0, 198, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 196, 0, 0, 0, 0, 0, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 0, 0, 0, 0, 0, 198, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 193, 196, 0, 0, 0, 0, 0, 193, 193, 0, 0, 193, 193, 193, 193, 193, 193, 193, 0, 0, 193, 193, 0, 0, 0, 0, 0, 198, 193, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 193, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 193, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 193, 193, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 193, 193, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 193, 193, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 193, 193, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 0, 193, 193, 0, 0, 0, 0, 0, 193, 193, 0, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 589, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 589, 0, 0, 589, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 589, 589, 0, 0, 0, 589, 589, 589, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 198, 193, 0, 193, 55, 0, 55, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 76, 0, 76, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 198, 193, 193, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 108, 0, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 108, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 198, 193, 13, 0, 0, 13, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 13, 13, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 196, 0, 13, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 202, 196, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 0, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 198, 193, 193, 193, 193, 193, 193, 193, 193, 196, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 13, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 589, 589, 13, 13, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 108, 0, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 193, 55, 0, 55, 193, 0, 193, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 108, 108, 108, 483, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 203, 202, 202, 202, 202, 202, 202, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 203, 202, 202, 0, 0, 0, 0, 0, 0, 0, 0, 202, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 196, 31, 40, 40, 40, 40, 40, 40, 40, 31, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 202, 202, 202, 202, 202, 202, 202, 589, 13, 13, 13, 0, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 196, 40, 572, 638, 0, 0, 0, 0, 0, 40, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 196, 40, 0, 0, 0, 0, 0, 40, 0, 40, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 40, 0, 0, 0, 0, 0, 40, 0, 40, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 40, 40, 40, 40, 40, 40, 31, 0, 40, 0, 0, 198, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 589, 589, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 29, 29, 29, 29, 31, 31, 31, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 589, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 202, 202, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 185, 185, 185, 185, 185, 185, 185, 185, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 13, 13, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 198, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 46, 46, 46, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 31, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 589, 589, 589, 589, 589, 13, 14, 632, 632, 631, 13, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, 599, 599, 68, 68, 14, 14, 631, 631, 631, 0, 0, 13, 13, 13, 13, 13, 13, 143, 143, 143, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 196, 0, 31, 40, 40, 40, 40, 40, 40, 31, 0, 31, 40, 40, 31, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 193, 193, 196, 0, 0, 0, 0, 0, 198, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 0, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 195, 195, 195, 194, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 196, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 13, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 13, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 13, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 13, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 198, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 196, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 196, 0, 0, 0, 0, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 0, 0, 0, 0, 198, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 196, 0, 0, 0, 0, 0, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 0, 0, 0, 0, 0, 198, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 193, 196, 0, 0, 0, 0, 0, 193, 193, 0, 0, 193, 193, 193, 193, 193, 193, 193, 0, 0, 193, 193, 0, 0, 0, 0, 0, 198, 193, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 193, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 193, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 193, 193, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 193, 193, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 193, 0, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 0, 193, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 0, 193, 193, 0, 0, 0, 0, 0, 193, 193, 0, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 589, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 589, 0, 0, 589, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 589, 589, 0, 0, 0, 589, 589, 589, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 198, 193, 0, 193, 55, 0, 55, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 76, 0, 76, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 198, 193, 193, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 108, 0, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 108, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 198, 193, 13, 0, 0, 13, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 13, 13, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 196, 0, 13, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 202, 196, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 0, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 198, 193, 193, 193, 193, 193, 193, 193, 193, 196, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 13, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 108, 0, 40, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 589, 589, 13, 13, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 108, 0, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 193, 55, 0, 55, 193, 0, 193, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 108, 108, 108, 483, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 203, 202, 202, 202, 202, 202, 202, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 203, 202, 202, 0, 0, 0, 0, 0, 0, 0, 0, 202, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 196, 31, 40, 40, 40, 40, 40, 40, 40, 31, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 202, 202, 202, 202, 202, 202, 202, 589, 13, 13, 13, 0, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 196, 40, 572, 638, 0, 0, 0, 0, 0, 40, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 196, 40, 0, 0, 0, 0, 0, 40, 0, 40, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 40, 0, 0, 0, 0, 0, 40, 0, 40, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 40, 40, 40, 40, 40, 40, 31, 0, 40, 0, 0, 198, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 589, 589, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 29, 29, 29, 29, 31, 31, 31, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 589, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 202, 202, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 185, 185, 185, 185, 185, 185, 185, 185, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, 13, 13, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 198, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 46, 46, 46, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 31, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 589, 589, 589, 589, 589, 13, 14, 632, 632, 631, 13, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 40, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 40, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, 599, 599, 68, 68, 14, 14, 631, 631, 631, 0, 0, 13, 13, 13, 13, 13, 13, 143, 143, 143, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 196, 0, 31, 40, 40, 40, 40, 40, 40, 31, 0, 31, 40, 40, 31, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 193, 193, 196, 0, 0, 0, 0, 0, 198, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 0, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 193, 193, 193, 193, 195, 195, 195, 194, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "height":120, "id":57, "name":"walls", From 88c5d708f9a4b2211fa032fb08f3e4464b64c3e8 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 9 Dec 2019 19:27:53 +0200 Subject: [PATCH 027/121] changed most dire rats to giant rats --- src/server/config/maps/sewer/map.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/server/config/maps/sewer/map.json b/src/server/config/maps/sewer/map.json index d0b19593..2a893fcc 100644 --- a/src/server/config/maps/sewer/map.json +++ b/src/server/config/maps/sewer/map.json @@ -2128,7 +2128,7 @@ "gid":281, "height":8, "id":1234, - "name":"Dire Rat", + "name":"Giant Rat", "rotation":0, "type":"", "visible":true, @@ -2140,7 +2140,7 @@ "gid":281, "height":8, "id":1235, - "name":"Dire Rat", + "name":"Giant Rat", "rotation":0, "type":"", "visible":true, @@ -2188,7 +2188,7 @@ "gid":281, "height":8, "id":1255, - "name":"Dire Rat", + "name":"Giant Rat", "rotation":0, "type":"", "visible":true, @@ -2200,7 +2200,7 @@ "gid":281, "height":8, "id":1256, - "name":"Dire Rat", + "name":"Giant Rat", "rotation":0, "type":"", "visible":true, @@ -2212,7 +2212,7 @@ "gid":281, "height":8, "id":1258, - "name":"Dire Rat", + "name":"Giant Rat", "rotation":0, "type":"", "visible":true, @@ -2224,7 +2224,7 @@ "gid":281, "height":8, "id":1259, - "name":"Dire Rat", + "name":"Giant Rat", "rotation":0, "type":"", "visible":true, From fedff9d56fd83fec55a5ea874f5a1b0677cc3279 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sun, 15 Dec 2019 06:11:12 +0200 Subject: [PATCH 028/121] Added an if for a crash when a party member is suddenly just gone --- src/server/config/spells/spellAura.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/config/spells/spellAura.js b/src/server/config/spells/spellAura.js index e69f8735..7036683b 100644 --- a/src/server/config/spells/spellAura.js +++ b/src/server/config/spells/spellAura.js @@ -95,7 +95,8 @@ module.exports = { if (!members.find(m => ~~m === ~~serverId)) { delete effects[serverId]; const obj = objects.find(f => ~~f.serverId === ~~serverId); - obj.effects.removeEffect(effect); + if (obj) + obj.effects.removeEffect(effect); } }); }, From 3e7abeb6abf3cfc99493d77b9a7f4ad7d5d21c5a Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 16 Dec 2019 05:49:51 +0200 Subject: [PATCH 029/121] fixes #1320 --- src/server/components/trade.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server/components/trade.js b/src/server/components/trade.js index 70963eb0..76e83cd4 100644 --- a/src/server/components/trade.js +++ b/src/server/components/trade.js @@ -265,10 +265,15 @@ module.exports = { let targetTrade = target.trade; - let item = this.obj.inventory.destroyItem(msg.itemId, 1); + const item = this.obj.inventory.findItem(msg.itemId); + const oldQuantity = item.quantity; + this.obj.inventory.destroyItem(msg.itemId); if (!item) return; + if (oldQuantity) + item.quantity = oldQuantity; + let worth = ~~(item.worth * targetTrade.markup.buy); this.gold += worth; From aa1b18befbec176cd5126a7795799a4dced7f3cb Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 16 Dec 2019 20:29:52 +0200 Subject: [PATCH 030/121] hotfix for a vendor crash --- src/server/components/trade.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/server/components/trade.js b/src/server/components/trade.js index 76e83cd4..ad9bd7f0 100644 --- a/src/server/components/trade.js +++ b/src/server/components/trade.js @@ -266,11 +266,12 @@ module.exports = { let targetTrade = target.trade; const item = this.obj.inventory.findItem(msg.itemId); - const oldQuantity = item.quantity; - this.obj.inventory.destroyItem(msg.itemId); if (!item) return; + const oldQuantity = item.quantity; + this.obj.inventory.destroyItem(msg.itemId); + if (oldQuantity) item.quantity = oldQuantity; From 6dccfffef5c7c709fce8e7090784309ee29c800b Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Mon, 16 Dec 2019 21:01:32 +0200 Subject: [PATCH 031/121] fixes #1210 --- src/server/security/rest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/security/rest.js b/src/server/security/rest.js index 0650c8c2..28846f88 100644 --- a/src/server/security/rest.js +++ b/src/server/security/rest.js @@ -19,7 +19,7 @@ module.exports = { let pars = req.originalUrl.split('?').pop().split('&'); pars.forEach(p => { - let [par, val] = p.split('='); + let [par, val = ''] = p.split('='); config[par] = val .split('%20') .join(' '); From 67861a2b28c07de6c9a2799b1fb6595d0e82e8c7 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Thu, 19 Dec 2019 09:39:24 +0200 Subject: [PATCH 032/121] fixes #704 --- src/server/components/equipment.js | 4 ++++ src/server/components/gatherer.js | 9 ++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/server/components/equipment.js b/src/server/components/equipment.js index 765c250e..0d810940 100644 --- a/src/server/components/equipment.js +++ b/src/server/components/equipment.js @@ -28,6 +28,10 @@ module.exports = { }; }, + isSlotEmpty: function (slot) { + return !this.eq.has(slot); + }, + autoEquip: function (itemId) { if (!this.doAutoEq) return; diff --git a/src/server/components/gatherer.js b/src/server/components/gatherer.js index e011edee..f7d80df2 100644 --- a/src/server/components/gatherer.js +++ b/src/server/components/gatherer.js @@ -23,6 +23,8 @@ module.exports = { if (nodes.length === 0) return; + const { obj: { equipment, stats } } = this; + let firstNode = nodes[0]; this.gathering = firstNode; @@ -30,17 +32,14 @@ module.exports = { let ttlMax = firstNode.resourceNode.ttl || this.defaultTtlMax; if (firstNode.resourceNode.nodeType === 'fish') { - let rod = this.obj.equipment.eq.tool; - if (!rod) { + if (equipment.isSlotEmpty('tool')) { this.sendAnnouncement('You need a fishing rod to fish'); this.gathering = null; return; } - rod = this.obj.inventory.findItem(rod); - - let statCatchSpeed = Math.min(150, this.obj.stats.values.catchSpeed); + let statCatchSpeed = Math.min(150, stats.values.catchSpeed); ttlMax *= (1 - (statCatchSpeed / 200)); } From 3f03ffc4c477a994b933918bad3c9666960c990f Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Fri, 20 Dec 2019 20:00:05 +0200 Subject: [PATCH 033/121] fixes #1325 --- src/server/world/instancer.js | 2 +- src/server/world/map.js | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index 3d860a29..8249e5b9 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -93,7 +93,7 @@ module.exports = { if (spawnEvent.changed) msg.keepPos = false; - if ((msg.keepPos) && (!physics.isValid(obj.x, obj.y))) + if (msg.keepPos && (!physics.isValid(obj.x, obj.y) || !map.canPathFromPos(obj))) msg.keepPos = false; if (!msg.keepPos || !obj.has('x') || (map.mapFile.properties.isRandom && obj.instanceId !== map.seed)) { diff --git a/src/server/world/map.js b/src/server/world/map.js index a478c72c..3ca7c5ca 100644 --- a/src/server/world/map.js +++ b/src/server/world/map.js @@ -437,5 +437,19 @@ module.exports = { let spawns = this.spawn.filter(s => (((s.maxLevel) && (s.maxLevel >= level)) || (!s.maxLevel))); return spawns[0]; + }, + + //Find if any spawns can path to a position. This is important for when maps change and players + // log in on tiles that aren't blocking but not able to reach anywhere useful + canPathFromPos: function (pos) { + const canPath = this.spawn.some(s => { + const path = physics.getPath(pos, s); + const { x, y } = path[path.length - 1]; + const isFullPath = (s.x === x && s.y === y); + + return isFullPath; + }); + + return canPath; } }; From bdef602fccad6cf04f3e5c046469b609e77f59ff Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Fri, 20 Dec 2019 20:30:58 +0200 Subject: [PATCH 034/121] another fix for #1325 --- src/server/world/map.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/world/map.js b/src/server/world/map.js index 3ca7c5ca..3669b245 100644 --- a/src/server/world/map.js +++ b/src/server/world/map.js @@ -444,6 +444,9 @@ module.exports = { canPathFromPos: function (pos) { const canPath = this.spawn.some(s => { const path = physics.getPath(pos, s); + if (!path.length) + return true; + const { x, y } = path[path.length - 1]; const isFullPath = (s.x === x && s.y === y); From 83ac65a52867b2bc949862018235faf8f10afbec Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Fri, 20 Dec 2019 20:39:40 +0200 Subject: [PATCH 035/121] fixes #1326 --- src/server/config/maps/cave/map.json | 2 +- src/server/config/spells/spellAmbush.js | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/server/config/maps/cave/map.json b/src/server/config/maps/cave/map.json index a527a3a9..d7559de5 100644 --- a/src/server/config/maps/cave/map.json +++ b/src/server/config/maps/cave/map.json @@ -2447,7 +2447,7 @@ "y":0 }], "nextlayerid":10, - "nextobjectid":923, + "nextobjectid":924, "orientation":"orthogonal", "properties":[ { diff --git a/src/server/config/spells/spellAmbush.js b/src/server/config/spells/spellAmbush.js index b0549f4a..5d4978c0 100644 --- a/src/server/config/spells/spellAmbush.js +++ b/src/server/config/spells/spellAmbush.js @@ -75,27 +75,32 @@ module.exports = { // the delta by -1 let offsetX = 0; if (dx !== 0) - offsetX = (dx / Math.abs(dx)) * -1; + offsetX = dx / Math.abs(dx); let offsetY = 0; if (dy !== 0) - offsetY = (dy / Math.abs(dy)) * -1; + offsetY = dy / Math.abs(dy); let targetPos = { x: target.x, y: target.y }; - let physics = obj.instance.physics; + const physics = obj.instance.physics; + const fnTileValid = this.isTileValid.bind(this, physics, x, y); //Check where we should land - if (!this.isTileValid(physics, x, y, targetPos.x - offsetX, targetPos.y - offsetY)) { - if (!this.isTileValid(physics, x, y, targetPos.x - offsetX, targetPos.y)) - targetPos.y -= offsetY; - else - targetPos.x -= offsetX; + if (!fnTileValid(targetPos.x + offsetX, targetPos.y + offsetY)) { + if (!fnTileValid(targetPos.x + offsetX, targetPos.y)) { + if (!fnTileValid(targetPos.x, targetPos.y + offsetY)) { + targetPos.x -= offsetX; + targetPos.y -= offsetY; + } else + targetPos.y += offsetY; + } else + targetPos.x += offsetX; } else { - targetPos.x -= offsetX; - targetPos.y -= offsetY; + targetPos.x += offsetX; + targetPos.y += offsetY; } let targetEffect = target.effects.addEffect({ From 4a587582d0cc665dd8b2a49fdb7cdb2d59fc9c78 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Fri, 20 Dec 2019 22:01:37 +0200 Subject: [PATCH 036/121] another fix for #1325 to cater for portals --- src/server/world/map.js | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/server/world/map.js b/src/server/world/map.js index 3669b245..58d4b113 100644 --- a/src/server/world/map.js +++ b/src/server/world/map.js @@ -442,17 +442,31 @@ module.exports = { //Find if any spawns can path to a position. This is important for when maps change and players // log in on tiles that aren't blocking but not able to reach anywhere useful canPathFromPos: function (pos) { - const canPath = this.spawn.some(s => { - const path = physics.getPath(pos, s); - if (!path.length) - return true; - - const { x, y } = path[path.length - 1]; - const isFullPath = (s.x === x && s.y === y); + const fnCanPath = positions => { + return positions.some(p => { + const path = physics.getPath(pos, p); + //Are we on the position? + if (!path.length) + return true; + + const { x, y } = path[path.length - 1]; + //Can we reach the position? + const isFullPath = (p.x === x && p.y === y); + if (isFullPath) + return true; + + return false; + }); + }; + + const canPathToSpawn = fnCanPath(this.spawn); + + if (canPathToSpawn) + return true; - return isFullPath; - }); + const portals = objects.objects.filter(o => o.portal); + const canPathToPortal = fnCanPath(portals); - return canPath; + return canPathToPortal; } }; From 66c156e29ac2c10a7c7159e6c537083b21d8a32f Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Fri, 3 Jan 2020 20:08:35 +0200 Subject: [PATCH 037/121] changed cron job for plague of rats --- src/server/config/maps/sewer/events/plagueOfRats.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/maps/sewer/events/plagueOfRats.js b/src/server/config/maps/sewer/events/plagueOfRats.js index 6fd76d9b..21adeac5 100644 --- a/src/server/config/maps/sewer/events/plagueOfRats.js +++ b/src/server/config/maps/sewer/events/plagueOfRats.js @@ -51,7 +51,7 @@ const descriptionStrings = { }; const config = { - cron: '0/3 * * * *', + cron: '0 */3 * * *', //cron: '* * * * *', idFirstSpawnPhase: 6, idFailPhase: 19, From 2980baa1eedb744673ff7c2efea015b81f6c0310 Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Mon, 6 Jan 2020 07:06:47 +0200 Subject: [PATCH 038/121] fixes #1335 --- src/server/config/eventPhases/phaseGiveRewards.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/config/eventPhases/phaseGiveRewards.js b/src/server/config/eventPhases/phaseGiveRewards.js index a4e55cd6..f15dc12b 100644 --- a/src/server/config/eventPhases/phaseGiveRewards.js +++ b/src/server/config/eventPhases/phaseGiveRewards.js @@ -9,7 +9,9 @@ module.exports = { }]; const pRewards = rewards[p.name]; - rList.push(...pRewards); + if (pRewards.length) + rList.push(...pRewards); + if (rList.length > 1) rList[1].msg = `${config.name} reward:`; From 81b8761bb8f5b3e3179ae1fd529746f18b70577c Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Mon, 6 Jan 2020 20:11:59 +0200 Subject: [PATCH 039/121] another fix for #1335 --- src/server/config/eventPhases/phaseGiveRewards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/eventPhases/phaseGiveRewards.js b/src/server/config/eventPhases/phaseGiveRewards.js index f15dc12b..5e91dffe 100644 --- a/src/server/config/eventPhases/phaseGiveRewards.js +++ b/src/server/config/eventPhases/phaseGiveRewards.js @@ -9,7 +9,7 @@ module.exports = { }]; const pRewards = rewards[p.name]; - if (pRewards.length) + if (pRewards && pRewards.length) rList.push(...pRewards); if (rList.length > 1) From 7cc57bde958824af45d30d5bd6dd51e4de7fc099 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Thu, 9 Jan 2020 20:29:06 +0200 Subject: [PATCH 040/121] fixes #1349 --- src/server/config/eventPhases/phaseSetDescription.js | 2 -- src/server/config/maps/sewer/events/plagueOfRats.js | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/server/config/eventPhases/phaseSetDescription.js b/src/server/config/eventPhases/phaseSetDescription.js index 2e9b09e3..3d076eae 100644 --- a/src/server/config/eventPhases/phaseSetDescription.js +++ b/src/server/config/eventPhases/phaseSetDescription.js @@ -3,7 +3,5 @@ module.exports = { init: function (event) { event.eventManager.setEventDescription(event.config.name, this.desc); - - this.end = true; } }; diff --git a/src/server/config/maps/sewer/events/plagueOfRats.js b/src/server/config/maps/sewer/events/plagueOfRats.js index 21adeac5..2415abef 100644 --- a/src/server/config/maps/sewer/events/plagueOfRats.js +++ b/src/server/config/maps/sewer/events/plagueOfRats.js @@ -238,7 +238,8 @@ module.exports = { id: 'banditAlchemist' }, { type: 'setDescription', - desc: descriptionStrings.active + desc: descriptionStrings.active, + auto: true }, { type: 'spawnMob', mobs: [rat], From e971964eefcfd8f1e3d6cea5e8c16babbd016249 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sun, 2 Feb 2020 09:38:20 +0200 Subject: [PATCH 041/121] fixes #1381 --- src/client/js/components/spellbook.js | 4 ++-- src/client/js/input.js | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/client/js/components/spellbook.js b/src/client/js/components/spellbook.js index 5e1795bb..e4d6bc87 100644 --- a/src/client/js/components/spellbook.js +++ b/src/client/js/components/spellbook.js @@ -90,8 +90,8 @@ define([ onMouseDown: function (e, target) { if (isMobile && this.groundTargetSpell) { this.groundTarget = { - x: ~~(e.x / scale), - y: ~~(e.y / scale) + x: ~~(e.worldX / scale), + y: ~~(e.worldY / scale) }; this.onKeyDown(this.groundTargetSpell); diff --git a/src/client/js/input.js b/src/client/js/input.js index 15597bce..ce239536 100644 --- a/src/client/js/input.js +++ b/src/client/js/input.js @@ -197,6 +197,10 @@ define([ this.mouse.down = true; this.mouse.event = e; + //This is needed for casting targetted spells on Mobile...it's hacky. + this.mouse.worldX = e.pageX + renderer.pos.x; + this.mouse.worldY = e.pageY + renderer.pos.y; + events.emit('mouseDown', this.mouse); }, mouseUp: function (e) { @@ -223,8 +227,8 @@ define([ return; const zoom = window.devicePixelRatio; - this.mouse.x = e.offsetX * zoom + renderer.pos.x; - this.mouse.y = e.offsetY * zoom + renderer.pos.y; + this.mouse.x = (e.offsetX * zoom) + renderer.pos.x; + this.mouse.y = (e.offsetY * zoom) + renderer.pos.y; } }, From 2279d5d59e96d9285be90d4050e3e4f385533bfc Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sat, 15 Feb 2020 05:39:26 +0200 Subject: [PATCH 042/121] Added a hotfix for elixir of infatuation cdMax --- src/server/fixes/fixes.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/fixes/fixes.js b/src/server/fixes/fixes.js index 4d73dafc..02346dd9 100644 --- a/src/server/fixes/fixes.js +++ b/src/server/fixes/fixes.js @@ -29,6 +29,12 @@ module.exports = { }, fixItems: function (items) { + items + .filter(i => (i.name === 'Elixir of Infatuation')) + .forEach(function (i) { + i.cdMax = 342; + }); + items .filter(i => ((i.name === 'Cowl of Obscurity') && (!i.factions))) .forEach(function (i) { From dc300421a2d4755ef48bdccff132dbe702ab0bac Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sat, 15 Feb 2020 06:50:32 +0200 Subject: [PATCH 043/121] fixes #1397 --- src/server/components/inventory.js | 2 +- src/server/mail/mailRethinkDb.js | 61 +----------------------------- 2 files changed, 3 insertions(+), 60 deletions(-) diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index 5ecc4c29..bd66422c 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -713,7 +713,7 @@ module.exports = { } return true; }, - getItem: function (item, hideMessage, noStack, hideAlert) { + getItem: function (item, hideMessage, noStack, hideAlert, smee) { return getItem(this, item, hideMessage, noStack, hideAlert); }, diff --git a/src/server/mail/mailRethinkDb.js b/src/server/mail/mailRethinkDb.js index a1e350a4..d573a895 100644 --- a/src/server/mail/mailRethinkDb.js +++ b/src/server/mail/mailRethinkDb.js @@ -71,65 +71,8 @@ module.exports = { }, getMail: async function (playerName) { - let items = await io.getAsync({ - key: playerName, - table: 'mail' - }); - - if (!items || !(items instanceof Array)) - return; - - let player = this.instance.objects.objects.find(o => (o.name === playerName)); - if (!player) - return; - - let inventory = player.inventory; - let stash = player.stash; - - let sentMessages = []; - - items.forEach(function (r) { - if (r.removeAll) { - for (let i = 0; i < inventory.items.length; i++) { - let item = inventory.items[i]; - if ((r.nameLike) && (item.name.indexOf(r.nameLike) > -1)) { - inventory.destroyItem(item.id, item.quantity ? item.quantity : null); - i--; - } - } - - if (stash) { - for (let i = 0; i < stash.items.length; i++) { - let item = stash.items[i]; - if ((r.nameLike) && (item.name.indexOf(r.nameLike) > -1)) { - stash.destroyItem(item.id); - i--; - } - } - } - } else { - if ((r.msg) && (!sentMessages.some(s => (s === r.msg)))) { - player.instance.syncer.queue('onGetMessages', { - id: player.id, - messages: [{ - class: 'color-greenB', - message: r.msg, - type: 'info' - }] - }, [player.serverId]); - - sentMessages.push(r.msg); - delete r.msg; - } - - inventory.getItem(r); - } - }); - - await io.deleteAsync({ - key: playerName, - table: 'mail' - }); + //This function is left here because SQLite has one and the server will crash if it's not here. + // That said, we don't need it because the listener sorts out acquisition. }, sendMail: async function (playerName, items, callback) { From 4f9379a2d831b0d418c1c7843160f7f7e01e59d6 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sat, 15 Feb 2020 06:55:08 +0200 Subject: [PATCH 044/121] removed test code --- src/server/components/inventory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index bd66422c..5ecc4c29 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -713,7 +713,7 @@ module.exports = { } return true; }, - getItem: function (item, hideMessage, noStack, hideAlert, smee) { + getItem: function (item, hideMessage, noStack, hideAlert) { return getItem(this, item, hideMessage, noStack, hideAlert); }, From 664918847d84763fd7c0691651655b71d11e80c5 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sat, 15 Feb 2020 19:55:14 +0200 Subject: [PATCH 045/121] fixes #1399 --- src/server/mail/mailRethinkDb.js | 79 +++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/src/server/mail/mailRethinkDb.js b/src/server/mail/mailRethinkDb.js index d573a895..f0686d0d 100644 --- a/src/server/mail/mailRethinkDb.js +++ b/src/server/mail/mailRethinkDb.js @@ -1,3 +1,7 @@ +//This lock system is so stupid. But until we rewrite mail (no more auto-fetch) +// We need a way to stop race conditions (listener picking up mail when we just want to getMail normally) +const locks = {}; + module.exports = { init: function (instance) { this.instance = instance; @@ -18,6 +22,11 @@ module.exports = { if (!player) return; + if (locks[player.name]) + return; + + locks[player.name] = 1; + let items = doc.value; let inventory = player.inventory; let stash = player.stash; @@ -66,13 +75,79 @@ module.exports = { key: doc.id, table: 'mail' }); + + delete locks[player.name]; }); }); }, getMail: async function (playerName) { - //This function is left here because SQLite has one and the server will crash if it's not here. - // That said, we don't need it because the listener sorts out acquisition. + let items = await io.getAsync({ + key: playerName, + table: 'mail' + }); + + if (!items || !(items instanceof Array)) + return; + + let player = this.instance.objects.objects.find(o => (o.name === playerName)); + if (!player) + return; + + if (locks[playerName]) + return; + + locks[playerName] = 1; + + let inventory = player.inventory; + let stash = player.stash; + + let sentMessages = []; + + items.forEach(function (r) { + if (r.removeAll) { + for (let i = 0; i < inventory.items.length; i++) { + let item = inventory.items[i]; + if ((r.nameLike) && (item.name.indexOf(r.nameLike) > -1)) { + inventory.destroyItem(item.id, item.quantity ? item.quantity : null); + i--; + } + } + + if (stash) { + for (let i = 0; i < stash.items.length; i++) { + let item = stash.items[i]; + if ((r.nameLike) && (item.name.indexOf(r.nameLike) > -1)) { + stash.destroyItem(item.id); + i--; + } + } + } + } else { + if ((r.msg) && (!sentMessages.some(s => (s === r.msg)))) { + player.instance.syncer.queue('onGetMessages', { + id: player.id, + messages: [{ + class: 'color-greenB', + message: r.msg, + type: 'info' + }] + }, [player.serverId]); + + sentMessages.push(r.msg); + delete r.msg; + } + + inventory.getItem(r); + } + }); + + await io.deleteAsync({ + key: playerName, + table: 'mail' + }); + + delete locks[playerName]; }, sendMail: async function (playerName, items, callback) { From f5e937eb0828156a170bd0c4e6d2d5786d759abd Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sat, 15 Feb 2020 19:56:14 +0200 Subject: [PATCH 046/121] UNDO THIS: Made resources spawn faster for sjofni's embrace --- src/server/world/resourceSpawner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/world/resourceSpawner.js b/src/server/world/resourceSpawner.js index 0449f784..98f24f3a 100644 --- a/src/server/world/resourceSpawner.js +++ b/src/server/world/resourceSpawner.js @@ -9,7 +9,7 @@ module.exports = { physics: null, map: null, - cdMax: 171, + cdMax: 86, init: function (instance) { Object.assign(this, { From 75ba773adb0328c8e3bcd52d55fe9090c84aa0b6 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sat, 15 Feb 2020 20:39:08 +0200 Subject: [PATCH 047/121] another fix for #1399 --- src/server/mail/mailRethinkDb.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/mail/mailRethinkDb.js b/src/server/mail/mailRethinkDb.js index f0686d0d..841e281a 100644 --- a/src/server/mail/mailRethinkDb.js +++ b/src/server/mail/mailRethinkDb.js @@ -71,7 +71,7 @@ module.exports = { } }); - io.deleteAsync({ + await io.deleteAsync({ key: doc.id, table: 'mail' }); From 2fb5df02820015b9971eb853b128ec1a65689bd3 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Thu, 20 Feb 2020 13:58:20 +0000 Subject: [PATCH 048/121] fixes #1406 (cherry picked from commit c8b8290645f8a564d6ad464eb7c939f4788cc79d) --- src/server/config/quests/questBuilder.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/server/config/quests/questBuilder.js b/src/server/config/quests/questBuilder.js index ae67d55d..83f78b6d 100644 --- a/src/server/config/quests/questBuilder.js +++ b/src/server/config/quests/questBuilder.js @@ -11,7 +11,12 @@ module.exports = { obtain: function (obj, template) { let zoneName = template ? template.zoneName : obj.zoneName; - let zonePath = mapList.mapList.find(m => m.name === zoneName).path; + let zone = mapList.mapList.find(m => m.name === zoneName); + + //Zone doesn't exist any more. Probably been renamed + if (!zone) + return; + let oQuests = obj.quests; if (oQuests.quests.filter(q => q.zoneName === zoneName).length > 0) return; @@ -19,7 +24,7 @@ module.exports = { let zoneTemplate = null; try { - zoneTemplate = require('../../' + zonePath + '/' + zoneName + '/quests.js'); + zoneTemplate = require(`../../${zone.path}/${zoneName}/quests.js`); } catch (e) { zoneTemplate = globalQuests; } @@ -43,7 +48,7 @@ module.exports = { if (!pickQuest) pickQuest = config.infini[~~(Math.random() * config.infini.length)]; let pickType = pickQuest.type[0].toUpperCase() + pickQuest.type.substr(1); - let questClass = require('../../config/quests/templates/quest' + pickType); + let questClass = require(`../../config/quests/templates/quest${pickType}`); let quest = extend({}, pickQuest, questTemplate, questClass, template); From c98341ef43d90ede04b95be96908a9fc197110c9 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sun, 1 Mar 2020 05:50:18 +0000 Subject: [PATCH 049/121] Revert "UNDO THIS: Made resources spawn faster for sjofni's embrace" This reverts commit f5e937eb0828156a170bd0c4e6d2d5786d759abd --- src/server/world/resourceSpawner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/world/resourceSpawner.js b/src/server/world/resourceSpawner.js index 98f24f3a..0449f784 100644 --- a/src/server/world/resourceSpawner.js +++ b/src/server/world/resourceSpawner.js @@ -9,7 +9,7 @@ module.exports = { physics: null, map: null, - cdMax: 86, + cdMax: 171, init: function (instance) { Object.assign(this, { From fc06a73c18e6c5b5b5796ecc41d85de40b71128c Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sun, 1 Mar 2020 07:57:02 +0200 Subject: [PATCH 050/121] revert valentines styles --- src/client/js/rendering/renderer.js | 20 ++++++++--------- .../ui/templates/characters/characters.js | 2 +- .../ui/templates/characters/styles.less | 7 +++--- .../ui/templates/createCharacter/styles.less | 12 +++++----- src/client/ui/templates/login/styles.less | 22 ++++++++----------- 5 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/client/js/rendering/renderer.js b/src/client/js/rendering/renderer.js index b73dd144..d3c0f3b4 100644 --- a/src/client/js/rendering/renderer.js +++ b/src/client/js/rendering/renderer.js @@ -176,31 +176,31 @@ define([ let container = this.layers.tileSprites; for (let i = 0; i < w; i++) { - let ii = i / 7.5; + let ii = i / 10; for (let j = 0; j < h; j++) { let roll = Math.sin(((j * 0.2) % 5) + Math.cos(ii % 8)); - let tile = 74; + let tile = 5; if (roll < -0.2) - tile = 108; + tile = 3; else if (roll < 0.2) - tile = 107; + tile = 4; else if (roll < 0.5) - tile = 79; + tile = 53; let alpha = mRandom(); - if ([73, 79].indexOf(tile) > -1) + if ([5, 53].indexOf(tile) > -1) alpha *= 2; alpha = Math.min(Math.max(0.15, alpha), 0.65); if (mRandom() < 0.35) { tile = { - 74: 94, - 108: 110, - 107: 97, - 79: 119 + 5: 6, + 3: 0, + 4: 1, + 53: 54 }[tile]; } diff --git a/src/client/ui/templates/characters/characters.js b/src/client/ui/templates/characters/characters.js index 29c99732..5a882784 100644 --- a/src/client/ui/templates/characters/characters.js +++ b/src/client/ui/templates/characters/characters.js @@ -105,7 +105,7 @@ define([ .forEach(function (c, i) { let charName = c.name; if (c.level !== null) - charName += ' (' + c.level + ')'; + charName += ' (' + c.level + ')'; let html = templateListItem .replace('$NAME$', charName); diff --git a/src/client/ui/templates/characters/styles.less b/src/client/ui/templates/characters/styles.less index c959223f..73a865c3 100644 --- a/src/client/ui/templates/characters/styles.less +++ b/src/client/ui/templates/characters/styles.less @@ -20,8 +20,7 @@ margin-bottom: (@boxPadding * 2); } - .left, - .right { + .left, .right { height: @boxHeight; float: left; background-color: #3a3b4a; @@ -103,7 +102,7 @@ } .btn { - background-color: @pinkB; + background-color: @blueC; width: calc((100% - (16px * 2)) / 3); float: left; margin-right: 16px; @@ -114,7 +113,7 @@ } &:hover { - background-color: @pinkB; + background-color: @blueB; } &.deleting { diff --git a/src/client/ui/templates/createCharacter/styles.less b/src/client/ui/templates/createCharacter/styles.less index b20d6a9b..5f9c7d9d 100644 --- a/src/client/ui/templates/createCharacter/styles.less +++ b/src/client/ui/templates/createCharacter/styles.less @@ -24,8 +24,7 @@ width: 613px; background-color: #3a3b4a; - .left, - .right { + .left, .right { float: left; height: 100%; } @@ -34,8 +33,7 @@ width: calc(100% - (@boxPadding * 2) - 160px); padding: @boxPadding 0px @boxPadding @boxPadding; - .txtClass, - .txtCostume { + .txtClass, .txtCostume { cursor: pointer; -webkit-user-select: none; @@ -130,7 +128,7 @@ } .btn { - background-color: @pinkC; + background-color: @blueC; width: calc((100% - @boxPadding) / 2); float: left; margin-right: @boxPadding; @@ -141,7 +139,7 @@ } &:hover { - background-color: @pinkB; + background-color: @blueB; } } @@ -176,7 +174,7 @@ .heading { margin-bottom: @boxPadding; - color: @tealB; + color: @blueA; } .list { diff --git a/src/client/ui/templates/login/styles.less b/src/client/ui/templates/login/styles.less index 7d589487..49e60710 100644 --- a/src/client/ui/templates/login/styles.less +++ b/src/client/ui/templates/login/styles.less @@ -38,24 +38,21 @@ width: @rightWidth; padding: @boxPadding; - .label, - input { + .label, input { float: left; } .label { width: 30%; padding-top: 10px; - color: @tealC; + color: @green; } input { width: 70%; } - input, - .textbox, - input:-webkit-autofill { + input, .textbox, input:-webkit-autofill { box-shadow: 0 0 0px 1000px darken(@gray, 15%) inset; color: @white; -webkit-text-fill-color: @white; @@ -63,8 +60,7 @@ } /* We duplicate this for firefox which doesn't like the webkit selector */ - input, - .textbox { + input, .textbox { box-shadow: 0 0 0px 1000px darken(@gray, 15%) inset; color: @white; -webkit-text-fill-color: @white; @@ -78,7 +74,7 @@ margin-top: 36px; float: left; text-align: center; - color: @pinkA; + color: @orangeA; filter: brightness(100%) drop-shadow(0px -4px 0px @blackD) drop-shadow(0px 4px 0px @blackD) @@ -96,7 +92,7 @@ height: 35px; .btn { - background-color: @pinkC; + background-color: @blueC; width: calc((100% - @boxPadding) / 2); float: left; margin-right: @boxPadding; @@ -107,7 +103,7 @@ } &:hover { - background-color: @pinkB; + background-color: @blueB; } } @@ -146,7 +142,7 @@ padding-left: 10px; padding-right: 10px; margin-left: 10px; - background-color: @pinkD; + background-color: @blueD; color: @white; &:first-child { @@ -154,7 +150,7 @@ } &:hover { - background-color: @pinkC; + background-color: @blueC; } } From 7f1d3fb33a57144ce8427e448a8661ce844098b5 Mon Sep 17 00:00:00 2001 From: Shaun Kichenbrand Date: Sun, 15 Mar 2020 11:25:43 +0000 Subject: [PATCH 051/121] fixed version number --- src/client/ui/templates/login/template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/ui/templates/login/template.html b/src/client/ui/templates/login/template.html index e124eb01..ec03a02e 100644 --- a/src/client/ui/templates/login/template.html +++ b/src/client/ui/templates/login/template.html @@ -11,11 +11,11 @@
-
[ Latest Release Notes ]
+
[ Latest Release Notes ]
Pledge on Patreon
Donate on Paypal
Access the Wiki
-
v0.4.4
+
v0.5
From 0fd19a0704bf19addfa53e09ad9c8087d004af0a Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 8 Apr 2020 13:08:13 +0200 Subject: [PATCH 052/121] trying to isolate google sheets error --- src/server/security/sheets.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/server/security/sheets.js b/src/server/security/sheets.js index 4fd60b33..652cf6ec 100644 --- a/src/server/security/sheets.js +++ b/src/server/security/sheets.js @@ -75,7 +75,11 @@ module.exports = { }, update: async function () { - const records = await this.sheet.getRows(); - this.onGetRows(null, records); + try { + const records = await this.sheet.getRows(); + this.onGetRows(null, records); + } catch (e) { + setTimeout(this.update.bind(this), 300000); + } } }; From 089f21bf4a1cf1ff4dcada855383e3f4f7c99461 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 11 Apr 2020 12:41:21 +0000 Subject: [PATCH 053/121] asvald runes are now always commong (cherry picked from commit 444d1ff82498a99fb569b9f18c6113d597e43f02) --- src/server/config/maps/fjolarok/zone.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/server/config/maps/fjolarok/zone.js b/src/server/config/maps/fjolarok/zone.js index ec720817..79606c6f 100644 --- a/src/server/config/maps/fjolarok/zone.js +++ b/src/server/config/maps/fjolarok/zone.js @@ -854,56 +854,56 @@ module.exports = { extra: [{ generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'magic missile', worth: 3 }, { generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'ice spear', worth: 3 }, { generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'smite', worth: 3 }, { generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'consecrate', worth: 3 }, { generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'slash', worth: 3 }, { generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'charge', worth: 3 }, { generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'flurry', worth: 3 }, { generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'smokebomb', worth: 3 From 426081daec84f7c99549f605cec6647c7273d5bd Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 11 Apr 2020 12:42:00 +0000 Subject: [PATCH 054/121] Starter runes are now always common (cherry picked from commit 1ac0f46a9adeaf7fe04f95d70078e81fcbddc1f1) --- src/server/components/inventory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index 6ecf2454..4f4a22e6 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -594,7 +594,7 @@ module.exports = { if (!hasSpell) { let item = generator.generate({ spell: true, - spellQuality: 0, + quality: 0, spellName: spellName }); item.worth = 0; From 91d0c51f23dbd7d10ca40cf89220335366462428 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 18 Apr 2020 07:44:15 +0200 Subject: [PATCH 055/121] if an item that is quicklotted is mailed, then placed in an overflow bag, the server crashes --- src/server/components/inventory.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index 4f4a22e6..9db2df43 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -408,6 +408,7 @@ module.exports = { } delete item.pos; + delete item.quickSlot; let res = await io.getAsync({ key: msg.recipient, From e921bccd0d8efd2dcb69ff1ca5501c8fab9b47bf Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 18 Apr 2020 09:44:25 +0200 Subject: [PATCH 056/121] another fix for #1470 --- src/server/components/inventory.js | 3 --- src/server/mail/mailRethinkDb.js | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index 9db2df43..3632cc0d 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -407,9 +407,6 @@ module.exports = { return; } - delete item.pos; - delete item.quickSlot; - let res = await io.getAsync({ key: msg.recipient, table: 'character' diff --git a/src/server/mail/mailRethinkDb.js b/src/server/mail/mailRethinkDb.js index 07d684ec..b4a38bd6 100644 --- a/src/server/mail/mailRethinkDb.js +++ b/src/server/mail/mailRethinkDb.js @@ -63,6 +63,8 @@ module.exports = { delete r.msg; } + delete r.pos; + delete r.quickSlot; inventory.getItem(r, false, false, false, true); } }); @@ -130,6 +132,8 @@ module.exports = { delete r.msg; } + delete r.pos; + delete r.quickSlot; inventory.getItem(r, false, false, false, true); } }); From 4e77323ab82b45e1b42b9a8b6db70ab7bc384146 Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 5 May 2020 19:21:40 +0200 Subject: [PATCH 057/121] necro runes in asvald's show weren't always common --- src/server/mods/class-necromancer/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/mods/class-necromancer/index.js b/src/server/mods/class-necromancer/index.js index 4b280e94..ee9d104d 100644 --- a/src/server/mods/class-necromancer/index.js +++ b/src/server/mods/class-necromancer/index.js @@ -25,14 +25,14 @@ module.exports = { let newRunes = [{ generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'harvest life', worth: 3 }, { generate: true, spell: true, - spellQuality: 0, + quality: 0, infinite: true, spellName: 'summon skeleton', worth: 3 From a155e64319728096964c9b8ff3ca36beebb2827f Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 5 May 2020 19:27:10 +0200 Subject: [PATCH 058/121] fixed the name of adminForceSave --- src/server/security/rest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/security/rest.js b/src/server/security/rest.js index 2934e6dd..605bb9dc 100644 --- a/src/server/security/rest.js +++ b/src/server/security/rest.js @@ -2,7 +2,7 @@ const events = require('../misc/events'); const restEndpoints = { info: require('./restEndpoints/info.js'), - forceSaveAll: require('./restEndpoints/forceSaveAll.js') + adminForceSave: require('./restEndpoints/forceSaveAll.js') }; module.exports = { From 17584a7a97d21a5b01ece52139922b2dbea771da Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 5 May 2020 19:35:38 +0200 Subject: [PATCH 059/121] weapons with predefined qualities weren't always that quality (shank) --- src/server/items/generators/spellbook.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/items/generators/spellbook.js b/src/server/items/generators/spellbook.js index 8e983ffc..e75e31b4 100644 --- a/src/server/items/generators/spellbook.js +++ b/src/server/items/generators/spellbook.js @@ -100,7 +100,7 @@ module.exports = { if (item.slot) { const tempItem = {}; - const tempBlueprint = extend(blueprint); + const tempBlueprint = extend({}, blueprint); delete tempBlueprint.quality; tempBlueprint.quality = blueprint.spellQuality; From 90426031b86116485e1b2e2957a606487db4739b Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 9 Sep 2020 17:39:02 +0000 Subject: [PATCH 060/121] fixes #1546 (cherry picked from commit 102df2577af453262855fd1d82447bf471d6d11b) --- src/server/components/equipment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/equipment.js b/src/server/components/equipment.js index 94ec0924..e7bc2a05 100644 --- a/src/server/components/equipment.js +++ b/src/server/components/equipment.js @@ -61,7 +61,7 @@ module.exports = { let inventory = obj.inventory; let item = inventory.findItem(itemId); - if (!item) + if (!item || item.eq) return; else if ((!item.slot) || (item.material) || (item.quest) || (item.ability) || (!inventory.canEquipItem(item))) { item.eq = false; From 0c12a0aab3f100133b2a6c3c5623bff920c37ac3 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 4 Sep 2020 12:09:23 +0000 Subject: [PATCH 061/121] fixes #1538 (cherry picked from commit 88dfb2bc7ad538aea9ae9e021483e5e3f3a8cc28) --- src/client/js/system/client.js | 6 +----- src/server/server.js | 4 +++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/client/js/system/client.js b/src/client/js/system/client.js index 5d477331..4e92ec57 100644 --- a/src/client/js/system/client.js +++ b/src/client/js/system/client.js @@ -9,12 +9,8 @@ define([ doneConnect: false, init: function (onReady) { - let tType = 'websocket'; - if (window.location.href.indexOf('polling') > -1) - tType = 'polling'; - this.socket = io({ - transports: [tType] + transports: ['websocket'] }); this.socket.on('connect', this.onConnected.bind(this, onReady)); diff --git a/src/server/server.js b/src/server/server.js index e00eef92..cb56a6d8 100644 --- a/src/server/server.js +++ b/src/server/server.js @@ -8,7 +8,9 @@ module.exports = { init: function (callback) { let app = require('express')(); let server = require('http').createServer(app); - let socketServer = require('socket.io')(server); + let socketServer = require('socket.io')(server, { + transports: ['websocket'] + }); global.cons.sockets = socketServer.sockets; From e1cc215937a7042525264264016dd28ef96a2a3f Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 9 Sep 2020 20:14:24 +0200 Subject: [PATCH 062/121] another fix for #1546 --- src/server/components/inventory/getItem.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/components/inventory/getItem.js b/src/server/components/inventory/getItem.js index 8eb7cf62..4abedb09 100644 --- a/src/server/components/inventory/getItem.js +++ b/src/server/components/inventory/getItem.js @@ -125,8 +125,10 @@ module.exports = (cpnInv, item, hideMessage, noStack, hideAlert, createBagIfFull if (item.eq) { if (item.ability) cpnInv.learnAbility(item.id, item.runeSlot); - else + else { + delete item.eq; obj.equipment.equip(item.id); + } } else if (item.has('quickSlot')) { obj.equipment.setQuickSlot({ itemId: item.id, From 3e22a5b2ad3028f36fbea9be7086c474fee0e172 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 12 Sep 2020 13:35:59 +0000 Subject: [PATCH 063/121] bump version in serverConfig (cherry picked from commit a801bb4e43ed3aebc3f389836231178fef8967ed) --- src/server/config/serverConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js index b0b386eb..018c2a82 100644 --- a/src/server/config/serverConfig.js +++ b/src/server/config/serverConfig.js @@ -1,5 +1,5 @@ module.exports = { - version: '0.6', + version: '0.8.0', port: 4000, startupMessage: 'Server: ready', defaultZone: 'fjolarok', From bacc3da47321dd84dfb76676618c78f1ea10f11f Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 12 Sep 2020 14:58:01 +0000 Subject: [PATCH 064/121] fixes #1560 (cherry picked from commit d3230bbc38641d38b3fd4299bae03d06aed5a0f9) --- src/server/misc/scheduler.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/server/misc/scheduler.js b/src/server/misc/scheduler.js index fbcce913..a9a03450 100644 --- a/src/server/misc/scheduler.js +++ b/src/server/misc/scheduler.js @@ -27,8 +27,13 @@ module.exports = { if (f.length === 1) { f = f[0].split('/'); - if (f.length === 1) - return (useTime === ~~f[0]); + if (f.length === 1) { + const options = f[0].split(','); + const isOk = options.some(o => { + return ~~o === useTime; + }); + return isOk; + } return ((useTime % f[1]) === 0); } return ((useTime >= f[0]) && (useTime <= f[1])); From 5bc8f663ac58e9c4fb3537aa23b170ca0833bbd2 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 12 Sep 2020 19:33:42 +0000 Subject: [PATCH 065/121] fixes #1564 (cherry picked from commit 659703a107714ccec91c9ae041d619f7efeea19c) --- src/server/events/events.js | 7 +++++++ src/server/world/instancer.js | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/server/events/events.js b/src/server/events/events.js index 92a094d6..8659f705 100644 --- a/src/server/events/events.js +++ b/src/server/events/events.js @@ -251,6 +251,13 @@ module.exports = { config.events.afterGiveRewards(this, config); }, + stopAll: function () { + this.configs.forEach(c => { + if (c.event) + this.stopEvent(c); + }); + }, + stopEvent: function (config) { let event = config.event; diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index e93ad1a0..a78688ab 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -99,9 +99,13 @@ module.exports = { return; } + spawners.reset(); + objects.objects.length = 0; objects.objects = []; + events.stopAll(); + map.randomMap.generate(); map.seed = _.getGuid(); From 5111c0affaba99631b2e965fdbf36fa5aa6915bc Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 12 Sep 2020 20:54:55 +0000 Subject: [PATCH 066/121] another fix for #1564 and fixed a rare crash that was introduced a year ago by 9053b1335a8f1b0069f6faebeb7859349dd8107b (cherry picked from commit 09a9c708110fb3d27e2d998664727f133fd099f8) --- src/server/config/spells/spellTemplate.js | 2 +- src/server/events/events.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/config/spells/spellTemplate.js b/src/server/config/spells/spellTemplate.js index 71208b62..e9e48970 100644 --- a/src/server/config/spells/spellTemplate.js +++ b/src/server/config/spells/spellTemplate.js @@ -64,7 +64,7 @@ module.exports = { updateBase: function () { if (this.castTime > 0) { let action = this.currentAction; - if (_.getDeepProperty(action, 'target.destroyed') || !this.canCast(action.target)) { + if (_.getDeepProperty(action, 'target.destroyed') || (action && !this.canCast(action.target))) { this.currentAction = null; this.castTime = 0; this.obj.syncer.set(false, null, 'casting', 0); diff --git a/src/server/events/events.js b/src/server/events/events.js index 8659f705..fa37f35b 100644 --- a/src/server/events/events.js +++ b/src/server/events/events.js @@ -254,7 +254,7 @@ module.exports = { stopAll: function () { this.configs.forEach(c => { if (c.event) - this.stopEvent(c); + c.event.done = true; }); }, From 6fdcac6bf9864675ab288cb0b2694c010dbed95b Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 13 Sep 2020 05:09:46 +0000 Subject: [PATCH 067/121] closes #1566 (cherry picked from commit bc1ab9596c7f6ef3ba5b58ad2fb806a32e9035cc) --- .../mods/class-necromancer/spells/spellSummonSkeleton.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/server/mods/class-necromancer/spells/spellSummonSkeleton.js b/src/server/mods/class-necromancer/spells/spellSummonSkeleton.js index f0b873cd..e2a2e2f9 100644 --- a/src/server/mods/class-necromancer/spells/spellSummonSkeleton.js +++ b/src/server/mods/class-necromancer/spells/spellSummonSkeleton.js @@ -15,6 +15,8 @@ module.exports = { killMinionsOnDeath: true, minionsDieOnAggroClear: false, + maxSummon: 1, + minions: [], name: 'Skeletal Minion', @@ -32,6 +34,9 @@ module.exports = { if (this.killMinionsBeforeSummon) this.killMinions(); + if (this.minions.length >= this.maxSummon) + return false; + let obj = this.obj; let target = action.target; From 348645b3f801874d92a7d4f8345505879a44f455 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 13 Sep 2020 04:56:06 +0000 Subject: [PATCH 068/121] fixed a bug introduced in 09a9c708110fb3d27e2d998664727f133fd099f8 this is the right fix now...I think (cherry picked from commit 598c507c66150ba20789d2b1ecb2a7f38a38ed01) --- src/server/config/spells/spellTemplate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/spells/spellTemplate.js b/src/server/config/spells/spellTemplate.js index e9e48970..14cbf9ea 100644 --- a/src/server/config/spells/spellTemplate.js +++ b/src/server/config/spells/spellTemplate.js @@ -64,7 +64,7 @@ module.exports = { updateBase: function () { if (this.castTime > 0) { let action = this.currentAction; - if (_.getDeepProperty(action, 'target.destroyed') || (action && !this.canCast(action.target))) { + if (action && (_.getDeepProperty(action, 'target.destroyed') || !this.canCast(action.target))) { this.currentAction = null; this.castTime = 0; this.obj.syncer.set(false, null, 'casting', 0); From f0db5cb4935283945d060cb4a8b5cd965eb386eb Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 13 Sep 2020 11:01:30 +0200 Subject: [PATCH 069/121] added logging --- src/server/config/spells/spellTemplate.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/server/config/spells/spellTemplate.js b/src/server/config/spells/spellTemplate.js index 14cbf9ea..a33cb975 100644 --- a/src/server/config/spells/spellTemplate.js +++ b/src/server/config/spells/spellTemplate.js @@ -64,6 +64,14 @@ module.exports = { updateBase: function () { if (this.castTime > 0) { let action = this.currentAction; + if (!action) { + io.setAsync({ + key: new Date(), + table: 'error', + value: 'no action ' + this.obj.name + ' ' + this.type + }); + } + if (action && (_.getDeepProperty(action, 'target.destroyed') || !this.canCast(action.target))) { this.currentAction = null; this.castTime = 0; From b354ffd1639f41411fc6982cb7767a0646db1a9e Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 18 Sep 2020 21:29:47 +0200 Subject: [PATCH 070/121] error logging for crash --- src/server/components/social.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/server/components/social.js b/src/server/components/social.js index 20758616..8443177f 100644 --- a/src/server/components/social.js +++ b/src/server/components/social.js @@ -147,6 +147,16 @@ module.exports = { //Gets called on the player that requested to leave leaveParty: function (msg) { + if (!this.party) { + io.setAsync({ + key: new Date(), + table: 'error', + value: 'no party error ' + this.obj.name + }); + + return; + } + let name = this.obj.name; this.party.spliceWhere(p => p === this.obj.id); From 6136de7c065f594f8eeb97001565e9dd4bc7ee9d Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 20 Sep 2020 14:39:00 +0000 Subject: [PATCH 071/121] bug[#1578]: spritesheets defined in item type blueprints are no longer given priority over item blueprint spritesheets (cherry picked from commit a23a62840bc08d90bb9eee0c3a0c36e771ee9079) --- src/server/items/generators/types.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/items/generators/types.js b/src/server/items/generators/types.js index 8e83df6e..5ff5f0e3 100644 --- a/src/server/items/generators/types.js +++ b/src/server/items/generators/types.js @@ -37,7 +37,7 @@ module.exports = { item.type = type; item.sprite = extend([], blueprint.sprite || typeBlueprint.sprite); - if (typeBlueprint.spritesheet) + if (typeBlueprint.spritesheet && !blueprint.spritesheet) item.spritesheet = typeBlueprint.spritesheet; if (typeBlueprint.spellName) { From c6cad177c49b367942b40c3d40eefa5020963b71 Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 21 Sep 2020 19:52:20 +0000 Subject: [PATCH 072/121] bug[#1584]: fixed an fps issue on maps with many hiders (cherry picked from commit 1ac9c4b581d06b025f24f405cd1b8fe367b9beb7) --- src/client/js/rendering/renderer.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/client/js/rendering/renderer.js b/src/client/js/rendering/renderer.js index 3349db88..737aa2bb 100644 --- a/src/client/js/rendering/renderer.js +++ b/src/client/js/rendering/renderer.js @@ -486,10 +486,13 @@ define([ rendered.spliceWhere(s => s === sprite); } - newHidden.push({ - x: i, - y: j - }); + if (cell.visible) { + cell.visible = false; + newHidden.push({ + x: i, + y: j + }); + } const hasFake = cell.some(c => c[0] === '-'); if (hasFake) { @@ -510,10 +513,13 @@ define([ rendered.spliceWhere(s => s === sprite); } - newVisible.push({ - x: i, - y: j - }); + if (!cell.visible) { + cell.visible = true; + newVisible.push({ + x: i, + y: j + }); + } const hasNonFake = cell.some(c => c[0] !== '-'); if (hasNonFake) { From 926139384fb72c7cd2ef94d696fe71856ff8d47c Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 22 Sep 2020 05:01:57 +0000 Subject: [PATCH 073/121] bug[#1587]: plus signs are no longer allowed in usernames (cherry picked from commit 74254d08d21e7a481e1920074739c9f9f257db3d) --- src/server/components/auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 2cec36c7..74e04c04 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -303,7 +303,7 @@ module.exports = { return; } - let illegal = ["'", '"', '/', '(', ')', '[', ']', '{', '}', ':', ';', '<', '>']; + let illegal = ["'", '"', '/', '(', ')', '[', ']', '{', '}', ':', ';', '<', '>', '+']; for (let i = 0; i < illegal.length; i++) { if (credentials.username.indexOf(illegal[i]) > -1) { msg.callback(messages.login.illegal); From 4fa19d922c34101bd4d25e9f6205debef43eb60d Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 22 Sep 2020 10:08:48 +0000 Subject: [PATCH 074/121] bug[#1584]: Fixed an issue related to objects not showing up due to hider fps fix (cherry picked from commit 7a670a31a115aeea591cc7414480350658f9165f) --- src/client/js/rendering/renderer.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/client/js/rendering/renderer.js b/src/client/js/rendering/renderer.js index 737aa2bb..7099c4ea 100644 --- a/src/client/js/rendering/renderer.js +++ b/src/client/js/rendering/renderer.js @@ -583,12 +583,20 @@ define([ highY = Math.min(h - 1, highY + 10); for (let i = lowX; i < highX; i++) { + const mapRow = map[i]; let spriteRow = sprites[i]; let outside = ((i >= x - sw) && (i < x + sw)); for (let j = lowY; j < highY; j++) { if ((outside) && (j >= y - sh) && (j < y + sh)) continue; + const cell = mapRow[j]; + + if (cell.visible) { + cell.visible = false; + newHidden.push({ x: i, y: j }); + } + let list = spriteRow[j]; let lLen = list.length; for (let k = 0; k < lLen; k++) { From b33f9c1e745a6735bf9fc8d4368efe7c13c9d539 Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 10 Nov 2020 03:41:32 +0000 Subject: [PATCH 075/121] bug[#1636]: Stopped alloweing question marks in usernames as it was causing a server crash (cherry picked from commit b6c488e3e6d1e0ad5be756583a3dd81b2a80cf12) --- src/server/components/auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 74e04c04..4d81b2ad 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -303,7 +303,7 @@ module.exports = { return; } - let illegal = ["'", '"', '/', '(', ')', '[', ']', '{', '}', ':', ';', '<', '>', '+']; + let illegal = ["'", '"', '/', '(', ')', '[', ']', '{', '}', ':', ';', '<', '>', '+', '?']; for (let i = 0; i < illegal.length; i++) { if (credentials.username.indexOf(illegal[i]) > -1) { msg.callback(messages.login.illegal); From 2de584ad19dc37af9f508394f30e2a4431890860 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 20 Nov 2020 03:35:58 +0000 Subject: [PATCH 076/121] bug[#1654]: Fixed a crash caused by player objects with names of objects getting drops (cherry picked from commit ef9401b23600680369e8fb68ce6fb7b306b81410) --- src/server/components/inventory/dropBag.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/inventory/dropBag.js b/src/server/components/inventory/dropBag.js index e657b22a..bad0364a 100644 --- a/src/server/components/inventory/dropBag.js +++ b/src/server/components/inventory/dropBag.js @@ -7,7 +7,7 @@ module.exports = (cpnInv, ownerName, killSource) => { const obj = cpnInv.obj; //Only drop loot if this player is in the zone - let playerObject = obj.instance.objects.find(o => o.name === ownerName); + let playerObject = obj.instance.objects.find(o => o.player && o.name === ownerName); if (!playerObject) return; From 3d433f533a7668a58011db3bc0161959b5d30f66 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 22 Nov 2020 06:47:17 +0000 Subject: [PATCH 077/121] added fixes for squashling pet and elixir of infatuation sprites (cherry picked from commit 362f33ee4c82bc852926710648d4aa65fd229a99) --- src/server/fixes/fixes.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/server/fixes/fixes.js b/src/server/fixes/fixes.js index 977dc24e..8f3c85bc 100644 --- a/src/server/fixes/fixes.js +++ b/src/server/fixes/fixes.js @@ -46,6 +46,14 @@ module.exports = { .filter(i => (i.name === 'Elixir of Infatuation')) .forEach(function (i) { i.cdMax = 342; + i.sprite = [1, 0]; + }); + + items + .filter(i => i.name === 'Squashling Vine') + .forEach(i => { + i.petSheet = 'server/mods/iwd-souls-moor/images/skins.png'; + i.petCell = 16; }); items From fb6a500e262654064d949be3a307a914d01bdf11 Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 24 Nov 2020 17:56:20 +0000 Subject: [PATCH 078/121] modding[#1659]: Added saveData to the onAfterBuildPlayerObject event so mods can access the saved character data (cherry picked from commit c7ec3dae825cebcdb9d3f901f0c443c58ac873c7) --- src/server/components/player.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/components/player.js b/src/server/components/player.js index 6f41fce9..2614bd59 100644 --- a/src/server/components/player.js +++ b/src/server/components/player.js @@ -102,7 +102,8 @@ module.exports = { }); eventEmitter.emit('onAfterBuildPlayerObject', { - obj: this.obj + obj: this.obj, + saveData: character }); obj.xp = stats.values.xp; From ac88a4565bec1674d0923df0ae41d332e2398e5d Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 5 Dec 2020 17:57:28 +0000 Subject: [PATCH 079/121] bug: Fixed a crash caused by castSpellOnHit spells not having a name (cherry picked from commit 7b884034abef95aa36d6ae1edd1e28121e4d8fbc) --- src/server/config/itemEffects/castSpellOnHit.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/config/itemEffects/castSpellOnHit.js b/src/server/config/itemEffects/castSpellOnHit.js index 08cdcc9a..34bf083f 100644 --- a/src/server/config/itemEffects/castSpellOnHit.js +++ b/src/server/config/itemEffects/castSpellOnHit.js @@ -22,7 +22,8 @@ module.exports = { const spellName = 'spell' + spell.replace(/./, spell.toUpperCase()[0]); const spellTemplate = require(`../spells/${spellName}`); - const builtSpell = extend({ obj: this }, spellBaseTemplate, spellTemplate, { + const builtSpell = extend({ obj: this }, spellBaseTemplate, spellTemplate, { + name: spellName, noEvents: true, statType, damage: spellDamage, From fae519f61d5413977cd4b4e0f3e0e704247821cf Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 12 Jan 2021 17:22:30 +0000 Subject: [PATCH 080/121] bug: Fixed an issue with certain chars not working with the rethinkdb match expression (cherry picked from commit d003e3b472e5e8476d92a3c75a22ea64d1b518c7) --- src/server/components/auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index c7969490..d267dfd4 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -299,7 +299,7 @@ module.exports = { return; } - let illegal = ["'", '"', '/', '(', ')', '[', ']', '{', '}', ':', ';', '<', '>', '+', '?']; + let illegal = ["'", '"', '/', '(', ')', '[', ']', '{', '}', ':', ';', '<', '>', '+', '?', '*']; for (let i = 0; i < illegal.length; i++) { if (credentials.username.indexOf(illegal[i]) > -1) { msg.callback(messages.login.illegal); From 496142a117ee8f545792aab8ec9e4b1545215526 Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 6 Jan 2021 06:07:59 +0000 Subject: [PATCH 081/121] enhancement[#1696]: Adding a hideMonetization url parameter now hides the donate and patreon links from the login screen (cherry picked from commit d792503a57060cc469463c6c528b87921ec412f0) --- src/client/css/main.less | 4 ++++ src/client/js/main.js | 3 +++ src/client/ui/templates/login/template.html | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/client/css/main.less b/src/client/css/main.less index e228a12f..b1443832 100644 --- a/src/client/css/main.less +++ b/src/client/css/main.less @@ -39,6 +39,10 @@ body { } + &.hideMonetization .monetization { + display: none; + } + } .mobile.ui-container > .right { diff --git a/src/client/js/main.js b/src/client/js/main.js index 35baec33..6c76dde9 100644 --- a/src/client/js/main.js +++ b/src/client/js/main.js @@ -51,6 +51,9 @@ define([ await loadLongPress(); } + if (window.location.search.includes('hideMonetization')) + $('.ui-container').addClass('hideMonetization'); + client.init(this.onClientReady.bind(this)); }, diff --git a/src/client/ui/templates/login/template.html b/src/client/ui/templates/login/template.html index 088902e4..2e4a3393 100644 --- a/src/client/ui/templates/login/template.html +++ b/src/client/ui/templates/login/template.html @@ -13,8 +13,8 @@
[ Latest Release Notes ]
-
Pledge on Patreon
-
Donate on Paypal
+
Pledge on Patreon
+
Donate on Paypal
Access the Wiki
v0.8.5
From 6de061a2621ec4e50534eda12a0c9b8178779920 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Wed, 17 Feb 2021 19:22:27 +0000 Subject: [PATCH 082/121] Merge branch '1725-onbeforesendmessage-typesubtype' into 'master' Pass message type and subType to the onBeforeSendMessage event Closes #1725 See merge request Isleward/isleward!531 (cherry picked from commit ca68f4fdc5f33566b13ec3f3f20ca9af2fe6c087) 679aa864 enhancement[#1725] Pass message type and subType to the onBeforeSendMessage event --- src/server/components/social/chat.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/server/components/social/chat.js b/src/server/components/social/chat.js index 6a5bb32b..03f65129 100644 --- a/src/server/components/social/chat.js +++ b/src/server/components/social/chat.js @@ -201,6 +201,8 @@ module.exports = (cpnSocial, msg) => { source: obj.auth.charname, sourceObj: obj, msg: messageString, + type: msgData.type, + subType: msgData.subType, ignore: false, error: null }; From f446b478e3d0a3545c4ee37adb04663f9e0f8fef Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 25 Feb 2021 05:50:58 +0200 Subject: [PATCH 083/121] bug: Fixed an issue with damage events sometimes causing infinite loops --- src/server/components/stats.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/server/components/stats.js b/src/server/components/stats.js index 259b1c71..7898d556 100644 --- a/src/server/components/stats.js +++ b/src/server/components/stats.js @@ -557,8 +557,10 @@ module.exports = { let obj = this.obj; - source.fireEvent('beforeDealDamage', damage, obj); - obj.fireEvent('beforeTakeDamage', damage, source); + if (!damage.noEvents) { + source.fireEvent('beforeDealDamage', damage, obj); + obj.fireEvent('beforeTakeDamage', damage, source); + } if (damage.failed || obj.destroyed) return; From 69f132780c538ce14a8cf00449c258692b23e9f6 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Fri, 26 Feb 2021 05:16:57 +0000 Subject: [PATCH 084/121] Merge branch '1728-restrict-roll' into 'master' Change roll and uneq into an admin commands Closes #1728 See merge request Isleward/isleward!532 (cherry picked from commit 2588d9c19a23fe456de416eea1c0ec2c305aa47c) 57b087df Change roll into an admin command a0d3b931 [chore] Fix dangling comma 03a4ce69 Audit fix 7e330f26 Make unEq an admin command 32b13ad2 [chore] Fix dangling comma --- .../components/extensions/socialCommands.js | 6 +- src/server/package-lock.json | 214 +++++++----------- src/server/package.json | 2 +- 3 files changed, 81 insertions(+), 141 deletions(-) diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index e68d23e3..453f0637 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -17,8 +17,6 @@ let commandRoles = { //Regular players join: 0, leave: 0, - unEq: 0, - roll: 0, block: 0, unblock: 0, help: 0, @@ -45,7 +43,9 @@ let commandRoles = { rezone: 10, startEvent: 10, stopEvent: 10, - teleport: 10 + teleport: 10, + roll: 10, + unEq: 10 }; //Commands that should be run on the main thread (not the zone thread) diff --git a/src/server/package-lock.json b/src/server/package-lock.json index c7483b16..555d88b3 100644 --- a/src/server/package-lock.json +++ b/src/server/package-lock.json @@ -357,11 +357,6 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -411,9 +406,9 @@ "dev": true }, "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" }, "base64-js": { "version": "1.5.1", @@ -438,14 +433,6 @@ "tweetnacl": "^0.14.3" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "1.0.0" - } - }, "bignumber.js": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", @@ -515,11 +502,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -601,9 +583,9 @@ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "component-inherit": { "version": "0.0.3", @@ -781,22 +763,22 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "engine.io": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz", - "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", "requires": { "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "0.3.1", + "cookie": "~0.4.1", "debug": "~4.1.0", "engine.io-parser": "~2.2.0", - "ws": "^7.1.2" + "ws": "~7.4.2" }, "dependencies": { "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "debug": { "version": "4.1.1", @@ -807,61 +789,48 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "engine.io-client": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", - "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", + "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", "requires": { - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "component-inherit": "0.0.3", - "debug": "~4.1.0", + "debug": "~3.1.0", "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "async-limiter": "~1.0.0" + "ms": "2.0.0" } } } }, "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", "requires": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", + "base64-arraybuffer": "0.1.4", "blob": "0.0.5", "has-binary2": "~1.0.2" } @@ -2178,11 +2147,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -2251,20 +2215,14 @@ } }, "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "~1.0.0" - } + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" }, "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "~1.0.0" - } + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" }, "parseurl": { "version": "1.3.3", @@ -2615,15 +2573,15 @@ } }, "socket.io": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", - "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", + "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", "requires": { "debug": "~4.1.0", - "engine.io": "~3.4.0", + "engine.io": "~3.5.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.3.0", + "socket.io-client": "2.4.0", "socket.io-parser": "~3.4.0" }, "dependencies": { @@ -2636,9 +2594,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -2648,76 +2606,58 @@ "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" }, "socket.io-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", "requires": { "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "engine.io-client": "~3.4.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", "has-binary2": "~1.0.2", - "has-cors": "1.1.0", "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", + "parseqs": "0.0.6", + "parseuri": "0.0.6", "socket.io-parser": "~3.3.0", "to-array": "0.1.4" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", "requires": { - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "debug": "~3.1.0", "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } } } } }, "socket.io-parser": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz", - "integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "requires": { "component-emitter": "1.2.1", "debug": "~4.1.0", "isarray": "2.0.1" }, "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -2727,9 +2667,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -3080,9 +3020,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz", + "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==" }, "xmlhttprequest-ssl": { "version": "1.5.5", diff --git a/src/server/package.json b/src/server/package.json index ee1b7c53..8533aae5 100644 --- a/src/server/package.json +++ b/src/server/package.json @@ -12,7 +12,7 @@ "image-size": "^0.9.2", "less-middleware": "^3.1.0", "rethinkdbdash": "^2.3.31", - "socket.io": "^2.3.0", + "socket.io": "^2.4.1", "universal-analytics": "^0.4.23" }, "devDependencies": { From 2bc8b3895e0209c438d307b2f80d77bc6ecd61ed Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 31 Mar 2021 07:33:08 +0200 Subject: [PATCH 085/121] balance: Enchanted wreaths are now destroyable (cherry picked from commit b9d2db647da42c07a256c0bab4c4030f0b7f76ab) --- src/server/fixes/fixes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/fixes/fixes.js b/src/server/fixes/fixes.js index c3b26909..1aff44bc 100644 --- a/src/server/fixes/fixes.js +++ b/src/server/fixes/fixes.js @@ -46,6 +46,7 @@ module.exports = { .filter(i => i.name === 'Enchanted Wreath') .forEach(i => { delete i.noDrop; + delete i.noDestroy; }); items From aee938119f6e2a4dcd2711e048d3ff9fa35f3920 Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 29 Apr 2021 11:38:32 +0200 Subject: [PATCH 086/121] UNDO: Debugging for role levels (cherry picked from commit cd6cb711b9b7d1c0088833a08c49f09613b2633e) --- src/server/components/extensions/socialCommands.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index 453f0637..80a4ea36 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -137,6 +137,20 @@ module.exports = { return; } + io.setAsync({ + key: new Date(), + table: 'modLog', + value: { + source: this.obj.name, + command: actionName, + target: 'roleLevel: ' + this.roleLevel, + reason: 'commandRole: ' + commandRoles[actionName] + }, + serialize: true + }); + + return; + let config = {}; const originalConfig = messageText.join(' '); if ((messageText.length === 1) && (messageText[0].indexOf('=') === -1)) From 8af4a8b27b4706ad11e99a73d825d5688e0dd56d Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 29 Apr 2021 19:07:35 +0200 Subject: [PATCH 087/121] bug #1763 (cherry picked from commit 669ca0f68d575d272b06bf778773bb88eb2e2387) --- src/server/components/extensions/socialCommands.js | 14 -------------- src/server/security/sheets.js | 1 + 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js index 80a4ea36..453f0637 100644 --- a/src/server/components/extensions/socialCommands.js +++ b/src/server/components/extensions/socialCommands.js @@ -137,20 +137,6 @@ module.exports = { return; } - io.setAsync({ - key: new Date(), - table: 'modLog', - value: { - source: this.obj.name, - command: actionName, - target: 'roleLevel: ' + this.roleLevel, - reason: 'commandRole: ' + commandRoles[actionName] - }, - serialize: true - }); - - return; - let config = {}; const originalConfig = messageText.join(' '); if ((messageText.length === 1) && (messageText[0].indexOf('=') === -1)) diff --git a/src/server/security/sheets.js b/src/server/security/sheets.js index 652cf6ec..c836dbce 100644 --- a/src/server/security/sheets.js +++ b/src/server/security/sheets.js @@ -58,6 +58,7 @@ module.exports = { delete o.messageprefix; o.extraStashSlots = ~~o.extrastashslots; + o.level = ~~o.level; if (typeof (o.items) === 'string') o.items = JSON.parse(o.items || '[]'); From 36527333eea45028e5db47e75ce366340c4a67da Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 13 May 2021 15:53:49 +0200 Subject: [PATCH 088/121] bug #1592 (cherry picked from commit fb5e3bcac26a7596293643d8521e9b8a438396ea) --- src/server/components/auth.js | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 8ba0bd00..76ab11d3 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -1,3 +1,4 @@ +//Imports const bcrypt = require('bcrypt-nodejs'); const messages = require('../misc/messages'); const skins = require('../config/skins'); @@ -10,6 +11,40 @@ const events = require('../misc/events'); const checkLoginRewards = require('./auth/checkLoginRewards'); +//This section of code is in charge of ensuring that we only ever create one account at a time, +// since we don't have a read/write lock on the characters table, we have to address it in code +const createLockBuffer = []; +const getCreateLock = async () => { + const releaseLock = res => { + createLockBuffer.spliceWhere(r => r === res); + + const nextEntry = createLockBuffer[0]; + + if (!nextEntry) + return; + + nextEntry.takeLock(); + }; + + const promise = new Promise(async res => { + let lockEntry = {}; + lockEntry.takeLock = res.bind(null, releaseLock.bind(null, lockEntry)); + + if (!createLockBuffer.length) { + createLockBuffer.push(lockEntry); + + lockEntry.takeLock(); + + return; + } + + createLockBuffer.push(lockEntry); + }); + + return promise; +}; + +//Component Definition module.exports = { type: 'auth', @@ -348,6 +383,8 @@ module.exports = { }, createCharacter: async function (msg) { + const releaseCreateLock = await getCreateLock(); + let data = msg.data; let name = data.name; @@ -435,6 +472,8 @@ module.exports = { serialize: true }); + releaseCreateLock(); + this.initTracker(); this.play({ From 987337aaf15542a84dbdbbff213e808cac6389aa Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 13 May 2021 16:06:40 +0200 Subject: [PATCH 089/121] bug #1592 (cherry picked from commit 033774f1fbfe432ec14a0f01e3c2fc57b01d2739) --- src/server/components/auth.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 76ab11d3..5947df01 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -15,8 +15,8 @@ const checkLoginRewards = require('./auth/checkLoginRewards'); // since we don't have a read/write lock on the characters table, we have to address it in code const createLockBuffer = []; const getCreateLock = async () => { - const releaseLock = res => { - createLockBuffer.spliceWhere(r => r === res); + const releaseLock = lockEntry => { + createLockBuffer.spliceWhere(c => c === lockEntry); const nextEntry = createLockBuffer[0]; @@ -383,8 +383,6 @@ module.exports = { }, createCharacter: async function (msg) { - const releaseCreateLock = await getCreateLock(); - let data = msg.data; let name = data.name; @@ -417,6 +415,8 @@ module.exports = { return; } + const releaseCreateLock = await getCreateLock(); + let exists = await io.getAsync({ key: name, ignoreCase: true, @@ -425,7 +425,9 @@ module.exports = { }); if (exists) { + releaseCreateLock(); msg.callback(messages.login.charExists); + return; } From 6c5db3e4f35384ca60a55f4f9941567866d496ca Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 15 May 2021 12:12:47 +0200 Subject: [PATCH 090/121] fix for currency chances (cherry picked from commit 383a142a73abce50bac216c787f28cb034619c80) --- src/server/items/generator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/items/generator.js b/src/server/items/generator.js index 7b51bdbd..989c13a0 100644 --- a/src/server/items/generator.js +++ b/src/server/items/generator.js @@ -47,7 +47,7 @@ module.exports = { if (blueprint.level < 5) currencyChance = 0; else if (blueprint.level < 14) - currencyChance = (blueprint.level - 4) / 11; + currencyChance *= (blueprint.level - 4) / 11; //If you kill a mob that's too low of a level, idols are much more rare if ( From 8e0e579d9a4b11476aa1646d0548f9b3941480f7 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 15 May 2021 13:59:45 +0200 Subject: [PATCH 091/121] bug #1567 (cherry picked from commit 9ad6e63bbb632386d9d6fc8f2956c431fe2ec671) --- src/client/js/system/events.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/client/js/system/events.js b/src/client/js/system/events.js index 675c9d02..2b185ffb 100644 --- a/src/client/js/system/events.js +++ b/src/client/js/system/events.js @@ -58,11 +58,7 @@ define([ return; } - let len = list.length; - for (let i = 0; i < len; i++) { - let l = list[i]; - l.apply(null, args); - } + list.forEach(l => l.apply(null, args)); } }; From ad72253e7162dd3cef2afaee5afbabe1eb7d0593 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 15 May 2021 16:09:19 +0200 Subject: [PATCH 092/121] Changed fjolarok quest level range from 1-10 to 1-12 (cherry picked from commit faefbeeb7a66f6b361c2c581128fba685d03252f) --- src/server/config/maps/fjolarok/zone.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/maps/fjolarok/zone.js b/src/server/config/maps/fjolarok/zone.js index 1bc6ee28..0a0a83d8 100644 --- a/src/server/config/maps/fjolarok/zone.js +++ b/src/server/config/maps/fjolarok/zone.js @@ -1,6 +1,6 @@ module.exports = { name: 'Fjolarok', - level: [1, 10], + level: [1, 12], resources: { Skyblossom: { type: 'herb', From 962e030cf3f81b21032d5b0c623ac71e8502f30f Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 15 May 2021 16:09:42 +0200 Subject: [PATCH 093/121] bug #1777 (cherry picked from commit 5c7356e29d55e6c6f0353cdb19191851562deecd) --- src/server/components/inventory.js | 2 ++ src/server/world/syncer.js | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index 3ec07cac..7c4a9abc 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -599,6 +599,8 @@ module.exports = { } }]); + obj.canBeSeenBy = ownerName; + return obj; }, diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index c6d58f41..70786282 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -48,6 +48,7 @@ module.exports = { for (let i = 0; i < oLen; i++) { let o = oList[i]; + let canBeSeenBy = o.canBeSeenBy; let oId = o.id; let ox = o.x; let oy = o.y; @@ -87,7 +88,13 @@ module.exports = { let px = p.x; let py = p.y; - let canSee = (Math.abs(ox - px) <= viewDistanceX && Math.abs(oy - py) < viewDistanceY); + const canSee = ( + Math.abs(ox - px) <= viewDistanceX && Math.abs(oy - py) < viewDistanceY && + ( + !canBeSeenBy || + canBeSeenBy === p.name + ) + ); let hasSeen = p.player.hasSeen(oId); From a4558467f73381c8e95ab6309e96c3eb61d43ac5 Mon Sep 17 00:00:00 2001 From: Shaun Date: Sat, 15 May 2021 16:09:57 +0200 Subject: [PATCH 094/121] bug #1777 (cherry picked from commit bd44c3c0e3e15483ba5652be6073f0f243466c8c) --- src/client/js/components/chest.js | 13 ++++--------- src/client/js/objects/objects.js | 2 +- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/client/js/components/chest.js b/src/client/js/components/chest.js index 46b03f4d..38943df7 100644 --- a/src/client/js/components/chest.js +++ b/src/client/js/components/chest.js @@ -3,7 +3,7 @@ define([ ], function ( ) { - let colors = [ + const colors = [ '929398', '80f643', '3fa7dd', @@ -11,7 +11,7 @@ define([ 'ffeb38' ]; - let chances = [ + const chances = [ 0.0075, 0.02, 0.04, @@ -19,7 +19,7 @@ define([ 0.095 ]; - let indices = { + const indices = { 50: 0, 51: 1, 128: 2, @@ -33,12 +33,7 @@ define([ ownerName: null, init: function (blueprint) { - if (this.ownerName && (!window.player || window.player.name !== this.ownerName)) { - this.obj.sheetName = null; - return; - } - - let index = indices[this.obj.cell] || 0; + const index = indices[this.obj.cell] || 0; this.obj.addComponent('particles', { chance: chances[index], diff --git a/src/client/js/objects/objects.js b/src/client/js/objects/objects.js index d4dd54bb..01cce11f 100644 --- a/src/client/js/objects/objects.js +++ b/src/client/js/objects/objects.js @@ -137,7 +137,7 @@ define([ if (obj.sheetName) obj.sprite = renderer.buildObject(obj); - if ((obj.name) && (obj.sprite)) { + if (obj.name && obj.sprite) { obj.nameSprite = renderer.buildText({ layerName: 'effects', text: obj.name, From b6eaaefc0979d30594f72b0b89497ed5d53447af Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 16 May 2021 09:22:46 +0200 Subject: [PATCH 095/121] Removed a too-small fishing spot that causes freezes when fished from (cherry picked from commit bae22b237bd42b0dde1e7c6c707c7a669fbd3220) --- src/server/config/maps/fjolarok/map.json | 28 ++---------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/src/server/config/maps/fjolarok/map.json b/src/server/config/maps/fjolarok/map.json index 10853e0a..6d571c45 100644 --- a/src/server/config/maps/fjolarok/map.json +++ b/src/server/config/maps/fjolarok/map.json @@ -1,12 +1,5 @@ { "backgroundcolor":"#32222e", "compressionlevel":-1, - "editorsettings": - { - "export": - { - "target":"." - } - }, "height":164, "infinite":false, "layers":[ @@ -2160,23 +2153,6 @@ "x":176, "y":896 }, - { - "height":32, - "id":651, - "name":"sun carp school", - "properties":[ - { - "name":"resource", - "type":"string", - "value":"Sun Carp" - }], - "rotation":0, - "type":"", - "visible":true, - "width":24, - "x":584, - "y":768 - }, { "height":16, "id":652, @@ -2866,7 +2842,7 @@ "value":"[{\"maxLevel\":1,\"x\":100,\"y\":150},{\"maxLevel\":999,\"x\":132,\"y\":82}]" }], "renderorder":"right-down", - "tiledversion":"1.3.3", + "tiledversion":"1.6.0", "tileheight":8, "tilesets":[ { @@ -3090,6 +3066,6 @@ }], "tilewidth":8, "type":"map", - "version":1.2, + "version":"1.6", "width":195 } \ No newline at end of file From 99db4ca99c7cc475aef10fbdf8770e30f3b80528 Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 17 May 2021 17:35:42 +0200 Subject: [PATCH 096/121] temp (cherry picked from commit 0bf2b8b8ab4d25f3b649b244b7e8f8c1891cbb92) --- src/server/config/quests/templates/questLootGen.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/server/config/quests/templates/questLootGen.js b/src/server/config/quests/templates/questLootGen.js index 7da56b13..8f885225 100644 --- a/src/server/config/quests/templates/questLootGen.js +++ b/src/server/config/quests/templates/questLootGen.js @@ -54,6 +54,14 @@ module.exports = { } } + if (!this.item) { + this.setAsync({ + key: new Date(), + table: 'error', + value: this.obj.name + ' ' + this.mobType + }); + } + this.name = this.item.name + ' Gatherer'; this.description = 'Loot ' + this.have + '/' + this.need + ' ' + this.item.name + ' from ' + this.mobName; From 574584cc4b3d7463bb8d91c4e7fc46bb12ab357c Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 13 Jun 2021 08:23:30 +0200 Subject: [PATCH 097/121] bug #1792: Fixed an issue that caused item tooltips to be in 'compare mode' on mobile (cherry picked from commit fdb99ee8dd9e8e55acee11ade7da5b5fdea78670) --- .../ui/templates/tooltipItem/buildTooltip/lineBuilders.js | 6 +++--- src/client/ui/templates/tooltipItem/tooltipItem.js | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/client/ui/templates/tooltipItem/buildTooltip/lineBuilders.js b/src/client/ui/templates/tooltipItem/buildTooltip/lineBuilders.js index ee007a9d..2e340c6b 100644 --- a/src/client/ui/templates/tooltipItem/buildTooltip/lineBuilders.js +++ b/src/client/ui/templates/tooltipItem/buildTooltip/lineBuilders.js @@ -341,10 +341,10 @@ define([ let text = null; - if (!shiftDown && compare) - text = '[shift] to compare'; - else if (isMobile && compare && !shiftDown) + if (isMobile && compare && !shiftDown) text = 'tap again to compare'; + else if (!shiftDown && compare) + text = '[shift] to compare'; if (!text) return null; diff --git a/src/client/ui/templates/tooltipItem/tooltipItem.js b/src/client/ui/templates/tooltipItem/tooltipItem.js index 9a795c12..61a4b1e7 100644 --- a/src/client/ui/templates/tooltipItem/tooltipItem.js +++ b/src/client/ui/templates/tooltipItem/tooltipItem.js @@ -31,11 +31,12 @@ define([ }, onShowItemTooltip: function (item, pos, canCompare, bottomAlign) { - this.item = item; this.removeButton(); const html = buildTooltip(this, item, pos, canCompare, bottomAlign); + this.item = item; + const el = this.tooltip; el.html(html); el.css({ display: 'flex' }); From 0a1c4bb13b0aa3fbe081a146c61f17413fee5c3c Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 15 Jun 2021 06:46:22 +0200 Subject: [PATCH 098/121] bug #1774 (cherry picked from commit fe28c3ca6c7ec1dd4d827d58c726883e15a3b6a3) --- src/client/js/objects/objects.js | 2 +- src/server/components/portal/sendObjToZone.js | 4 +++- src/server/components/social/rezone.js | 20 ++++++------------- src/server/world/syncer.js | 12 ++++++++++- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/client/js/objects/objects.js b/src/client/js/objects/objects.js index 01cce11f..86f8e4f3 100644 --- a/src/client/js/objects/objects.js +++ b/src/client/js/objects/objects.js @@ -95,7 +95,7 @@ define([ if (oldZone === null) o.destroy(); - else if ((o.zoneId === oldZone) && (!o.has('player'))) + else if (o.zoneId === oldZone) o.destroy(); } diff --git a/src/server/components/portal/sendObjToZone.js b/src/server/components/portal/sendObjToZone.js index f16d9eff..a2b4c4dd 100644 --- a/src/server/components/portal/sendObjToZone.js +++ b/src/server/components/portal/sendObjToZone.js @@ -1,5 +1,7 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => { - const { instance: { physics, syncer: globalSyncer } } = obj; + const { serverId, instance: { physics, syncer: globalSyncer } } = obj; + + globalSyncer.flushForTarget(serverId); if (obj.zoneName === zoneName) { physics.removeObject(obj, obj.x, obj.y); diff --git a/src/server/components/social/rezone.js b/src/server/components/social/rezone.js index 01ba018d..e3edbc07 100644 --- a/src/server/components/social/rezone.js +++ b/src/server/components/social/rezone.js @@ -1,18 +1,10 @@ -module.exports = async (cpnSocial, targetZone) => { - const { obj } = cpnSocial; - - obj.fireEvent('beforeRezone'); +const sendObjToZone = require('../portal/sendObjToZone'); - obj.destroyed = true; - - const simpleObj = obj.getSimple(true, false, true); +module.exports = (cpnSocial, targetZone) => { + const { obj } = cpnSocial; - process.send({ - method: 'rezone', - id: obj.serverId, - args: { - obj: simpleObj, - newZone: targetZone - } + sendObjToZone({ + obj, + zoneName: targetZone }); }; diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index 70786282..a75e4eb5 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -14,7 +14,7 @@ module.exports = { let oList = objects.objects; let oLen = oList.length; - let pList = oList.filter(f => f.player); + let pList = oList.filter(f => f.player && !f.destroyed); let pLen = pList.length; if (pLen === 0) @@ -166,6 +166,16 @@ module.exports = { }); }, + flushForTarget: function (targetServerId) { + const buffer = this.buffer; + + for (let p in buffer) { + const list = buffer[p]; + + list.spliceWhere(l => l.to === targetServerId); + } + }, + send: function () { if (!this.dirty) return; From c7795d4078454829afb7eaa1d1e8b7d602f81b47 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 30 Jul 2021 22:03:48 +0200 Subject: [PATCH 099/121] enhancement #1819: Recreated change because could not cherry-pick --- src/server/components/auth.js | 2 +- src/server/security/connections.js | 5 ++++- src/server/world/atlas.js | 20 ++++++++++++++++++++ src/server/world/instancer.js | 18 ++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index a5674f63..92fa744f 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -293,7 +293,7 @@ module.exports = { } this.username = msg.data.username; - cons.logOut(this.obj); + await cons.logOut(this.obj); this.initTracker(); diff --git a/src/server/security/connections.js b/src/server/security/connections.js index 7d114a53..2981d3fc 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -154,7 +154,7 @@ module.exports = { msg.callback(); }, - logOut: function (exclude) { + logOut: async function (exclude) { let players = this.players; let pLen = players.length; for (let i = 0; i < pLen; i++) { @@ -163,6 +163,9 @@ module.exports = { if ((!p) || (p === exclude) || (!p.auth)) continue; + if (p.name && p.zoneName) + await atlas.forceSavePlayer(p.name, p.zoneName); + if (p.auth.username === exclude.auth.username) p.socket.emit('dc', {}); } diff --git a/src/server/world/atlas.js b/src/server/world/atlas.js index 5f31a847..abeed5ae 100644 --- a/src/server/world/atlas.js +++ b/src/server/world/atlas.js @@ -258,5 +258,25 @@ module.exports = { }); }); }); + }, + + forceSavePlayer: async function (playerName, zoneName) { + const thread = this.getThreadFromName(zoneName); + + if (!thread) + return; + + return new Promise(res => { + const callbackId = this.registerCallback(res); + + thread.worker.send({ + method: 'forceSavePlayer', + args: { + playerName, + callbackId + } + }); + }); } + }; diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index 2f5d62db..d59ca16c 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -337,5 +337,23 @@ module.exports = { process.send({ method: 'onZoneIdle' }); + }, + + forceSavePlayer: async function ({ playerName, callbackId }) { + const player = objects.objects.find(o => o.player && o.name === playerName); + + if (!player?.auth) + return; + + await player.auth.doSave(); + + process.send({ + module: 'atlas', + method: 'resolveCallback', + msg: { + id: callbackId + } + }); } + }; From 8faf92e7f892183a9019c8b0665b2a70f35f258a Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 30 Aug 2021 06:45:28 +0200 Subject: [PATCH 100/121] bug #1774: Bandaid fix for character stuck in void (cherry picked from commit 881562489f30fc9f63002c91ed8ecabd01944adc) --- src/client/js/objects/objBase.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/client/js/objects/objBase.js b/src/client/js/objects/objBase.js index f38b78e3..e66f480b 100644 --- a/src/client/js/objects/objBase.js +++ b/src/client/js/objects/objBase.js @@ -117,6 +117,7 @@ define([ this.self || ( renderer.sprites[x] && + renderer.sprites[x][y] && renderer.sprites[x][y].length > 0 && !renderer.isHidden(x, y) ) From ff338f6cd3ea3c84774e1d5562cea9e0974d72e8 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 8 Oct 2021 07:43:57 +0200 Subject: [PATCH 101/121] bug #1837 (cherry picked from commit e0c0408e24ba3f23ded298f4c2398db6c0952194) --- src/server/server/onConnection.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/server/server/onConnection.js b/src/server/server/onConnection.js index 80f98d8c..2abc1470 100644 --- a/src/server/server/onConnection.js +++ b/src/server/server/onConnection.js @@ -20,11 +20,15 @@ const onRequest = (socket, msg, callback) => { if (!router.allowedCpn(msg)) return; + delete msg.threadModule; + cons.route(socket, msg); } else if (msg.threadModule) { if (!router.allowedGlobalCall(msg.threadModule, msg.method)) return; + delete msg.cpn; + cons.route(socket, msg); } else { if (!router.allowedGlobal(msg)) From e1206f4b596c816c5d64457b6f1489723312466a Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 8 Oct 2021 07:49:31 +0200 Subject: [PATCH 102/121] chore: Allowing npm audit to fail because sqlite... (cherry picked from commit 113801e90eeb12c397d3748962b632dabd6c7454) --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3f45d484..680eb026 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,6 +9,7 @@ audit: script: - cd src/server - npm audit + allow_failure: true only: - merge_requests - master From 3556fdfa6fbc9d67229788ee76f0ce0d0edf5d22 Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 27 Oct 2021 07:45:08 +0200 Subject: [PATCH 103/121] modding #1857 (cherry picked from commit 41c257e222ba23ad0bc00df5f6effbc4e53883bb) --- src/server/components/auth.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 668e5231..09effa68 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -340,6 +340,20 @@ module.exports = { } } + const emBeforeRegisterAccount = { + obj: this.obj, + success: true, + msg: null + }; + + eventEmitter.emit('onBeforeRegisterAccount', emBeforeRegisterAccount); + + if (!emBeforeRegisterAccount.success) { + msg.callback(emBeforeRegisterAccount.msg); + + return; + } + let exists = await io.getAsync({ key: credentials.username, ignoreCase: true, @@ -350,6 +364,7 @@ module.exports = { if (exists) { msg.callback(messages.login.exists); + return; } From 1372c24671c6b2899afeb79be046c820f96c28dd Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 26 Oct 2021 21:04:04 +0200 Subject: [PATCH 104/121] bug ##1854 (cherry picked from commit ed9162a843d73d997ebc50f1770e7208752c7a9a) --- src/server/world/syncer.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index a75e4eb5..4b1affde 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -172,7 +172,11 @@ module.exports = { for (let p in buffer) { const list = buffer[p]; - list.spliceWhere(l => l.to === targetServerId); + list.forEach(l => l.to.splice(f => f === targetServerId)); + list.spliceWhere(l => !l.to.length); + + if (!list.length) + delete buffer[p]; } }, From 68439acc022336f852ec2216a8f8ef6367765ba2 Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 27 Oct 2021 16:18:06 +0200 Subject: [PATCH 105/121] modding #1858 (cherry picked from commit 2abeb38d64cfb370ea0e14907e7a471d7e28950b) --- src/server/components/auth.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index 09effa68..de52cc17 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -260,6 +260,7 @@ module.exports = { if (credentials.username === '' || credentials.password === '') { msg.callback(messages.login.allFields); + return; } @@ -279,6 +280,18 @@ module.exports = { msg.callback(messages.login.incorrect); return; } + + const emBeforeLogin = { + obj: this.obj, + success: true, + msg: null + }; + await eventEmitter.emit('onBeforeLogin', emBeforeLogin); + if (!emBeforeLogin.success) { + msg.callback(emBeforeLogin.msg); + + return; + } this.username = username; await cons.logOut(this.obj); From 64d35663f338a767fe5cb248bc10de325e25f4c1 Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 27 Oct 2021 16:47:09 +0200 Subject: [PATCH 106/121] #1858 (cherry picked from commit ff424623e5ca72f162818767e78959d97ef2c24f) --- src/server/components/auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index de52cc17..ca55f1fa 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -359,7 +359,7 @@ module.exports = { msg: null }; - eventEmitter.emit('onBeforeRegisterAccount', emBeforeRegisterAccount); + await eventEmitter.emit('onBeforeRegisterAccount', emBeforeRegisterAccount); if (!emBeforeRegisterAccount.success) { msg.callback(emBeforeRegisterAccount.msg); From 42dd32cd0d89799d0059bee8be35efe9126060fb Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Thu, 25 Nov 2021 16:01:04 +0000 Subject: [PATCH 107/121] Merge branch '1873-profanity-filter' into 'master' Relax profanity filter Closes #1873 See merge request Isleward/isleward!577 (cherry picked from commit 153c8f2717855560cef74b709069a929c3c2d864) d0f5f560 Relax profanity filter a963cc8e Fix lint complaints b69b637d Return the lowercase convert to profanities bf4d7187 Stop the linter from complaining --- src/server/misc/profanities.js | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/server/misc/profanities.js b/src/server/misc/profanities.js index c17f8237..8d943f13 100644 --- a/src/server/misc/profanities.js +++ b/src/server/misc/profanities.js @@ -9,7 +9,6 @@ let blacklist = [ 'blowjob', 'boner', 'boob', - 'breast', 'bukkake', 'cameltoe', 'carpetmuncher', @@ -28,8 +27,6 @@ let blacklist = [ 'dike', 'dildo', 'dong', - 'douche', - 'dumbass', 'dyke', 'ejaculate', 'erection', @@ -42,16 +39,11 @@ let blacklist = [ 'foreskin', 'fuck', 'fuk', - 'gay', 'goatse', - 'godamn', - 'goddammit', - 'goddamn', 'goldenshower', 'handjob', 'hardon', 'hitler', - 'homo', 'horny', 'jerkoff', 'jism', @@ -125,7 +117,6 @@ let blacklist = [ 'testis', 'tits', 'tramp', - 'transsex', 'turd', 'twat', 'undies', @@ -146,7 +137,8 @@ let blacklist = [ 'whoring', 'wigger', 'gaes', - 'gaez' + 'gaez', + 'nogger' ]; module.exports = { @@ -161,7 +153,7 @@ module.exports = { buildPath: function (chain, node) { node = node || this.tree; const letter = chain[0]; - + if (!node[letter]) node[letter] = {}; @@ -171,9 +163,7 @@ module.exports = { isClean: function (text, finalLevel) { text = text - .toLowerCase() - .split(' ') - .join(''); + .toLowerCase(); const tree = this.tree; From 387717c32467c6fdc9f77b41a82d6180b53895c0 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Fri, 29 Oct 2021 03:59:41 +0000 Subject: [PATCH 108/121] Merge branch '1848-bordershadow' into 'master' Add border shadow to enemy info tooltip Closes #1859 See merge request Isleward/isleward!571 (cherry picked from commit f72126a377cf7d620c821a97c91450447c985adb) da397333 closes #1859 --- src/client/ui/templates/tooltipInfo/template.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/ui/templates/tooltipInfo/template.html b/src/client/ui/templates/tooltipInfo/template.html index a4c06dbc..5a82abd8 100644 --- a/src/client/ui/templates/tooltipInfo/template.html +++ b/src/client/ui/templates/tooltipInfo/template.html @@ -1,3 +1,3 @@ -
- +
+
\ No newline at end of file From 81e13d22fd4fb0fadf00898e93d07b6f0a2145bf Mon Sep 17 00:00:00 2001 From: kckckc Date: Tue, 2 Nov 2021 12:56:28 -0700 Subject: [PATCH 109/121] closes #1459 (cherry picked from commit abd2d3b651258a676528a0f33f76def37fc77c90) --- src/server/config/recipes/enchanting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/config/recipes/enchanting.js b/src/server/config/recipes/enchanting.js index 35e39ba4..b40aef72 100644 --- a/src/server/config/recipes/enchanting.js +++ b/src/server/config/recipes/enchanting.js @@ -45,7 +45,7 @@ module.exports = [{ withProps: ['slot'], withoutProps: ['noAugment'], checks: [ - item => item.level && item.level < consts.maxLevel + item => item.level && (item.originalLevel || item.level) < consts.maxLevel ] }], craftAction: relevel From ca0bd6bbfca82f88a244443c99b6cd332901b814 Mon Sep 17 00:00:00 2001 From: Vildravn Date: Thu, 16 Dec 2021 14:50:13 +0000 Subject: [PATCH 110/121] Merge branch '1877-faction-item-vendor-fix' into 'master' bug #1877: Move the canBuy check from factionVendor.js to trade.js Closes #1877 See merge request Isleward/isleward!578 (cherry picked from commit cb0202c4279d5ade3f6d6fdb5d8900be3d1850d0) 420230b7 bug #1877: Move the canBuy check from factionVendor.js to trade.js --- .../components/extensions/factionVendor.js | 19 ------------------- src/server/components/trade.js | 17 ++++++++++++++++- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/server/components/extensions/factionVendor.js b/src/server/components/extensions/factionVendor.js index 5e1d1c03..17c04c79 100644 --- a/src/server/components/extensions/factionVendor.js +++ b/src/server/components/extensions/factionVendor.js @@ -149,25 +149,6 @@ module.exports = { } }, - canBuy: function (itemId, requestedBy, action) { - let item = null; - if (action === 'buy') - item = this.findItem(itemId, requestedBy.name); - else if (action === 'buyback') - item = this.findBuyback(itemId, requestedBy.name); - - let result = true; - if (item.factions) - result = requestedBy.reputation.canEquipItem(item); - - if (!result) { - const message = 'your reputation is too low to buy that item'; - requestedBy.social.notifySelf({ message }); - } - - return result; - }, - findItem: function (itemId, sourceName) { let list = this.items[sourceName]; if (!list) diff --git a/src/server/components/trade.js b/src/server/components/trade.js index 4af96e40..3c72a179 100644 --- a/src/server/components/trade.js +++ b/src/server/components/trade.js @@ -341,7 +341,22 @@ module.exports = { }, canBuy: function (itemId, requestedBy, action) { - return true; + let item = null; + if (action === 'buy') + item = this.findItem(itemId, requestedBy.name); + else if (action === 'buyback') + item = this.findBuyback(itemId, requestedBy.name); + + let result = true; + if (item.factions) + result = requestedBy.reputation.canEquipItem(item); + + if (!result) { + const message = 'your reputation is too low to buy that item'; + requestedBy.social.notifySelf({ message }); + } + + return result; }, findItem: function (itemId, sourceName) { From f110f08901c6ffcf7fe34b82d02accb02ec1fd07 Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 27 Jan 2022 19:36:05 +0200 Subject: [PATCH 111/121] bug #1897 (cherry picked from commit 7de88f085477a01591dc539be4d194b34ca0bb49) --- src/server/components/auth.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index ca55f1fa..5e5117e5 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -303,7 +303,8 @@ module.exports = { table: 'accountInfo', noDefault: true }) || { - loginStreak: 0 + loginStreak: 0, + level: 0 }; const msgAccountInfo = { @@ -392,7 +393,8 @@ module.exports = { }); this.accountInfo = { - loginStreak: 0 + loginStreak: 0, + level: 0 }; await io.setAsync({ From 3ac151113ef52b403e5f6be9cec24bd97729d20c Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 14 Feb 2022 20:56:37 +0200 Subject: [PATCH 112/121] chore: test logging --- src/server/components/auth.js | 46 +++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index bbe21089..adb23678 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -288,12 +288,27 @@ module.exports = { return; } + if (username === 'bbb' || username === 'aaa') { + await io.setAsync({ + key: new Date(), + table: 'error', + value: username + '1' + }); + } + const emBeforeLogin = { obj: this.obj, success: true, msg: null }; await eventEmitter.emit('onBeforeLogin', emBeforeLogin); + if (username === 'bbb' || username === 'aaa') { + await io.setAsync({ + key: new Date(), + table: 'error', + value: username + '2' + }); + } if (!emBeforeLogin.success) { msg.callback(emBeforeLogin.msg); @@ -302,6 +317,13 @@ module.exports = { this.username = username; await cons.logOut(this.obj); + if (username === 'bbb' || username === 'aaa') { + await io.setAsync({ + key: new Date(), + table: 'error', + value: username + '3' + }); + } this.initTracker(); @@ -314,6 +336,14 @@ module.exports = { level: 0 }; + if (username === 'bbb' || username === 'aaa') { + await io.setAsync({ + key: new Date(), + table: 'error', + value: username + '4' + }); + } + const msgAccountInfo = { username, accountInfo @@ -321,8 +351,24 @@ module.exports = { await eventEmitter.emit('onBeforeGetAccountInfo', msgAccountInfo); + if (username === 'bbb' || username === 'aaa') { + await io.setAsync({ + key: new Date(), + table: 'error', + value: username + '5' + }); + } + await eventEmitter.emit('onAfterLogin', { username }); + if (username === 'bbb' || username === 'aaa') { + await io.setAsync({ + key: new Date(), + table: 'error', + value: username + '6' + }); + } + this.accountInfo = msgAccountInfo.accountInfo; msg.callback(); From 0395594c9c0cfd676bbd2d26a9b2255e1d46b0f4 Mon Sep 17 00:00:00 2001 From: Shaun Date: Mon, 14 Feb 2022 21:31:22 +0200 Subject: [PATCH 113/121] bug: trying to fix hanging login --- src/server/security/connections.js | 7 ++++--- src/server/world/instancer.js | 9 ++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/server/security/connections.js b/src/server/security/connections.js index 61ae3ee5..2267a2fd 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -164,11 +164,12 @@ module.exports = { if ((!p) || (p === exclude) || (!p.auth)) continue; - if (p.name && p.zoneName) - await atlas.forceSavePlayer(p.name, p.zoneName); + if (p.auth.username === exclude.auth.username) { + if (p.name && p.zoneName) + await atlas.forceSavePlayer(p.name, p.zoneName); - if (p.auth.username === exclude.auth.username) p.socket.emit('dc', {}); + } } }, diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js index 59c1a669..c4d70288 100644 --- a/src/server/world/instancer.js +++ b/src/server/world/instancer.js @@ -355,8 +355,15 @@ module.exports = { forceSavePlayer: async function ({ playerName, callbackId }) { const player = objects.objects.find(o => o.player && o.name === playerName); - if (!player?.auth) + if (!player?.auth) { + await io.setAsync({ + key: new Date(), + table: 'error', + value: 'no auth found for forcesave ' + playerName + }); + return; + } await player.auth.doSave(); From 60855c5d54f2e9b1a9c5aef8e738250e8536c9a3 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Tue, 15 Feb 2022 02:48:50 +0000 Subject: [PATCH 114/121] Revert "chore: test logging" This reverts commit 3ac151113ef52b403e5f6be9cec24bd97729d20c --- src/server/components/auth.js | 46 ----------------------------------- 1 file changed, 46 deletions(-) diff --git a/src/server/components/auth.js b/src/server/components/auth.js index adb23678..bbe21089 100644 --- a/src/server/components/auth.js +++ b/src/server/components/auth.js @@ -288,27 +288,12 @@ module.exports = { return; } - if (username === 'bbb' || username === 'aaa') { - await io.setAsync({ - key: new Date(), - table: 'error', - value: username + '1' - }); - } - const emBeforeLogin = { obj: this.obj, success: true, msg: null }; await eventEmitter.emit('onBeforeLogin', emBeforeLogin); - if (username === 'bbb' || username === 'aaa') { - await io.setAsync({ - key: new Date(), - table: 'error', - value: username + '2' - }); - } if (!emBeforeLogin.success) { msg.callback(emBeforeLogin.msg); @@ -317,13 +302,6 @@ module.exports = { this.username = username; await cons.logOut(this.obj); - if (username === 'bbb' || username === 'aaa') { - await io.setAsync({ - key: new Date(), - table: 'error', - value: username + '3' - }); - } this.initTracker(); @@ -336,14 +314,6 @@ module.exports = { level: 0 }; - if (username === 'bbb' || username === 'aaa') { - await io.setAsync({ - key: new Date(), - table: 'error', - value: username + '4' - }); - } - const msgAccountInfo = { username, accountInfo @@ -351,24 +321,8 @@ module.exports = { await eventEmitter.emit('onBeforeGetAccountInfo', msgAccountInfo); - if (username === 'bbb' || username === 'aaa') { - await io.setAsync({ - key: new Date(), - table: 'error', - value: username + '5' - }); - } - await eventEmitter.emit('onAfterLogin', { username }); - if (username === 'bbb' || username === 'aaa') { - await io.setAsync({ - key: new Date(), - table: 'error', - value: username + '6' - }); - } - this.accountInfo = msgAccountInfo.accountInfo; msg.callback(); From 8147f1b4953daeb4aebb209cbaad7dd39ae874aa Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 15 Feb 2022 05:23:34 +0200 Subject: [PATCH 115/121] chore: small cleanup of onConnection function --- src/server/security/connections.js | 4 ++++ src/server/server/onConnection.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/security/connections.js b/src/server/security/connections.js index 2267a2fd..36e63b08 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -109,6 +109,10 @@ module.exports = { cpn[method](msg); }, + routeGlobal: function (msg) { + global[msg.module][msg.method](msg); + }, + unzone: function (msg) { let socket = msg.socket; let player = this.players.find(p => p.socket.id === socket.id); diff --git a/src/server/server/onConnection.js b/src/server/server/onConnection.js index ecea69c4..f7373d9a 100644 --- a/src/server/server/onConnection.js +++ b/src/server/server/onConnection.js @@ -43,7 +43,7 @@ const onRequest = (socket, msg, callback) => { if (source) msg.data.sourceId = source.id; - global[msg.module][msg.method](msg); + cons.routeGlobal(msg); } }; From a76856c809e8d523e4bb708932a546e9ead8aecc Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 15 Feb 2022 21:08:07 +0200 Subject: [PATCH 116/121] chore: fixed merge issue --- src/server/security/connections.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/server/security/connections.js b/src/server/security/connections.js index 2a5cdf1f..9cfb0402 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -69,10 +69,6 @@ module.exports = { routeGlobal.call(this, msg); }, - routeGlobal: function (msg) { - global[msg.module][msg.method](msg); - }, - unzone: function (msg) { let socket = msg.socket; let player = this.players.find(p => p.socket.id === socket.id); From ce93669efd68d018eb2247f8fd75e1d82f099b38 Mon Sep 17 00:00:00 2001 From: Shaun Date: Fri, 18 Feb 2022 15:54:46 +0200 Subject: [PATCH 117/121] bug #1906 (cherry picked from commit 2bbe965534c6a16f795c63a352c8dd3be5e0549e) --- src/server/components/spellbook.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/server/components/spellbook.js b/src/server/components/spellbook.js index 4f15ea71..e555ef6e 100644 --- a/src/server/components/spellbook.js +++ b/src/server/components/spellbook.js @@ -300,7 +300,7 @@ module.exports = { } } - if (spell.spellType === 'buff' || spell.spellType === 'heal') { + if (target.aggro && (spell.spellType === 'buff' || spell.spellType === 'heal')) { if (this.obj.aggro.faction !== target.aggro.faction) return; } else if (target.aggro && !this.obj.aggro.canAttack(target)) { @@ -311,7 +311,11 @@ module.exports = { } if (!spell.targetGround && target && !target.aggro && !spell.aura) { - this.sendAnnouncement("You don't feel like attacking that target"); + if (spell.spellType === 'heal') + this.sendAnnouncement("You don't feel like healing that target"); + else + this.sendAnnouncement("You don't feel like attacking that target"); + return; } From c8ad480700e992ddba8b7f2fe14c567fb83e773b Mon Sep 17 00:00:00 2001 From: Vildravn Date: Sun, 20 Feb 2022 00:03:01 +0100 Subject: [PATCH 118/121] bug #1908: Set fireblast pushback to 0 This is just a quick fix, please revert this later --- src/server/config/spells/spellFireblast.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/server/config/spells/spellFireblast.js b/src/server/config/spells/spellFireblast.js index ad90f442..7c0b51b2 100644 --- a/src/server/config/spells/spellFireblast.js +++ b/src/server/config/spells/spellFireblast.js @@ -1,4 +1,6 @@ const getTargetPos = (physics, obj, m, pushback) => { + pushback = 0; // TEMPORARY FIX, PLEASE REVERT + let targetPos = { x: m.x, y: m.y From bea8595ce9fc1f042744e691e07967233b7ae0eb Mon Sep 17 00:00:00 2001 From: Shaun Date: Sun, 20 Feb 2022 08:53:11 +0200 Subject: [PATCH 119/121] reverted tempfix for #1908 and merged hotfix --- src/server/config/spells/spellFireblast.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/server/config/spells/spellFireblast.js b/src/server/config/spells/spellFireblast.js index 9cdb79dc..1f1dc96a 100644 --- a/src/server/config/spells/spellFireblast.js +++ b/src/server/config/spells/spellFireblast.js @@ -1,6 +1,4 @@ const getTargetPos = (physics, obj, m, pushback) => { - pushback = 0; // TEMPORARY FIX, PLEASE REVERT - let targetPos = { x: m.x, y: m.y From 2234404a567931d6322923e8cb71220f6a7080d2 Mon Sep 17 00:00:00 2001 From: Shaun Date: Tue, 22 Feb 2022 10:00:38 +0200 Subject: [PATCH 120/121] temp: undo later --- src/server/world/atlas.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/server/world/atlas.js b/src/server/world/atlas.js index c91d5f5e..b04fbce9 100644 --- a/src/server/world/atlas.js +++ b/src/server/world/atlas.js @@ -145,9 +145,14 @@ module.exports = { this.threads.push(thread); }, onMessage: function (thread, message) { - if (message.module) - global[message.module][message.method](message); - else if (message.event === 'onCrashed') { + if (message.module) { + try { + global[message.module][message.method](message); + } catch (e) { + console.log('No global method found', message.module, message.method); + process.exit(); + } + } else if (message.event === 'onCrashed') { thread.worker.kill(); process.exit(); } else From 7a37c28d675a587a20e5a2e9d5a8a71d76afdb12 Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 9 Mar 2022 08:05:05 +0200 Subject: [PATCH 121/121] bug #1914 (cherry picked from commit e0f1e8aa3dda07086df15ac914e8308021208477) --- src/server/components/mob.js | 8 ++++++++ src/server/security/connections.js | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/server/components/mob.js b/src/server/components/mob.js index 735b9fbb..2f801faa 100644 --- a/src/server/components/mob.js +++ b/src/server/components/mob.js @@ -126,6 +126,14 @@ module.exports = { let distanceFromHome = Math.max(abs(this.originX - obj.x), abs(this.originY - obj.y)); if (!distanceFromHome) { this.goHome = false; + + if (!obj.spellbook) { + /* eslint-disable-next-line no-console */ + console.log('MOB HAS NO SPELLBOOK BUT WANTS TO RESET ROTATION'); + /* eslint-disable-next-line no-console */ + console.log(obj.name, obj.zone, obj.zoneName, obj.x, obj.y, obj.components.map(c => c.type).join(',')); + } + obj.spellbook.resetRotation(); } } diff --git a/src/server/security/connections.js b/src/server/security/connections.js index 9cfb0402..ff627b50 100644 --- a/src/server/security/connections.js +++ b/src/server/security/connections.js @@ -164,7 +164,8 @@ module.exports = { .forEach(p => { atlas.performAction(p, { cpn: 'auth', - method: 'doSave' + method: 'doSave', + data: {} }); }); },