[
  {
    "path": ".claude/client-camera-follow-system.md",
    "content": "# Client Camera Follow System Architecture\n\nThis document describes how the camera follow system works in the Reldens client-side code.\n\n## Overview\n\nThe camera follow system manages how the Phaser camera tracks the player character during gameplay. It involves multiple components across the client architecture: PlayerEngine, GameEngine, and scene management.\n\n## Key Components\n\n### 1. PlayerEngine (lib/users/client/player-engine.js)\n\n**Purpose**: Manages the player character on the client-side, including camera initialization and configuration.\n\n**Camera Configuration Properties** (lines 88-98):\n```javascript\nthis.cameraRoundPixels = Boolean(\n    this.config.getWithoutLogs('client/general/engine/cameraRoundPixels', true)\n);\nthis.cameraInterpolationX = Number(\n    this.config.getWithoutLogs('client/general/engine/cameraInterpolationX', 0.04)\n);\nthis.cameraInterpolationY = Number(\n    this.config.getWithoutLogs('client/general/engine/cameraInterpolationY', 0.04)\n);\n```\n\n**Configuration Source**: These values come from the database `config` table with scope `client` and are loaded during game initialization.\n\n### 2. Camera Initialization Flow (PlayerEngine.create())\n\n**Execution Order** (lines 115-139):\n\n1. **Player Sprite Creation** (line 126):\n   - `this.addPlayer(this.playerId, addPlayerData)` creates the player sprite in the physics world\n\n2. **Initial Camera Follow** (line 127):\n   - `this.scene.cameras.main.startFollow(this.players[this.playerId])`\n   - Camera begins tracking the player sprite\n\n3. **Scene Visibility** (line 128):\n   - `this.scene.scene.setVisible(true, this.roomName)` makes the scene visible\n\n4. **Camera Fade-In Effect** (line 129):\n   - `this.scene.cameras.main.fadeFrom(this.fadeDuration)`\n   - Starts fade-in animation (default 1000ms duration)\n\n5. **Physics World Configuration** (lines 130-132):\n   - `fixedStep = false` enables variable physics timestep\n   - Sets physics and camera bounds to match map dimensions\n\n6. **Camera Fade Complete Handler** (lines 134-138):\n   - Event listener triggered when fade animation completes\n   - Re-initializes camera follow with interpolation settings\n   - Sets lerp and roundPixels values\n\n### 3. Phaser Camera Follow API\n\n**startFollow() Method Signature**:\n```javascript\ncamera.startFollow(target, roundPixels, lerpX, lerpY, offsetX, offsetY)\n```\n\n**Parameters**:\n- `target`: The game object (player sprite) to follow\n- `roundPixels` (optional): Boolean - force pixel-perfect rendering\n- `lerpX` (optional): Number - horizontal interpolation (0-1, default 1)\n- `lerpY` (optional): Number - vertical interpolation (0-1, default 1)\n- `offsetX` (optional): Number - horizontal offset from target center\n- `offsetY` (optional): Number - vertical offset from target center\n\n**Lerp Behavior**:\n- Value of `1`: Camera instantly snaps to target position (no interpolation)\n- Value < `1`: Camera smoothly interpolates to target position\n- Lower values (e.g., 0.04) = slower, smoother camera movement\n- Higher values (e.g., 0.8) = faster, more responsive camera movement\n\n### 4. GameEngine.updateGameSize() Integration\n\n**Purpose** (lib/game/client/game-engine.js:79-106): Handles responsive behavior when window resizes or fullscreen toggles.\n\n**Camera Lerp Adjustment** (lines 84-86, 101-104):\n```javascript\nif(player){\n    activeScene.cameras.main.setLerp(player.cameraInterpolationX, player.cameraInterpolationY);\n}\n```\n\n**Execution Flow**:\n1. **Before resize operations** (line 85): Sets lerp values\n2. **Timeout delay** (line 87): Waits for configured duration (default 500ms)\n3. **After resize operations** (line 103): Restores lerp values\n\n**Why Twice?**:\n- First call: Prepares camera for UI element repositioning\n- Second call: Ensures camera tracking restored after all resize operations complete\n\n### 5. Event-Driven Architecture\n\n**Scene Creation Event** (game-manager.js:248):\n```javascript\nthis.events.on('reldens.afterSceneDynamicCreate', async () => {\n    this.gameEngine.updateGameSize(this);\n});\n```\n\n**Timing Sequence**:\n1. Scene created\n2. PlayerEngine.create() called - camera follow initialized\n3. Camera fade starts (1000ms)\n4. `reldens.afterSceneDynamicCreate` event fires\n5. `updateGameSize()` called - adjusts camera lerp\n6. Camera fade completes - lerp values set in event handler\n\n### 6. Configuration Values\n\n**Database Config Paths**:\n- `client/general/engine/cameraRoundPixels`: Boolean (default: true)\n- `client/general/engine/cameraInterpolationX`: Float (default: 0.04)\n- `client/general/engine/cameraInterpolationY`: Float (default: 0.04)\n- `client/players/animations/fadeDuration`: Integer milliseconds (default: 1000)\n- `client/general/gameEngine/updateGameSizeTimeOut`: Integer milliseconds (default: 500)\n\n**Config Loading**: Values are loaded from database during server initialization and sent to client in the `START_GAME` message as part of `gameConfig`.\n\n### 7. Physics World Integration\n\n**Fixed Step Setting** (player-engine.js:130):\n```javascript\nthis.scene.physics.world.fixedStep = false;\n```\n\n**Impact**:\n- `false`: Variable timestep - physics updates based on actual frame time\n- `true`: Fixed timestep - physics updates at consistent intervals regardless of frame rate\n\n**Camera Bounds** (lines 131-132):\n```javascript\nthis.scene.physics.world.setBounds(0, 0, this.scene.map.widthInPixels, this.scene.map.heightInPixels);\nthis.scene.cameras.main.setBounds(0, 0, this.scene.map.widthInPixels, this.scene.map.heightInPixels);\n```\n\nBoth physics world and camera are constrained to the map dimensions to prevent the camera from showing areas outside the game world.\n\n### 8. Responsive Behavior\n\n**Window Resize Listener** (game-manager.js:253-255):\n```javascript\nthis.gameDom.getWindow().addEventListener('resize', () => {\n    this.gameEngine.updateGameSize(this);\n});\n```\n\n**Fullscreen Handlers** (handlers/full-screen-handler.js:57, 65):\n- Entering fullscreen: `updateGameSize()` called\n- Exiting fullscreen: `updateGameSize()` called\n\n**Purpose**: Ensures camera interpolation remains consistent across different viewport sizes and display modes.\n\n## Data Flow Summary\n\n1. Database Config\n2. Server loads config\n3. Client receives config in START_GAME message\n4. PlayerEngine constructor reads config values\n5. PlayerEngine.create() initializes camera\n6. startFollow() begins tracking player\n7. Fade animation starts\n8. Camera fade completes - lerp values applied\n9. Window resize events - updateGameSize() maintains lerp\n\n## Key Technical Points\n\n1. **Camera initialization happens in two phases**: Initial `startFollow()` and post-fade configuration\n2. **Lerp values must be passed to `startFollow()` or set via `setLerp()`** for interpolation to work\n3. **Round pixels and lerp work together**: Round pixels prevents sub-pixel jitter, lerp provides smooth motion\n4. **Physics timestep affects camera smoothness**: Variable timestep can cause frame-to-frame variations\n5. **Responsive system maintains camera settings**: `updateGameSize()` ensures lerp persists through viewport changes\n\n## File Locations\n\n- **PlayerEngine**: `lib/users/client/player-engine.js`\n- **GameEngine**: `lib/game/client/game-engine.js`\n- **GameManager**: `lib/game/client/game-manager.js`\n- **FullScreenHandler**: `lib/game/client/handlers/full-screen-handler.js`\n- **Config Database**: `config` table with `scope='client'`\n"
  },
  {
    "path": ".claude/commands-reference.md",
    "content": "# Commands Reference\n\nComplete reference for all Reldens CLI commands.\n\n## CLI Binaries\n\nThe project provides three main CLI entry points:\n- `reldens` - Main command router (bin/reldens-commands.js)\n- `reldens-generate` - Data generation tool (bin/generate.js)\n- `reldens-import` - Data import tool (bin/import.js)\n\n## Development & Building\n\n```bash\n# Run tests\nnpm test\n# Or with filters\nnode tests/manager.js --filter=\"test-name\" --break-on-error\n\n# Build commands (via reldens CLI)\nreldens buildCss [theme-name]           # Build theme styles\nreldens buildClient [theme-name]        # Build client HTML\nreldens buildSkeleton                   # Build both styles and client\nreldens fullRebuild                     # Complete rebuild from scratch\n\n# Theme & asset management\nreldens installDefaultTheme             # Install default theme\nreldens copyAssetsToDist                # Copy assets to dist folder\nreldens copyDefaultAssets               # Copy default assets to dist/assets\nreldens copyDefaultTheme                # Copy default theme to project\nreldens copyPackage                     # Copy reldens module packages to project\nreldens resetDist                       # Delete and recreate dist folder\nreldens removeDist                      # Delete dist folder only\n\n# Database & entities\nreldens generateEntities [--override]   # Generate entities from database schema\n# This reads .env credentials and uses @reldens/storage to generate entities\n# Generated entities are placed in the generated-entities/ directory\n\n# Direct entity generation with connection arguments (bypasses .env):\nnpx reldens-storage generateEntities --user=reldens --pass=reldens --database=reldens_clean --driver=objection-js\n```\n\n## Prisma-Specific Commands\n\n**IMPORTANT:** Prisma requires a separate client generation step before entities can be generated.\n\n```bash\n# Step 1: Generate Prisma schema and client from existing database\n# This introspects the database and creates prisma/schema.prisma + prisma/client/\nnpx reldens-storage-prisma --host=localhost --port=3306 --user=reldens --password=reldens --database=reldens_clean --clientOutputPath=./client\n\n# Step 2: Generate Reldens entities using Prisma driver\nnpx reldens-storage generateEntities --user=reldens --pass=reldens --database=reldens_clean --driver=prisma\n\n# Full parameter list for reldens-storage-prisma:\n# --host          Database host (default: localhost)\n# --port          Database port (default: 3306)\n# --user          Database username (required)\n# --password      Database password (required)\n# --database      Database name (required)\n# --clientOutputPath  Output path for Prisma client (default: ./client)\n# --schemaPath    Path for schema.prisma file (default: ./prisma)\n```\n\n**Prisma Workflow:**\n1. Run `reldens-storage-prisma` to generate schema.prisma and Prisma client\n2. The command introspects your MySQL database and creates the Prisma schema\n3. Run `reldens-storage generateEntities` with `--driver=prisma` to generate Reldens entities\n4. Set `RELDENS_STORAGE_DRIVER=prisma` in your `.env` file to use Prisma at runtime\n\n**Environment Variables for Prisma:**\n```\nRELDENS_STORAGE_DRIVER=prisma\nRELDENS_DB_URL=mysql://user:password@host:port/database\n```\n\n## Installation & Setup\n\n```bash\nreldens createApp                       # Create base project skeleton\nreldens installSkeleton                 # Install skeleton\nreldens copyEnvFile                     # Copy .env.dist template\nreldens copyKnexFile                    # Copy knexfile.js template\nreldens copyIndex                       # Copy index.js template\nreldens copyServerFiles                 # Reset dist and run fullRebuild\nreldens copyNew                         # Copy all default files for fullRebuild\nreldens help                            # Show all available commands\nreldens test                            # Test file system access\n```\n\n## Data Generation Tools\n\n```bash\n# Generate game data (via reldens-generate)\nreldens-generate players-experience     # Generate player XP per level\nreldens-generate monsters-experience    # Generate monster XP per level\nreldens-generate attributes             # Generate attributes per level\nreldens-generate maps                   # Generate maps with various loaders\n\n# Data import (via reldens-import)\nreldens-import [data-type]              # Import game data\n```\n\n## User Management Commands\n\n```bash\n# Create admin user\nreldens createAdmin --user=username --pass=password --email=email@example.com\n# Creates an admin user with role_id from config (default: 1)\n# Validates email format and username/email uniqueness\n# Password is automatically encrypted using PBKDF2 SHA-512\n\n# Reset user password\nreldens resetPassword --user=username --pass=newpassword\n# Resets password for existing user\n# Password is automatically encrypted\n# Works for any user (admin or regular)\n\n# Examples:\nreldens createAdmin --user=admin --pass=SecurePass123 --email=admin@yourgame.com\nreldens resetPassword --user=someuser --pass=NewSecurePass456\n```\n\n**Implementation Details:**\n- Service classes: `CreateAdmin` and `ResetPassword` in `lib/users/server/`\n- Both receive `serverManager` in constructor (following importer pattern)\n- Services return boolean result with `error` property for failure details\n- `createAdmin` uses existing `usersRepository.create()` with `role_id` in userData\n- `resetPassword` uses `usersRepository.loadOneBy()` and `updateById()`\n- Admin role ID from config: `server/admin/roleId` (default: 1)\n- Email validation via `sc.validateInput(email, 'email')` from `@reldens/utils`\n- Commands initialize ServerManager automatically from `.env` (pattern from `bin/import.js`)\n- Password encryption uses `Encryptor` from `@reldens/server-utils` (100k iterations, SHA-512)\n"
  },
  {
    "path": ".claude/entities-reference.md",
    "content": "# Entities Reference\n\nComplete list of all 60+ entity types in the Reldens platform.\n\nEntities are located in `generated-entities/entities/` and are auto-generated from the database schema.\n\n## Ads System\n- ads\n- ads-banner\n- ads-event-video\n- ads-played\n- ads-providers\n- ads-types\n\n## Audio System\n- audio\n- audio-categories\n- audio-markers\n- audio-player-config\n\n## Chat System\n- chat\n- chat-message-types\n\n## Clans/Teams System\n- clan\n- clan-levels\n- clan-levels-modifiers\n- clan-members\n\n## Configuration\n- config\n- config-types\n\n## Drops/Rewards\n- drops-animations\n\n## Features\n- features\n\n## Items System\n- items-group\n- items-inventory\n- items-item\n- items-item-modifiers\n- items-types\n\n## Localization\n- locale\n- users-locale\n\n## Objects System\n- objects\n- objects-animations\n- objects-assets\n- objects-items-inventory\n- objects-items-requirements\n- objects-items-rewards\n- objects-skills\n- objects-stats\n- objects-types\n\n## Operations\n- operation-types\n\n## Players\n- players\n- players-state\n- players-stats\n\n## Respawn System\n- respawn\n\n## Rewards System\n- rewards\n- rewards-events\n- rewards-events-state\n- rewards-modifiers\n\n## Rooms/Maps\n- rooms\n- rooms-change-points\n- rooms-return-points\n\n## Scores/Leaderboards\n- scores\n- scores-detail\n\n## Skills System\n- skills-class-level-up-animations\n- skills-class-path\n- skills-class-path-level-labels\n- skills-class-path-level-skills\n- skills-groups\n- skills-levels\n- skills-levels-modifiers\n- skills-levels-modifiers-conditions\n- skills-levels-set\n- skills-owners-class-path\n- skills-skill\n- skills-skill-animations\n- skills-skill-attack\n- skills-skill-group-relation\n- skills-skill-owner-conditions\n- skills-skill-owner-effects\n- skills-skill-owner-effects-conditions\n- skills-skill-physical-data\n- skills-skill-target-effects\n- skills-skill-target-effects-conditions\n- skills-skill-type\n\n## Snippets\n- snippets\n\n## Stats/Modifiers\n- stats\n- target-options\n\n## Users/Authentication\n- users\n- users-login\n\n## Entity Relations\n\nEntity relations keys are defined in `generated-entities/entities-config.js`.\n\nCustom entity overrides are located in `lib/[plugin-folder]/server/entities` or `lib/[plugin-folder]/server/models`.\n"
  },
  {
    "path": ".claude/environment-variables.md",
    "content": "# Environment Variables Reference\n\nComplete reference for all RELDENS_* environment variables.\n\nSee `lib/game/server/install-templates/.env.dist` for the template file.\n\n## Application Server\n\n- `NODE_ENV` - Environment mode (production/development)\n- `RELDENS_DEFAULT_ENCODING` - Default encoding (default: utf8)\n- `RELDENS_APP_HOST` - Application host\n- `RELDENS_APP_PORT` - Application port\n- `RELDENS_PUBLIC_URL` - Public URL for the application\n\n## HTTPS Configuration\n\n- `RELDENS_EXPRESS_USE_HTTPS` - Enable HTTPS\n- `RELDENS_EXPRESS_HTTPS_PRIVATE_KEY` - Private key path\n- `RELDENS_EXPRESS_HTTPS_CERT` - Certificate path\n- `RELDENS_EXPRESS_HTTPS_CHAIN` - Certificate chain path\n- `RELDENS_EXPRESS_HTTPS_PASSPHRASE` - HTTPS passphrase\n\n## Express Server\n\n- `RELDENS_USE_EXPRESS_JSON` - Enable JSON parsing\n- `RELDENS_EXPRESS_JSON_LIMIT` - JSON payload limit\n- `RELDENS_EXPRESS_URLENCODED_LIMIT` - URL encoded limit\n- `RELDENS_GLOBAL_RATE_LIMIT` - Global rate limiting\n- `RELDENS_TOO_MANY_REQUESTS_MESSAGE` - Rate limit message\n- `RELDENS_USE_URLENCODED` - Enable URL encoding\n- `RELDENS_USE_HELMET` - Enable Helmet security\n- `RELDENS_USE_XSS_PROTECTION` - Enable XSS protection\n- `RELDENS_USE_CORS` - Enable CORS\n- `RELDENS_CORS_ORIGIN` - CORS origin\n- `RELDENS_CORS_METHODS` - CORS methods\n- `RELDENS_CORS_HEADERS` - CORS headers\n- `RELDENS_EXPRESS_SERVE_HOME` - Serve dynamic home page\n- `RELDENS_EXPRESS_TRUSTED_PROXY` - Trusted proxy\n- `RELDENS_EXPRESS_RATE_LIMIT_MS` - Rate limit window (default: 60000)\n- `RELDENS_EXPRESS_RATE_LIMIT_MAX_REQUESTS` - Max requests per window (default: 30)\n- `RELDENS_EXPRESS_RATE_LIMIT_APPLY_KEY_GENERATOR` - Apply key generator\n- `RELDENS_EXPRESS_SERVE_STATICS` - Serve static files\n\n## Admin Panel\n\n- `RELDENS_ADMIN_ROUTE_PATH` - Admin panel route path\n- `RELDENS_ADMIN_SECRET` - Admin authentication secret\n- `RELDENS_HOT_PLUG` - Enable hot-plug configuration updates (0/1)\n\n## Colyseus Monitor\n\n- `RELDENS_MONITOR` - Enable Colyseus monitor\n- `RELDENS_MONITOR_AUTH` - Enable monitor authentication\n- `RELDENS_MONITOR_USER` - Monitor username\n- `RELDENS_MONITOR_PASS` - Monitor password\n\n## Storage & Database\n\n- `RELDENS_STORAGE_DRIVER` - Storage driver (objection-js, mikro-orm, prisma)\n- `RELDENS_DB_CLIENT` - Database client (mysql, mysql2, mongodb)\n- `RELDENS_DB_HOST` - Database host\n- `RELDENS_DB_PORT` - Database port\n- `RELDENS_DB_NAME` - Database name\n- `RELDENS_DB_USER` - Database username\n- `RELDENS_DB_PASSWORD` - Database password\n- `RELDENS_DB_POOL_MIN` - Connection pool minimum (default: 2)\n- `RELDENS_DB_POOL_MAX` - Connection pool maximum (default: 10)\n- `RELDENS_DB_LIMIT` - Query limit (default: 0)\n- `RELDENS_DB_URL` - Full database URL (auto-generated if not specified)\n- `RELDENS_DB_URL_OPTIONS` - Additional URL options\n\n## Logging\n\n- `RELDENS_LOG_LEVEL` - Log level (0-7, default: 7)\n- `RELDENS_ENABLE_TRACE_FOR` - Enable trace for specific levels (emergency,alert,critical)\n\n## Mailer\n\n- `RELDENS_MAILER_ENABLE` - Enable email functionality\n- `RELDENS_MAILER_SERVICE` - Mail service provider\n- `RELDENS_MAILER_HOST` - SMTP host\n- `RELDENS_MAILER_PORT` - SMTP port\n- `RELDENS_MAILER_USER` - SMTP username\n- `RELDENS_MAILER_PASS` - SMTP password\n- `RELDENS_MAILER_FROM` - From email address\n- `RELDENS_MAILER_FORGOT_PASSWORD_LIMIT` - Forgot password attempts limit (default: 4)\n\n## Bundler\n\n- `RELDENS_ALLOW_RUN_BUNDLER` - Allow automatic bundler execution via createClientBundle() (default: 0)\n- `RELDENS_ALLOW_BUILD_CLIENT` - Allow client build execution via buildClient() (default: 1)\n- `RELDENS_ALLOW_BUILD_CSS` - Allow CSS build execution via buildCss() (default: 1)\n- `RELDENS_FORCE_RESET_DIST_ON_BUNDLE` - Force reset dist on bundle\n- `RELDENS_FORCE_COPY_ASSETS_ON_BUNDLE` - Force copy assets on bundle\n- `RELDENS_JS_SOURCEMAPS` - Enable JavaScript source maps\n- `RELDENS_CSS_SOURCEMAPS` - Enable CSS source maps\n\n**Important**: Always use `createClientBundle()` instead of calling `buildClient()` directly when building during server startup. The `createClientBundle()` method respects `RELDENS_ALLOW_RUN_BUNDLER` and provides additional configuration options.\n\n## Game Server\n\n- `RELDENS_PING_INTERVAL` - Ping interval in ms (default: 5000)\n- `RELDENS_PING_MAX_RETRIES` - Max ping retries (default: 3)\n\n## Firebase\n\n- `RELDENS_FIREBASE_ENABLE` - Enable Firebase authentication\n- `RELDENS_FIREBASE_API_KEY` - Firebase API key\n- `RELDENS_FIREBASE_APP_ID` - Firebase app ID\n- `RELDENS_FIREBASE_AUTH_DOMAIN` - Firebase auth domain\n- `RELDENS_FIREBASE_DATABASE_URL` - Firebase database URL\n- `RELDENS_FIREBASE_PROJECT_ID` - Firebase project ID\n- `RELDENS_FIREBASE_STORAGE_BUCKET` - Firebase storage bucket\n- `RELDENS_FIREBASE_MESSAGING_SENDER_ID` - Firebase sender ID\n- `RELDENS_FIREBASE_MEASUREMENTID` - Firebase measurement ID\n"
  },
  {
    "path": ".claude/feature-modules.md",
    "content": "# Feature Modules Reference\n\nComplete reference for all 23 feature modules under `lib/`.\n\n## Core/Game Management\n\n### Game (`lib/game/`)\nCore game engine\n- ServerManager - Main server orchestrator (lib/game/server/manager.js)\n- GameManager - Main client orchestrator (lib/game/client/game-manager.js)\n- Data server configuration\n- Entities loader\n- Maps loader\n- Login manager\n- Installation scripts\n- Theme manager\n\n### Rooms (`lib/rooms/`)\nCore multiplayer room system\n- `server/scene.js` (RoomScene): Main game room with physics, collisions, objects\n- `server/login.js` (RoomLogin): Authentication and player initialization\n- Client connects via `room-events.js` to handle server state synchronization\n\n### World (`lib/world/`)\nPhysics engine integration (P2.js), pathfinding, collisions\n- Authoritative physics calculations\n- Collision detection and handling\n- Pathfinding algorithms\n\n### Config (`lib/config/`)\nConfiguration management\n- Database-driven configuration\n- Environment variable handling\n- Runtime configuration overrides\n\n### Features (`lib/features/`)\nPlugin-like modular system\n- Features are loaded from database (`features` table with `is_enabled` flag)\n- `server/manager.js` (FeaturesManager) dynamically loads enabled features\n- Each feature can hook into events via `setup()` method\n\n## Gameplay Systems\n\n### Actions (`lib/actions/`)\nCombat system (PvP/PvE), skills, battle mechanics\n- Server handles authoritative battle calculations\n- Client receives battle states and renders animations\n- `server/battle.js` - Main battle system\n- `server/pve.js` - PvE combat logic\n- `server/pvp.js` - PvP combat logic\n\n### Inventory (`lib/inventory/`)\nItems system with equipment and usable items\n- Integrates with @reldens/items-system\n- Item management, equipment slots, consumables\n\n### Respawn (`lib/respawn/`)\nPlayer and NPC respawn system\n- Death handling\n- Respawn points configuration\n\n### Rewards (`lib/rewards/`)\nLoot and rewards system\n- Drop tables\n- Reward distribution\n\n### Scores (`lib/scores/`)\nLeaderboards and ranking system\n- Player scores tracking\n- Global leaderboards\n\n### Teams (`lib/teams/`)\nParty/guild system\n- Team formation\n- Shared objectives\n- Clan levels and bonuses\n\n## Player Systems\n\n### Users (`lib/users/`)\nAuthentication, registration, player management\n- Supports guest users, Firebase authentication\n- `server/login-manager.js` handles all auth flows\n- Player creation and management\n\n### Chat (`lib/chat/`)\nMulti-channel chat (global, room, private messages)\n- Message types and tabs\n- Real-time messaging\n\n### Audio (`lib/audio/`)\nSound and music system\n- Background music management\n- Sound effects for actions and events\n- Audio configuration per scene/room\n\n### Prediction (`lib/prediction/`)\nClient-side prediction system\n- Reduces perceived latency\n- Smooths player movement\n\n## Integration/Support\n\n### Admin (`lib/admin/`)\nAdmin panel integration with @reldens/cms\n- Manages game configuration through web interface\n- Handles entity CRUD operations\n- Supports hot-plug configuration updates\n\n### Firebase (`lib/firebase/`)\nFirebase integration\n- Firebase authentication\n- Client-side Firebase SDK integration\n\n### Ads (`lib/ads/`)\nAdvertisement integration system\n- Third-party ad network support (CrazyGames, GameMonetize)\n- Ad placement configuration\n\n### Import (`lib/import/`)\nData import utilities\n- File handlers\n- MIME type detection\n- Bulk data import tools\n\n### Objects (`lib/objects/`)\nGame objects (NPCs, interactables, respawn areas)\n- `server/manager.js` loads and manages room objects\n- Objects can listen to messages via `listenMessages` interface\n\n### Snippets (`lib/snippets/`)\nReusable code snippets and utilities\n- Common helper functions\n- Shared utilities across modules\n\n### Bundlers (`lib/bundlers/`)\nAsset bundling drivers\n- Parcel integration\n- CSS and JavaScript bundling\n- Theme asset compilation\n"
  },
  {
    "path": ".claude/guest-system-technical-guide.md",
    "content": "# Guest System Technical Guide\n\n## Overview\n\nThe guest system allows anonymous players to join the game without registration. This document explains the complete technical flow from database configuration to client-side form activation.\n\n---\n\n## 1. Database Configuration\n\n### Rooms Table - `customData` Field\n\nEach room can be marked as guest-accessible via the `customData` JSON field:\n\n```json\n{\n  \"allowGuest\": true\n}\n```\n\n**Location:** `rooms` table in `customData` column\n\n**Example SQL:**\n```sql\nUPDATE rooms SET customData = '{\"allowGuest\": true}' WHERE name = 'town';\n```\n\n---\n\n## 2. Server-Side Flow\n\n### 2.1 Rooms Loading (`lib/rooms/server/manager.js`)\n\n**Method:** `loadRooms()` (lines 204-241)\n\n```javascript\nasync loadRooms(){\n    let roomsModels = await this.dataServer.getEntity('rooms').loadAllWithRelations([...]);\n\n    // Process each room\n    for(let room of roomsModels){\n        let roomModel = this.generateRoomModel(room);\n        rooms.push(roomModel);\n        roomsById[room.id] = roomModel;\n        roomsByName[room.name] = roomModel;\n    }\n\n    // Filter guest rooms\n    this.availableRoomsGuest = this.filterGuestRooms(roomsByName);\n\n    // Create room lists for registration and login\n    let registrationRooms = this.filterRooms(true);\n    this.registrationAvailableRooms = this.extractRoomDataForSelector(registrationRooms);\n    this.registrationAvailableRoomsGuest = this.extractRoomDataForSelector(\n        this.fetchGuestRooms(registrationRooms)\n    );\n\n    let loginRooms = this.filterRooms(false);\n    this.loginAvailableRooms = this.extractRoomDataForSelector(loginRooms);\n    this.loginAvailableRoomsGuest = this.extractRoomDataForSelector(\n        this.fetchGuestRooms(loginRooms)\n    );\n\n    return this.loadedRooms;\n}\n```\n\n### 2.2 Guest Room Filtering (`lib/rooms/server/manager.js`)\n\n**Method:** `filterGuestRooms()` (line 415+)\n\n```javascript\nfilterGuestRooms(availableRooms){\n    let guestRooms = {};\n    for(let roomName of Object.keys(availableRooms)){\n        let room = availableRooms[roomName];\n        let customData = sc.get(room, 'customData', {});\n        if(sc.isString(customData)){\n            customData = JSON.parse(customData);\n        }\n        // Check if allowGuest is true\n        if(sc.get(customData, 'allowGuest')){\n            guestRooms[roomName] = room;\n        }\n    }\n    return guestRooms;\n}\n```\n\n**Method:** `fetchGuestRooms()` (line 403+)\n\n```javascript\nfetchGuestRooms(availableRooms){\n    // Check global setting\n    if(this.allowGuestOnRooms){\n        return availableRooms; // All rooms allow guests\n    }\n    // Filter by room-specific allowGuest\n    return this.filterGuestRooms(availableRooms);\n}\n```\n\n**Global Setting:**\n- Config path: `server/players/guestUser/allowOnRooms`\n- Default: `true`\n- If `true`, all rooms allow guests\n- If `false`, only rooms with `customData.allowGuest = true` allow guests\n\n### 2.3 Config Assignment (`lib/rooms/server/manager.js`)\n\n**Method:** `defineRoomsInGameServer()` (lines 109-116)\n\n```javascript\n// After all rooms are loaded and defined\nif(this.config.client?.rooms?.selection){\n    this.config.client.rooms.selection.availableRooms = {\n        registration: this.registrationAvailableRooms,\n        registrationGuest: this.registrationAvailableRoomsGuest,  // ← Guest rooms here\n        login: this.loginAvailableRooms,\n        loginGuest: this.loginAvailableRoomsGuest                 // ← Guest rooms here\n    };\n}\n```\n\n**Called by:** `ServerManager.defineServerRooms()` calls `RoomsManager.defineRoomsInGameServer()`\n\n---\n\n## 3. Config File Generation\n\n### 3.1 Timing (CRITICAL)\n\n**File:** `lib/game/server/manager.js`\n\n**Execution order:**\n1. `initializeManagers()` (line 261-263)\n   - Calls `defineServerRooms()`\n   - Guest rooms configured in `this.configManager.client.rooms.selection.availableRooms`\n2. **Config file created** (line 264-272)\n   - `HomepageLoader.createConfigFile()` with guest rooms data\n3. **Client built** (line 272)\n   - Bundles config.js into dist folder\n\n### 3.2 Config File Creation (`lib/game/server/homepage-loader.js`)\n\n**Method:** `createConfigFile()` (lines 51-62)\n\n```javascript\nstatic createConfigFile(projectThemePath, initialConfiguration){\n    let configFilePath = FileHandler.joinPaths(projectThemePath, 'config.js');\n    let configFileContents = 'window.reldensInitialConfig = '+JSON.stringify(initialConfiguration)+';';\n    let writeResult = FileHandler.writeFile(configFilePath, configFileContents);\n    if(!writeResult){\n        Logger.error('Failed to write config file: '+configFilePath);\n        return false;\n    }\n    Logger.info('Config file created: '+configFilePath);\n    return true;\n}\n```\n\n**Output file:** `theme/config.js`\n\n**Content structure:**\n```javascript\nwindow.reldensInitialConfig = {\n    gameEngine: { /* ... */ },\n    client: {\n        rooms: {\n            selection: {\n                availableRooms: {\n                    registration: { /* normal rooms */ },\n                    registrationGuest: { /* guest-allowed rooms */ },  // ← KEY DATA\n                    login: { /* normal rooms */ },\n                    loginGuest: { /* guest-allowed rooms */ }          // ← KEY DATA\n                }\n            }\n        }\n    }\n};\n```\n\n---\n\n## 4. Client-Side Flow\n\n### 4.1 Config Loading (`lib/game/client/game-manager.js`)\n\n**Constructor** (line 48-94)\n\n```javascript\nconstructor(){\n    this.config = new ConfigManager();\n    let initialConfig = this.gameDom.getWindow()?.reldensInitialConfig || {};\n    sc.deepMergeProperties(this.config, initialConfig);  // ← Loads from window.reldensInitialConfig\n    // ...\n}\n```\n\n**Data source:** `window.reldensInitialConfig` from `theme/config.js`\n\n### 4.2 Client Start (`lib/game/client/handlers/client-start-handler.js`)\n\n**Method:** `clientStart()` (line 30-53)\n\n```javascript\nclientStart(){\n    let registrationForm = new RegistrationFormHandler(this.gameManager);\n    registrationForm.activateRegistration();\n\n    let guestForm = new GuestFormHandler(this.gameManager);  // ← Guest handler\n    guestForm.activateGuest();                               // ← Activates guest form\n\n    // ... other handlers\n}\n```\n\n**Called by:** `GameManager.clientStart()` on `DOMContentLoaded`\n\n### 4.3 Guest Form Activation (`lib/game/client/handlers/guest-form-handler.js`)\n\n**Method:** `activateGuest()` (lines 34-72)\n\n```javascript\nactivateGuest(){\n    if(!this.form){\n        return false;\n    }\n\n    // Get guest rooms from config\n    let availableGuestRooms = this.gameManager.config.getWithoutLogs(\n        'client/rooms/selection/availableRooms/registrationGuest',  // ← Config path\n        {}\n    );\n\n    // Check if guest login is allowed AND guest rooms exist\n    if(\n        !this.gameManager.config.get('client/general/users/allowGuest')\n        || 0 === Object.keys(availableGuestRooms).length  // ← CRITICAL CHECK\n    ){\n        this.form.classList.add('hidden');  // ← HIDE FORM\n        return true;\n    }\n\n    // Form is visible, activate submit handler\n    this.form.addEventListener('submit', (e) => {\n        e.preventDefault();\n        if(!this.form.checkValidity()){\n            return false;\n        }\n        this.form.querySelector(selectors.LOADING_CONTAINER).classList.remove(GameConst.CLASSES.HIDDEN);\n        let randomGuestName = 'guest-'+sc.randomChars(12);\n        let userName = this.gameManager.config.getWithoutLogs('client/general/users/allowGuestUserName', false)\n            ? this.gameDom.getElement(selectors.GUEST.USERNAME).value\n            : randomGuestName;\n        let formData = {\n            formId: this.form.id,\n            username: userName,\n            password: userName,\n            rePassword: userName,\n            isGuest: true\n        };\n        this.gameManager.startGame(formData, true);\n    });\n\n    return true;\n}\n```\n\n**Form element:** `#guest-form` in `theme/default/index.html`\n\n**Key logic:**\n- If `availableGuestRooms` is empty: form hidden\n- If `client/general/users/allowGuest` is false: form hidden\n- Otherwise: form visible and functional\n\n---\n\n## 5. Complete Flow Diagram\n\n**Step 1: DATABASE (rooms table)**\n- customData: {\"allowGuest\": true}\n\n**Step 2: SERVER - RoomsManager.loadRooms()**\n- Loads all rooms from database\n- Calls filterGuestRooms() to identify guest-allowed rooms\n- Creates registrationAvailableRoomsGuest list\n\n**Step 3: SERVER - RoomsManager.defineRoomsInGameServer()**\n- Assigns guest rooms to config:\n- config.client.rooms.selection.availableRooms = {\n  - registrationGuest: [...],\n  - loginGuest: [...]\n- }\n\n**Step 4: SERVER - ServerManager.startGameServerInstance()**\n- After initializeManagers() completes\n- Calls HomepageLoader.createConfigFile()\n- Writes theme/config.js with guest rooms data\n- Calls themeManager.buildClient()\n- Bundles config.js into dist/\n\n**Step 5: CLIENT - Browser loads theme/default/index.html**\n- Includes script src=\"config.js\"\n- Sets window.reldensInitialConfig\n\n**Step 6: CLIENT - GameManager constructor**\n- Reads window.reldensInitialConfig\n- Merges into this.config\n\n**Step 7: CLIENT - ClientStartHandler.clientStart()**\n- Creates GuestFormHandler\n- Calls activateGuest()\n\n**Step 8: CLIENT - GuestFormHandler.activateGuest()**\n- Reads config.get('client/rooms/selection/availableRooms/registrationGuest')\n- If empty: HIDE form\n- If not empty: SHOW form and attach submit handler\n\n---\n\n## 6. Configuration Options\n\n### Server-Side Configs\n\n**Path:** `server/players/guestUser/allowOnRooms`\n- **Type:** Boolean\n- **Default:** `true`\n- **Effect:** If `true`, all rooms allow guests (ignores `customData.allowGuest`)\n\n**Path:** `server/players/guestsUser/emailDomain`\n- **Type:** String\n- **Default:** `@guest-reldens.com`\n- **Effect:** Email domain for guest accounts\n\n### Client-Side Configs\n\n**Path:** `client/general/users/allowGuest`\n- **Type:** Boolean\n- **Default:** Set from server config\n- **Effect:** Master switch for guest login feature\n\n**Path:** `client/general/users/allowGuestUserName`\n- **Type:** Boolean\n- **Default:** `false`\n- **Effect:** If `true`, allows guests to choose username; if `false`, generates random username\n\n### Environment Variables\n\n**Variable:** `RELDENS_CREATE_CONFIG_FILE`\n- **Type:** Number (0 or 1)\n- **Default:** `1`\n- **Effect:** Controls whether config.js file is created after rooms are configured\n\n**Variable:** `RELDENS_GUESTS_EMAIL_DOMAIN`\n- **Type:** String\n- **Default:** `@guest-reldens.com`\n- **Effect:** Email domain for guest user accounts\n\n---\n\n## 7. Testing Guest System\n\n### Database Setup\n\n```sql\n-- Enable guest on specific room\nUPDATE rooms\nSET customData = '{\"allowGuest\": true}'\nWHERE name = 'town';\n\n-- Disable guest on specific room\nUPDATE rooms\nSET customData = '{\"allowGuest\": false}'\nWHERE name = 'forest';\n```\n\n---\n\n## 8. Code References\n\n**Key Files:**\n- `lib/rooms/server/manager.js` - Room loading and guest filtering\n- `lib/game/server/manager.js` - Config file creation timing\n- `lib/game/server/homepage-loader.js` - Config file generation\n- `lib/game/client/game-manager.js` - Config loading\n- `lib/game/client/handlers/client-start-handler.js` - Form initialization\n- `lib/game/client/handlers/guest-form-handler.js` - Guest form logic\n\n**Database:**\n- Table: `rooms`\n- Column: `customData` (JSON)\n- Field: `allowGuest` (boolean)\n\n**Config Paths:**\n- Server: `server/players/guestUser/allowOnRooms`\n- Server: `server/players/guestsUser/emailDomain`\n- Client: `client/general/users/allowGuest`\n- Client: `client/general/users/allowGuestUserName`\n- Client: `client/rooms/selection/availableRooms/registrationGuest`\n- Client: `client/rooms/selection/availableRooms/loginGuest`\n"
  },
  {
    "path": ".claude/installer-guide.md",
    "content": "# Installer Guide\n\nComplete guide for the Reldens web-based installation wizard.\n\n## Overview\n\nThe Reldens installer (`lib/game/server/installer.js`) provides a web-based GUI for setting up new Reldens installations. It handles database setup, entity generation, storage driver configuration, and project file creation.\n\n## Accessing the Installer\n\nThe installer runs automatically on the first launch when no installation lock file exists:\n```bash\nnpm start\n# Navigate to http://localhost:8080 (or configured host/port)\n```\n\nThe installer will automatically redirect to the installation wizard if the project has not been installed yet.\n\n## Storage Drivers & Database Clients\n\nReldens supports three storage drivers with multiple database clients:\n\n### Prisma Driver\n- **mysql** - MySQL database (automated installation)\n- **postgresql (manual)** - PostgreSQL database\n- **sqlite (manual)** - SQLite database\n- **sqlserver (manual)** - SQL Server database\n- **mongodb (manual)** - MongoDB database\n- **cockroachdb (manual)** - CockroachDB database\n\n### Objection-js Driver (Knex.js)\n- **mysql (native)** - MySQL with native driver (automated installation)\n- **mysql2 (recommended)** - MySQL with mysql2 driver (automated installation)\n- **pg (manual)** - PostgreSQL\n- **sqlite3 (manual)** - SQLite3\n- **better-sqlite3 (manual)** - Better-SQLite3\n- **mssql (manual)** - SQL Server\n- **oracledb (manual)** - Oracle DB\n- **cockroachdb (manual)** - CockroachDB\n\n### MikroORM Driver\n- **mysql** - MySQL database (automated installation)\n- **mariadb (manual)** - MariaDB database\n- **postgresql (manual)** - PostgreSQL database\n- **sqlite (manual)** - SQLite database\n- **mongodb (manual)** - MongoDB database\n- **mssql (manual)** - SQL Server\n- **better-sqlite3 (manual)** - Better-SQLite3\n\n## Automated vs Manual Installation\n\n### Automated Installation (MySQL Only)\n\nOnly MySQL clients support automated installation scripts:\n- `mysql` (all drivers)\n- `mysql2` (objection-js only)\n\n**Automated steps:**\n1. Creates database tables via `reldens-install-v4.0.0.sql`\n2. Installs basic configuration via `reldens-basic-config-v4.0.0.sql` (if checked)\n3. Installs sample data via `reldens-sample-data-v4.0.0.sql` (if checked)\n4. Generates entities from database schema\n5. Creates project configuration files\n\n### Manual Installation (All Other Clients)\n\nClients marked with **(manual)** require manual database setup:\n- PostgreSQL, SQLite, MongoDB, SQL Server, Oracle, CockroachDB, MariaDB, Better-SQLite3\n\n**Manual steps:**\n1. Installer skips SQL script execution\n2. User must manually create database tables and schema\n3. Installer generates entities from existing database\n4. Installer creates project configuration files\n\n**Manual Setup Process:**\n1. Select a manual client from the installer\n2. Complete the installation wizard\n3. Manually execute SQL scripts or create schema in your database:\n   - Copy SQL files from `migrations/production/` directory\n   - Adapt SQL syntax for your database (if needed)\n   - Execute scripts in order: install, basic-config, sample-data\n4. Run entity generation: `reldens generateEntities --override`\n5. Restart the application\n\n## Installation Process Flow\n\n### For MySQL Clients\n\n1. **Package Installation** (if enabled)\n   - Status: \"Checking and installing required packages...\"\n   - Installs `@reldens/storage` and driver-specific packages\n\n2. **Database Connection**\n   - Status: \"Configuring database connection...\"\n   - Tests connection with provided credentials\n\n3. **Driver Installation**\n   - Status: \"Installing database driver: {driver}...\"\n   - Executes SQL migration scripts\n   - Creates tables, basic config, sample data\n\n4. **Entity Generation**\n   - Status: \"Generating entities from database schema...\"\n   - Introspects database and generates entity classes\n\n5. **Project Files**\n   - Status: \"Creating project files...\"\n   - Creates `.env`, `knexfile.js`, `index.js`, etc.\n\n6. **Completion**\n   - Status: \"Installation completed successfully!\"\n   - Redirects to game\n\n### For Manual Clients\n\n1. **Package Installation** (if enabled)\n2. **Database Connection**\n3. **Driver Installation**\n   - Status: \"Installing database driver: {driver}...\"\n   - Logs: \"Non-MySQL client detected ({client}), skipping automated SQL scripts.\"\n   - Skips all SQL migrations\n4. **Entity Generation** (requires pre-existing database schema)\n5. **Project Files**\n6. **Completion**\n\n## Status Tracking\n\nThe installer provides real-time status updates during installation:\n- Status file: `dist/assets/install-status.json`\n- Format: `{message: string, timestamp: number}`\n- Frontend polls every 2 seconds\n- Status messages appear beside/below loading image\n\n**Status Messages:**\n- \"Starting installation process...\"\n- \"Checking and installing required packages...\"\n- \"Configuring database connection...\"\n- \"Installing database driver: {driver}...\"\n- \"Generating entities from database schema...\"\n- \"Creating project files...\"\n- \"Installation completed successfully!\"\n\n## Configuration Options\n\n### App Settings\n- **Host** - Server host URL (e.g., http://localhost)\n- **Port** - Server port (default: 8080)\n- **Public URL** - Public-facing URL (for reverse proxies)\n- **Trusted Proxy** - Reverse proxy address\n- **Admin Panel Path** - Admin interface route (default: /reldens-admin)\n- **Admin Panel Secret Key** - Secret key for admin access\n- **Hot-Plug** - Enable runtime configuration reload\n\n### Storage Settings\n- **Storage Driver** - Database ORM (prisma, objection-js, mikro-orm)\n- **Client** - Database client library (see list above)\n- **Host** - Database server host\n- **Port** - Database server port\n- **Database Name** - Database name\n- **Username** - Database user\n- **Password** - Database password\n- **Install minimal configuration** - MySQL only\n- **Install sample data** - MySQL only\n\n### Optional Features\n- **HTTPS** - SSL/TLS configuration\n- **Monitor** - Colyseus monitoring tools\n- **Mailer** - Email service integration (SendGrid, NodeMailer)\n- **Firebase** - Firebase authentication integration\n\n## Installer Architecture\n\n### Core Classes\n\n**Installer** (`lib/game/server/installer.js`)\n- Main orchestration class\n- Handles Express routes and form processing\n- Coordinates sub-installers\n- Manages status tracking\n\n**GenericDriverInstallation** (`lib/game/server/installer/generic-driver-installation.js`)\n- Handles ObjectionJS and MikroORM installations\n- Executes SQL migrations via `rawQuery()`\n- Checks client type and skips non-MySQL scripts\n\n**PrismaInstallation** (`lib/game/server/installer/prisma-installation.js`)\n- Handles Prisma-specific installation\n- Runs installation in forked subprocess\n- Generates Prisma schema and client\n\n**PrismaSubprocessWorker** (`lib/game/server/installer/prisma-subprocess-worker.js`)\n- Forked child process for Prisma installation\n- Isolates Prisma client to avoid module caching\n- Checks client type and skips non-MySQL scripts\n\n**EntitiesInstallation** (`lib/game/server/installer/entities-installation.js`)\n- Generates entity classes from database schema\n- Supports all three storage drivers\n\n**ProjectFilesCreation** (`lib/game/server/installer/project-files-creation.js`)\n- Creates `.env` file with configuration\n- Creates `knexfile.js` for ObjectionJS\n- Creates `index.js` entry point\n- Copies theme files and assets\n\n**PackagesInstallation** (`lib/game/server/installer/packages-installation.js`)\n- Manages npm package installation and linking based on `RELDENS_INSTALLATION_TYPE`\n- Reads the lock file at construction time (while the main package link is still active)\n- Runs installs before links so the main package link is always restored last\n- Handles driver-specific dependencies (e.g. `@prisma/client` for Prisma)\n\n**Installation Types** (set via `RELDENS_INSTALLATION_TYPE` environment variable):\n\n- `normal` — installs `reldens` from npm registry; no linking\n- `link` — npm links `reldens` and all `@reldens/*` packages; no npm installs\n- `link-main` — npm installs all `@reldens/*` packages from registry (no version pinning), then npm links `reldens` last to restore the local source junction\n\n**Package installation sequence** (`link-main`):\n1. Lock file is read from `node_modules/reldens/package-lock.json` at construction (while link is active)\n2. `unlinkAllPackages()` removes all existing links for `reldens` and all `@reldens/*` packages\n3. `checkAndInstallPackages()` runs installs first, then the link:\n   - `npm install @reldens/cms`, `npm install @reldens/storage`, etc. (no version pinning)\n   - `npm link reldens` — restores the junction to the local source last\n4. With the junction restored, `migrations/production/` resolves correctly through the link to the local source SQL files\n\n### Frontend Files\n\n**install/index.html**\n- Installation form with all configuration fields\n- Client dropdown populated by JavaScript\n- Form validation and submission\n\n**install/index.js**\n- Database client mapping (`DB_CLIENTS_MAP`)\n- Dynamic client dropdown updates\n- Status polling functionality\n- Form submission handling\n\n**install/css/styles.scss**\n- Installer styling\n\n## MySQL-Only Scripts\n\nThe following SQL migration files only work with MySQL:\n- `migrations/production/reldens-install-v4.0.0.sql`\n- `migrations/production/reldens-basic-config-v4.0.0.sql`\n- `migrations/production/reldens-sample-data-v4.0.0.sql`\n\nFor other databases, these scripts must be manually adapted to the target database syntax.\n\n## Troubleshooting\n\n### \"Non-MySQL client detected, skipping automated SQL scripts\"\n\n**Cause:** Selected a manual database client (PostgreSQL, SQLite, MongoDB, etc.)\n\n**Solution:**\n1. Complete the installer wizard\n2. Manually set up database schema\n3. Run entity generation\n4. Restart application\n\n### \"Connection failed, please check the storage configuration\"\n\n**Cause:** Invalid database credentials or unreachable database server\n\n**Solution:**\n1. Verify database server is running\n2. Check host, port, username, password\n3. Ensure database exists\n4. Check firewall/network settings\n\n### \"Entities generation failed\"\n\n**Cause:** Database schema not found or invalid\n\n**Solution:**\n1. For MySQL: Ensure installation scripts ran successfully\n2. For manual clients: Verify you created all required tables\n3. Check database connection\n4. Ensure user has schema read permissions\n\n### \"Required packages installation failed\"\n\n**Cause:** npm install failed or network issues\n\n**Solution:**\n1. Check internet connection\n2. Manually run: `npm install @reldens/storage`\n3. For Prisma: `npm install @prisma/client`\n4. Check npm logs for errors\n\n## Post-Installation\n\nAfter successful installation:\n1. Application redirects to game\n2. Lock file created at configured path\n3. Installer becomes inaccessible\n4. Use admin panel for further configuration\n5. Access admin at configured path (default: /reldens-admin)\n6. Use configured admin secret key for first login\n\n## Re-installation\n\nTo re-run the installer:\n1. Stop the application\n2. Delete the installation lock file (location configured in ThemeManager)\n3. Optionally drop and recreate database\n4. Start application and navigate to installation wizard\n"
  },
  {
    "path": ".claude/items-system-implementation.md",
    "content": "# Items System Implementation - Complete Documentation\n\n## Overview\n\nThe Reldens Items System manages player inventory, equipment, and item modifiers. It uses the `@reldens/items-system` package for core functionality and integrates with the `@reldens/modifiers` package for stat modifications.\n\n## Architecture\n\n### Core Components\n\n1. **ItemsServer** (`@reldens/items-system`) - Server-side inventory manager\n2. **Inventory** (`@reldens/items-system`) - Base inventory container\n3. **ItemBase** - Base class for all items\n4. **Equipment** - Specialized item type for equippable items\n5. **Modifier** (`@reldens/modifiers`) - Handles stat modifications\n6. **StorageObserver** - Persists inventory changes to database\n\n### Directory Structure\n\n**lib/inventory/**\n- **client/** - Client-side inventory UI and rendering\n- **server/** - Server-side inventory logic\n  - items-factory.js - Creates item instances from database models\n  - message-actions.js - Handles equip/unequip/trade messages\n  - models-manager.js - Database operations\n  - storage-observer.js - Event listeners for persistence\n  - plugin.js - Inventory feature plugin\n  - **subscribers/** - Event subscribers\n    - player-subscriber.js - Creates player inventory on login\n    - player-death-subscriber.js\n- constants.js\n\n## Item Creation Flow\n\n### When Player Logs In\n\n**Entry Point**: `lib/inventory/server/plugin.js` line 50-51\n```javascript\nthis.events.on('reldens.createPlayerStatsAfter', async (client, userModel, currentPlayer, room) => {\n    await PlayerSubscriber.createPlayerInventory(client, currentPlayer, room, this.events, this.modelsManager);\n});\n```\n\n**Sequence**:\n\n1. **Player Stats Loaded** (`lib/users/server/plugin.js` lines 289-309)\n   - Stats loaded from `players_stats` table\n   - Set on `currentPlayer.stats` and `currentPlayer.statsBase`\n   - Event `reldens.createPlayerStatsAfter` fires\n\n2. **Inventory Creation** (`lib/inventory/server/subscribers/player-subscriber.js` lines 30-63)\n   ```javascript\n   let serverProps = {\n       owner: currentPlayer,              // The player schema instance\n       client: new ClientWrapper({client, room}),\n       persistence: true,\n       ownerIdProperty: 'player_id',\n       eventsManager: events,\n       modelsManager: modelsManager,\n       itemClasses: {...},\n       groupClasses: {...},\n       itemsModelData: room.config.inventory.items\n   };\n   let inventoryServer = new ItemsServer(serverProps);\n   inventoryServer.dataServer = new StorageObserver(inventoryServer.manager, modelsManager);\n   ```\n\n3. **Items Loading** (`lib/inventory/server/storage-observer.js` lines 169-182)\n   ```javascript\n   async loadOwnerItems(){\n       let itemsModels = await this.modelsManager.loadOwnerItems(this.manager.getOwnerId());\n       let itemsInstances = await ItemsFactory.fromModelsList(itemsModels, this.manager);\n       await this.manager.fireEvent(ItemsEvents.LOADED_OWNER_ITEMS, this, itemsInstances, itemsModels);\n       await this.manager.setItems(itemsInstances);\n   }\n   ```\n\n4. **Item Instance Creation** (`lib/inventory/server/items-factory.js` lines 40-71)\n   ```javascript\n   static async fromModel(itemInventoryModel, manager){\n       let itemClass = sc.get(\n           manager.itemClasses,\n           itemInventoryModel.related_items_item.key,\n           manager.types.classByTypeId(itemInventoryModel.related_items_item.type)\n       );\n       let itemObj = new itemClass(itemProps);\n       if (itemObj.isType(ItemsConst.TYPES.EQUIPMENT)) {\n           itemObj.equipped = (1 === itemInventoryModel.is_active);  // Mark as equipped if active\n       }\n       await this.enrichWithModifiers(itemInventoryModel, itemObj, manager);\n       return itemObj;\n   }\n   ```\n\n5. **Modifier Creation** (`lib/inventory/server/items-factory.js` lines 79-93)\n   ```javascript\n   static async enrichWithModifiers(itemInventoryModel, itemObj, manager){\n       let modifiers = {};\n       for(let modifierData of itemInventoryModel.related_items_item.related_items_item_modifiers){\n           if(modifierData.operation !== ModifierConst.OPS.SET){\n               modifierData.value = Number(modifierData.value);\n           }\n           modifierData.target = manager.owner;  // Set target to currentPlayer\n           modifiers[modifierData.id] = new Modifier(modifierData);\n       }\n       itemObj.modifiers = modifiers;\n   }\n   ```\n\n### Critical Timing\n\n- **BEFORE items load**: `currentPlayer.stats` is set (fresh object from database)\n- **DURING item creation**: Modifiers get `target = manager.owner = currentPlayer`\n- **AFTER items load**: Modifiers have correct reference to `currentPlayer.stats`\n\n## Equipment Flow\n\n### Manual Equip (User Action)\n\n**Entry Point**: User clicks equip button, client sends message, server receives\n\n1. **Message Reception** (`lib/inventory/server/message-actions.js` lines 71-73)\n   ```javascript\n   if(InventoryConst.ACTIONS.EQUIP === data.act){\n       return await this.executeEquipAction(playerSchema, data);\n   }\n   ```\n\n2. **Execute Equip Action** (`lib/inventory/server/message-actions.js` lines 360-373)\n   ```javascript\n   async executeEquipAction(playerSchema, data){\n       let item = playerSchema.inventory.manager.items[data.idx];\n       if(!item.equipped){\n           this.unEquipPrevious(item.group_id, playerSchema.inventory.manager.items);  // Unequip same group\n           await item.equip();  // Equip new item\n           return true;\n       }\n       await item.unequip();  // If already equipped, unequip\n       return true;\n   }\n   ```\n\n3. **Item Equip Method** (`npm-packages/reldens-items/lib/item/type/equipment.js` lines 26-35)\n   ```javascript\n   async equip(applyMods){\n       this.equipped = true;\n       await this.manager.fireEvent(ItemsEvents.EQUIP_ITEM, this);\n       if(applyMods === false || this.manager.applyModifiersAuto === false){\n           return false;\n       }\n       await this.applyModifiers();  // Apply modifiers automatically\n   }\n   ```\n\n4. **Apply Modifiers** (`npm-packages/reldens-items/lib/item/type/item-base.js` lines 90-105)\n   ```javascript\n   async changeModifiers(revert){\n       await this.manager.fireEvent(ItemsEvents.EQUIP_BEFORE+(revert ? 'Revert': 'Apply')+'Modifiers', this);\n       let modifiersKeys = Object.keys(this.modifiers);\n       let methodName = revert ? 'revert' : 'apply';\n       for(let i of modifiersKeys){\n           this.modifiers[i][methodName](this.target);  // this.target is false, but modifier has its own target\n       }\n       return this.manager.fireEvent(ItemsEvents.EQUIP+(revert ? 'Reverted' : 'Applied')+'Modifiers', this);\n   }\n   ```\n\n5. **Modifier Execute** (`npm-packages/reldens-modifiers/lib/modifier.js` lines 84-108)\n   ```javascript\n   execute(target, revert = false, useBasePropertyToGetValue = false, applyOnBaseProperty = false){\n       // If target param is false, use this.target (set to currentPlayer in factory)\n       if(target){\n           this.target = target;\n       }\n       let newValue = this.getModifiedValue(revert, useBasePropertyToGetValue);\n       let applyToProp = applyOnBaseProperty ? this.basePropertyKey : this.propertyKey;\n       this.setOwnerProperty(applyToProp, newValue);  // Sets currentPlayer.stats.atk\n       this.state = revert ? ModifierConst.MOD_REVERTED : ModifierConst.MOD_APPLIED;\n       return true;\n   }\n   ```\n\n6. **Property Manager Sets Value** (`npm-packages/reldens-modifiers/lib/property-manager.js` lines 22-34)\n   ```javascript\n   manageOwnerProperty(propertyOwner, propertyString, value){\n       let propertyPathParts = propertyString.split('/');  // ['stats', 'atk']\n       let childPropertyOwner = this.extractChildPropertyOwner(propertyOwner, propertyPathParts);  // Get stats object\n       let propertyKey = propertyPathParts[propertyPathParts.length-1];  // 'atk'\n       if('undefined' === typeof value && !sc.hasOwn(childPropertyOwner, propertyKey)){\n           ErrorManager.error('Invalid property \"'+propertyKey+'\" from path: \"'+propertyPathParts.join('/')+'\"].');\n       }\n       if('undefined' !== typeof value){\n           childPropertyOwner[propertyKey] = value;  // Sets stats.atk = newValue\n       }\n       return childPropertyOwner[propertyKey];\n   }\n   ```\n\n7. **Stats Persistence** (`lib/inventory/server/storage-observer.js` lines 68-79)\n   ```javascript\n   this.manager.listenEvent(\n       ItemsEvents.EQUIP+'AppliedModifiers',\n       this.updateAppliedModifiers.bind(this),\n       ...\n   );\n\n   async updateAppliedModifiers(item){\n       return await this.modelsManager.onChangedModifiers(item, ModifierConst.MOD_APPLIED);\n   }\n   ```\n\n8. **Persist Data** (`lib/inventory/server/models-manager.js` lines 127-131)\n   ```javascript\n   async onChangedModifiers(item, action){\n       return await item.manager.owner.persistData({act: action, item: item});\n   }\n   ```\n\n9. **Save Player Stats** (`lib/rooms/server/scene.js` lines 228-234)\n   ```javascript\n   currentPlayer.persistData = async (params) => {\n       await this.savePlayedTime(currentPlayer);\n       await this.savePlayerState(currentPlayer.sessionId);\n       await this.savePlayerStats(currentPlayer, client);  // Saves stats to database\n   };\n   ```\n\n10. **Client Update** (`lib/rooms/server/scene.js` lines 759-763)\n    ```javascript\n    client.send('*', {\n        act: GameConst.PLAYER_STATS,\n        stats: playerSchema.stats,\n        statsBase: playerSchema.statsBase\n    });\n    ```\n\n## Modifier Operations\n\nFrom `@reldens/modifiers/lib/constants.js`:\n\n**1. INC - Increase (flat)**\n- Apply: `value + operand`\n- Revert: `value - operand`\n\n**2. DEC - Decrease**\n- Apply: `value - operand`\n- Revert: `value + operand`\n\n**3. DIV - Divide**\n- Apply: `value / operand`\n- Revert: `value * operand`\n\n**4. MUL - Multiply**\n- Apply: `value * operand`\n- Revert: `value / operand`\n\n**5. INC_P - Increase by %**\n- Apply: `value + (value * operand / 100)`\n- Revert: Complex percentage revert\n\n**6. DEC_P - Decrease by %**\n- Apply: `value - (value * operand / 100)`\n- Revert: Complex percentage revert\n\n**7. SET - Set value**\n- Apply: `operand`\n- Revert: `false`\n\n**8. METHOD - Custom method**\n- Apply: Calls custom method on modifier\n- Revert: Calls custom method\n\n**9. SET_N - Set (alt)**\n- Apply: `operand`\n- Revert: `false`\n\n### INC_P (Increase Percentage) Calculation\n\nFrom `@reldens/modifiers/lib/calculator.js` lines 30-37:\n\n**Apply**:\n```javascript\nreturn originalValue + Math.round(originalValue * operationValue / 100);\n```\nExample: atk=100, value=5 results in 100 + Math.round(100 * 5 / 100) = 100 + 5 = 105\n\n**Revert**:\n```javascript\nlet revertValue = Math.ceil(originalValue - (originalValue / (100 - operationValue)) * 100);\nreturn originalValue + revertValue;\n```\nExample: atk=105, value=5 results in Math.ceil(105 - (105/95)*100) = Math.ceil(-5.26) = -5 then 105 + (-5) = 100\n\n## Database Schema\n\n### items_item (Item Definitions)\n```sql\nCREATE TABLE `items_item` (\n    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n    `key` varchar(255) NOT NULL,\n    `type` int(11) NOT NULL,\n    `group_id` int(10) unsigned DEFAULT NULL,\n    `label` varchar(255) DEFAULT NULL,\n    `description` text,\n    `qty_limit` int(11) DEFAULT NULL,\n    `uses_limit` int(11) DEFAULT NULL,\n    `useTimeOut` int(11) DEFAULT NULL,\n    `execTimeOut` int(11) DEFAULT NULL,\n    `customData` text,\n    PRIMARY KEY (`id`)\n);\n```\n\n### items_item_modifiers (Item Modifier Definitions)\n```sql\nCREATE TABLE `items_item_modifiers` (\n    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n    `item_id` int(10) unsigned NOT NULL,\n    `key` varchar(255) NOT NULL,\n    `property_key` varchar(255) NOT NULL,\n    `operation` int(11) NOT NULL,\n    `value` varchar(255) NOT NULL,\n    `maxProperty` varchar(255) DEFAULT NULL,\n    PRIMARY KEY (`id`),\n    FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`)\n);\n```\n\n- `item_id`: References the item this modifier belongs to\n- `key`: Modifier identifier (e.g., 'atk')\n- `property_key`: Path to property to modify (e.g., 'stats/atk')\n- `operation`: Operation ID (1-9, see Modifier Operations table)\n- `value`: Value to apply (as string, converted to number if not SET operation)\n- `maxProperty`: Optional max value property path (e.g., 'statsBase/hp')\n\n### items_inventory (Player Item Instances)\n```sql\nCREATE TABLE `items_inventory` (\n    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n    `owner_id` int(10) unsigned NOT NULL,\n    `item_id` int(10) unsigned NOT NULL,\n    `qty` int(11) NOT NULL,\n    `remaining_uses` int(11) DEFAULT NULL,\n    `is_active` tinyint(1) DEFAULT 0,\n    PRIMARY KEY (`id`),\n    FOREIGN KEY (`owner_id`) REFERENCES `players` (`id`),\n    FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`)\n);\n```\n\n- `owner_id`: Player ID who owns this item instance\n- `item_id`: References the item definition\n- `qty`: Quantity (-1 for unlimited)\n- `remaining_uses`: Uses left (if item has uses limit)\n- `is_active`: 1 if equipped, 0 if not (for equipment items only)\n\n## Event Flow\n\n### Equipment Events Sequence\n\n1. `ItemsEvents.EQUIP_ITEM` - Fired when equip() starts\n   - **Listener**: `StorageObserver.saveEquippedItemAsActive()` - Updates `is_active=1` in database\n\n2. `ItemsEvents.EQUIP_BEFORE+'Apply'+'Modifiers'` - Before modifiers are applied\n   - No default listeners\n\n3. `ItemsEvents.EQUIP+'Applied'+'Modifiers'` - After modifiers are applied\n   - **Listener**: `StorageObserver.updateAppliedModifiers()` - Calls `persistData()` to save stats\n\n4. `reldens.playerPersistDataBefore` - Before data persistence\n   - Custom hooks can intercept here\n\n5. `reldens.savePlayerStatsUpdateClient` - After stats saved, before client update\n   - **Listener**: `UsersPlugin.updateClientsWithPlayerStats()` - Updates life bar UI\n\n6. Client receives `GameConst.PLAYER_STATS` message with updated stats\n\n### Unequip Events Sequence\n\n1. `ItemsEvents.UNEQUIP_ITEM` - Fired when unequip() starts\n   - **Listener**: `StorageObserver.saveUnequippedItemAsInactive()` - Updates `is_active=0` in database\n\n2. `ItemsEvents.EQUIP_BEFORE+'Revert'+'Modifiers'` - Before modifiers are reverted\n   - No default listeners\n\n3. `ItemsEvents.EQUIP+'Reverted'+'Modifiers'` - After modifiers are reverted\n   - **Listener**: `StorageObserver.updateRevertedModifiers()` - Calls `persistData()` to save stats\n\n4-6. Same persistence and client update flow as equip\n\n## Testing Checklist\n\n- Equip item - Stats increase correctly\n- Unequip item - Stats revert to base value\n- Logout with equipped item - Stats saved correctly\n- Login with equipped item - Stats loaded with modifiers applied\n- Unequip after login - Stats revert to base value correctly\n- Multiple items in same group - Only one equipped at a time\n- Percentage modifiers - Calculate correctly for different base values\n- Flat modifiers - Add/subtract exact values\n- Max/min property limits - Respect statsBase maximums\n\n## Performance Considerations\n\n- Modifiers are applied synchronously in a loop (item-base.js line 101-103)\n- For items with many modifiers, this could cause brief delay\n- Stats are saved to database after every equip/unequip operation\n- Consider batching stats updates if players frequently swap equipment\n\n## Extension Points\n\n### Custom Item Types\n\nCreate custom item class extending ItemBase or Equipment:\n```javascript\nconst Equipment = require('@reldens/items-system').ItemBase;\n\nclass MagicWeapon extends Equipment {\n    async equip(applyMods){\n        // Custom equip logic\n        await super.equip(applyMods);\n        // Post-equip custom logic\n    }\n}\n```\n\nRegister in `server/customClasses/inventory/items`:\n```javascript\nitemClasses: {\n    'magic_sword': MagicWeapon\n}\n```\n\n### Custom Modifiers\n\nCreate custom modifier with METHOD operation:\n```javascript\nconst { Modifier } = require('@reldens/modifiers');\n\nclass CustomModifier extends Modifier {\n    customCalculation(modifier, propertyValue){\n        // Your custom logic\n        return newValue;\n    }\n}\n```\n\nSet in database:\n```sql\nINSERT INTO items_item_modifiers VALUES (\n    NULL, item_id, 'custom', 'stats/custom', 8, 'customCalculation', NULL\n);\n```\n\n### Event Hooks\n\nHook into any event for custom logic:\n```javascript\nevents.on('reldens.createdPlayerSchema', async (client, userModel, currentPlayer, room) => {\n    // Custom logic when player is created\n});\n\ninventoryServer.manager.listenEvent(ItemsEvents.EQUIP_ITEM, async (item) => {\n    // Custom logic when any item is equipped\n});\n```\n\n## References\n\n- `@reldens/items-system` package: D:\\dap\\work\\reldens\\npm-packages\\reldens-items\n- `@reldens/modifiers` package: D:\\dap\\work\\reldens\\npm-packages\\reldens-modifiers\n- Sample data: D:\\dap\\work\\reldens\\src\\migrations\\production\\reldens-sample-data-v4.0.0.sql\n"
  },
  {
    "path": ".claude/player-state-flow.md",
    "content": "# Player State Flow - Complete Technical Guide\n\n## Overview\n\nThis document explains the complete player state management system in Reldens, including the database entity refactor that introduced the \"related_\" naming convention, and how player state flows from database to runtime.\n\n---\n\n## Architecture Layers\n\n### 1. Database Layer (Persistent Storage)\n\nAfter the entity refactor, all database relations use the **\"related_\" prefix** (this is the NEW/CURRENT convention, NOT legacy):\n\n```javascript\nUsersModel {\n  id: number,\n  email: string,\n  username: string,\n  password: string,\n  role_id: number,\n\n  // NEW: Database relations with \"related_\" prefix\n  related_users_login: UsersLoginModel[],\n  related_players: PlayersModel[]  // ← Array of all players for this user\n}\n\nPlayersModel {\n  id: number,\n  user_id: number,\n  name: string,\n  created_at: Date,\n  updated_at: Date,\n\n  // NEW: Player state from database (persistent)\n  related_players_state: PlayersStateModel {\n    id: number,\n    player_id: number,\n    room_id: number,    // ← Last SAVED room\n    x: number,          // ← Last SAVED position\n    y: number,\n    dir: string\n    // NOTE: NO scene property in database model!\n  }\n}\n```\n\n**Key Points:**\n- `related_players` is an **array** (users can have multiple characters)\n- `related_players_state` is the **database snapshot** of player position\n- Database model does NOT include `scene` property (only `room_id`)\n\n---\n\n### 2. Runtime Layer (In-Memory During Gameplay)\n\nDuring login and gameplay, additional properties are added for runtime state management:\n\n```javascript\n// After login processing:\nuserModel {\n  ...database fields,\n  related_players: PlayersModel[],  // From database\n\n  // ADDED AT RUNTIME: Selected player reference\n  player: PlayersModel {             // ← Selected from related_players[]\n    ...database fields,\n    related_players_state: { ... },  // Database snapshot\n\n    // ADDED AT RUNTIME: Enhanced runtime state\n    state: {\n      room_id: number,    // ← CURRENT room (updated during gameplay)\n      x: number,          // ← CURRENT position\n      y: number,\n      dir: string,\n      scene: string       // ← ADDED: Room name (not in database!)\n    }\n  }\n}\n```\n\n**Key Points:**\n- `userModel.player` is **assigned at runtime** from `related_players[]`\n- `player.state` is **created during login** and updated during gameplay\n- `player.state.scene` is **added by server**, not from database\n- `related_players_state` remains **unchanged** after initial load (becomes stale)\n\n---\n\n## Complete Login Flow\n\n### Step 1: User Authentication\n\n**File:** `lib/rooms/server/login.js:70-107` (onAuth)\n\n```javascript\nasync onAuth(client, options, request) {\n    // Load user from database\n    let loginResult = await this.loginManager.processUserRequest(options);\n\n    // Select player if specified\n    if(sc.hasOwn(options, 'selectedPlayer')){\n        loginResult.user.player = this.getPlayerByIdFromArray(\n            loginResult.user.related_players,  // ← From database array\n            options.selectedPlayer\n        );\n    }\n\n    return loginResult.user;  // ← Becomes userModel in onJoin\n}\n```\n\n### Step 2: Load User From Database\n\n**File:** `lib/users/server/manager.js:67-83`\n\n```javascript\nasync loadUserByUsername(username) {\n    let loadedUser = await this.usersRepository.loadOneByWithRelations(\n        'username',\n        username,\n        ['related_users_login', 'related_players.related_players_state']\n        //                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n        //                        Loads players WITH their state from DB\n    );\n    return loadedUser;\n}\n```\n\n**Result:** User loaded with `related_players[]` array, each player has `related_players_state` from database.\n\n### Step 3: Map Player State Relation\n\n**File:** `lib/game/server/login-manager.js:351-361`\n\n```javascript\nmapPlayerStateRelation(user) {\n    if(!sc.isArray(user.related_players)){\n        return;\n    }\n    for(let player of user.related_players){\n        if(player.related_players_state && !player.state){\n            // Create runtime state from database state\n            player.state = player.related_players_state;\n        }\n    }\n}\n```\n\n**CRITICAL:** This creates `player.state` by assigning `player.related_players_state`.\n\n**Question:** Is this assignment by reference or copy?\n- In JavaScript, object assignment is **by reference**\n- BUT: Database ORM models might be immutable/frozen\n- **Result:** They can diverge during gameplay\n\n### Step 4: Set Scene On Players\n\n**File:** `lib/game/server/login-manager.js:423-441`\n\n```javascript\nasync setSceneOnPlayers(user, userData) {\n    for(let player of user.related_players){\n        if(!player.state){\n            continue;\n        }\n\n        // Check if user selected a different scene on login\n        let config = this.config.get('client/rooms/selection');\n        if(config.allowOnLogin && userData['selectedScene'] &&\n           userData['selectedScene'] !== RoomsConst.ROOM_LAST_LOCATION_KEY){\n            await this.applySelectedLocation(player, userData['selectedScene']);\n        }\n\n        // CRITICAL: Add scene property to state\n        player.state.scene = await this.getRoomNameById(player.state.room_id);\n        //           ^^^^^ ADDED HERE - not in database!\n    }\n}\n```\n\n**Result:** Each player now has `player.state.scene` with the room name string.\n\n### Step 5: Select Player (Runtime Assignment)\n\n**File:** `lib/rooms/server/login.js:89-91`\n\n```javascript\nif(sc.hasOwn(options, 'selectedPlayer')){\n    loginResult.user.player = this.getPlayerByIdFromArray(\n        loginResult.user.related_players,\n        options.selectedPlayer\n    );\n}\n```\n\n**Result:** `userModel.player` now references ONE player from the array with both:\n- `player.related_players_state` (database snapshot)\n- `player.state` (runtime state with scene)\n\n---\n\n## Gameplay Flow\n\n### Joining Scene Room\n\n**File:** `lib/rooms/server/scene.js:126-156`\n\n```javascript\nasync onJoin(client, options, userModel) {\n    // userModel already has player selected from onAuth\n\n    // Validate using RUNTIME state (not database state!)\n    if(this.validateRoomData){\n        if(!userModel.player.state){  // ← Check runtime state exists\n            Logger.warning('Missing user player state.', userModel);\n            return false;\n        }\n        if(!this.validateRoom(userModel.player.state.scene, isGuest)){\n            //                            ^^^^^ Use runtime state with scene!\n            return false;\n        }\n    }\n\n    // Create player schema in room...\n}\n```\n\n**FIX APPLIED:** Changed from `related_players_state.scene` (doesn't exist) to `state.scene` (exists).\n\n### Saving Player State During Gameplay\n\n**File:** `lib/rooms/server/scene.js:708-737`\n\n```javascript\nasync savePlayerState(sessionId) {\n    let playerSchema = this.playerBySessionIdFromState(sessionId);\n\n    // Extract CURRENT position from runtime state\n    let {room_id, x, y, dir} = playerSchema.state;  // ← From state, NOT related_players_state\n    let playerId = playerSchema.player_id;\n    let updatePatch = {room_id, x: parseInt(x), y: parseInt(y), dir};\n\n    // Update database with CURRENT position\n    updateResult = await this.loginManager.usersManager.updateUserStateByPlayerId(\n        playerId,\n        updatePatch\n    );\n\n    return playerSchema;\n}\n```\n\n**Key Points:**\n- Database updated FROM `playerSchema.state` (runtime)\n- Database updated TO `players_state` table (will become `related_players_state` on next login)\n- `related_players_state` in current session is NEVER updated (remains stale)\n\n---\n\n## Data Flow Diagram\n\n**Step 1: DATABASE (players_state table)**\n- room_id: 4, x: 400, y: 345, dir: 'down'\n- (NO scene property)\n\n**Step 2: LOAD - UsersManager.loadUserByUsername()**\n- related_players[].related_players_state = database snapshot\n\n**Step 3: MAP - LoginManager.mapPlayerStateRelation()**\n- player.state = player.related_players_state\n- (Assignment creates runtime state)\n\n**Step 4: ENHANCE - LoginManager.setSceneOnPlayers()**\n- player.state.scene = getRoomNameById(player.state.room_id)\n- (Adds scene property to runtime state)\n\n**Step 5: SELECT - RoomLogin.onAuth()**\n- userModel.player = getPlayerByIdFromArray(...)\n- (Assigns selected player to userModel.player)\n\n**Step 6: VALIDATE - RoomScene.onJoin()**\n- Check: userModel.player.state exists\n- Validate: userModel.player.state.scene matches room\n\n**Step 7: GAMEPLAY - Player moves, changes scenes**\n- Updates: playerSchema.state (runtime)\n- Unchanged: player.related_players_state (stale)\n\n**Step 8: SAVE - RoomScene.savePlayerState()**\n- Read FROM: playerSchema.state (current position)\n- Write TO: database players_state table\n- (Becomes related_players_state on next login)\n\n---\n\n## State Divergence\n\nAfter login, you have **TWO sources of state** that can diverge:\n\n### Example Session:\n\n**Initial Login:**\n```javascript\nuserModel.player.related_players_state = {\n  room_id: 4,  // Town (from database)\n  x: 400,\n  y: 345,\n  dir: 'down'\n}\n\nuserModel.player.state = {\n  room_id: 4,  // Same as database\n  x: 400,\n  y: 345,\n  dir: 'down',\n  scene: 'reldens-town'  // Added by server\n}\n```\n\n**After Scene Change (player moves to house):**\n```javascript\nuserModel.player.related_players_state = {\n  room_id: 4,  // UNCHANGED (stale)\n  x: 400,\n  y: 345,\n  dir: 'down'\n}\n\nuserModel.player.state = {\n  room_id: 2,  // UPDATED to house\n  x: 548,\n  y: 615,\n  dir: 'up',\n  scene: 'reldens-house-1'  // UPDATED\n}\n```\n\n**On Logout:** `state` is saved to database, becomes `related_players_state` on next login.\n\n---\n\n## Key Takeaways\n\n1. **\"related_\" prefix is the NEW database relation naming** (not legacy)\n2. **`related_players_state`** = Database snapshot (stale after load, no scene property)\n3. **`state`** = Runtime state (active, has scene property, source of truth for gameplay)\n4. **`scene` property** = Only exists in runtime `state`, NOT in database model\n5. **Validation must use** `player.state.scene`, NOT `player.related_players_state.scene`\n6. **Database updates** read from `state` and write to `players_state` table\n7. **`related_players_state` is never updated** during a session (snapshot only)\n\n---\n\n## Code References\n\n**Key Files:**\n- `lib/users/server/manager.js:67-83` - Load user with relations\n- `lib/game/server/login-manager.js:351-361` - Map player state relation\n- `lib/game/server/login-manager.js:423-441` - Set scene on players\n- `lib/rooms/server/login.js:70-107` - Authentication and player selection\n- `lib/rooms/server/scene.js:126-156` - Scene validation\n- `lib/rooms/server/scene.js:708-737` - Save player state\n\n**Database Tables:**\n- `users` - User accounts\n- `players` - Player characters\n- `players_state` - Player positions (becomes `related_players_state` when loaded)\n\n**Entity Relations:**\n- `UsersModel.related_players` relates to `PlayersModel[]`\n- `PlayersModel.related_players_state` relates to `PlayersStateModel`\n"
  },
  {
    "path": ".claude/room-data-optimization.md",
    "content": "# Room Data Optimization - Scene Data Filter\n\n**Purpose**: Optimize Colyseus schema buffer usage by detecting and extracting shared properties from room objects, reducing data transmission size without losing functionality.\n\n---\n\n## Overview\n\nThe SceneDataFilter system prevents Colyseus buffer overflow by analyzing room data and extracting identical properties across multiple objects into a shared defaults structure. This reduces buffer usage from ~176 KB to under 64 KB for rooms with 400+ objects.\n\n**Key Components**:\n- **Server**: `SceneDataFilter` (`lib/rooms/server/scene-data-filter.js`) - Detects shared properties, creates optimized data structure\n- **Client**: `AnimationsDefaultsMerger` (`lib/game/client/animations-defaults-merger.js`) - Merges defaults back into objects\n\n**Critical Design Principle**: The filter NEVER adds properties to objects. It ONLY extracts existing identical properties to a separate defaults structure.\n\n---\n\n## Server-Side: SceneDataFilter\n\n### Architecture\n\n**SceneDataFilter Methods:**\n- filterRoomData() - Main entry (called by State.mapRoomData)\n- buildCompleteData() - Returns unfiltered data (sendAll: true)\n- buildFilteredData() - Returns optimized data (sendAll: false)\n- optimizeData() - Generic optimization method\n- detectIdenticalProperties() - Finds shared properties across objects\n- valuesAreDifferent() - Compares values for optimization\n\n### How It Works\n\n1. **No Hardcoded Fields**: Filter dynamically detects which fields are identical across objects\n2. **Grouping**: Objects are grouped by a shared field for comparison\n   - `preloadAssets`: Groups by `asset_type` (filters `asset_type === 'spritesheet'`)\n   - `objectsAnimationsData`: Groups by `asset_key` field, falls back to `key` field if `asset_key` not present\n3. **Detection**: For each group with 2+ objects, detects properties with identical values across ALL objects\n4. **Extraction**: Identical properties extracted to defaults object, keyed by grouping field value\n5. **Grouping Field Preservation**: The grouping field (e.g., `asset_key`) is removed from defaults and kept in each object so client can look up defaults\n\n### Optimization Logic\n\n```javascript\n// Example: 200 objects with asset_key: 'enemy_forest_1'\n{\n  'enemy_1': {asset_key: 'enemy_forest_1', type: 'npc', enabled: true, x: 100, y: 200},\n  'enemy_2': {asset_key: 'enemy_forest_1', type: 'npc', enabled: true, x: 150, y: 250},\n  ...\n}\n\n// Filter detects: type, enabled are identical across all 200 objects\n// Result:\n{\n  objectsAnimationsData: {\n    'enemy_1': {asset_key: 'enemy_forest_1', x: 100, y: 200},\n    'enemy_2': {asset_key: 'enemy_forest_1', x: 150, y: 250},\n    ...\n  },\n  animationsDefaults: {\n    'enemy_forest_1': {type: 'npc', enabled: true, ...}\n  }\n}\n```\n\n**Key Points**:\n- `asset_key` stays in each object (needed for client to lookup defaults)\n- Only properties with IDENTICAL values across ALL objects in group are extracted\n- Properties with different values (x, y, content, options, id) stay in each object\n- Single-object groups are NOT optimized (no shared properties to extract)\n\n### When Optimization Happens vs Doesn't\n\n**Town Room (6 NPCs)**:\n- Each NPC has unique properties (different types, content, options)\n- No groups with 2+ identical objects\n- Result: `animationsDefaults: {}` (empty), all data stays in objects\n- All objects keep their original structure with `key` field as asset reference\n\n**Forest Room (400 NPCs)**:\n- 200 enemies of type A, 200 enemies of type B\n- Each group has identical shared properties\n- Result: `animationsDefaults: {'enemy_forest_1': {...}, 'enemy_forest_2': {...}}`\n- Optimized objects have `asset_key` field added by filter for grouping\n- Optimized objects contain only unique properties (x, y) + `asset_key` reference\n\n### preloadAssets Filtering\n\n**Process**:\n1. Filters only `asset_type === 'spritesheet'` (matches client loader)\n2. Groups remaining assets by `asset_type`\n3. Detects identical properties across assets with same type\n4. Extracts to `preloadAssetsDefaults[asset_type]`\n\n**Typically Kept Fields** (detected dynamically, NOT hardcoded):\n- `asset_type` - Grouping field (stays in each asset)\n- `asset_key` - Usually unique per asset\n- `asset_file` - Usually unique per asset\n- `extra_params` - Often identical for same asset_type\n\n**Typically Removed to Defaults** (if identical across assets):\n- Database metadata fields if they happen to be identical\n\n**Result**: Minimal optimization for preloadAssets since most fields are unique per asset.\n\n### objectsAnimationsData Optimization\n\n**Process**:\n1. Groups objects by `asset_key` field (or `key` field if no `asset_key`)\n2. For groups with 2+ objects: Detects identical properties\n3. Removes grouping field from identical properties (keeps in each object)\n4. Extracts identical properties to `animationsDefaults[grouping_value]`\n5. Objects retain only unique properties + grouping field reference\n\n**Grouping Field Priority**:\n1. Use `asset_key` if present (already set by server for optimized objects)\n2. Fall back to `key` field if no `asset_key` (non-optimized objects)\n\n**Critical**: Grouping field (`asset_key` or `key`) is NEVER extracted to defaults. It must stay in each object so client can look up the correct defaults entry.\n\n---\n\n## Client-Side: AnimationsDefaultsMerger\n\n### Purpose\n\nMerges extracted defaults back into objects after receiving optimized data from server.\n\n### When It Runs\n\n```javascript\n// Only runs if roomData has animationsDefaults property\nif(sc.hasOwn(roomData, 'animationsDefaults')){\n    AnimationsDefaultsMerger.mergeDefaults(roomData);\n}\n```\n\n**Important**: Server adds `animationsDefaults: {}` (even if empty) when filter is active. This triggers the merger to run.\n\n### Merge Logic\n\n```javascript\nfor(let key of objectKeys){\n    let objectData = objectsAnimationsData[key];\n\n    // Only process objects with asset_key from server (optimized objects)\n    if(!sc.hasOwn(objectData, 'asset_key')){\n        continue;  // Keep non-optimized objects untouched\n    }\n\n    // Set key to map index for optimized objects\n    objectData.key = key;\n\n    // Lookup and merge defaults\n    let assetKey = objectData.asset_key;\n    if(sc.hasOwn(animationsDefaults, assetKey)){\n        let defaults = animationsDefaults[assetKey];\n        objectsAnimationsData[key] = Object.assign({}, defaults, objectData);\n    }\n}\n```\n\n### Key Behavior\n\n**Optimized Objects** (have `asset_key` from server):\n1. `objectData.key` set to map index (e.g., 'enemy_1')\n2. Defaults looked up using `asset_key` value\n3. Merged: `Object.assign({}, defaults, objectData)` - object properties override defaults\n4. Result has all properties needed for rendering\n\n**Non-Optimized Objects** (no `asset_key` from server):\n1. Skipped entirely - no modifications\n2. `objectData.key` keeps original value (asset reference like 'people_town_1')\n3. All original properties preserved as-is\n4. Ready for rendering without merge\n\n### Why This Matters\n\nThe merger MUST check for `asset_key` presence before modifying objects because:\n- **Objects without `asset_key`**: Were NOT optimized by server, have complete data, use `key` field as asset reference\n- **Objects with `asset_key`**: Were optimized by server, have partial data, need defaults merged, use `asset_key` as asset reference\n\nIf merger modifies non-optimized objects (changes their `key` field), it breaks asset loading and dialog functionality.\n\n---\n\n## Data Flow Examples\n\n### Town Room (No Optimization)\n\n**Server Processing**:\n```javascript\n// Original data\nobjectsAnimationsData: {\n  'ground-collisions444': {\n    key: 'door_house_1',\n    type: 'anim',\n    enabled: true,\n    x: 400,\n    y: 310,\n    ...all properties...\n  },\n  'house-collisions-over-player535': {\n    key: 'people_town_1',\n    type: 'npc',\n    enabled: true,\n    content: 'Hello! My name is Alfred...',\n    x: 240,\n    y: 368,\n    ...all properties...\n  }\n}\n\n// SceneDataFilter analysis:\n// - Group by 'key' field (no asset_key present)\n// - Each object has unique 'key' value = single-object groups\n// - No optimization performed\n\n// Server output\n{\n  objectsAnimationsData: { ...unchanged... },\n  animationsDefaults: {}  // Empty - triggers merger but no data to merge\n}\n```\n\n**Client Processing**:\n```javascript\n// AnimationsDefaultsMerger.mergeDefaults() runs\nfor(let key of ['ground-collisions444', 'house-collisions-over-player535']){\n    let objectData = objectsAnimationsData[key];\n\n    // Check for asset_key\n    if(!sc.hasOwn(objectData, 'asset_key')){\n        continue;  // SKIP - no modifications, keep original data\n    }\n}\n\n// Result: All objects unchanged\nobjectsAnimationsData: {\n  'ground-collisions444': {key: 'door_house_1', ...},\n  'house-collisions-over-player535': {key: 'people_town_1', ...}\n}\n\n// AnimationEngine uses props.key fallback\n// object['ground-collisions444'].key = 'door_house_1' loads asset 'door_house_1'\n// object['house-collisions-over-player535'].key = 'people_town_1' NPC dialog works\n```\n\n### Forest Room (With Optimization)\n\n**Server Processing**:\n```javascript\n// Original data: 400 objects, 200 identical enemies per type\nobjectsAnimationsData: {\n  'enemy_1': {\n    asset_key: 'enemy_forest_1',  // Already set by server\n    type: 'npc',\n    enabled: true,\n    targetName: 'enemy-pve',\n    layerName: 'enemies-layer',\n    x: 100,\n    y: 200\n  },\n  'enemy_2': {\n    asset_key: 'enemy_forest_1',\n    type: 'npc',\n    enabled: true,\n    targetName: 'enemy-pve',\n    layerName: 'enemies-layer',\n    x: 150,\n    y: 250\n  },\n  // ... 198 more with same asset_key\n}\n\n// SceneDataFilter analysis:\n// - Group by 'asset_key' field\n// - 'enemy_forest_1' group has 200 objects\n// - Detects identical: type, enabled, targetName, layerName\n// - Keeps unique: x, y (different per object)\n// - Keeps grouping field: asset_key (needed for lookup)\n\n// Server output\n{\n  objectsAnimationsData: {\n    'enemy_1': {asset_key: 'enemy_forest_1', x: 100, y: 200},\n    'enemy_2': {asset_key: 'enemy_forest_1', x: 150, y: 250},\n    // ... 198 more (only unique props + asset_key)\n  },\n  animationsDefaults: {\n    'enemy_forest_1': {\n      type: 'npc',\n      enabled: true,\n      targetName: 'enemy-pve',\n      layerName: 'enemies-layer',\n      // ... all shared properties\n    }\n  }\n}\n```\n\n**Client Processing**:\n```javascript\n// AnimationsDefaultsMerger.mergeDefaults() runs\nfor(let key of ['enemy_1', 'enemy_2', ...]){\n    let objectData = objectsAnimationsData[key];\n    // {asset_key: 'enemy_forest_1', x: 100, y: 200}\n\n    // Check for asset_key\n    if(!sc.hasOwn(objectData, 'asset_key')){\n        continue;  // NOT executed - asset_key exists\n    }\n\n    // Set key to map index\n    objectData.key = key;  // 'enemy_1'\n\n    // Lookup defaults\n    let assetKey = objectData.asset_key;  // 'enemy_forest_1'\n    let defaults = animationsDefaults['enemy_forest_1'];\n\n    // Merge\n    objectsAnimationsData[key] = Object.assign({}, defaults, objectData);\n    // Result: {\n    //   type: 'npc',\n    //   enabled: true,\n    //   targetName: 'enemy-pve',\n    //   layerName: 'enemies-layer',\n    //   asset_key: 'enemy_forest_1',\n    //   key: 'enemy_1',\n    //   x: 100,\n    //   y: 200\n    // }\n}\n\n// AnimationEngine uses props.asset_key (exists) loads asset 'enemy_forest_1'\n// All properties restored from defaults + unique props\n```\n\n---\n\n## Performance Impact\n\n### 400 Objects Example (Forest Room)\n\n**Unfiltered**:\n- preloadAssets: 400 × 2 assets × 275 bytes = 220 KB\n- objectsAnimationsData: 400 × 150 bytes = 60 KB\n- roomData: 10 KB\n- **Total sceneData**: ~290 KB\n- **Total State (with 50 players)**: ~176 KB encoded\n- **Buffer overflow**: Required 176 KB vs 8 KB default\n\n**Optimized**:\n- preloadAssets: 2 spritesheets × 95 bytes = 0.2 KB\n- objectsAnimationsData: 400 × 35 bytes = 14 KB\n- animationsDefaults: 2 entries × 140 bytes = 0.3 KB\n- roomData: 10 KB\n- **Total sceneData**: ~25 KB\n- **Total State (with 50 players)**: ~80 KB encoded\n\n**Reduction**:\n- sceneData: 265 KB saved (91% reduction)\n- Total State: 96 KB saved (54.5% reduction)\n\n---\n\n## Configuration\n\n### sendAll Flag\n\n**Path**: `server/rooms/data/sendAll`\n**Default**: `false` (filtering enabled)\n\n```sql\nINSERT INTO config (path, value, scope) VALUES\n('server/rooms/data/sendAll', 'false', 'server');\n```\n\n**Values**:\n- `false`: Enables optimization (recommended for production)\n- `true`: Sends all data unfiltered (debugging only)\n\n### Custom Processor\n\nFor custom filtering logic, define a processor in server plugin.\n\n**Path**: `server/customClasses/sceneDataProcessor`\n**Method**: `process({ roomData, filter })`\n\n**Example**:\n```javascript\nclass CustomSceneDataProcessor {\n    process({ roomData, filter }) {\n        let customData = Object.assign({}, roomData);\n        // Use filter methods for standard optimization\n        let optimized = filter.buildFilteredData(roomData);\n        // Add custom fields\n        customData.customField = 'custom value';\n        return Object.assign({}, optimized, customData);\n    }\n}\n\nconfig.set('server/customClasses/sceneDataProcessor', new CustomSceneDataProcessor());\n```\n\n---\n\n## Key Concepts\n\n### asset_key Field\n\n**Purpose**: Reference to shared defaults, used for grouping and lookup\n\n**When Present**:\n- Server added it during optimization (object was grouped with others)\n- Indicates object has partial data, needs defaults merged\n- Client uses it to lookup defaults and as asset reference\n\n**When NOT Present**:\n- Object was not optimized (unique properties, single-object group)\n- Object has complete data, no merge needed\n- Client uses `key` field as asset reference\n\n### key Field\n\n**Two Different Roles**:\n\n1. **Non-Optimized Objects**: Asset reference (e.g., 'people_town_1')\n   - Original value from server\n   - AnimationEngine fallback: `sc.get(props, 'asset_key', props.key)`\n   - Used to load sprite asset\n\n2. **Optimized Objects**: Map index (e.g., 'enemy_1')\n   - Set by client merger to map key\n   - Not used for asset loading (asset_key used instead)\n   - Identifies object instance\n\n### Grouping Fields\n\n**Purpose**: Field used to group objects for comparison and defaults lookup\n\n**Requirements**:\n- Must be identical across all objects in group\n- Must stay in each object (NOT extracted to defaults)\n- Client needs it to look up correct defaults entry\n\n**Examples**:\n- `asset_type` for preloadAssets\n- `asset_key` for objectsAnimationsData (if present)\n- `key` for objectsAnimationsData (fallback if no asset_key)\n\n### Why Grouping Field Must Stay in Objects\n\n```javascript\n// If asset_key was extracted to defaults:\nobjectsAnimationsData: {\n  'enemy_1': {x: 100, y: 200}  // No asset_key!\n}\nanimationsDefaults: {\n  'enemy_forest_1': {asset_key: 'enemy_forest_1', type: 'npc', ...}\n}\n\n// Client can't merge - doesn't know which defaults to use!\n// No way to know 'enemy_1' should use 'enemy_forest_1' defaults\n```\n\nKeeping grouping field in each object allows lookup:\n```javascript\nlet assetKey = objectData.asset_key;  // 'enemy_forest_1'\nlet defaults = animationsDefaults[assetKey];  // Found!\n```\n\n---\n\n## Integration Points\n\n### Server Integration\n\n**RoomScene** (`lib/rooms/server/scene.js`):\n```javascript\nthis.sceneDataFilter = new SceneDataFilter({configManager: this.configManager});\n```\n\n**State** (`lib/rooms/server/state.js`):\n```javascript\nconstructor(data){\n    this.sceneDataFilter = sc.get(data, 'sceneDataFilter', false);\n}\n\nmapRoomData(roomData){\n    if(false === this.sceneDataFilter){\n        return roomData;\n    }\n    return this.sceneDataFilter.filterRoomData(roomData);\n}\n```\n\n### Client Integration\n\n**RoomEvents** (`lib/game/client/room-events.js`):\n```javascript\nthis.room.onMessage('*', (message) => {\n    if('sceneData' === message.act){\n        let roomData = message.scene;\n        // Merge defaults if present\n        if(sc.hasOwn(roomData, 'animationsDefaults')){\n            AnimationsDefaultsMerger.mergeDefaults(roomData);\n        }\n        // Process room data...\n    }\n});\n```\n\n**AnimationEngine** (`lib/game/client/animation-engine.js`):\n```javascript\nconstructor(props){\n    // Uses asset_key if present, falls back to key\n    this.asset_key = sc.get(props, 'asset_key', props.key);\n}\n```\n\n---\n\n## Testing\n\n### Verify Optimization Behavior\n\n**Town Room (No Optimization Expected)**:\n1. Join Town room\n2. Check browser console: No `asset_key` in objects\n3. Verify: `animationsDefaults: {}`\n4. Test NPC dialogs work correctly\n\n**Forest Room (Optimization Expected)**:\n1. Join Forest room with 400 objects\n2. Check browser console: Objects have `asset_key` field\n3. Verify: `animationsDefaults` has entries\n4. Test enemies render and behave correctly\n\n### Measure Data Size\n\nAdd logging in `State.mapRoomData()`:\n```javascript\nthis.sceneData = JSON.stringify(roomData);\nLogger.info('sceneData size: ' + this.sceneData.length + ' bytes');\n```\n\n### Verify Buffer Overflow Resolved\n\n```bash\nnpm run bots -- --room=reldens-bots-forest --bots=50\n```\n\nExpected: No buffer overflow warnings in server console.\n\n### Verify Client Functionality\n\n1. Join rooms with various object counts\n2. Verify spritesheets load correctly\n3. Verify animations play correctly\n4. Verify NPC dialogs work correctly\n5. Check browser console for errors related to missing assets or properties\n\n---\n\n## Debugging\n\n### Disable Filtering\n\nSet in database or config:\n```javascript\nconfig.set('server/rooms/data/sendAll', true);\n```\n\nSends all database fields to client for debugging. Compare filtered vs unfiltered data to identify issues.\n\n### Log Optimization Results\n\n```javascript\nclass DebugSceneDataProcessor {\n    process({ roomData, filter }) {\n        let filtered = filter.buildFilteredData(roomData);\n        Logger.info('objectsAnimationsData count:', Object.keys(filtered.objectsAnimationsData || {}).length);\n        Logger.info('animationsDefaults entries:', Object.keys(filtered.animationsDefaults || {}).length);\n\n        // Log which objects were optimized\n        for(let key in filtered.objectsAnimationsData){\n            let obj = filtered.objectsAnimationsData[key];\n            if(sc.hasOwn(obj, 'asset_key')){\n                Logger.info('Optimized object:', key, 'asset_key:', obj.asset_key);\n            }\n        }\n\n        return filtered;\n    }\n}\n```\n\n### Common Issues\n\n**NPCs Not Visible**:\n- Check browser console for asset loading errors\n- Verify `asset_key` or `key` field present in object\n- Verify asset exists in preloadAssets\n- Check AnimationEngine.asset_key is set correctly\n\n**NPC Dialogs Not Working**:\n- Verify non-optimized objects keep original `key` field value\n- Check AnimationsDefaultsMerger is NOT modifying objects without `asset_key`\n- Verify dialog system uses correct object reference\n\n**Buffer Overflow Still Occurring**:\n- Verify `sendAll: false` in config\n- Check optimization is detecting shared properties\n- Log data size before/after filtering\n- Verify client is merging defaults correctly\n\n---\n\n## References\n\n- **Server Filter**: `lib/rooms/server/scene-data-filter.js`\n- **Client Merger**: `lib/game/client/animations-defaults-merger.js`\n- **State Integration**: `lib/rooms/server/state.js`\n- **Scene Integration**: `lib/rooms/server/scene.js`\n- **Room Events**: `lib/game/client/room-events.js`\n- **Animation Engine**: `lib/game/client/animation-engine.js`\n- **Colyseus Schema**: https://docs.colyseus.io/state/schema/\n"
  },
  {
    "path": ".claude/room-images-tileset-override-flow.md",
    "content": "# Room Images and Tileset Override System\n\n## Overview\n\nThis document explains how the room scene images upload system works and how the `overrideSceneImagesWithMapFile` option automatically synchronizes scene images with the Tiled map file tilesets.\n\n## Configuration\n\n**Config Path:** `server/rooms/maps/overrideSceneImagesWithMapFile`\n**Type:** Boolean\n**Default:** `true`\n**Location:** Database `config` table or environment variable\n\nWhen enabled, the system uses the Tiled map file as the source of truth for scene images, automatically overriding the `scene_images` field with images listed in the map's tilesets.\n\n## File Locations\n\n### Source Code\n- **Validator:** `lib/admin/server/room-map-tilesets-validator.js`\n- **Subscriber:** `lib/admin/server/subscribers/rooms-entity-subscriber.js`\n- **File Upload Renderer:** `lib/admin/server/rooms-file-upload-renderer.js`\n- **Admin Plugin:** `lib/admin/server/plugin.js`\n\n### Admin Interface\n- **Tileset File Item Template:** `theme/admin/templates/fields/edit/tileset-file-item.html`\n- **Tileset Alert Wrapper Template:** `theme/admin/templates/fields/edit/tileset-alert-wrapper.html`\n- **Client JS:** `theme/admin/reldens-admin-client.js`\n- **Client CSS:** `theme/admin/reldens-admin-client.css`\n- **Router:** `npm-packages/reldens-cms/lib/admin-manager/router-contents.js`\n\n## Database Schema\n\n### Rooms Table\n- `id` - Room identifier\n- `map_filename` - Tiled map JSON file (e.g., `reldens-forest.json`)\n- `scene_images` - Comma-separated list of tileset images (e.g., `reldens-forest.png,reldens-town.png`)\n\n### Upload Configuration\nBoth fields are configured as upload fields:\n- `map_filename` - Single file upload, bucket: `theme/assets/maps`\n- `scene_images` - Multiple file upload, bucket: `theme/assets/images`\n\n## System Flow\n\n### 1. Initial Room Creation\n\n**User Actions:**\n1. Navigate to Admin → Rooms → Create New\n2. Upload map JSON file to `map_filename` field\n3. Upload tileset images to `scene_images` field\n4. Click Save\n\n**System Processing:**\n1. **Upload Phase** - Files saved to respective buckets\n2. **Validation Phase** - `validateUploadedFiles()` checks required fields\n3. **Save Phase** - Entity created in database\n4. **Post-Save Event** - `reldens.adminAfterEntitySave` fires\n5. **Validator Execution** - `RoomMapTilesetsValidator.validate()` runs\n\n**Validator Logic:**\n```javascript\n// Check if override is enabled\noverrideEnabled = config.getWithoutLogs('server/rooms/maps/overrideSceneImagesWithMapFile', true)\n\n// Read map file\nmapData = readMapFile(bucket, mapFilename, roomId)\n\n// Extract tileset images from map JSON\ntilesetImages = extractTilesetImages(mapData.tilesets)\n// Example: ['reldens-forest.png']\n\n// Compare with current scene_images\nif (tilesetImages !== currentSceneImages) {\n    // Validate all images exist in scene_images bucket\n    if (validateImagesExist(tilesetImages, sceneImagesBucket)) {\n        // Override scene_images with tileset images\n        roomsRepository.updateById(roomId, {scene_images: tilesetImages.join(',')})\n    }\n}\n```\n\n### 2. Room Editing\n\n**User Actions:**\n1. Navigate to Admin → Rooms → Edit Room\n2. View existing files in both fields\n3. Modify files or click Save without changes\n\n**Edit Form Population:**\n\n**Event:** `reldens.adminEditPropertiesPopulation`\n\n**Flow:**\n```javascript\n// 1. Event emitted with room data\nevent = {\n    driverResource,     // Entity configuration\n    renderedEditProperties, // Form properties\n    loadedEntity,       // Room from database\n    entityId: 'rooms',\n    entityData: loadedEntity\n}\n\n// 2. RoomsEntitySubscriber.populateEditFormTilesetImages() executes\nif (overrideSceneImagesWithMapFile) {\n    // Extract tileset images from map file\n    tilesetImages = validator.extractTilesetImagesFromEntity(entityData, driverResource)\n\n    // Inject into form properties\n    renderedEditProperties.tilesetImages = tilesetImages\n    renderedEditProperties.overrideSceneImagesEnabled = true\n}\n\n// 3. RoomsFileUploadRenderer processes scene_images field\n// Event: reldens.adminBeforeFieldRender\nif (propertyKey === 'scene_images' && tilesetImages.length > 0) {\n    // Render each file with protection flag\n    for each file:\n        renderedFileItems.push(render tileset-file-item.html with {\n            filename,\n            isProtected: tilesetImages.includes(filename)\n        })\n\n    // Wrap files in alert container\n    templateData.renderedFiles = render tileset-alert-wrapper.html\n}\n\n// 4. Template renders with tileset protection\n{{^isProtected}}\n    <button class=\"remove-upload-btn\">X</button> -\n{{/isProtected}}\n{{filename}}\n```\n\n**Result:**\n- Protected images (tilesets): NO remove button\n- Non-protected images: Remove button shown\n- Alert icon displays with info message\n\n### 3. Saving Changes\n\n**Scenario A: No Files Changed**\n1. User clicks Save without uploading/removing files\n2. Validation passes (existing files satisfy requirement)\n3. Entity updated with form data\n4. Post-save validator runs\n5. If scene_images matches tilesets → No action\n6. If mismatch → Override with tileset images\n\n**Scenario B: Add New Image**\n1. User uploads additional image to `scene_images`\n2. `prepareUploadPatchData()` appends new file to existing files\n3. Entity saved with: `existing_images.png,new_image.png`\n4. Post-save validator runs\n5. Validates tileset images exist\n6. **Overrides** scene_images with ONLY tileset images (removes non-tileset images)\n\n**Scenario C: Remove Non-Protected Image**\n1. User clicks X button on non-protected image\n2. Client adds filename to `removed_scene_images` hidden input\n3. `prepareUploadPatchData()` filters removed files\n4. Entity saved with filtered list\n5. Post-save validator runs\n6. Overrides with tileset images (removes non-tileset files)\n\n**Scenario D: Attempt Remove Protected Image (Prevented)**\n1. Protected image (tileset) has NO remove button\n2. User cannot remove it through UI\n3. Alert icon displays: \"Images specified in the tileset can't be removed since the option overrideSceneImagesWithMapFile is active.\"\n\n### 4. Map File Update\n\n**User Updates Map File:**\n1. User replaces `map_filename` with new Tiled map\n2. New map references different tileset images\n3. Entity saved\n4. Post-save validator executes\n5. Reads new map file tilesets\n6. **Replaces** scene_images with new tileset images\n7. Old images no longer referenced (user must manage cleanup)\n\n## Technical Details\n\n### Map File Structure\n\n**Example: reldens-forest.json**\n```json\n{\n    \"tilesets\": [\n        {\n            \"columns\": 14,\n            \"firstgid\": 1,\n            \"image\": \"reldens-forest.png\",\n            \"imageheight\": 408,\n            \"imagewidth\": 476,\n            \"name\": \"reldens-forest\",\n            \"tilecount\": 168\n        }\n    ]\n}\n```\n\n**Extraction Logic:**\n```javascript\nextractTilesetImages(mapData) {\n    let tilesets = mapData.tilesets || []\n    let images = []\n\n    for (let tileset of tilesets) {\n        let tilesetImage = tileset.image  // 'reldens-forest.png' or '../images/reldens-forest.png'\n        let imageFileName = tilesetImage.split('/').pop()  // Extract filename only\n\n        if (!images.includes(imageFileName)) {\n            images.push(imageFileName)\n        }\n    }\n\n    return images  // ['reldens-forest.png']\n}\n```\n\n### Validation Logic\n\n**Array Comparison (validator):**\n```javascript\narraysAreEqual(array1, array2) {\n    if (array1.length !== array2.length) {\n        return false\n    }\n    let sorted1 = [...array1].sort()\n    let sorted2 = [...array2].sort()\n    for (let i = 0; i < sorted1.length; i++) {\n        if (sorted1[i] !== sorted2[i]) {\n            return false\n        }\n    }\n    return true\n}\n```\n\n**Image Existence Validation (validator):**\n```javascript\nvalidateImagesExist(tilesetImages, sceneImagesBucket, roomId, mapFilename) {\n    for (let imageFileName of tilesetImages) {\n        let imageFilePath = FileHandler.joinPaths(sceneImagesBucket, imageFileName)\n\n        if (!FileHandler.exists(imageFilePath)) {\n            return false\n        }\n    }\n\n    return true\n}\n```\n\n### Client-Side Protection\n\n**File Item Template (tileset-file-item.html):**\n```html\n<p class=\"upload-current-file\" data-field=\"{{&fieldName}}\" data-filename=\"{{&filename}}\">\n    {{^isProtected}}\n        <button type=\"button\" class=\"remove-upload-btn\" data-field=\"{{&fieldName}}\" data-filename=\"{{&filename}}\" title=\"REMOVE\">X</button> -\n    {{/isProtected}}\n    {{&filename}}\n</p>\n```\n\n**Alert Wrapper Template (tileset-alert-wrapper.html):**\n```html\n<div class=\"tileset-alert-wrapper\">\n    <div class=\"upload-files-with-alert\">\n        {{{renderedFileItems}}}\n    </div>\n    <div class=\"tileset-alert-icon-container\">\n        <img src=\"/assets/admin/alert.png\" class=\"tileset-alert-icon\" alt=\"Info\" title=\"Images specified in the tileset can't be removed since the option overrideSceneImagesWithMapFile is active.\">\n        <span class=\"tileset-info-message hidden\">Images specified in the tileset can't be removed since the option overrideSceneImagesWithMapFile is active.</span>\n    </div>\n</div>\n```\n\n**JavaScript Toggle (reldens-admin-client.js):**\n```javascript\ndocument.querySelectorAll('.tileset-alert-icon').forEach(icon => {\n    icon.addEventListener('click', () => {\n        let message = icon.nextElementSibling\n        if (message?.classList.contains('tileset-info-message')) {\n            message.classList.toggle('hidden')\n        }\n    })\n})\n```\n\n## Benefits\n\n1. **Consistency:** Scene images always match map tilesets\n2. **Automation:** No manual sync between map and images\n3. **Single Source of Truth:** Tiled map file controls image references\n4. **Developer Experience:** Edit maps in Tiled, changes auto-sync\n\n## Limitations\n\n1. **One-Way Sync:** Map → Database only (not bidirectional)\n2. **Cleanup Required:** Removing tileset from map doesn't delete old image files\n3. **Override Always Wins:** Manual changes to scene_images get overwritten on next save\n4. **Requires Config:** Must enable `overrideSceneImagesWithMapFile` to activate\n\n## Disabling the Feature\n\nTo disable tileset override and manage images manually:\n\n**Option 1: Database Config**\n```sql\nUPDATE config\nSET value = '0'\nWHERE path = 'server/rooms/maps/overrideSceneImagesWithMapFile';\n```\n\n**Option 2: Environment Variable**\n```bash\nRELDENS_SERVER_ROOMS_MAPS_OVERRIDESCENEIMAGESWITHMAPFILE=0\n```\n\n**Result:**\n- Post-save validation skipped\n- All images show remove buttons\n- Full manual control over scene_images field\n- Map file and scene_images can diverge\n"
  },
  {
    "path": ".claude/stat-bars-configuration.md",
    "content": "# Stat Bars Configuration\n\n## Overview\n\nThe player stats bars system is a generic client-side feature that displays visual bars for any configured player stat in the player box UI.\n\n## Configuration Path\n\n**Scope**: `client`\n**Path**: `players/barsProperties`\n**Type**: JSON (type 4)\n\n## Configuration Structure\n\nThe configuration is a JSON object where each key represents a stat key, and each value contains the bar properties for that stat.\n\n```json\n{\n    \"statKey\": {\n        \"enabled\": true,\n        \"label\": \"Display Label\",\n        \"activeColor\": \"#hexcolor\",\n        \"inactiveColor\": \"#hexcolor\"\n    }\n}\n```\n\n## Properties\n\nEach stat bar configuration requires the following properties:\n\n- **enabled** (boolean): Whether the bar should be displayed\n- **label** (string): The display label shown above the bar\n- **activeColor** (string): Hex color for the filled portion of the bar\n- **inactiveColor** (string): Hex color for the empty/background portion of the bar\n\nAll four properties are required. If any property is missing, the bar will not be displayed.\n\n## Activation Rules\n\n- If config does not exist or is empty: bars system is NOT activated\n- If config exists: bars are activated ONLY for stats with all required properties\n- Each stat is validated independently via BarProperties model\n- Only bars with `ready === true` are rendered\n\n## Database Configuration\n\n### Development Migration\n\nAdd to `migrations/development/beta.39.7-sql-update.sql`:\n\n```sql\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES\n('client', 'players/barsProperties', '{\"hp\":{\"enabled\":true,\"label\":\"HP\",\"activeColor\":\"#ff0000\",\"inactiveColor\":\"#330000\"},\"mp\":{\"enabled\":true,\"label\":\"MP\",\"activeColor\":\"#0000ff\",\"inactiveColor\":\"#000033\"}}', 4);\n```\n\n### Production Migration\n\nAdd to `migrations/production/reldens-basic-config-v4.0.0.sql`:\n\n```sql\n(92, 'client', 'players/barsProperties', '{\"hp\":{\"enabled\":true,\"label\":\"HP\",\"activeColor\":\"#ff0000\",\"inactiveColor\":\"#330000\"},\"mp\":{\"enabled\":true,\"label\":\"MP\",\"activeColor\":\"#0000ff\",\"inactiveColor\":\"#000033\"}}', 4),\n```\n\n## Examples\n\n### HP and MP Bars\n\n```json\n{\n    \"hp\": {\n        \"enabled\": true,\n        \"label\": \"HP\",\n        \"activeColor\": \"#ff0000\",\n        \"inactiveColor\": \"#330000\"\n    },\n    \"mp\": {\n        \"enabled\": true,\n        \"label\": \"MP\",\n        \"activeColor\": \"#0000ff\",\n        \"inactiveColor\": \"#000033\"\n    }\n}\n```\n\n### Stamina Bar\n\n```json\n{\n    \"stamina\": {\n        \"enabled\": true,\n        \"label\": \"Stamina\",\n        \"activeColor\": \"#00ff00\",\n        \"inactiveColor\": \"#003300\"\n    }\n}\n```\n\n### Multiple Stats\n\n```json\n{\n    \"hp\": {\n        \"enabled\": true,\n        \"label\": \"HP\",\n        \"activeColor\": \"#ff0000\",\n        \"inactiveColor\": \"#330000\"\n    },\n    \"mp\": {\n        \"enabled\": true,\n        \"label\": \"MP\",\n        \"activeColor\": \"#0000ff\",\n        \"inactiveColor\": \"#000033\"\n    },\n    \"stamina\": {\n        \"enabled\": true,\n        \"label\": \"STA\",\n        \"activeColor\": \"#ffff00\",\n        \"inactiveColor\": \"#333300\"\n    },\n    \"atk\": {\n        \"enabled\": false,\n        \"label\": \"ATK\",\n        \"activeColor\": \"#ff6600\",\n        \"inactiveColor\": \"#331100\"\n    }\n}\n```\n\nIn this example, HP, MP, and Stamina bars will be displayed. ATK bar will not be displayed because `enabled: false`.\n\n## Disabling Bars\n\nTo disable a specific stat bar, set `enabled: false`:\n\n```json\n{\n    \"hp\": {\n        \"enabled\": false,\n        \"label\": \"HP\",\n        \"activeColor\": \"#ff0000\",\n        \"inactiveColor\": \"#330000\"\n    }\n}\n```\n\nTo disable the entire bars system, remove the config or set it to an empty object `{}`.\n\n## Technical Notes\n\n- The stat key in the config must match the stat key in the database `stats` table\n- Bars are rendered in the order they appear in the configuration object\n- Bar values are calculated from `message.stats[statKey]` (current) and `message.statsBase[statKey]` (max)\n- Percentage calculation: `(currentValue / maxValue) * 100`\n- Bars update automatically when stats change via `reldens.playerStatsUpdateAfter` event\n- Bars are rendered inside `#player-stats-bars-wrapper` within `#ui-player-extras` container\n\n---\n\n# Player Names Configuration\n\n## Overview\n\nThe player names system displays character names above sprites. Names can be configured separately for the current player and other players.\n\n## Configuration Path\n\n**Scope**: `client`\n**Path**: `ui/players`\n**Type**: Multiple (boolean, object)\n\n## Configuration Properties\n\n### Visibility Controls\n\n- **showCurrentPlayerName** (type 3 - boolean): Show name for the current player\n  - Default: `0` (hidden)\n  - Database: `client/ui/players/showCurrentPlayerName`\n  - When disabled, current player's name will not be displayed\n  - Useful when using alternative UI systems or cleaner visual experience\n\n- **showNames** (type 3 - boolean): Show names for all other players\n  - Default: `1` (enabled)\n  - Database: `client/ui/players/showNames`\n  - Controls name visibility for other players (not current player)\n\n- **showNamesLimit** (type 2 - number): Maximum name length before truncation\n  - Default: `10`\n  - Database: `client/ui/players/showNamesLimit`\n  - Names longer than this value will be truncated with '...'\n\n### Visual Appearance\n\nNames are styled using the `nameText` configuration object with the following properties:\n\n- **align** (type 1 - string): Text alignment\n  - Default: `center`\n  - Database: `client/ui/players/nameText/align`\n\n- **depth** (type 2 - number): Rendering depth/z-index\n  - Default: `200000`\n  - Database: `client/ui/players/nameText/depth`\n\n- **fill** (type 1 - string): Text color\n  - Default: `#ffffff`\n  - Database: `client/ui/players/nameText/fill`\n\n- **fontFamily** (type 1 - string): Font family\n  - Default: `Verdana, Geneva, sans-serif`\n  - Database: `client/ui/players/nameText/fontFamily`\n\n- **fontSize** (type 1 - string): Font size\n  - Default: `12px`\n  - Database: `client/ui/players/nameText/fontSize`\n\n- **height** (type 2 - number): Vertical offset from sprite\n  - Default: `-90`\n  - Database: `client/ui/players/nameText/height`\n\n- **shadowBlur** (type 2 - number): Shadow blur radius\n  - Default: `5`\n  - Database: `client/ui/players/nameText/shadowBlur`\n\n- **shadowColor** (type 1 - string): Shadow color\n  - Default: `rgba(0,0,0,0.7)`\n  - Database: `client/ui/players/nameText/shadowColor`\n\n- **shadowX** (type 2 - number): Shadow X offset\n  - Default: `5`\n  - Database: `client/ui/players/nameText/shadowX`\n\n- **shadowY** (type 2 - number): Shadow Y offset\n  - Default: `5`\n  - Database: `client/ui/players/nameText/shadowY`\n\n- **stroke** (type 1 - string): Text stroke color\n  - Default: `#000000`\n  - Database: `client/ui/players/nameText/stroke`\n\n- **strokeThickness** (type 2 - number): Stroke thickness\n  - Default: `4`\n  - Database: `client/ui/players/nameText/strokeThickness`\n\n## Database Configuration\n\n### Development Migration\n\nAdd to `migrations/development/[version]-sql-update.sql`:\n\n```sql\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES\n('client', 'ui/players/showCurrentPlayerName', '0', 3);\n```\n\n### Production Migration\n\nFrom `migrations/production/reldens-basic-config-v4.0.0.sql`:\n\nExisting configurations (IDs 239-252):\n```sql\n(239, 'client', 'ui/players/nameText/align', 'center', 1),\n(240, 'client', 'ui/players/nameText/depth', '200000', 2),\n(241, 'client', 'ui/players/nameText/fill', '#ffffff', 1),\n(242, 'client', 'ui/players/nameText/fontFamily', 'Verdana, Geneva, sans-serif', 1),\n(243, 'client', 'ui/players/nameText/fontSize', '12px', 1),\n(244, 'client', 'ui/players/nameText/height', '-90', 2),\n(245, 'client', 'ui/players/nameText/shadowBlur', '5', 2),\n(246, 'client', 'ui/players/nameText/shadowColor', 'rgba(0,0,0,0.7)', 1),\n(247, 'client', 'ui/players/nameText/shadowX', '5', 2),\n(248, 'client', 'ui/players/nameText/shadowY', '5', 2),\n(249, 'client', 'ui/players/nameText/stroke', '#000000', 1),\n(250, 'client', 'ui/players/nameText/strokeThickness', '4', 2),\n(251, 'client', 'ui/players/nameText/textLength', '4', 2),\n(252, 'client', 'ui/players/showNames', '1', 3),\n```\n\nNew configuration to add:\n```sql\n(253, 'client', 'ui/players/showCurrentPlayerName', '0', 3),\n```\n\n## Configuration Examples\n\n### Example 1: Hide Current Player Name\n\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';\n```\n\nCurrent player's name will not be displayed. Useful when using alternative UI systems.\n\n### Example 2: Hide All Other Players' Names\n\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';\n```\n\nOther players' names will not be displayed. Current player's name visibility depends on `showCurrentPlayerName`.\n\n### Example 3: Show Both Current Player and Other Players' Names\n\n```sql\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';\n```\n\nAll players' names will be displayed.\n\n### Example 4: Customize Name Text Style\n\n```sql\nUPDATE `config` SET `value` = '#00ff00' WHERE `scope` = 'client' AND `path` = 'ui/players/nameText/fill';\nUPDATE `config` SET `value` = '16px' WHERE `scope` = 'client' AND `path` = 'ui/players/nameText/fontSize';\nUPDATE `config` SET `value` = '6' WHERE `scope` = 'client' AND `path` = 'ui/players/nameText/strokeThickness';\n```\n\nCreates green player names with 16px font size and thicker stroke.\n\n## Visibility Behavior\n\n**Configuration: showCurrentPlayerName=0, showNames=0**\n- Current Player: Name hidden\n- Other Players: Names hidden\n\n**Configuration: showCurrentPlayerName=0, showNames=1**\n- Current Player: Name hidden\n- Other Players: Names shown\n\n**Configuration: showCurrentPlayerName=1, showNames=0**\n- Current Player: Name shown\n- Other Players: Names hidden\n\n**Configuration: showCurrentPlayerName=1, showNames=1**\n- Current Player: Name shown\n- Other Players: Names shown\n\n## Implementation Details\n\n### Files\n\n- **PlayerEngine**: `lib/users/client/player-engine.js` - Main player management class\n- **SpriteTextFactory**: `lib/game/client/engine/sprite-text-factory.js` - Text rendering utility\n\n### Key Methods\n\n- `showPlayerName(id)`: Displays name above player sprite, checks configuration\n- `updateNamePosition(playerSprite)`: Updates name position during movement\n- `applyNameLengthLimit(showName)`: Truncates long names\n\n### Events\n\n- `reldens.playerEngineAddPlayer`: Called when player is added, triggers name display\n- `reldens.runPlayerAnimation`: Updates name position during animation\n\n---\n\n# Life Bar Configuration\n\n## Overview\n\nThe life bar system displays health bars for the current player, other players, NPCs, and enemies. Life bars are rendered using Phaser graphics and can be positioned either fixed on the UI scene or floating above sprites.\n\n## Configuration Path\n\n**Scope**: `client`\n**Path**: `ui/lifeBar`\n**Type**: Multiple (boolean, number, string)\n\n## Configuration Properties\n\n### Core Settings\n\n- **enabled** (type 3 - boolean): Enable or disable the entire lifebar system\n  - Default: `1` (enabled)\n  - Database: `client/ui/lifeBar/enabled`\n\n### Visual Appearance\n\n- **fillStyle** (type 1 - string): Hex color for the filled portion of the bar\n  - Default: `0xff0000` (red)\n  - Database: `client/ui/lifeBar/fillStyle`\n  - Format: Hex color without `#` prefix (e.g., `0xff0000`)\n\n- **lineStyle** (type 1 - string): Hex color for the bar border\n  - Default: `0xffffff` (white)\n  - Database: `client/ui/lifeBar/lineStyle`\n  - Format: Hex color without `#` prefix (e.g., `0xffffff`)\n\n- **height** (type 2 - number): Height of the bar in pixels\n  - Default: `5`\n  - Database: `client/ui/lifeBar/height`\n\n- **width** (type 2 - number): Width of the bar in pixels\n  - Default: `50`\n  - Database: `client/ui/lifeBar/width`\n\n- **top** (type 2 - number): Distance above sprite in pixels\n  - Default: `5`\n  - Database: `client/ui/lifeBar/top`\n\n### Positioning\n\nThe lifebar system supports two positioning modes: fixed and floating.\n\n#### Fixed Position\n\n- **fixedPosition** (type 3 - boolean): Current player's bar appears at fixed position on UI scene\n  - Default: `0` (floating above sprite)\n  - Database: `client/ui/lifeBar/fixedPosition`\n  - When enabled, uses `x`, `y`, `responsiveX`, `responsiveY` properties\n\n- **x** (type 2 - number): Fixed X position in pixels\n  - Default: `5`\n  - Database: `client/ui/lifeBar/x`\n  - Used when `fixedPosition: 1` and responsive mode is disabled\n\n- **y** (type 2 - number): Fixed Y position in pixels\n  - Default: `12`\n  - Database: `client/ui/lifeBar/y`\n  - Used when `fixedPosition: 1` and responsive mode is disabled\n\n#### Responsive Positioning\n\n- **responsiveX** (type 2 - number): Responsive X position as percentage of screen width\n  - Default: `1`\n  - Database: `client/ui/lifeBar/responsiveX`\n  - Calculation: `uiX = responsiveX * screenWidth / 100`\n  - Used when `fixedPosition: 1` and `client/ui/screen/responsive` is enabled\n\n- **responsiveY** (type 2 - number): Responsive Y position as percentage of screen height\n  - Default: `24`\n  - Database: `client/ui/lifeBar/responsiveY`\n  - Calculation: `uiY = responsiveY * screenHeight / 100`\n  - Used when `fixedPosition: 1` and `client/ui/screen/responsive` is enabled\n\n### Visibility Controls\n\n- **showCurrentPlayer** (type 3 - boolean): Show lifebar for the current player\n  - Default: `0` (hidden)\n  - Database: `client/ui/lifeBar/showCurrentPlayer`\n  - When disabled, current player's lifebar will not be displayed\n  - Useful when using alternative UI systems like player stats bars\n\n- **showAllPlayers** (type 3 - boolean): Show lifebars for all other players\n  - Default: `0` (hidden)\n  - Database: `client/ui/lifeBar/showAllPlayers`\n  - When disabled, other players' bars only show via `showOnClick`\n\n- **showEnemies** (type 3 - boolean): Show lifebars for NPCs and enemies\n  - Default: `1` (enabled)\n  - Database: `client/ui/lifeBar/showEnemies`\n  - Controls all objects (NPCs/enemies)\n\n- **showOnClick** (type 3 - boolean): Show lifebars only when target is clicked\n  - Default: `1` (enabled)\n  - Database: `client/ui/lifeBar/showOnClick`\n  - Works for both other players and objects when their specific show flags are disabled\n\n## Database Configuration\n\n### Development Migration\n\nAdd to `migrations/development/[version]-sql-update.sql`:\n\n```sql\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES\n('client', 'ui/lifeBar/enabled', '1', 3),\n('client', 'ui/lifeBar/fillStyle', '0xff0000', 1),\n('client', 'ui/lifeBar/fixedPosition', '0', 3),\n('client', 'ui/lifeBar/height', '5', 2),\n('client', 'ui/lifeBar/lineStyle', '0xffffff', 1),\n('client', 'ui/lifeBar/responsiveX', '1', 2),\n('client', 'ui/lifeBar/responsiveY', '24', 2),\n('client', 'ui/lifeBar/showAllPlayers', '0', 3),\n('client', 'ui/lifeBar/showCurrentPlayer', '0', 3),\n('client', 'ui/lifeBar/showEnemies', '1', 3),\n('client', 'ui/lifeBar/showOnClick', '1', 3),\n('client', 'ui/lifeBar/top', '5', 2),\n('client', 'ui/lifeBar/width', '50', 2),\n('client', 'ui/lifeBar/x', '5', 2),\n('client', 'ui/lifeBar/y', '12', 2);\n```\n\n### Production Migration\n\nFrom `migrations/production/reldens-basic-config-v4.0.0.sql` (IDs 181-194):\n\n```sql\n(181, 'client', 'ui/lifeBar/enabled', '1', 3),\n(182, 'client', 'ui/lifeBar/fillStyle', '0xff0000', 1),\n(183, 'client', 'ui/lifeBar/fixedPosition', '0', 3),\n(184, 'client', 'ui/lifeBar/height', '5', 2),\n(185, 'client', 'ui/lifeBar/lineStyle', '0xffffff', 1),\n(186, 'client', 'ui/lifeBar/responsiveX', '1', 2),\n(187, 'client', 'ui/lifeBar/responsiveY', '24', 2),\n(188, 'client', 'ui/lifeBar/showAllPlayers', '0', 3),\n(189, 'client', 'ui/lifeBar/showCurrentPlayer', '0', 3),\n(190, 'client', 'ui/lifeBar/showEnemies', '1', 3),\n(191, 'client', 'ui/lifeBar/showOnClick', '1', 3),\n(192, 'client', 'ui/lifeBar/top', '5', 2),\n(193, 'client', 'ui/lifeBar/width', '50', 2),\n(194, 'client', 'ui/lifeBar/x', '5', 2),\n(195, 'client', 'ui/lifeBar/y', '12', 2),\n```\n\n## Configuration Examples\n\n### Example 1: Fixed Position in Top-Left Corner\n\n```sql\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/fixedPosition';\nUPDATE `config` SET `value` = '5' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/x';\nUPDATE `config` SET `value` = '5' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/y';\n```\n\nThis positions the current player's lifebar at coordinates (5, 5) on the UI scene, fixed regardless of player movement.\n\n### Example 2: Responsive Fixed Position\n\n```sql\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/fixedPosition';\nUPDATE `config` SET `value` = '50' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/responsiveX';\nUPDATE `config` SET `value` = '5' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/responsiveY';\n```\n\nThis positions the current player's lifebar at 50% of screen width and 5% of screen height, adapting to different resolutions.\n\n### Example 3: Show All Players' Lifebars\n\n```sql\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';\n```\n\nAll other players' lifebars are always visible, floating above their sprites.\n\n### Example 4: Hide Enemy Lifebars\n\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showEnemies';\n```\n\nNPCs and enemies will not show lifebars at all.\n\n### Example 5: Hide Current Player Lifebar\n\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';\n```\n\nCurrent player's lifebar will not be displayed. Useful when using alternative UI systems like player stats bars.\n\n### Example 6: Always Show Bars (No Click Required)\n\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showOnClick';\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showEnemies';\n```\n\nAll players and enemies will always show their lifebars without requiring click interaction.\n\n### Example 7: Custom Colors and Dimensions\n\n```sql\nUPDATE `config` SET `value` = '0x00ff00' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/fillStyle';\nUPDATE `config` SET `value` = '0x000000' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/lineStyle';\nUPDATE `config` SET `value` = '80' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/width';\nUPDATE `config` SET `value` = '8' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/height';\n```\n\nCreates a green lifebar with black border, 80 pixels wide and 8 pixels tall.\n\n## Visibility Behavior\n\nThe current player's lifebar visibility is controlled by `showCurrentPlayer` configuration.\n\n**Configuration: showCurrentPlayer=0, showAllPlayers=0, showEnemies=0, showOnClick=0**\n- Current Player: Never\n- Other Players: Never\n- NPCs/Enemies: Never\n\n**Configuration: showCurrentPlayer=0, showAllPlayers=0, showEnemies=0, showOnClick=1**\n- Current Player: Never\n- Other Players: On Click\n- NPCs/Enemies: Never\n\n**Configuration: showCurrentPlayer=0, showAllPlayers=0, showEnemies=1, showOnClick=1**\n- Current Player: Never\n- Other Players: On Click\n- NPCs/Enemies: On Click\n\n**Configuration: showCurrentPlayer=1, showAllPlayers=0, showEnemies=0, showOnClick=0**\n- Current Player: Always\n- Other Players: Never\n- NPCs/Enemies: Never\n\n**Configuration: showCurrentPlayer=1, showAllPlayers=0, showEnemies=1, showOnClick=1**\n- Current Player: Always\n- Other Players: On Click\n- NPCs/Enemies: On Click\n\n**Configuration: showCurrentPlayer=1, showAllPlayers=1, showEnemies=0, showOnClick=0**\n- Current Player: Always\n- Other Players: Always\n- NPCs/Enemies: Never\n\n**Configuration: showCurrentPlayer=1, showAllPlayers=1, showEnemies=1, showOnClick=0**\n- Current Player: Always\n- Other Players: Always\n- NPCs/Enemies: Always\n\n## Positioning Behavior\n\n### Floating Mode (fixedPosition: 0)\n\n- Current player's bar floats above sprite\n- Other players' bars float above their sprites\n- NPCs/enemies bars float above their sprites\n- Bars automatically update position as sprites move\n- Position calculation: `(spriteX - barWidth/2, spriteY - barHeight - top + spriteTopOffset/2)`\n\n### Fixed Mode (fixedPosition: 1)\n\n- **Current player only**: Bar appears at fixed position on UI scene\n- Other players and NPCs/enemies always float above sprites\n- Fixed position uses either:\n  - Absolute coordinates: `x`, `y` properties (when responsive is disabled)\n  - Responsive coordinates: `responsiveX`, `responsiveY` properties (when `client/ui/screen/responsive` is enabled)\n- Bar position updates on screen resize\n\n## Implementation Details\n\n### Files\n\n- **LifebarUi**: `lib/users/client/lifebar-ui.js` - Main lifebar management class\n- **ObjectsHandler**: `lib/users/client/objects-handler.js` - Handles NPCs/enemies lifebars\n- **Plugin**: `lib/users/client/plugin.js` - Initializes lifebar system\n\n### Events\n\n- `reldens.playerStatsUpdateAfter`: Updates current player's lifebar\n- `reldens.joinedRoom`: Sets up message listeners for lifebar updates\n- `reldens.runPlayerAnimation`: Redraws player lifebar\n- `reldens.updateGameSizeBefore`: Recalculates fixed position on resize\n- `reldens.playersOnRemove`: Removes player lifebar on disconnect\n- `reldens.playerEngineAddPlayer`: Processes queued lifebar messages\n- `reldens.createAnimationAfter`: Draws object lifebars\n- `reldens.objectBodyChanged`: Updates object lifebar\n- `reldens.gameEngineShowTarget`: Shows target lifebar on click\n- `reldens.gameEngineClearTarget`: Hides previous target lifebar\n\n### Bar Property\n\nThe lifebar tracks the stat configured at `client/actions/skills/affectedProperty`, which defaults to `hp`.\n\nTo change the tracked stat:\n\n```sql\nUPDATE `config` SET `value` = 'mp' WHERE `scope` = 'client' AND `path` = 'actions/skills/affectedProperty';\n```\n\nThis would make lifebars track magic points instead of health points.\n"
  },
  {
    "path": ".claude/storage-architecture.md",
    "content": "# Storage & Entity Management Architecture\n\nComplete reference for the storage system and entity management.\n\n## Entity Generation Workflow\n\n1. Define database schema (SQL migrations in `migrations/`)\n2. Run `reldens generateEntities --override`\n3. Entities are generated in `generated-entities/`\n4. Models in each feature's `server/models/` extend generated entities\n\n## Storage Drivers\n\n- `objection-js` (default was objection-js): Uses Knex.js for SQL, direct database access, no validation\n- `mikro-orm`: ORM with decorators, supports MongoDB\n- `prisma` (current default): Modern ORM with type safety, custom validation, database default support\n- Configured via `RELDENS_STORAGE_DRIVER` in `.env`\n\n## Driver Differences\n\n### ObjectionJS\n- Direct SQL via Knex query builder\n- No field validation before database\n- Database handles defaults and constraints\n- Foreign keys as direct field values\n- Less informative error messages\n\n### Prisma\n- Type-safe Prisma Client\n- Custom `ensureRequiredFields()` validation before database\n- Skips validation for fields with database defaults\n- Foreign keys use relation connect syntax: `{players: {connect: {id: 1001}}}`\n- VARCHAR foreign key support\n- Better error messages for missing required fields\n- Metadata-driven field type casting\n\n## Entity Access and Storage System Architecture\n\n### CRITICAL: Understanding getEntity() Return Type\n\n`dataServer.getEntity()` returns a `BaseDriver` instance from `@reldens/storage`, NOT an Entity or Model class.\n\n**What getEntity() Returns:**\n```javascript\n// Returns BaseDriver instance (or ObjectionJsDriver, PrismaDriver, MikroOrmDriver subclass)\nlet statsRepository = this.dataServer.getEntity('stats');\n\n// BaseDriver provides unified interface across all storage drivers:\nawait statsRepository.create({key: 'hp', label: 'Health Points'});\nawait statsRepository.loadAll();\nawait statsRepository.loadBy('key', 'hp');\nawait statsRepository.loadOneBy('key', 'hp');\nawait statsRepository.updateById(1, {label: 'HP'});\nawait statsRepository.deleteById(1);\n```\n\n**Type Annotation for Repository Properties:**\n```javascript\n/**\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\n\n// Correct - driver-agnostic type\n/** @type {BaseDriver} */\nthis.statsRepository = this.dataServer.getEntity('stats');\n\n// WRONG - Entity classes are for admin panel config only\n/** @type {StatsEntity} */  // ❌ WRONG\nthis.statsRepository = this.dataServer.getEntity('stats');\n\n// WRONG - Model classes are driver-specific (objection-js/prisma/mikro-orm)\n/** @type {StatsModel} */  // ❌ WRONG\nthis.statsRepository = this.dataServer.getEntity('stats');\n```\n\n## Storage System Component Breakdown\n\n### 1. Entity Classes (`generated-entities/entities/[table]-entity.js`)\n- Purpose: Admin panel configuration ONLY\n- Define property metadata (types, required fields, display names)\n- Define edit/show/list properties for admin UI\n- Example: `StatsEntity.propertiesConfig()` returns admin panel config\n- Never used for database operations\n\n### 2. Model Classes (`generated-entities/models/{driver}/[table]-model.js`)\n- Purpose: ORM-specific model definitions\n- Driver-specific paths:\n  - `models/objection-js/stats-model.js` - ObjectionJS\n  - `models/prisma/stats-model.js` - Prisma\n  - `models/mikro-orm/stats-model.js` - MikroORM\n- Define table names, relations, schema\n- Wrapped by BaseDriver before use\n\n### 3. BaseDriver (`@reldens/storage/lib/base-driver.js`)\n- Purpose: Unified database interface\n- Wraps raw Model classes\n- Provides consistent API across all storage drivers\n- THIS IS WHAT `getEntity()` RETURNS\n- Methods: create, load, loadBy, loadOneBy, update, delete, count, etc.\n- Driver implementations:\n  - `ObjectionJsDriver` - uses Knex query builder\n  - `PrismaDriver` - uses Prisma Client\n  - `MikroOrmDriver` - uses MikroORM EntityManager\n\n### 4. BaseDataServer (`@reldens/storage/lib/base-data-server.js`)\n- Purpose: Manages database connection and entity registry\n- Has `EntityManager` for storing BaseDriver instances\n- `getEntity(key)` retrieves BaseDriver from EntityManager\n- Driver implementations:\n  - `ObjectionJsDataServer`\n  - `PrismaDataServer`\n  - `MikroOrmDataServer`\n\n## Entity Loading Flow\n\n1. `EntitiesLoader.loadEntities()` (lib/game/server/entities-loader.js:41)\n   - Checks `RELDENS_STORAGE_DRIVER` env var (default: 'prisma')\n   - Loads from `generated-entities/models/{driver}/registered-models-{driver}.js`\n   - Returns `{entities, entitiesRaw, translations}`\n\n2. `DataServerInitializer.initializeEntitiesAndDriver()` (lib/game/server/data-server-initializer.js:55)\n   - Creates DataServer instance: `new DriversMap[storageDriver](config)`\n   - DataServer generates BaseDriver instances for each entity\n   - Stores in EntityManager registry\n\n3. `dataServer.getEntity(key)` returns BaseDriver from EntityManager\n\n## Usage Examples\n\n```javascript\n// 1. Basic CRUD operations\nlet statsRepo = this.dataServer.getEntity('stats');\nlet newStat = await statsRepo.create({key: 'hp', label: 'Health'});\nlet allStats = await statsRepo.loadAll();\nlet hpStat = await statsRepo.loadOneBy('key', 'hp');\nawait statsRepo.updateById(hpStat.id, {base_value: 100});\n\n// 2. With relations\nlet skillData = await this.dataServer\n    .getEntity('skillsClassLevelUpAnimations')\n    .loadAllWithRelations();\n\n// 3. Accessing related data from loaded instances\nlet classPathModel = await this.dataServer.getEntity('skillsClassPath').loadById(1);\nlet relatedSkills = classPathModel.related_skills_levels_set.related_skills_levels;\n```\n\n## Important Notes\n\n- ALWAYS use `BaseDriver` type for repository properties\n- Entity classes are NEVER used for database operations\n- Model classes are wrapped by BaseDriver - never accessed directly\n- Storage driver is configurable: objection-js, prisma (default), mikro-orm\n- Relations can be nested\n- Entity relations keys are defined in `generated-entities/entities-config.js`\n- Custom entity overrides are in `lib/[plugin-folder]/server/entities` or `lib/[plugin-folder]/server/models`\n\n## Generated Entities Structure\n\nThe `generated-entities/` directory contains:\n- `entities/` - 60+ auto-generated entity classes for all database tables\n- `models/` - Custom entity overrides (extend generated entities)\n- `entities-config.js` - Entity relationship mappings and configuration\n- `entities-translations.js` - Translation/label mappings for admin panel\n\n## Entity Overrides and Database Defaults\n\n**Auto-Populated Fields:**\n\nSome fields should be auto-populated by the database or application logic, not manually entered through the admin panel.\n\n**Example: scores_detail.kill_time**\n```javascript\n// Database schema (migrations/production/reldens-install-v4.0.0.sql)\n// `kill_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP\n\n// Entity override (lib/scores/server/entities/scores-detail-entity-override.js)\nclass ScoresDetailEntityOverride extends ScoresDetailEntity {\n    static propertiesConfig(extraProps) {\n        let config = super.propertiesConfig(extraProps);\n        // Remove kill_time from admin panel edit form\n        config.editProperties.splice(config.editProperties.indexOf('kill_time'), 1);\n        return config;\n    }\n}\n\n// Game logic auto-populates when creating through code\n// (lib/scores/server/scores-updater.js)\nlet scoreDetailData = {\n    player_id: attacker.player_id,\n    obtained_score: obtainedScore,\n    kill_time: sc.formatDate(new Date()),  // Auto-populated\n    kill_player_id: props.killPlayerId || null,\n    kill_npc_id: props.killNpcId || null,\n};\n```\n\n**How It Works:**\n1. Field removed from `editProperties` - not shown in admin panel\n2. Database has `DEFAULT CURRENT_TIMESTAMP` - auto-fills when missing\n3. Game logic explicitly sets value when creating programmatically\n4. Prisma driver skips validation for fields with database defaults\n\n**Important:** With Prisma driver, validation automatically skips required fields that have database defaults, allowing admin panel creates to succeed even when these fields are excluded from the form.\n"
  },
  {
    "path": ".claude/trade-system-implementation.md",
    "content": "# Trade System Flow - Player-to-Player Trading\n\n## Server to Client Data Flow\n\n**Server sends to each player (via TRADE_SHOW message):**\n\n- `playerToExchangeKey`: The OTHER player's exchange key ('A' or 'B')\n- `playerConfirmed`: The OTHER player's confirmation status (for display message)\n- `myConfirmed`: THIS player's confirmation status (for button state logic)\n- `items`: THIS player's available inventory items (for column 1)\n- `traderItemsData`: The OTHER player's item data (for column 3 display)\n- `exchangeData`: Complete exchange object with structure: `{ 'A': {itemUid: qty}, 'B': {itemUid: qty} }`\n- `isTradeEnd`: Boolean indicating if both players confirmed (triggers trade completion)\n\n**Server determines playerToExchangeKey:**\n\nLine 305 in `lib/inventory/server/message-actions.js`:\n```javascript\nlet playerToExchangeKey = ownerSessionId === playerTo.sessionId ? 'A' : 'B';\n```\n\nThis identifies which exchange key belongs to the OTHER player (the one being sent data about in the message).\n\n## Three Column Structure\n\nThe trade UI displays three columns:\n\n- **Column 1** (`.my-items`): My available inventory items - items I can add to trade\n- **Column 2** (`.pushed-to-trade`): Items I'M SENDING to the other player\n- **Column 3** (`.got-from-trade`): Items I'M RECEIVING from the other player\n\n**HTML Structure:**\n\n- `.trade-container`\n  - `.trade-row.trade-items-boxes`\n    - `.trade-player-col.trade-col-1.my-items` (My Items)\n    - `.trade-player-col.trade-col-2.pushed-to-trade` (Sending)\n    - `.trade-player-col.trade-col-3.got-from-trade` (Receiving)\n  - `.trade-row.trade-confirm-actions`\n    - `.confirm-action` button\n    - `.disconfirm-action` button\n    - `.cancel-action` button\n\n## Client Processing Flow\n\n**When client receives TRADE_SHOW message:**\n\nLine 136-141 in `trade-message-handler.js`:\n```javascript\nlet traderExchangeKey = sc.get(this.message, 'playerToExchangeKey', 'A');\nlet myExchangeKey = 'A' === traderExchangeKey ? 'B' : 'A';\nthis.updateItemsList(items, container, exchangeData[myExchangeKey]);\nthis.updateMyExchangeData((exchangeData[myExchangeKey] || {}), items, myExchangeKey);\nthis.updateTraderExchangeData((exchangeData[traderExchangeKey] || {}), traderItemsData, traderExchangeKey);\n```\n\n**Processing steps:**\n\n1. Extract exchange keys:\n   - `traderExchangeKey` = value from `playerToExchangeKey` (OTHER player's key)\n   - `myExchangeKey` = opposite of `traderExchangeKey` (THIS player's key)\n\n2. Update Column 1 (my available items):\n   - Call `updateItemsList(items, container, exchangeData[myExchangeKey])`\n   - Passes MY exchange data to check which items to hide (items with full qty in trade)\n\n3. Update Column 2 (items I'm sending):\n   - Call `updateMyExchangeData(exchangeData[myExchangeKey], items, myExchangeKey)`\n   - Shows items from MY exchange key\n\n4. Update Column 3 (items I'm receiving):\n   - Call `updateTraderExchangeData(exchangeData[traderExchangeKey], traderItemsData, traderExchangeKey)`\n   - Shows items from TRADER's exchange key\n\n## HTML Recreation Pattern\n\n**Every TRADE_SHOW message triggers full HTML recreation:**\n\nLine 181 in `trade-message-handler.js`:\n```javascript\ncontainer.innerHTML = this.createTradeContainer(tradeItems);\n```\n\nServer sends TRADE_SHOW to BOTH players simultaneously when:\n- Item added/removed\n- Player confirms/disconfirms\n- ANY trade state change\n\n**Implications:**\n- All buttons and DOM elements are DESTROYED and RECREATED each time\n- Event listeners must be re-attached after every update (lines 182-183)\n- Server state is the ONLY source of truth\n- No client-side state should be maintained between updates\n\n## Button State Logic\n\n**Server sends confirmation statuses:**\n- `playerConfirmed`: OTHER player's confirmation status (for display message \"Player X CONFIRMED\")\n- `myConfirmed`: THIS player's confirmation status (for button state logic)\n\n**Button States Calculation:**\n\nLine 183 in `trade-message-handler.js`:\n```javascript\nthis.activateConfirmButtonAction(sc.get(this.message, 'exchangeData', {}));\n```\n\nLines 193-200 in `activateConfirmButtonAction`:\n```javascript\nlet myExchangeKey = sc.get(this.message, 'playerToExchangeKey', 'A');\nlet traderExchangeKey = 'A' === myExchangeKey ? 'B' : 'A';\nlet myExchangeData = exchangeData[myExchangeKey] || {};\nlet traderExchangeData = exchangeData[traderExchangeKey] || {};\nlet myHasItems = 0 < Object.keys(myExchangeData).length;\nlet traderHasItems = 0 < Object.keys(traderExchangeData).length;\nlet hasAnyItems = myHasItems || traderHasItems;\nlet iConfirmed = sc.get(this.message, 'myConfirmed', false);\n```\n\n**Confirm Button:**\n- `disabled = iConfirmed || !hasAnyItems`\n- Disabled when: Player already confirmed OR no items in trade\n- Enabled when: Player not confirmed AND items exist in trade\n\n**Disconfirm Button:**\n- `disabled = !iConfirmed`\n- Disabled when: Player not confirmed\n- Enabled when: Player already confirmed\n\n**Each player sees their own button states based on their own confirmation status from `myConfirmed` field.**\n\n## Example Data Flow\n\n**Scenario: Player A (key='A') adds itemX to trade, then confirms**\n\n**Server state after adding item:**\n```javascript\nexchangeData = {\n  'A': {itemX: 1},\n  'B': {}\n}\nconfirmations = {\n  'A': false,\n  'B': false\n}\n```\n\n**Message sent to Player A:**\n```javascript\n{\n  playerToExchangeKey: 'B',\n  playerConfirmed: false,\n  myConfirmed: false,\n  exchangeData: { 'A': {itemX: 1}, 'B': {} },\n  items: {...},\n  traderItemsData: {}\n}\n```\n\n**Player A UI state:**\n- Column 1: Shows Player A's available items (itemX hidden if full qty placed)\n- Column 2: Shows `exchangeData['A']` = {itemX: 1} (sending to Player B)\n- Column 3: Shows `exchangeData['B']` = {} (receiving from Player B - empty)\n- Confirm button: ENABLED (myConfirmed=false, hasAnyItems=true)\n- Disconfirm button: DISABLED (myConfirmed=false)\n\n**Message sent to Player B:**\n```javascript\n{\n  playerToExchangeKey: 'A',\n  playerConfirmed: false,\n  myConfirmed: false,\n  exchangeData: { 'A': {itemX: 1}, 'B': {} },\n  items: {...},\n  traderItemsData: {itemX: {...}}\n}\n```\n\n**Player B UI state:**\n- Column 1: Shows Player B's available items\n- Column 2: Shows `exchangeData['B']` = {} (sending to Player A - empty)\n- Column 3: Shows `exchangeData['A']` = {itemX: 1} (receiving from Player A)\n- Display message: No confirmation message (playerConfirmed=false)\n- Confirm button: ENABLED (myConfirmed=false, hasAnyItems=true)\n- Disconfirm button: DISABLED (myConfirmed=false)\n\n**After Player A clicks confirm:**\n\nServer updates confirmations:\n```javascript\nconfirmations = {\n  'A': true,\n  'B': false\n}\n```\n\n**Message sent to Player A:**\n```javascript\n{\n  playerToExchangeKey: 'B',\n  playerConfirmed: false,\n  myConfirmed: true,\n  // ... rest same\n}\n```\n\n**Player A UI state:**\n- Confirm button: DISABLED (myConfirmed=true)\n- Disconfirm button: ENABLED (myConfirmed=true)\n\n**Message sent to Player B:**\n```javascript\n{\n  playerToExchangeKey: 'A',\n  playerConfirmed: true,\n  myConfirmed: false,\n  // ... rest same\n}\n```\n\n**Player B UI state:**\n- Display message: \"Player A CONFIRMED\" (playerConfirmed=true)\n- Confirm button: ENABLED (myConfirmed=false)\n- Disconfirm button: DISABLED (myConfirmed=false)\n\n## Toggle Actions (Column 1 Only)\n\n**CSS Behavior (lines 373-405 in items-system.scss):**\n\n```scss\n.my-items .trade-item {\n    .actions-container.trade-actions {\n        display: none;  // Hidden by default\n\n        &.trade-actions-expanded {\n            display: block;  // Visible when toggled\n            position: absolute;  // Float below item\n            top: 54px;\n            left: 0;\n            z-index: 3;\n            background: $cBlack;\n            border: 1px solid $cWhite;\n            border-radius: 6px;\n            padding: 4px;\n        }\n    }\n}\n```\n\n**Important:** Toggle behavior with absolute positioning applies ONLY to column 1 (`.my-items`). Columns 2 and 3 do not have toggle behavior - their actions are always visible.\n\n## Files Involved\n\n**Client:**\n- `lib/inventory/client/trade-message-handler.js` - Main trade UI handler\n- `lib/inventory/client/trade-items-helper.js` - Item instance creation\n- `theme/default/css/items-system.scss` - Trade UI styles\n\n**Server:**\n- `lib/inventory/server/message-actions.js` - Trade message handling\n- `lib/inventory/server/trade.js` - Trade logic\n\n**Constants:**\n- `lib/objects/constants.js` - Trade action constants (ADD, REMOVE, CONFIRM, DISCONFIRM)\n- `lib/inventory/constants.js` - Inventory action constants (TRADE_START, TRADE_SHOW, etc.)\n\n**Translations:**\n- `lib/inventory/client/snippets/en_US.js` - UI labels (trade.actions.disconfirm)\n\n## CSS Styling\n\n**Player Confirmed Message** (lines 268-284 in items-system.scss):\n- Styled block with border and background\n- Empty state handling with transparent background\n\n**Button Layout** (lines 303-310):\n- Flexbox with center justification\n- No float positioning\n\n**Remove Button** (lines 358-366):\n- Absolute positioning at `right: -10px`\n- Icon size 20px\n\n**Toggle Actions** (lines 373-405):\n- Scoped to `.my-items` column only\n- Absolute positioning with floating styles\n- Other columns display actions inline without toggle\n"
  },
  {
    "path": ".claude/ui-visibility-configuration.md",
    "content": "# UI Visibility Configuration\n\n## Overview\n\nThis document describes the configuration system for controlling visibility of UI elements that can be displayed separately for the current player versus other players and NPCs.\n\n---\n\n## Life Bar Visibility Configuration\n\n### Purpose\n\nControls the display of health bars above player and NPC sprites. Allows independent configuration for current player, other players, and NPCs/enemies.\n\n### Configuration Paths\n\n- **Scope**: `client`\n- **Base Path**: `ui/lifeBar`\n- **Type**: boolean (type 3)\n\n### Visibility Properties\n\n**showCurrentPlayer**\n- Path: `client/ui/lifeBar/showCurrentPlayer`\n- Default: `0` (disabled)\n- Controls: Current player's lifebar visibility\n- Use case: Disable when using alternative UI systems like stat bars in player info panel\n\n**showAllPlayers**\n- Path: `client/ui/lifeBar/showAllPlayers`\n- Default: `0` (disabled)\n- Controls: Other players' lifebars visibility\n- Use case: Enable for PvP-focused games where seeing other players' health is important\n\n**showEnemies**\n- Path: `client/ui/lifeBar/showEnemies`\n- Default: `1` (enabled)\n- Controls: NPCs and enemies lifebars visibility\n- Use case: Disable for less cluttered visual experience\n\n**showOnClick**\n- Path: `client/ui/lifeBar/showOnClick`\n- Default: `1` (enabled)\n- Controls: Whether lifebars show only when target is clicked\n- Works for: Both other players and objects when their specific show flags are disabled\n\n### Implementation Flow\n\n**File**: `lib/users/client/lifebar-ui.js`\n**Method**: `canShowPlayerLifeBar(playerId)`\n\nFlow:\n1. Check if player is current player by comparing playerId with gameManager.getCurrentPlayer().playerId\n2. If current player: return value of `barConfig.showCurrentPlayer`\n3. If other player: check `barConfig.showAllPlayers` first, then `barConfig.showOnClick` if false\n4. Draw lifebar only if check returns true\n\n**Customizable Fields**:\n- `showCurrentPlayer` - boolean - stored in `this.barConfig.showCurrentPlayer`\n- `showAllPlayers` - boolean - stored in `this.barConfig.showAllPlayers`\n- `showEnemies` - boolean - stored in `this.barConfig.showEnemies`\n- `showOnClick` - boolean - stored in `this.barConfig.showOnClick`\n\n### Configuration Examples\n\nHide current player lifebar:\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';\n```\n\nShow all players lifebars always:\n```sql\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showOnClick';\n```\n\nHide all lifebars:\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showEnemies';\n```\n\n---\n\n## Player Names Visibility Configuration\n\n### Purpose\n\nControls the display of character names above player sprites. Allows independent configuration for current player versus other players.\n\n### Configuration Paths\n\n- **Scope**: `client`\n- **Base Path**: `ui/players`\n- **Type**: boolean (type 3)\n\n### Visibility Properties\n\n**showCurrentPlayerName**\n- Path: `client/ui/players/showCurrentPlayerName`\n- Default: `0` (disabled)\n- Controls: Current player's name visibility\n- Use case: Disable for cleaner visual experience when player info is shown in UI panel\n\n**showNames**\n- Path: `client/ui/players/showNames`\n- Default: `1` (enabled)\n- Controls: Other players' names visibility\n- Use case: Disable for less cluttered multiplayer experience\n\n**showNamesLimit**\n- Path: `client/ui/players/showNamesLimit`\n- Default: `10`\n- Controls: Maximum name length before truncation with ellipsis\n- Use case: Prevent long names from cluttering the screen\n\n### Implementation Flow\n\n**File**: `lib/users/client/player-engine.js`\n**Method**: `showPlayerName(id)`\n\nFlow:\n1. Determine which config to check using ternary: `id === this.playerId ? showCurrentPlayerName : showNames`\n2. Return false if config value is false\n3. Validate player exists and has name property\n4. Apply name length limit if configured\n5. Attach text sprite to player using SpriteTextFactory\n\n**Method**: `updateNamePosition(playerSprite)`\n\nFlow:\n1. Determine which config to check: `playerId === this.playerId ? showCurrentPlayerName : showNames`\n2. Return false if config is disabled or nameSprite doesn't exist\n3. Calculate relative position and update sprite coordinates\n\n**Customizable Fields**:\n- `globalConfigShowCurrentPlayerName` - boolean - loaded from `client/ui/players/showCurrentPlayerName`\n- `globalConfigShowNames` - boolean - loaded from `client/ui/players/showNames`\n- `globalConfigShowNamesLimit` - number - loaded from `client/ui/players/showNamesLimit`\n- `globalConfigNameText` - object - loaded from `client/ui/players/nameText` with style properties\n\n### Configuration Examples\n\nHide current player name:\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';\n```\n\nHide all other players names:\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';\n```\n\nShow both current and other players names:\n```sql\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';\n```\n\nIncrease name length limit:\n```sql\nUPDATE `config` SET `value` = '20' WHERE `scope` = 'client' AND `path` = 'ui/players/showNamesLimit';\n```\n\n---\n\n## Common Patterns\n\n### Pattern 1: Clean Current Player Display\n\nWhen using custom UI panels for current player information:\n\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';\n```\n\nResult: Current player has no floating UI elements, all info shown in panels\n\n### Pattern 2: Minimal Multiplayer Display\n\nFor focused gameplay with minimal distractions:\n\n```sql\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showOnClick';\n```\n\nResult: Other players show info only when clicked\n\n### Pattern 3: Full Visibility\n\nFor PvP or cooperative multiplayer:\n\n```sql\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showCurrentPlayer';\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showAllPlayers';\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showCurrentPlayerName';\nUPDATE `config` SET `value` = '1' WHERE `scope` = 'client' AND `path` = 'ui/players/showNames';\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'client' AND `path` = 'ui/lifeBar/showOnClick';\n```\n\nResult: All players always show names and health bars\n\n---\n\n## Implementation Details\n\n### Code Organization\n\nBoth systems follow the same architectural pattern:\n\n1. Configuration loaded in constructor from gameManager.config\n2. Single method determines visibility based on player type (current vs other)\n3. Ternary operator selects appropriate config property\n4. Early return if visibility check fails\n5. Render or update UI element if check passes\n\n### Property Access Pattern\n\nProperties are stored as class instance variables for performance:\n\n```javascript\nthis.barConfig = gameManager.config.get('client/ui/lifeBar');\nthis.globalConfigShowCurrentPlayerName = Boolean(this.config.get('client/ui/players/showCurrentPlayerName'));\nthis.globalConfigShowNames = Boolean(this.config.get('client/ui/players/showNames'));\n```\n\n### Conditional Logic Pattern\n\nBoth implementations use clean ternary logic:\n\n```javascript\nlet shouldShow = id === this.playerId ? this.configForCurrent : this.configForOthers;\nif(!shouldShow){\n    return false;\n}\n```\n\n### Integration Points\n\n**Life Bars**:\n- Created in: `lib/users/client/plugin.js` during `reldens.beforeCreateEngine` event\n- Updated on: `reldens.playerStatsUpdateAfter`, `reldens.runPlayerAnimation`, `reldens.updateGameSizeBefore`\n- Removed on: `reldens.playersOnRemove`\n\n**Player Names**:\n- Created in: `lib/users/client/player-engine.js` during `addPlayer()` call\n- Updated on: Every animation frame during `updatePlayerState()`\n- Removed on: `removePlayer()` call\n\n---\n\n## Migration Notes\n\nWhen adding these configurations to existing installations:\n\nDevelopment migration file:\n```sql\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES\n('client', 'ui/lifeBar/showCurrentPlayer', '0', 3),\n('client', 'ui/players/showCurrentPlayerName', '0', 3);\n```\n\nDefault values set to `0` to avoid changing existing behavior where alternative UI systems may already be implemented.\n\nAfter migration, users can explicitly enable these features if desired.\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: reldens\nopen_collective: # Replace with a single Open Collective username\nko_fi: damianpastorini\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: damian-pastorini\nissuehunt: damian-pastorini\notechie: # Replace with a single Otechie username\n# Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\ncustom: https://www.paypal.com/paypalme/damianpastorini\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n  schedule:\n    - cron: \"48 17 * * 0\"\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ javascript ]\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Initialize CodeQL\n        uses: github/codeql-action/init@v2\n        with:\n          languages: ${{ matrix.language }}\n          queries: +security-and-quality\n\n      - name: Autobuild\n        uses: github/codeql-action/autobuild@v2\n\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@v2\n        with:\n          category: \"/language:${{ matrix.language }}\"\n"
  },
  {
    "path": ".gitignore",
    "content": "/.cache\n/.env\n/.idea\n/knexfile.js\n/node_modules\n/npm-debug*\n/test\n/ts-node*\n/v8-compile-cache*\n/dev\nwinpty.exe.stackdump\n/.parcel-cache\n/tests/config.json\n/prisma\n/.claude/settings.json\n/.claude/settings.local.json\n/.claude/instructions.md\n/CLAUDE.local.md\n/.claude/skills/\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nReldens is an MMORPG Platform (v4.0.0-beta.39) built on Node.js, designed for developers to create multiplayer games. The platform integrates:\n- **Server**: Colyseus 0.16 for multiplayer game server\n- **Client**: Phaser 3 for game engine, Parcel for bundling\n- **Database**: Supports multiple storage drivers (objection-js, mikro-orm, prisma)\n- **Architecture**: Client-server with authoritative server, real-time synchronization via WebSockets\n\n**Node Version**: >= 20.0.0\n\n### Sub-Packages\n- **@reldens/utils** - Core utilities, Shortcuts class (imported as `sc`), EventsManagerSingleton, Logger\n- **@reldens/server-utils** - Server utilities, FileHandler, configuration helpers\n- **@reldens/storage** - Multi-ORM database layer (ObjectionJS, MikroORM, Prisma)\n- **@reldens/cms** - Content management system and admin panel\n- **@reldens/items-system** - Items and inventory system\n- **@reldens/modifiers** - Stats and modifiers system\n- **@reldens/skills** - Skills and abilities system\n\n## Essential Commands\n\n```bash\n# Testing\nnpm test\nnode tests/manager.js --filter=\"test-name\" --break-on-error\n\n# Building\nreldens buildSkeleton                   # Build both styles and client\nreldens fullRebuild                     # Complete rebuild from scratch\n\n# Database\nreldens generateEntities [--override]   # Generate entities from database schema\n\n# User management\nreldens createAdmin --user=username --pass=password --email=email@example.com\nreldens resetPassword --user=username --pass=newpassword\n```\n\n**Full command reference**: See `.claude/commands-reference.md`\n\n## Architecture Overview\n\n### Client-Server Organization\nThe codebase follows a **client/server split architecture** within each feature module:\n\n```\nlib/\n  ├── {feature}/\n  │   ├── client/           # Client-side code (Phaser, UI, rendering)\n  │   ├── server/           # Server-side code (Colyseus rooms, logic)\n  │   ├── constants.js      # Shared constants\n  │   └── schemas/          # Colyseus state schemas (if applicable)\n```\n\n### Core Entry Points\n- **Server**: `server.js` → `lib/game/server/manager.js` (ServerManager)\n- **Client**: `client.js` → `lib/game/client/game-manager.js` (GameManager)\n- **Theme**: `theme/default/index.js` initializes client with custom plugins\n\n### Feature Modules (23 Total)\nThe platform includes 23 feature modules: Game, Rooms, World, Config, Features, Actions, Inventory, Respawn, Rewards, Scores, Teams, Users, Chat, Audio, Prediction, Admin, Firebase, Ads, Import, Objects, Snippets, Bundlers.\n\n**Detailed list**: See `.claude/feature-modules.md`\n\n## Configuration System\n\nReldens uses a **database-driven configuration** with runtime overrides:\n\n1. **Database Config** (`config` table): Path-based keys, scoped by `scope` field\n2. **Environment Variables** (`.env`): Prefix `RELDENS_*` for all settings\n3. **Custom Classes**: Passed via `customClasses` to override defaults\n\n**Key Environment Variables:**\n- `RELDENS_STORAGE_DRIVER` - Storage driver (objection-js, mikro-orm, prisma)\n- `RELDENS_DB_HOST`, `RELDENS_DB_PORT`, `RELDENS_DB_NAME`, `RELDENS_DB_USER`, `RELDENS_DB_PASSWORD`\n- `RELDENS_HOT_PLUG` - Enable hot-plug configuration updates (0/1)\n\n**Full environment variables list**: See `.claude/environment-variables.md`\n\n## Events System\n\nThe platform uses **@reldens/utils EventsManagerSingleton** for extensibility:\n\n**Common Event Patterns**:\n- `reldens.{action}Before` - Hook before operation\n- `reldens.{action}After` - Hook after operation\n- Events are synchronous (`emitSync`) or async (`emit`)\n\n**Key Events**:\n- `reldens.serverConfigFeaturesReady` - Features loaded\n- `reldens.beforeJoinGame` - Before player joins\n- `reldens.startGameAfter` - Game initialized\n- `reldens.roomLoginOnAuth` - Custom authentication logic\n\n**Plugin Pattern**:\n```javascript\nclass ServerPlugin {\n    setup({events}) {\n        events.on('reldens.serverConfigFeaturesReady', (props) => {\n            // Custom logic here\n        });\n    }\n}\n```\n\n## Storage & Entity Management\n\n### CRITICAL: Understanding getEntity()\n\n`dataServer.getEntity()` returns a `BaseDriver` instance from `@reldens/storage`, NOT an Entity or Model class.\n\n```javascript\n// Correct - returns BaseDriver\nlet statsRepository = this.dataServer.getEntity('stats');\n\n// BaseDriver provides unified interface:\nawait statsRepository.create({key: 'hp', label: 'Health Points'});\nawait statsRepository.loadAll();\nawait statsRepository.loadOneBy('key', 'hp');\nawait statsRepository.updateById(1, {label: 'HP'});\n```\n\n**Type Annotation:**\n```javascript\n/** @type {import('@reldens/storage').BaseDriver} */\nthis.statsRepository = this.dataServer.getEntity('stats');\n```\n\n**Storage Drivers:**\n- `prisma` (current default): Modern ORM with type safety, custom validation\n- `objection-js`: Uses Knex.js, direct SQL, no validation\n- `mikro-orm`: ORM with decorators, supports MongoDB\n\n**Detailed architecture**: See `.claude/storage-architecture.md`\n**Entity list**: See `.claude/entities-reference.md`\n\n## Theme & Customization\n\n**Theme Structure** (`theme/`):\n- `plugins/` - Custom client/server plugins for game-specific logic\n- `default/` - Default theme assets (HTML, CSS, sprites, audio)\n- `admin/` - Admin panel customizations\n\n**Theme Management:**\nThemeManager (`lib/game/server/theme-manager.js`) handles asset copying, bundling, and CSS compilation.\n\n### Client Bundling Best Practices\n\n**CRITICAL**: Always use `themeManager.createClientBundle()` instead of calling `buildClient()` or `buildCss()` directly:\n\n- **createClientBundle()** - Wrapper that checks `RELDENS_ALLOW_RUN_BUNDLER` environment variable (used during server startup)\n- **buildClient()** - Direct method that checks `RELDENS_ALLOW_BUILD_CLIENT` environment variable\n- **buildCss()** - Direct method that checks `RELDENS_ALLOW_BUILD_CSS` environment variable\n\n**Environment Variables:**\n- `RELDENS_ALLOW_RUN_BUNDLER` - Controls `createClientBundle()` execution (default: 0)\n- `RELDENS_ALLOW_BUILD_CLIENT` - Controls `buildClient()` execution (default: 1)\n- `RELDENS_ALLOW_BUILD_CSS` - Controls `buildCss()` execution (default: 1)\n\n**Why this matters:** Production servers can regenerate clients and run Parcel builds for hot-reloading. These environment variables allow you to control when bundling happens, preventing unexpected builds during startup or deployment.\n\n## Colyseus 0.16 - CRITICAL State Synchronization\n\n**CRITICAL TIMING ISSUE**: Colyseus 0.16 state synchronization is asynchronous.\n\n### Problem Pattern (WRONG)\n```javascript\nlistenMessages(room, gameManager) {\n    if(!room.state || !room.state.bodies){\n        return false;  // ❌ WRONG - callbacks never set up!\n    }\n    this.setAddBodyCallback(room, gameManager);\n}\n```\n\n### Correct Pattern (RIGHT)\n```javascript\nlistenMessages(room, gameManager) {\n    if(!room.state || !room.state.bodies){\n        room.onStateChange.once((state) => {\n            this.setAddBodyCallback(room, gameManager);  // ✅ Wait for state\n        });\n        return false;\n    }\n    this.setAddBodyCallback(room, gameManager);\n}\n```\n\n**Alternative - Use Reactive Patterns:**\n```javascript\nactivateRoom(room) {\n    this.playersManager = RoomStateEntitiesManager.onEntityAdd(\n        room,\n        'players',\n        (player, key) => {\n            this.handlePlayerAdded(player, key);\n        }\n    );\n}\n```\n\n**CRITICAL**: Colyseus auto-cleans all listeners. Never store manager references or add manual disposal code unless explicitly needed.\n\n### Room Lifecycle\n1. `onCreate(options)`: Initialize world, physics, objects\n2. Player joins → `onJoin(client, options)`\n3. Message handling → `onMessage(client, message)`\n4. Player leaves → `onLeave(client, consented)`\n5. Room disposal → `onDispose()`\n\n## Common Development Patterns\n\n### Adding a New Feature\n1. Create feature module in `lib/{feature-name}/`\n2. Add database table in `migrations/`\n3. Create client/server subdirectories\n4. Add feature entry to `features` table\n5. Register in `lib/features/server/config-server.js`\n6. Implement `setup()` method to hook events\n\n### Modifying Game Logic\n- **Combat/Skills**: Edit `lib/actions/server/battle.js` or `pve.js`\n- **Player Stats**: Configure via database `stats` table\n- **Room Behavior**: Extend `RoomScene` or hook `reldens.createRoomAfter` event\n- **Client Rendering**: Modify Phaser scenes in `lib/game/client/scene-*.js`\n\n### Working with Database\n- Always use entity models via `dataServer.getEntity()`, never raw SQL\n- Generated entities are read-only; extend in `server/models/`\n- Use migrations for schema changes\n- Regenerate entities after schema changes: `reldens generateEntities --override`\n\n## Important Notes\n\n- **Authoritative Server**: All game logic runs on server; client is display-only\n- **Hot Plug**: Admin panel changes reload without restart if `RELDENS_HOT_PLUG=1`\n- **Logging**: Use `@reldens/utils/Logger` (configurable via `RELDENS_LOG_LEVEL`)\n- **File Operations**: Always use `@reldens/server-utils FileHandler` (never Node.js `fs`)\n- **Shortcuts Class**: Import as `sc` from `@reldens/utils` - provides `sc.get`, `sc.hasOwn`, `sc.isArray`, etc.\n- **Colyseus 0.16**: All client callbacks use `StateCallbacksManager` and `RoomStateEntitiesManager`\n- **Buffer Polyfill**: Required for Parcel bundling with Colyseus 0.16\n\n## Analysis Approach\n\nWhen working on code issues:\n- Always investigate thoroughly before making changes\n- Read related files completely before proposing solutions\n- Trace execution flows and dependencies\n- Provide proof for issues, never guess or assume\n- Verify file contents before creating patches\n- A variable with an unexpected value is not an issue, it is the result of a previous issue\n\n## Community & Support\n\n- **Discord**: https://discord.gg/HuJMxUY\n- **Demo**: https://dev.reldens.com/\n- **Documentation**: https://www.reldens.com/documentation/installation\n- **Issues**: https://github.com/damian-pastorini/reldens/issues\n- **Contact**: info@dwdeveloper.com\n\n## Detailed Reference Documentation\n\n- **Commands**: `.claude/commands-reference.md` - All CLI commands\n- **Environment Variables**: `.claude/environment-variables.md` - All RELDENS_* variables\n- **Feature Modules**: `.claude/feature-modules.md` - All 23 feature modules\n- **Storage Architecture**: `.claude/storage-architecture.md` - Entity management deep dive\n- **Entities**: `.claude/entities-reference.md` - All 60+ entity types\n- **Installer**: `.claude/installer-guide.md` - Web-based installation wizard guide\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Damian Alberto Pastorini\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<div style=\"width: 100%; background-color: #000000; text-align: center;\">\n    <a href=\"https://github.com/damian-pastorini/reldens\">\n        <img alt=\"Reldens - You can make it\" src=\"https://www.dwdeveloper.com/media/reldens/reldens-mmorpg-platform.png\"/>\n    </a>\n</div>\n\n---\n\n<h3 align=\"center\">\n    <p>\n        <a href=\"https://discord.gg/HuJMxUY\">Join our Discord community!</a>\n    </p>\n    <a href=\"https://discord.gg/HuJMxUY\">\n        <img alt=\"Reldens - Discord\" src=\"https://img.shields.io/badge/discord-%235865F2?style=for-the-badge&logo=discord&logoColor=white\"/>\n    </a>\n</h3>\n\n---\n\n# [Reldens - MMORPG Platform](https://www.reldens.com/)\n\nWelcome to Reldens, a platform designed to empower developers in creating multiplayer games.\n\nWith a wide array of features, Reldens enables developers to craft a rich gaming experience without grappling with the complexities usually associated with making a multiplayer game secure and efficient over any network.\n\nBuilt with popular development tools such as Node.js, Parcel, Colyseus, Phaser, and more, integrated with various database engines, and following robust development practices, the platform ensures security, ease of use, and high customization for developers.\n\nWhile the current stage of the platform is tailored for developers, ongoing improvements to the administration panel aim to make game creation accessible to non-developers in the future.\n\n---\n\n## [Check our website for the latest news!](https://www.reldens.com/ \"Check our website for the latest news\")\n\n---\n\n## [Features Overview](https://www.reldens.com/features)\n[First to mention, if the feature you need is not available, you can request a feature here: https://www.reldens.com/features-request](https://www.reldens.com/features-request)\n\nAs for the latest version released, the platform will provide you with the following features.\n\n- Installation GUI: Easy to install through the web.\n- Administration Panel: Manage every single aspect of your game through the panel.\n- Automatic data generators and import commands for attributes, levels, maps, objects, etc.\n- Trade System: Between Players (trade) and NPCs (buy and sell).\n- Full In-game Chat: Global, by room, and private messages between users with chat types and split in tabs.\n- Player Stats: Fully configurable stats! HP? MP? Magic? Stamina, you can set up as much as you need for your game logic.\n- Items System: create all kinds of items (usable and equipment).\n- Attacks, PVP, and PVE: create all kinds of skills, attacks, bullet type (can be dodged), target type (can't be dodged), fight with other players or just with NPCs.\n- NPC's, Enemies, and Respawn Areas: Set up NPC's with different options to interact and create respawn areas.\n- Teams and Clans System: Create, join, dismantle teams and clans, bonus based on clan level, and more.\n- Drops and Rewards: NPCs can drop any kind of items (rewards), and it can be configured to be split among team members.\n- Game rewards: you can configure rewards based on game events like daily or weekly login, it's events managed.\n- Game scores: configurable games scores, for example, keep track on monster kills and get a global scores table view.\n- Physics Engine and Pathfinder: Authoritative server with a physics engine and pathfinder.\n- Gravity World: Set up your rooms with or without gravity to get totally different kinds of gameplay.\n- Sounds System: Configurable multiple sound categories for any animation or scene.\n- In-game Ads: Integrated with CrazyGames and GameMonetize to show ads in-game.\n- Minimap: Optional configurable minimap.\n- Configurable Players Name and Life-bars visibility.\n- Terms and Conditions: Ready to be set up as you need.\n- Guest Users.\n- Users Registration: Continue playing later and double login invalidation.\n- Multiple Players Creation.\n- Registration and Login Integrated with Firebase.\n- Multiple servers switch support, from room-A in server-A, to room-B in server-B without notice.  \n- Database Ready: With multiple drivers for different storage or using MySQL by default, all you need will be saved.\n\n---\n\n## [Installation](https://www.reldens.com/documentation/installation \"Installation\")\n\nPlease follow the Installation Guide: https://www.reldens.com/documentation/installation.\n\n---\n\n## [Demo](https://dev.reldens.com/)\n\nWe use this demo to show how many features are available.\n\nTo access you can register in the following link (the basic registration will require email, user, and password, but\nnone real data is required here):\n\n- [https://demo.reldens.com/](https://dev.reldens.com/)\n\nYour email is required to access the server admin:\n\n- [https://demo.reldens.com/reldens-admin/](https://demo.reldens.com/reldens-admin/)\n\n---\n\n## Contact us\nJoin our Discord channel: [https://discord.gg/HuJMxUY](https://discord.gg/HuJMxUY) or contact us by email [info@dwdeveloper.com](mailto:info@dwdeveloper.com).\n\n\n## Support us! :)\n\n[![Ko-fi](https://img.shields.io/badge/Reldens-Support%20us%20on%20Ko--Fi-blue?style=for-the-badge)](https://ko-fi.com/I2I81VISA)\n[![Patroen](https://img.shields.io/badge/Reldens-Become%20a%20Patroen-blue?style=for-the-badge)](https://www.patreon.com/bePatron?u=18074832)\n\nIf you like to contribute in any way or donate to support the project please also feel free to contact me at [info@dwdeveloper.com](mailto:info@dwdeveloper.com).\n\n## Contributors\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n    <tr>\n        <td align=\"center\">\n            <a href=\"https://github.com/damian-pastorini\">\n                <img src=\"https://avatars.githubusercontent.com/u/1211779?v=4\" width=\"100px;\" alt=\"Damian Pastorini\"/><br/>\n                <sub><b>Damian Pastorini</b></sub>\n            </a><br/>\n            <a href=\"https://github.com/damian-pastorini/reldens/commits?author=damian-pastorini\" title=\"Owner\">💻</a>\n        </td>\n        <td align=\"center\">\n            <a href=\"https://github.com/luciovicentini\">\n                <img src=\"https://avatars.githubusercontent.com/u/16654212?v=4\" width=\"100px;\" alt=\"Lucio Vicentini\"/><br/>\n                <sub><b>Lucio Vicentini</b></sub>\n            </a><br/>\n            <a href=\"#\" title=\"Answering Questions\">💬</a> <a href=\"https://github.com/damian-pastorini/reldens/commits?author=luciovicentini\" title=\"Code\">💻</a>\n        </td>\n        <td align=\"center\">\n            <a href=\"https://github.com/TheXerxi\">\n                <img src=\"https://avatars.githubusercontent.com/u/146131154?v=4\" width=\"100px;\" alt=\"Joel P.\"/><br/>\n                <sub><b>Joel P.</b></sub>\n            </a><br/>\n            <a href=\"#\" title=\"Artist\">🎨</a> <a href=\"https://github.com/damian-pastorini/reldens/pull/256\" title=\"Code\">💻</a>\n        </td>\n    </tr>\n</table>\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\n---\n\n[![Reldens - NPM - Release](https://img.shields.io/github/v/release/damian-pastorini/reldens?color=red&style=for-the-badge)](https://www.npmjs.com/package/reldens)\n[![Reldens - GitHub - Stars](https://img.shields.io/github/stars/damian-pastorini/reldens?color=green&style=for-the-badge)](https://github.com/damian-pastorini/reldens)\n[![Reldens - Discord](https://img.shields.io/discord/599108949312143370?style=for-the-badge)](https://discord.gg/HuJMxUY)\n[![Reldens - Licence - MIT](https://img.shields.io/github/license/damian-pastorini/reldens?color=blue&style=for-the-badge)](https://github.com/damian-pastorini/reldens)\n\n---\n\n## License\n\n\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fdamian-pastorini%2Freldens.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fdamian-pastorini%2Freldens?ref=badge_large)\n\n---\n\n#### [By DwDeveloper](https://www.dwdeveloper.com/ \"DwDeveloper\")\n"
  },
  {
    "path": "bin/commander.js",
    "content": "#! /usr/bin/env node\n\n/**\n *\n * Reldens - Commands\n *\n */\n\nconst dotenv = require('dotenv');\nconst { spawn } = require('child_process');\nconst { CreateAdmin } = require('../lib/users/server/create-admin');\nconst { ResetPassword } = require('../lib/users/server/reset-password');\nconst { ThemeManager } = require('../lib/game/server/theme-manager');\nconst { PackagesInstallation } = require('../lib/game/server/installer/packages-installation');\nconst { ServerManager } = require('../server');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass Commander\n{\n\n    projectRoot = process.cwd();\n    reldensModulePath = FileHandler.joinPaths(this.projectRoot, 'node_modules', 'reldens');\n    projectThemeName = 'default';\n    jsSourceMaps = '1' === process.env.RELDENS_JS_SOURCEMAPS;\n    cssSourceMaps = '1' === process.env.RELDENS_CSS_SOURCEMAPS;\n    availableCommands = ['test', 'help', 'generateEntities', 'createAdmin', 'resetPassword'];\n    command = '';\n\n    prepareCommand()\n    {\n        if(!sc.hasOwn(process.env, 'RELDENS_LOG_LEVEL')){\n            process.env.RELDENS_LOG_LEVEL = 7;\n        }\n        Logger.info('- Reldens - ');\n        Logger.info('Use \"help\" as argument to see all the available commands:');\n        Logger.info('$ node scripts/reldens-commands.js help');\n        if(!FileHandler.exists(this.projectRoot)){\n            Logger.error('Can not access parent folder, check permissions.');\n            return false;\n        }\n        let parseResult = this.parseArgs();\n        if(!parseResult){\n            return false;\n        }\n        if(-1 !== this.availableCommands.indexOf(this.command)){\n            return true;\n        }\n        this.packagesInstallation = new PackagesInstallation({projectRoot: this.projectRoot});\n        if('createApp' === this.command){\n            if(!this.ensureReldensPackage()){\n                return false;\n            }\n        }\n        this.themeManager = new ThemeManager(this);\n        if(!this.validateThemeManagerCommand()){\n            return false;\n        }\n        this.themeManager.setupPaths(this);\n        Logger.info('Command \"'+this.command+'\" ready to be executed.');\n        Logger.info('Theme: '+this.projectThemeName);\n        return true;\n    }\n\n    ensureReldensPackage()\n    {\n        if(this.packagesInstallation.isPackageInstalled('reldens')){\n            return true;\n        }\n        Logger.info('Reldens package not found in node_modules.');\n        Logger.info('Installing reldens package...');\n        if(!this.packagesInstallation.processPackages(['reldens'], 'install')){\n            Logger.error('Failed to install reldens package.');\n            return false;\n        }\n        Logger.info('Reldens package installed successfully.');\n        return true;\n    }\n\n    parseArgs()\n    {\n        let args = process.argv;\n        if(2 === args.length){\n            Logger.error('Missing arguments.');\n            return false;\n        }\n        let extractedParams = args.slice(2);\n        this.command = extractedParams[0];\n        if(-1 !== this.availableCommands.indexOf(this.command)){\n            return true;\n        }\n        if(2 === extractedParams.length && '' !== extractedParams[1]){\n            this.projectThemeName = extractedParams[1];\n        }\n        return true;\n    }\n\n    validateThemeManagerCommand()\n    {\n        if(-1 !== this.availableCommands.indexOf(this.command)){\n            return true;\n        }\n        if('execute' === this.command || 'function' !== typeof this.themeManager[this.command]){\n            Logger.error('Invalid command:', this.command);\n            return false;\n        }\n        return true;\n    }\n\n    async execute()\n    {\n        await this.themeManager[this.command]();\n        Logger.info('Command executed!');\n        process.exit();\n    }\n\n    test()\n    {\n        let crudTestPath = FileHandler.joinPaths(this.projectRoot, 'crud-test');\n        FileHandler.createFolder(crudTestPath);\n        FileHandler.remove(crudTestPath);\n        Logger.info('Test OK.');\n    }\n\n    generateEntities()\n    {\n        this.loadEnvironmentConfig();\n        let args = [\n            'reldens-storage',\n            'generateEntities',\n            '--user='+process.env.RELDENS_DB_USER,\n            '--pass='+process.env.RELDENS_DB_PASSWORD,\n            '--host='+process.env.RELDENS_DB_HOST,\n            '--database='+process.env.RELDENS_DB_NAME,\n            '--driver='+(process.env.RELDENS_STORAGE_DRIVER || 'objection-js'),\n            '--client='+process.env.RELDENS_DB_CLIENT\n        ];\n        let overrideArg = process.argv.find(arg => '--override' === arg);\n        if(overrideArg){\n            args.push('--override');\n        }\n        Logger.info('Running: npx '+args.join(' '));\n        let child = spawn('npx', args, {\n            stdio: 'inherit',\n            cwd: this.projectRoot,\n            shell: true\n        });\n        child.on('exit', (code) => {\n            process.exit(code || 0);\n        });\n    }\n\n    async createAdmin()\n    {\n        Logger.info('Creating admin user...');\n        let args = this.getCommandArgs(['user', 'pass', 'email']);\n        let serverManager = await this.initializeServerManager();\n        let service = new CreateAdmin(serverManager);\n        let result = await service.create(args.user, args.pass, args.email);\n        process.exit(result ? 0 : 1);\n    }\n\n    async resetPassword()\n    {\n        Logger.info('Resetting user password...');\n        let args = this.getCommandArgs(['user', 'pass']);\n        let serverManager = await this.initializeServerManager();\n        let service = new ResetPassword(serverManager);\n        let result = await service.reset(args.user, args.pass);\n        process.exit(result ? 0 : 1);\n    }\n\n    getCommandArgs(requiredArgs)\n    {\n        let args = process.argv.slice(2);\n        let parsedArgs = {};\n        for(let arg of args){\n            if(!arg.includes('=')){\n                continue;\n            }\n            let [key, value] = arg.split('=');\n            let cleanKey = key.replace('--', '');\n            parsedArgs[cleanKey] = value;\n        }\n        for(let requiredArg of requiredArgs){\n            if(!parsedArgs[requiredArg]){\n                Logger.error('Missing required argument: --'+requiredArg);\n                process.exit(1);\n            }\n        }\n        return parsedArgs;\n    }\n\n    loadEnvironmentConfig()\n    {\n        let envPath = FileHandler.joinPaths(this.projectRoot, '.env');\n        if(!FileHandler.exists(envPath)){\n            Logger.error('.env file not found at: '+envPath);\n            process.exit(1);\n        }\n        dotenv.config({path: envPath});\n    }\n\n    async initializeServerManager()\n    {\n        this.loadEnvironmentConfig();\n        let serverManager = new ServerManager({\n            projectRoot: this.projectRoot,\n            projectThemeName: this.projectThemeName\n        });\n        await serverManager.initializeStorage(serverManager.rawConfig, serverManager.dataServerDriver);\n        await serverManager.initializeConfigManager();\n        return serverManager;\n    }\n\n    help()\n    {\n        Logger.info(' - Available commands:'\n            +\"\\n\"+'createApp                        - Create base project, copy all default files like in the skeleton.'\n            +\"\\n\"+'resetDist                        - Delete and create the \"dist\" folder.'\n            +\"\\n\"+'removeDist                       - Delete the \"dist\" folder.'\n            +\"\\n\"+'installDefaultTheme              - Copy theme and packages from node_modules into the current project theme.'\n            +\"\\n\"+'copyAssetsToDist                 - Copy project theme assets into the \"dist\" folder.'\n            +\"\\n\"+'copyKnexFile                     - Copy the knexfile.js sample into the project.'\n            +\"\\n\"+'copyEnvFile                      - Copy the .env file sample into the project.'\n            +\"\\n\"+'copyIndex                        - Copy the index file sample into the project.'\n            +\"\\n\"+'copyDefaultAssets                - Copy the reldens module default assets into the \"dist/assets\" folder.'\n            +\"\\n\"+'copyDefaultTheme                 - Copy the reldens module default theme into the project theme.'\n            +\"\\n\"+'copyPackage                      - Copy the reldens module packages into the project.'\n            +\"\\n\"+'buildCss [theme-folder-name]     - Builds the project theme styles.'\n            +\"\\n\"+'buildClient [theme-folder-name]  - Builds the project theme index.html.'\n            +\"\\n\"+'buildSkeleton                    - Builds the styles and project theme index.html.'\n            +\"\\n\"+'copyNew                          - Copy all default files for the fullRebuild.'\n            +\"\\n\"+'fullRebuild                      - Rebuild the Skeleton from scratch.'\n            +\"\\n\"+'installSkeleton                  - Installs Skeleton.'\n            +\"\\n\"+'copyServerFiles                  - Reset the \"dist\" folder and runs a fullRebuild.'\n            +\"\\n\"+'generateEntities [--override]    - Generate entities from database using .env credentials.'\n            +\"\\n\"+'createAdmin --user=X --pass=Y --email=Z  - Create admin user with specified credentials.'\n            +\"\\n\"+'resetPassword --user=X --pass=Y  - Reset password for specified user.');\n    }\n\n}\n\nmodule.exports = new Commander();\n"
  },
  {
    "path": "bin/generate.js",
    "content": "#! /usr/bin/env node\n\nconst {\n    PlayersExperiencePerLevel,\n    MonstersExperiencePerLevel,\n    AttributesPerLevel\n} = require('@reldens/game-data-generator');\nconst {\n    RandomMapGenerator,\n    LayerElementsObjectLoader,\n    LayerElementsCompositeLoader,\n    MultipleByLoaderGenerator,\n    MultipleWithAssociationsByLoaderGenerator\n} = require('@reldens/tile-map-generator');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger } = require('@reldens/utils');\n\n/**\n *\n * Commands:\n *\n * $ npx reldens-generate players-experience-per-level ./generate-data/players-experience-per-level.json\n *\n * $ npx reldens-generate monsters-experience-per-level ./generate-data/monsters-experience-per-level.json ./generate-data/players-level-sample.json\n *\n * $ npx reldens-generate attributes-per-level ./generate-data/attributes-per-level.json\n *\n * $ npx reldens-generate maps ./generate-data/map-data.json LayerElementsObjectLoader\n *\n * $ npx reldens-generate maps ./generate-data/map-composite-data.json LayerElementsCompositeLoader\n *\n * $ npx reldens-generate maps ./generate-data/map-composite-data-with-names.json MultipleByLoaderGenerator\n *\n * $ RELDENS_LOG_LEVEL=9 npx reldens-generate maps ./generate-data/map-composite-data-with-associations.json MultipleWithAssociationsByLoaderGenerator\n *\n */\n\nlet mapsGenerateModes = {\n    LayerElementsObjectLoader: async (commandParams) => {\n        let loader = new LayerElementsObjectLoader(commandParams);\n        await loader.load();\n        let generator = new RandomMapGenerator(loader.mapData);\n        return await generator.generate();\n    },\n    LayerElementsCompositeLoader: async (commandParams) => {\n        let loader = new LayerElementsCompositeLoader(commandParams);\n        await loader.load();\n        let generator = new RandomMapGenerator();\n        await generator.fromElementsProvider(loader.mapData);\n        return await generator.generate();\n    },\n    MultipleByLoaderGenerator: async (commandParams) => {\n        let generator = new MultipleByLoaderGenerator({loaderData: commandParams});\n        await generator.generate();\n    },\n    MultipleWithAssociationsByLoaderGenerator: async (commandParams) => {\n        let generator = new MultipleWithAssociationsByLoaderGenerator({loaderData: commandParams});\n        await generator.generate();\n    }\n};\n\nlet validCommands = {\n    'players-experience-per-level': (commandParams) => {\n        let playersExperiencePerLevel = new PlayersExperiencePerLevel(commandParams);\n        playersExperiencePerLevel.generate();\n    },\n    'monsters-experience-per-level': (commandParams) => {\n        let monstersExperiencePerLevel = new MonstersExperiencePerLevel(commandParams);\n        monstersExperiencePerLevel.generate();\n    },\n    'attributes-per-level': (commandParams) => {\n        let attributesPerLevel = new AttributesPerLevel(commandParams);\n        attributesPerLevel.generate();\n    },\n    'maps': async (commandParams) => {\n        if(!mapsGenerateModes[commandParams.importMode]){\n            console.error('- Invalid import mode. Valid options: '+Object.keys(mapsGenerateModes).join(', '));\n        }\n        let pathParts = commandParams.mapDataFile.split('/');\n        commandParams.mapDataFile = pathParts.pop();\n        commandParams.rootFolder = FileHandler.joinPaths(process.cwd(), ...pathParts);\n        // @TODO - BETA - Fix the generated folder placement.\n        // this will generate everything under rootFolder/whatever-the-path-is/generated:\n        await mapsGenerateModes[commandParams.importMode](commandParams);\n        let generatedFolder = FileHandler.joinPaths(commandParams.rootFolder, 'generated');\n        // we need to move the generated data to rootFolder/generated:\n        FileHandler.copyFolderSync(\n            generatedFolder,\n            FileHandler.joinPaths(process.cwd(), 'generated')\n        );\n    }\n};\n\nlet args = process.argv;\nif(2 === args.length){\n    console.error('- Missing arguments.', args);\n    return false;\n}\n\nlet extractedParams = args.slice(2);\n\nlet command = extractedParams[0] || false;\nif(!command){\n    console.error('- Missing command.');\n    return false;\n}\n\nif(-1 === Object.keys(validCommands).indexOf(command)){\n    console.error('- Invalid command.', command);\n    return false;\n}\n\nlet importJson = 'monsters-experience-per-level' === command\n    || 'players-experience-per-level' === command\n    || 'attributes-per-level' === command;\n\nif(importJson){\n    let filePath = FileHandler.joinPaths(process.cwd(), extractedParams[1] || '');\n    if(!filePath){\n        Logger.error('Invalid data file path.', process.cwd(), filePath);\n        return false;\n    }\n    let importedJson = FileHandler.fetchFileJson(filePath);\n    if(!importedJson){\n        console.error('- Can not parse data file.');\n        return false;\n    }\n    if('monsters-experience-per-level' === command){\n        let secondaryFilePath = FileHandler.joinPaths(process.cwd(), extractedParams[2] || '');\n        if(!secondaryFilePath){\n            Logger.error('Invalid data file path.', process.cwd(), secondaryFilePath);\n            return false;\n        }\n        let importedPlayerLevelsJson = FileHandler.fetchFileJson(secondaryFilePath);\n        if(!importedPlayerLevelsJson){\n            console.error('- Can not parse data file for player levels.');\n            return false;\n        }\n\n        importedJson.levelsExperienceByKey = importedPlayerLevelsJson;\n    }\n    return validCommands[command](importedJson);\n}\n\n\nif('maps' === command){\n    return validCommands[command]({\n        mapDataFile: extractedParams[1],\n        importMode: extractedParams[2] || ''\n    });\n}\n"
  },
  {
    "path": "bin/import.js",
    "content": "#! /usr/bin/env node\n\nconst { ServerManager } = require('../server');\nconst { ObjectsImporter } = require('../lib/import/server/objects-importer');\nconst { PlayersExperiencePerLevelImporter } = require('../lib/import/server/players-experience-per-level-importer');\nconst { AttributesPerLevelImporter } = require('../lib/import/server/attributes-per-level-importer');\nconst { ClassPathsImporter } = require('../lib/import/server/class-paths-importer');\nconst { MapsImporter } = require('../lib/import/server/maps-importer');\nconst { SkillsImporter } = require('../lib/import/server/skills-importer');\nconst { FileHandler } = require('@reldens/server-utils');\n\n/**\n *\n * Commands:\n *\n * $ npx reldens-import objects custom-game-theme-test generate-data/objects-generate-data.json\n *\n * - Player experience per-level import is not required if class-paths importer is going to be used.\n * $ npx reldens-import players-experience-per-level custom-game-theme-test generate-data/players-experience-per-level.json\n *\n * - Class-paths importer will also import the experience per level.\n * $ npx reldens-import class-paths custom-game-theme-test generate-data/class-paths.json\n *\n * $ npx reldens-import attributes-per-level custom-game-theme-test generate-data/class-paths-attributes-per-level.json\n *\n * $ npx reldens-import maps custom-game-theme-test generate-data/maps.json\n *\n * $ npx reldens-import skills custom-game-theme-test generate-data/skills-data.json\n *\n */\n\nlet validCommands = {\n    'objects': async (data, projectThemeName) => {\n        let serverManager = await initializeServer(data, projectThemeName);\n        if(!serverManager){\n            return false;\n        }\n        let importer = new ObjectsImporter(serverManager);\n        await importer.import(data);\n    },\n    'players-experience-per-level': async (data, projectThemeName) => {\n        let serverManager = await initializeServer(data, projectThemeName);\n        if(!serverManager){\n            return false;\n        }\n        let importer = new PlayersExperiencePerLevelImporter(serverManager);\n        await importer.import(data);\n    },\n    'attributes-per-level': async (data, projectThemeName) => {\n        let serverManager = await initializeServer(data, projectThemeName);\n        if(!serverManager){\n            return false;\n        }\n        let importer = new AttributesPerLevelImporter(serverManager);\n        await importer.import(data);\n    },\n    'class-paths': async (data, projectThemeName) => {\n        let serverManager = await initializeServer(data, projectThemeName);\n        if(!serverManager){\n            return false;\n        }\n        let importer = new ClassPathsImporter(serverManager);\n        await importer.import(data);\n    },\n    'maps': async (data, projectThemeName) => {\n        let serverManager = await initializeServer(data, projectThemeName);\n        if(!serverManager){\n            return false;\n        }\n        let importer = new MapsImporter(serverManager);\n        await importer.import(data);\n    },\n    'skills': async (data, projectThemeName) => {\n        let serverManager = await initializeServer(data, projectThemeName);\n        if(!serverManager){\n            return false;\n        }\n        let importer = new SkillsImporter(serverManager);\n        await importer.import(data);\n    }\n};\n\nasync function initializeServer(data, projectThemeName)\n{\n    if (!data) {\n        console.error('- Missing data.', data);\n        return false;\n    }\n    let appServer = new ServerManager({\n        projectRoot: process.cwd(),\n        projectThemeName\n    });\n    await appServer.initializeStorage(appServer.rawConfig, appServer.dataServerDriver);\n    return appServer;\n}\n\nlet args = process.argv;\nif(2 === args.length){\n    console.error('- Missing arguments.', args);\n    return false;\n}\n\nlet extractedParams = args.slice(2);\n\nlet command = extractedParams[0] || false;\nif (!command) {\n    console.error('- Missing command.');\n    return false;\n}\n\nlet themeName = extractedParams[1] || '';\nif (!themeName) {\n    console.error('- Missing active theme name.');\n    return false;\n}\n\nif (-1 === Object.keys(validCommands).indexOf(command)) {\n    console.error('- Invalid command.', command);\n    return false;\n}\n\nvalidCommands[command](FileHandler.fetchFileJson(extractedParams[2] || ''), themeName).then(() => {\n    console.log('Done.');\n    process.exit();\n}).catch((error) => {\n    console.error(error);\n    process.exit();\n});\n"
  },
  {
    "path": "bin/install-test.js",
    "content": "#! /usr/bin/env node\n\n/**\n *\n * Reldens - Install Test\n *\n */\n\nconst commander = require('./commander');\n\ncommander.projectThemeName = 'custom-game-theme-test';\n\ncommander.themeManager.setupPaths(commander);\n\nasync function runCommander(commander) {\n    await commander.themeManager.installSkeleton();\n    process.exit();\n}\n\nrunCommander(commander);\n"
  },
  {
    "path": "bin/reldens-commands.js",
    "content": "#! /usr/bin/env node\n\n/**\n *\n * Reldens - Commands\n *\n */\n\nconst commander = require('./commander');\n\nif(commander.prepareCommand()){\n    -1 !== commander.availableCommands.indexOf(commander.command)\n        ? commander[commander.command]()\n        : commander.execute().then(() => { console.info('- End'); });\n}\n"
  },
  {
    "path": "client.js",
    "content": "/**\n *\n * Reldens - GameManager\n *\n */\n\n// transpile and polyfill:\nrequire('core-js/stable');\nrequire('regenerator-runtime/runtime');\n\nconst { GameManager } = require('./lib/game/client/game-manager');\n\nmodule.exports.GameManager = GameManager;\n"
  },
  {
    "path": "generated-entities/entities/ads-banner-entity.js",
    "content": "/**\n *\n * Reldens - AdsBannerEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsBannerEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            ads_id: {\n                type: 'reference',\n                reference: 'ads',\n                isRequired: true,\n                dbType: 'int'\n            },\n            banner_data: {\n                type: 'textarea',\n                isRequired: true,\n                dbType: 'text'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('banner_data'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AdsBannerEntity = AdsBannerEntity;\n"
  },
  {
    "path": "generated-entities/entities/ads-entity.js",
    "content": "/**\n *\n * Reldens - AdsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass AdsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            provider_id: {\n                type: 'reference',\n                reference: 'ads_providers',\n                isRequired: true,\n                dbType: 'int'\n            },\n            type_id: {\n                type: 'reference',\n                reference: 'ads_types',\n                isRequired: true,\n                dbType: 'int'\n            },\n            width: {\n                type: 'number',\n                dbType: 'int'\n            },\n            height: {\n                type: 'number',\n                dbType: 'int'\n            },\n            position: {\n                dbType: 'varchar'\n            },\n            top: {\n                type: 'number',\n                dbType: 'int'\n            },\n            bottom: {\n                type: 'number',\n                dbType: 'int'\n            },\n            left: {\n                type: 'number',\n                dbType: 'int'\n            },\n            right: {\n                type: 'number',\n                dbType: 'int'\n            },\n            replay: {\n                type: 'number',\n                dbType: 'int'\n            },\n            enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AdsEntity = AdsEntity;\n"
  },
  {
    "path": "generated-entities/entities/ads-event-video-entity.js",
    "content": "/**\n *\n * Reldens - AdsEventVideoEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsEventVideoEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            ads_id: {\n                type: 'reference',\n                reference: 'ads',\n                isRequired: true,\n                dbType: 'int'\n            },\n            event_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            event_data: {\n                type: 'textarea',\n                isRequired: true,\n                dbType: 'text'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('event_data'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AdsEventVideoEntity = AdsEventVideoEntity;\n"
  },
  {
    "path": "generated-entities/entities/ads-played-entity.js",
    "content": "/**\n *\n * Reldens - AdsPlayedEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsPlayedEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            ads_id: {\n                type: 'reference',\n                reference: 'ads',\n                isRequired: true,\n                dbType: 'int'\n            },\n            player_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            started_at: {\n                type: 'datetime',\n                dbType: 'datetime'\n            },\n            ended_at: {\n                type: 'datetime',\n                dbType: 'datetime'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AdsPlayedEntity = AdsPlayedEntity;\n"
  },
  {
    "path": "generated-entities/entities/ads-providers-entity.js",
    "content": "/**\n *\n * Reldens - AdsProvidersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsProvidersEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AdsProvidersEntity = AdsProvidersEntity;\n"
  },
  {
    "path": "generated-entities/entities/ads-types-entity.js",
    "content": "/**\n *\n * Reldens - AdsTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AdsTypesEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AdsTypesEntity = AdsTypesEntity;\n"
  },
  {
    "path": "generated-entities/entities/audio-categories-entity.js",
    "content": "/**\n *\n * Reldens - AudioCategoriesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass AudioCategoriesEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            category_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            category_label: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            single_audio: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AudioCategoriesEntity = AudioCategoriesEntity;\n"
  },
  {
    "path": "generated-entities/entities/audio-entity.js",
    "content": "/**\n *\n * Reldens - AudioEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass AudioEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            audio_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            files_name: {\n                type: 'textarea',\n                isRequired: true,\n                dbType: 'text'\n            },\n            config: {\n                dbType: 'varchar'\n            },\n            room_id: {\n                type: 'reference',\n                reference: 'rooms',\n                dbType: 'int'\n            },\n            category_id: {\n                type: 'reference',\n                reference: 'audio_categories',\n                dbType: 'int'\n            },\n            enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('files_name'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AudioEntity = AudioEntity;\n"
  },
  {
    "path": "generated-entities/entities/audio-markers-entity.js",
    "content": "/**\n *\n * Reldens - AudioMarkersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AudioMarkersEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            audio_id: {\n                type: 'reference',\n                reference: 'audio',\n                isRequired: true,\n                dbType: 'int'\n            },\n            marker_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            start: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            duration: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            config: {\n                type: 'textarea',\n                dbType: 'text'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('config'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AudioMarkersEntity = AudioMarkersEntity;\n"
  },
  {
    "path": "generated-entities/entities/audio-player-config-entity.js",
    "content": "/**\n *\n * Reldens - AudioPlayerConfigEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass AudioPlayerConfigEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            player_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            category_id: {\n                type: 'reference',\n                reference: 'audio_categories',\n                dbType: 'int'\n            },\n            enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.AudioPlayerConfigEntity = AudioPlayerConfigEntity;\n"
  },
  {
    "path": "generated-entities/entities/chat-entity.js",
    "content": "/**\n *\n * Reldens - ChatEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ChatEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            player_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            room_id: {\n                type: 'reference',\n                reference: 'rooms',\n                dbType: 'int'\n            },\n            message: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            private_player_id: {\n                type: 'reference',\n                reference: 'players',\n                dbType: 'int'\n            },\n            message_type: {\n                type: 'reference',\n                reference: 'chat_message_types',\n                dbType: 'int'\n            },\n            message_time: {\n                type: 'datetime',\n                isRequired: true,\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ChatEntity = ChatEntity;\n"
  },
  {
    "path": "generated-entities/entities/chat-message-types-entity.js",
    "content": "/**\n *\n * Reldens - ChatMessageTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ChatMessageTypesEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            show_tab: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            also_show_in_type: {\n                type: 'reference',\n                reference: 'chat_message_types',\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ChatMessageTypesEntity = ChatMessageTypesEntity;\n"
  },
  {
    "path": "generated-entities/entities/clan-entity.js",
    "content": "/**\n *\n * Reldens - ClanEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass ClanEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'name';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            owner_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            points: {\n                type: 'number',\n                dbType: 'int'\n            },\n            level: {\n                type: 'reference',\n                reference: 'clan_levels',\n                isRequired: true,\n                dbType: 'int'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ClanEntity = ClanEntity;\n"
  },
  {
    "path": "generated-entities/entities/clan-levels-entity.js",
    "content": "/**\n *\n * Reldens - ClanLevelsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ClanLevelsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            key: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            required_experience: {\n                type: 'number',\n                dbType: 'bigint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ClanLevelsEntity = ClanLevelsEntity;\n"
  },
  {
    "path": "generated-entities/entities/clan-levels-modifiers-entity.js",
    "content": "/**\n *\n * Reldens - ClanLevelsModifiersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ClanLevelsModifiersEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            level_id: {\n                type: 'reference',\n                reference: 'clan_levels',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            operation: {\n                type: 'reference',\n                reference: 'operation_types',\n                isRequired: true,\n                dbType: 'int'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            minValue: {\n                dbType: 'varchar'\n            },\n            maxValue: {\n                dbType: 'varchar'\n            },\n            minProperty: {\n                dbType: 'varchar'\n            },\n            maxProperty: {\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ClanLevelsModifiersEntity = ClanLevelsModifiersEntity;\n"
  },
  {
    "path": "generated-entities/entities/clan-members-entity.js",
    "content": "/**\n *\n * Reldens - ClanMembersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ClanMembersEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            clan_id: {\n                type: 'reference',\n                reference: 'clan',\n                isRequired: true,\n                dbType: 'int'\n            },\n            player_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ClanMembersEntity = ClanMembersEntity;\n"
  },
  {
    "path": "generated-entities/entities/config-entity.js",
    "content": "/**\n *\n * Reldens - ConfigEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ConfigEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            scope: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            path: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            value: {\n                type: 'textarea',\n                isRequired: true,\n                dbType: 'text'\n            },\n            type: {\n                type: 'reference',\n                reference: 'config_types',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('value'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ConfigEntity = ConfigEntity;\n"
  },
  {
    "path": "generated-entities/entities/config-types-entity.js",
    "content": "/**\n *\n * Reldens - ConfigTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ConfigTypesEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ConfigTypesEntity = ConfigTypesEntity;\n"
  },
  {
    "path": "generated-entities/entities/drops-animations-entity.js",
    "content": "/**\n *\n * Reldens - DropsAnimationsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass DropsAnimationsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            item_id: {\n                type: 'reference',\n                reference: 'items_item',\n                isRequired: true,\n                dbType: 'int'\n            },\n            asset_type: {\n                dbType: 'varchar'\n            },\n            asset_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            file: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            extra_params: {\n                type: 'textarea',\n                dbType: 'text'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('extra_params'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.DropsAnimationsEntity = DropsAnimationsEntity;\n"
  },
  {
    "path": "generated-entities/entities/features-entity.js",
    "content": "/**\n *\n * Reldens - FeaturesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass FeaturesEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'title';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            code: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            is_enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.FeaturesEntity = FeaturesEntity;\n"
  },
  {
    "path": "generated-entities/entities/items-group-entity.js",
    "content": "/**\n *\n * Reldens - ItemsGroupEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass ItemsGroupEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            description: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            files_name: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            sort: {\n                type: 'number',\n                dbType: 'int'\n            },\n            items_limit: {\n                type: 'number',\n                dbType: 'int'\n            },\n            limit_per_item: {\n                type: 'number',\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = sc.removeFromArray([...propertiesKeys], ['description', 'files_name']);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ItemsGroupEntity = ItemsGroupEntity;\n"
  },
  {
    "path": "generated-entities/entities/items-inventory-entity.js",
    "content": "/**\n *\n * Reldens - ItemsInventoryEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ItemsInventoryEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            owner_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            item_id: {\n                type: 'reference',\n                reference: 'items_item',\n                isRequired: true,\n                dbType: 'int'\n            },\n            qty: {\n                type: 'number',\n                dbType: 'int'\n            },\n            remaining_uses: {\n                type: 'number',\n                dbType: 'int'\n            },\n            is_active: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ItemsInventoryEntity = ItemsInventoryEntity;\n"
  },
  {
    "path": "generated-entities/entities/items-item-entity.js",
    "content": "/**\n *\n * Reldens - ItemsItemEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass ItemsItemEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            type: {\n                type: 'reference',\n                reference: 'items_types',\n                dbType: 'int'\n            },\n            group_id: {\n                type: 'reference',\n                reference: 'items_group',\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            description: {\n                dbType: 'varchar'\n            },\n            qty_limit: {\n                type: 'number',\n                dbType: 'int'\n            },\n            uses_limit: {\n                type: 'number',\n                dbType: 'int'\n            },\n            useTimeOut: {\n                type: 'number',\n                dbType: 'int'\n            },\n            execTimeOut: {\n                type: 'number',\n                dbType: 'int'\n            },\n            customData: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('customData'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ItemsItemEntity = ItemsItemEntity;\n"
  },
  {
    "path": "generated-entities/entities/items-item-modifiers-entity.js",
    "content": "/**\n *\n * Reldens - ItemsItemModifiersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ItemsItemModifiersEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            item_id: {\n                type: 'reference',\n                reference: 'items_item',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            operation: {\n                type: 'reference',\n                reference: 'operation_types',\n                isRequired: true,\n                dbType: 'int'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            maxProperty: {\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ItemsItemModifiersEntity = ItemsItemModifiersEntity;\n"
  },
  {
    "path": "generated-entities/entities/items-types-entity.js",
    "content": "/**\n *\n * Reldens - ItemsTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ItemsTypesEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ItemsTypesEntity = ItemsTypesEntity;\n"
  },
  {
    "path": "generated-entities/entities/locale-entity.js",
    "content": "/**\n *\n * Reldens - LocaleEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass LocaleEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            locale: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            language_code: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            country_code: {\n                dbType: 'varchar'\n            },\n            enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.LocaleEntity = LocaleEntity;\n"
  },
  {
    "path": "generated-entities/entities/objects-animations-entity.js",
    "content": "/**\n *\n * Reldens - ObjectsAnimationsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsAnimationsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            object_id: {\n                type: 'reference',\n                reference: 'objects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            animationKey: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            animationData: {\n                type: 'textarea',\n                isRequired: true,\n                dbType: 'text'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('animationData'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ObjectsAnimationsEntity = ObjectsAnimationsEntity;\n"
  },
  {
    "path": "generated-entities/entities/objects-assets-entity.js",
    "content": "/**\n *\n * Reldens - ObjectsAssetsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsAssetsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            object_asset_id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            object_id: {\n                type: 'reference',\n                reference: 'objects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            asset_type: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            asset_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            asset_file: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            extra_params: {\n                type: 'textarea',\n                dbType: 'text'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('object_asset_id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('extra_params'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ObjectsAssetsEntity = ObjectsAssetsEntity;\n"
  },
  {
    "path": "generated-entities/entities/objects-entity.js",
    "content": "/**\n *\n * Reldens - ObjectsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass ObjectsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'title';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            room_id: {\n                type: 'reference',\n                reference: 'rooms',\n                isRequired: true,\n                dbType: 'int'\n            },\n            layer_name: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            tile_index: {\n                type: 'number',\n                dbType: 'int'\n            },\n            class_type: {\n                type: 'reference',\n                reference: 'objects_types',\n                dbType: 'int'\n            },\n            object_class_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            client_key: {\n                type: 'textarea',\n                isRequired: true,\n                dbType: 'text'\n            },\n            [titleProperty]: {\n                dbType: 'varchar'\n            },\n            private_params: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            client_params: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = sc.removeFromArray([...propertiesKeys], ['client_key', 'private_params', 'client_params']);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ObjectsEntity = ObjectsEntity;\n"
  },
  {
    "path": "generated-entities/entities/objects-items-inventory-entity.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsInventoryEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsItemsInventoryEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            owner_id: {\n                type: 'reference',\n                reference: 'objects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            item_id: {\n                type: 'reference',\n                reference: 'items_item',\n                isRequired: true,\n                dbType: 'int'\n            },\n            qty: {\n                type: 'number',\n                dbType: 'int'\n            },\n            remaining_uses: {\n                type: 'number',\n                dbType: 'int'\n            },\n            is_active: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ObjectsItemsInventoryEntity = ObjectsItemsInventoryEntity;\n"
  },
  {
    "path": "generated-entities/entities/objects-items-requirements-entity.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsRequirementsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsItemsRequirementsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            object_id: {\n                type: 'reference',\n                reference: 'objects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            item_key: {\n                type: 'reference',\n                reference: 'items_item',\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            required_item_key: {\n                type: 'reference',\n                reference: 'items_item',\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            required_quantity: {\n                type: 'number',\n                dbType: 'int'\n            },\n            auto_remove_requirement: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ObjectsItemsRequirementsEntity = ObjectsItemsRequirementsEntity;\n"
  },
  {
    "path": "generated-entities/entities/objects-items-rewards-entity.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsRewardsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsItemsRewardsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            object_id: {\n                type: 'reference',\n                reference: 'objects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            item_key: {\n                type: 'reference',\n                reference: 'items_item',\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            reward_item_key: {\n                type: 'reference',\n                reference: 'items_item',\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            reward_quantity: {\n                type: 'number',\n                dbType: 'int'\n            },\n            reward_item_is_required: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ObjectsItemsRewardsEntity = ObjectsItemsRewardsEntity;\n"
  },
  {
    "path": "generated-entities/entities/objects-skills-entity.js",
    "content": "/**\n *\n * Reldens - ObjectsSkillsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsSkillsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            object_id: {\n                type: 'reference',\n                reference: 'objects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_id: {\n                type: 'reference',\n                reference: 'skills_skill',\n                isRequired: true,\n                dbType: 'int'\n            },\n            target_id: {\n                type: 'reference',\n                reference: 'target_options',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ObjectsSkillsEntity = ObjectsSkillsEntity;\n"
  },
  {
    "path": "generated-entities/entities/objects-stats-entity.js",
    "content": "/**\n *\n * Reldens - ObjectsStatsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsStatsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            object_id: {\n                type: 'reference',\n                reference: 'objects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            stat_id: {\n                type: 'reference',\n                reference: 'stats',\n                isRequired: true,\n                dbType: 'int'\n            },\n            base_value: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            value: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ObjectsStatsEntity = ObjectsStatsEntity;\n"
  },
  {
    "path": "generated-entities/entities/objects-types-entity.js",
    "content": "/**\n *\n * Reldens - ObjectsTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ObjectsTypesEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ObjectsTypesEntity = ObjectsTypesEntity;\n"
  },
  {
    "path": "generated-entities/entities/operation-types-entity.js",
    "content": "/**\n *\n * Reldens - OperationTypesEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass OperationTypesEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                dbType: 'varchar'\n            },\n            key: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.OperationTypesEntity = OperationTypesEntity;\n"
  },
  {
    "path": "generated-entities/entities/players-entity.js",
    "content": "/**\n *\n * Reldens - PlayersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass PlayersEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'name';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            user_id: {\n                type: 'reference',\n                reference: 'users',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.PlayersEntity = PlayersEntity;\n"
  },
  {
    "path": "generated-entities/entities/players-state-entity.js",
    "content": "/**\n *\n * Reldens - PlayersStateEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass PlayersStateEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            player_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            room_id: {\n                type: 'reference',\n                reference: 'rooms',\n                isRequired: true,\n                dbType: 'int'\n            },\n            x: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            y: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            dir: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.PlayersStateEntity = PlayersStateEntity;\n"
  },
  {
    "path": "generated-entities/entities/players-stats-entity.js",
    "content": "/**\n *\n * Reldens - PlayersStatsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass PlayersStatsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            player_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            stat_id: {\n                type: 'reference',\n                reference: 'stats',\n                isRequired: true,\n                dbType: 'int'\n            },\n            base_value: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            value: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.PlayersStatsEntity = PlayersStatsEntity;\n"
  },
  {
    "path": "generated-entities/entities/respawn-entity.js",
    "content": "/**\n *\n * Reldens - RespawnEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass RespawnEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            object_id: {\n                type: 'reference',\n                reference: 'objects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            respawn_time: {\n                type: 'number',\n                dbType: 'int'\n            },\n            instances_limit: {\n                type: 'number',\n                dbType: 'int'\n            },\n            layer: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.RespawnEntity = RespawnEntity;\n"
  },
  {
    "path": "generated-entities/entities/rewards-entity.js",
    "content": "/**\n *\n * Reldens - RewardsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass RewardsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            object_id: {\n                type: 'reference',\n                reference: 'objects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            item_id: {\n                type: 'reference',\n                reference: 'items_item',\n                dbType: 'int'\n            },\n            modifier_id: {\n                type: 'reference',\n                reference: 'rewards_modifiers',\n                dbType: 'int'\n            },\n            experience: {\n                type: 'number',\n                dbType: 'int'\n            },\n            drop_rate: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            drop_quantity: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            is_unique: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            was_given: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            has_drop_body: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.RewardsEntity = RewardsEntity;\n"
  },
  {
    "path": "generated-entities/entities/rewards-events-entity.js",
    "content": "/**\n *\n * Reldens - RewardsEventsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass RewardsEventsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            description: {\n                dbType: 'varchar'\n            },\n            handler_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            event_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            event_data: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            position: {\n                type: 'number',\n                dbType: 'int'\n            },\n            enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            active_from: {\n                type: 'datetime',\n                dbType: 'datetime'\n            },\n            active_to: {\n                type: 'datetime',\n                dbType: 'datetime'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.RewardsEventsEntity = RewardsEventsEntity;\n"
  },
  {
    "path": "generated-entities/entities/rewards-events-state-entity.js",
    "content": "/**\n *\n * Reldens - RewardsEventsStateEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass RewardsEventsStateEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            rewards_events_id: {\n                type: 'reference',\n                reference: 'rewards_events',\n                isRequired: true,\n                dbType: 'int'\n            },\n            player_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            state: {\n                type: 'textarea',\n                dbType: 'text'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('state'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.RewardsEventsStateEntity = RewardsEventsStateEntity;\n"
  },
  {
    "path": "generated-entities/entities/rewards-modifiers-entity.js",
    "content": "/**\n *\n * Reldens - RewardsModifiersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass RewardsModifiersEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            operation: {\n                type: 'reference',\n                reference: 'operation_types',\n                isRequired: true,\n                dbType: 'int'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            minValue: {\n                dbType: 'varchar'\n            },\n            maxValue: {\n                dbType: 'varchar'\n            },\n            minProperty: {\n                dbType: 'varchar'\n            },\n            maxProperty: {\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.RewardsModifiersEntity = RewardsModifiersEntity;\n"
  },
  {
    "path": "generated-entities/entities/rooms-change-points-entity.js",
    "content": "/**\n *\n * Reldens - RoomsChangePointsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass RoomsChangePointsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            room_id: {\n                type: 'reference',\n                reference: 'rooms',\n                isRequired: true,\n                dbType: 'int'\n            },\n            tile_index: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            next_room_id: {\n                type: 'reference',\n                reference: 'rooms',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.RoomsChangePointsEntity = RoomsChangePointsEntity;\n"
  },
  {
    "path": "generated-entities/entities/rooms-entity.js",
    "content": "/**\n *\n * Reldens - RoomsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass RoomsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'title';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            name: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            map_filename: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            scene_images: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            room_class_key: {\n                dbType: 'varchar'\n            },\n            server_url: {\n                dbType: 'varchar'\n            },\n            customData: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('customData'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.RoomsEntity = RoomsEntity;\n"
  },
  {
    "path": "generated-entities/entities/rooms-return-points-entity.js",
    "content": "/**\n *\n * Reldens - RoomsReturnPointsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass RoomsReturnPointsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            room_id: {\n                type: 'reference',\n                reference: 'rooms',\n                isRequired: true,\n                dbType: 'int'\n            },\n            direction: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            x: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            y: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            is_default: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            from_room_id: {\n                type: 'reference',\n                reference: 'rooms',\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.RoomsReturnPointsEntity = RoomsReturnPointsEntity;\n"
  },
  {
    "path": "generated-entities/entities/scores-detail-entity.js",
    "content": "/**\n *\n * Reldens - ScoresDetailEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass ScoresDetailEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            player_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            obtained_score: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            kill_time: {\n                type: 'datetime',\n                dbType: 'datetime'\n            },\n            kill_player_id: {\n                type: 'number',\n                dbType: 'int'\n            },\n            kill_npc_id: {\n                type: 'number',\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ScoresDetailEntity = ScoresDetailEntity;\n"
  },
  {
    "path": "generated-entities/entities/scores-entity.js",
    "content": "/**\n *\n * Reldens - ScoresEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass ScoresEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            player_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            total_score: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            players_kills_count: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            npcs_kills_count: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            last_player_kill_time: {\n                type: 'datetime',\n                dbType: 'datetime'\n            },\n            last_npc_kill_time: {\n                type: 'datetime',\n                dbType: 'datetime'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.ScoresEntity = ScoresEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-class-level-up-animations-entity.js",
    "content": "/**\n *\n * Reldens - SkillsClassLevelUpAnimationsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsClassLevelUpAnimationsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            class_path_id: {\n                type: 'reference',\n                reference: 'skills_class_path',\n                dbType: 'int'\n            },\n            level_id: {\n                type: 'reference',\n                reference: 'skills_levels',\n                dbType: 'int'\n            },\n            animationData: {\n                type: 'textarea',\n                isRequired: true,\n                dbType: 'text'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('animationData'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsClassLevelUpAnimationsEntity = SkillsClassLevelUpAnimationsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-class-path-entity.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass SkillsClassPathEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            [titleProperty]: {\n                dbType: 'varchar'\n            },\n            levels_set_id: {\n                type: 'reference',\n                reference: 'skills_levels_set',\n                isRequired: true,\n                dbType: 'int'\n            },\n            enabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsClassPathEntity = SkillsClassPathEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-class-path-level-labels-entity.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathLevelLabelsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsClassPathLevelLabelsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            class_path_id: {\n                type: 'reference',\n                reference: 'skills_class_path',\n                isRequired: true,\n                dbType: 'int'\n            },\n            level_id: {\n                type: 'reference',\n                reference: 'skills_levels',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsClassPathLevelLabelsEntity = SkillsClassPathLevelLabelsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-class-path-level-skills-entity.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathLevelSkillsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsClassPathLevelSkillsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            class_path_id: {\n                type: 'reference',\n                reference: 'skills_class_path',\n                isRequired: true,\n                dbType: 'int'\n            },\n            level_id: {\n                type: 'reference',\n                reference: 'skills_levels',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_id: {\n                type: 'reference',\n                reference: 'skills_skill',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsClassPathLevelSkillsEntity = SkillsClassPathLevelSkillsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-groups-entity.js",
    "content": "/**\n *\n * Reldens - SkillsGroupsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsGroupsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            description: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            sort: {\n                type: 'number',\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsGroupsEntity = SkillsGroupsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-levels-entity.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsLevelsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            key: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            required_experience: {\n                type: 'number',\n                dbType: 'bigint'\n            },\n            level_set_id: {\n                type: 'reference',\n                reference: 'skills_levels_set',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsLevelsEntity = SkillsLevelsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-levels-modifiers-conditions-entity.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModifiersConditionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsLevelsModifiersConditionsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            levels_modifier_id: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            conditional: {\n                availableValues: [\n                    {value: 1, label: 'eq'},\n                    {value: 2, label: 'ne'},\n                    {value: 3, label: 'lt'},\n                    {value: 4, label: 'gt'},\n                    {value: 5, label: 'le'},\n                    {value: 6, label: 'ge'}\n                ],\n                isRequired: true,\n                dbType: 'enum'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsLevelsModifiersConditionsEntity = SkillsLevelsModifiersConditionsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-levels-modifiers-entity.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModifiersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsLevelsModifiersEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            level_id: {\n                type: 'reference',\n                reference: 'skills_levels',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            operation: {\n                type: 'reference',\n                reference: 'operation_types',\n                isRequired: true,\n                dbType: 'int'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            minValue: {\n                dbType: 'varchar'\n            },\n            maxValue: {\n                dbType: 'varchar'\n            },\n            minProperty: {\n                dbType: 'varchar'\n            },\n            maxProperty: {\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsLevelsModifiersEntity = SkillsLevelsModifiersEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-levels-set-entity.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsSetEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass SkillsLevelsSetEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            key: {\n                dbType: 'varchar'\n            },\n            [titleProperty]: {\n                dbType: 'varchar'\n            },\n            autoFillRanges: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            autoFillExperienceMultiplier: {\n                type: 'number',\n                dbType: 'int'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsLevelsSetEntity = SkillsLevelsSetEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-owners-class-path-entity.js",
    "content": "/**\n *\n * Reldens - SkillsOwnersClassPathEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsOwnersClassPathEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            class_path_id: {\n                type: 'reference',\n                reference: 'skills_class_path',\n                isRequired: true,\n                dbType: 'int'\n            },\n            owner_id: {\n                type: 'reference',\n                reference: 'players',\n                isRequired: true,\n                dbType: 'int'\n            },\n            currentLevel: {\n                type: 'number',\n                dbType: 'bigint'\n            },\n            currentExp: {\n                type: 'number',\n                dbType: 'bigint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsOwnersClassPathEntity = SkillsOwnersClassPathEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-animations-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAnimationsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsSkillAnimationsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_id: {\n                type: 'reference',\n                reference: 'skills_skill',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            classKey: {\n                dbType: 'varchar'\n            },\n            animationData: {\n                type: 'textarea',\n                isRequired: true,\n                dbType: 'text'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('animationData'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillAnimationsEntity = SkillsSkillAnimationsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-attack-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAttackEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass SkillsSkillAttackEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_id: {\n                type: 'reference',\n                reference: 'skills_skill',\n                isRequired: true,\n                dbType: 'int'\n            },\n            affectedProperty: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            allowEffectBelowZero: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            hitDamage: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            applyDirectDamage: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            attackProperties: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            defenseProperties: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            aimProperties: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            dodgeProperties: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            dodgeFullEnabled: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            dodgeOverAimSuccess: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            damageAffected: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            criticalAffected: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = sc.removeFromArray([...propertiesKeys], ['attackProperties', 'defenseProperties', 'aimProperties', 'dodgeProperties']);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillAttackEntity = SkillsSkillAttackEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass SkillsSkillEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            type: {\n                type: 'reference',\n                reference: 'skills_skill_type',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                dbType: 'varchar'\n            },\n            autoValidation: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            skillDelay: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            castTime: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            usesLimit: {\n                type: 'number',\n                dbType: 'int'\n            },\n            range: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            rangeAutomaticValidation: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            rangePropertyX: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            rangePropertyY: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            rangeTargetPropertyX: {\n                dbType: 'varchar'\n            },\n            rangeTargetPropertyY: {\n                dbType: 'varchar'\n            },\n            allowSelfTarget: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            },\n            criticalChance: {\n                type: 'number',\n                dbType: 'int'\n            },\n            criticalMultiplier: {\n                type: 'number',\n                dbType: 'int'\n            },\n            criticalFixedValue: {\n                type: 'number',\n                dbType: 'int'\n            },\n            customData: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('customData'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillEntity = SkillsSkillEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-group-relation-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillGroupRelationEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsSkillGroupRelationEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_id: {\n                type: 'reference',\n                reference: 'skills_skill',\n                isRequired: true,\n                dbType: 'int'\n            },\n            group_id: {\n                type: 'reference',\n                reference: 'skills_groups',\n                isRequired: true,\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillGroupRelationEntity = SkillsSkillGroupRelationEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-owner-conditions-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerConditionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsSkillOwnerConditionsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_id: {\n                type: 'reference',\n                reference: 'skills_skill',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            conditional: {\n                availableValues: [\n                    {value: 1, label: 'eq'},\n                    {value: 2, label: 'ne'},\n                    {value: 3, label: 'lt'},\n                    {value: 4, label: 'gt'},\n                    {value: 5, label: 'le'},\n                    {value: 6, label: 'ge'}\n                ],\n                isRequired: true,\n                dbType: 'enum'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillOwnerConditionsEntity = SkillsSkillOwnerConditionsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-owner-effects-conditions-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsConditionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsSkillOwnerEffectsConditionsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_owner_effect_id: {\n                type: 'reference',\n                reference: 'skills_skill_owner_effects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            conditional: {\n                availableValues: [\n                    {value: 1, label: 'eq'},\n                    {value: 2, label: 'ne'},\n                    {value: 3, label: 'lt'},\n                    {value: 4, label: 'gt'},\n                    {value: 5, label: 'le'},\n                    {value: 6, label: 'ge'}\n                ],\n                isRequired: true,\n                dbType: 'enum'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillOwnerEffectsConditionsEntity = SkillsSkillOwnerEffectsConditionsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-owner-effects-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsSkillOwnerEffectsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_id: {\n                type: 'reference',\n                reference: 'skills_skill',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            operation: {\n                type: 'reference',\n                reference: 'operation_types',\n                isRequired: true,\n                dbType: 'int'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            minValue: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            maxValue: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            minProperty: {\n                dbType: 'varchar'\n            },\n            maxProperty: {\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillOwnerEffectsEntity = SkillsSkillOwnerEffectsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-physical-data-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillPhysicalDataEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsSkillPhysicalDataEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_id: {\n                type: 'reference',\n                reference: 'skills_skill',\n                isRequired: true,\n                dbType: 'int'\n            },\n            magnitude: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            objectWidth: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            objectHeight: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            validateTargetOnHit: {\n                type: 'boolean',\n                dbType: 'tinyint'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillPhysicalDataEntity = SkillsSkillPhysicalDataEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-target-effects-conditions-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTargetEffectsConditionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsSkillTargetEffectsConditionsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_target_effect_id: {\n                type: 'reference',\n                reference: 'skills_skill_target_effects',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            conditional: {\n                availableValues: [\n                    {value: 1, label: 'eq'},\n                    {value: 2, label: 'ne'},\n                    {value: 3, label: 'lt'},\n                    {value: 4, label: 'gt'},\n                    {value: 5, label: 'le'},\n                    {value: 6, label: 'ge'}\n                ],\n                isRequired: true,\n                dbType: 'enum'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillTargetEffectsConditionsEntity = SkillsSkillTargetEffectsConditionsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-target-effects-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTargetEffectsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsSkillTargetEffectsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            skill_id: {\n                type: 'reference',\n                reference: 'skills_skill',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            property_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            operation: {\n                type: 'reference',\n                reference: 'operation_types',\n                isRequired: true,\n                dbType: 'int'\n            },\n            value: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            minValue: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            maxValue: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            minProperty: {\n                dbType: 'varchar'\n            },\n            maxProperty: {\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillTargetEffectsEntity = SkillsSkillTargetEffectsEntity;\n"
  },
  {
    "path": "generated-entities/entities/skills-skill-type-entity.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTypeEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass SkillsSkillTypeEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SkillsSkillTypeEntity = SkillsSkillTypeEntity;\n"
  },
  {
    "path": "generated-entities/entities/snippets-entity.js",
    "content": "/**\n *\n * Reldens - SnippetsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass SnippetsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'key';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            locale_id: {\n                type: 'reference',\n                reference: 'locale',\n                isRequired: true,\n                dbType: 'int'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            value: {\n                type: 'textarea',\n                isRequired: true,\n                dbType: 'text'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('value'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.SnippetsEntity = SnippetsEntity;\n"
  },
  {
    "path": "generated-entities/entities/stats-entity.js",
    "content": "/**\n *\n * Reldens - StatsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass StatsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'label';\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            [titleProperty]: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            description: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            base_value: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            customData: {\n                type: 'textarea',\n                dbType: 'text'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('customData'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.StatsEntity = StatsEntity;\n"
  },
  {
    "path": "generated-entities/entities/target-options-entity.js",
    "content": "/**\n *\n * Reldens - TargetOptionsEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass TargetOptionsEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            target_key: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            target_label: {\n                dbType: 'varchar'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.TargetOptionsEntity = TargetOptionsEntity;\n"
  },
  {
    "path": "generated-entities/entities/users-entity.js",
    "content": "/**\n *\n * Reldens - UsersEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\nconst { sc } = require('@reldens/utils');\n\nclass UsersEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            email: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            username: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            password: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            role_id: {\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            status: {\n                isRequired: true,\n                dbType: 'varchar'\n            },\n            created_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            updated_at: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            played_time: {\n                type: 'number',\n                dbType: 'int'\n            },\n            login_count: {\n                type: 'number',\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = [...propertiesKeys];\n        showProperties.splice(showProperties.indexOf('password'), 1);\n        let editProperties = sc.removeFromArray([...propertiesKeys], ['id', 'created_at', 'updated_at']);\n        let listProperties = [...propertiesKeys];\n        listProperties.splice(listProperties.indexOf('password'), 1);\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.UsersEntity = UsersEntity;\n"
  },
  {
    "path": "generated-entities/entities/users-locale-entity.js",
    "content": "/**\n *\n * Reldens - UsersLocaleEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass UsersLocaleEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            locale_id: {\n                type: 'reference',\n                reference: 'locale',\n                dbType: 'int'\n            },\n            user_id: {\n                type: 'reference',\n                reference: 'users',\n                dbType: 'int'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.UsersLocaleEntity = UsersLocaleEntity;\n"
  },
  {
    "path": "generated-entities/entities/users-login-entity.js",
    "content": "/**\n *\n * Reldens - UsersLoginEntity\n *\n */\n\nconst { EntityProperties } = require('@reldens/storage');\n\nclass UsersLoginEntity extends EntityProperties\n{\n\n    static propertiesConfig(extraProps)\n    {\n        let properties = {\n            id: {\n                isId: true,\n                type: 'number',\n                isRequired: true,\n                dbType: 'int'\n            },\n            user_id: {\n                type: 'reference',\n                reference: 'users',\n                isRequired: true,\n                dbType: 'int'\n            },\n            login_date: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            },\n            logout_date: {\n                type: 'datetime',\n                dbType: 'timestamp'\n            }\n        };\n        let propertiesKeys = Object.keys(properties);\n        let showProperties = propertiesKeys;\n        let editProperties = [...propertiesKeys];\n        editProperties.splice(editProperties.indexOf('id'), 1);\n        let listProperties = propertiesKeys;\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            ...extraProps\n        };\n    }\n\n}\n\nmodule.exports.UsersLoginEntity = UsersLoginEntity;\n"
  },
  {
    "path": "generated-entities/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { AdsBannerEntity } = require('./entities/ads-banner-entity');\nconst { AdsEntity } = require('./entities/ads-entity');\nconst { AdsEventVideoEntity } = require('./entities/ads-event-video-entity');\nconst { AdsPlayedEntity } = require('./entities/ads-played-entity');\nconst { AdsProvidersEntity } = require('./entities/ads-providers-entity');\nconst { AdsTypesEntity } = require('./entities/ads-types-entity');\nconst { AudioCategoriesEntity } = require('./entities/audio-categories-entity');\nconst { AudioEntity } = require('./entities/audio-entity');\nconst { AudioMarkersEntity } = require('./entities/audio-markers-entity');\nconst { AudioPlayerConfigEntity } = require('./entities/audio-player-config-entity');\nconst { ChatEntity } = require('./entities/chat-entity');\nconst { ChatMessageTypesEntity } = require('./entities/chat-message-types-entity');\nconst { ClanEntity } = require('./entities/clan-entity');\nconst { ClanLevelsEntity } = require('./entities/clan-levels-entity');\nconst { ClanLevelsModifiersEntity } = require('./entities/clan-levels-modifiers-entity');\nconst { ClanMembersEntity } = require('./entities/clan-members-entity');\nconst { ConfigEntity } = require('./entities/config-entity');\nconst { ConfigTypesEntity } = require('./entities/config-types-entity');\nconst { DropsAnimationsEntity } = require('./entities/drops-animations-entity');\nconst { FeaturesEntity } = require('./entities/features-entity');\nconst { ItemsGroupEntity } = require('./entities/items-group-entity');\nconst { ItemsInventoryEntity } = require('./entities/items-inventory-entity');\nconst { ItemsItemEntity } = require('./entities/items-item-entity');\nconst { ItemsItemModifiersEntity } = require('./entities/items-item-modifiers-entity');\nconst { ItemsTypesEntity } = require('./entities/items-types-entity');\nconst { LocaleEntity } = require('./entities/locale-entity');\nconst { ObjectsAnimationsEntity } = require('./entities/objects-animations-entity');\nconst { ObjectsAssetsEntity } = require('./entities/objects-assets-entity');\nconst { ObjectsEntity } = require('./entities/objects-entity');\nconst { ObjectsItemsInventoryEntity } = require('./entities/objects-items-inventory-entity');\nconst { ObjectsItemsRequirementsEntity } = require('./entities/objects-items-requirements-entity');\nconst { ObjectsItemsRewardsEntity } = require('./entities/objects-items-rewards-entity');\nconst { ObjectsSkillsEntity } = require('./entities/objects-skills-entity');\nconst { ObjectsStatsEntity } = require('./entities/objects-stats-entity');\nconst { ObjectsTypesEntity } = require('./entities/objects-types-entity');\nconst { OperationTypesEntity } = require('./entities/operation-types-entity');\nconst { PlayersEntity } = require('./entities/players-entity');\nconst { PlayersStateEntity } = require('./entities/players-state-entity');\nconst { PlayersStatsEntity } = require('./entities/players-stats-entity');\nconst { RespawnEntity } = require('./entities/respawn-entity');\nconst { RewardsEntity } = require('./entities/rewards-entity');\nconst { RewardsEventsEntity } = require('./entities/rewards-events-entity');\nconst { RewardsEventsStateEntity } = require('./entities/rewards-events-state-entity');\nconst { RewardsModifiersEntity } = require('./entities/rewards-modifiers-entity');\nconst { RoomsChangePointsEntity } = require('./entities/rooms-change-points-entity');\nconst { RoomsEntity } = require('./entities/rooms-entity');\nconst { RoomsReturnPointsEntity } = require('./entities/rooms-return-points-entity');\nconst { ScoresDetailEntity } = require('./entities/scores-detail-entity');\nconst { ScoresEntity } = require('./entities/scores-entity');\nconst { SkillsClassLevelUpAnimationsEntity } = require('./entities/skills-class-level-up-animations-entity');\nconst { SkillsClassPathEntity } = require('./entities/skills-class-path-entity');\nconst { SkillsClassPathLevelLabelsEntity } = require('./entities/skills-class-path-level-labels-entity');\nconst { SkillsClassPathLevelSkillsEntity } = require('./entities/skills-class-path-level-skills-entity');\nconst { SkillsGroupsEntity } = require('./entities/skills-groups-entity');\nconst { SkillsLevelsEntity } = require('./entities/skills-levels-entity');\nconst { SkillsLevelsModifiersConditionsEntity } = require('./entities/skills-levels-modifiers-conditions-entity');\nconst { SkillsLevelsModifiersEntity } = require('./entities/skills-levels-modifiers-entity');\nconst { SkillsLevelsSetEntity } = require('./entities/skills-levels-set-entity');\nconst { SkillsOwnersClassPathEntity } = require('./entities/skills-owners-class-path-entity');\nconst { SkillsSkillAnimationsEntity } = require('./entities/skills-skill-animations-entity');\nconst { SkillsSkillAttackEntity } = require('./entities/skills-skill-attack-entity');\nconst { SkillsSkillEntity } = require('./entities/skills-skill-entity');\nconst { SkillsSkillGroupRelationEntity } = require('./entities/skills-skill-group-relation-entity');\nconst { SkillsSkillOwnerConditionsEntity } = require('./entities/skills-skill-owner-conditions-entity');\nconst { SkillsSkillOwnerEffectsConditionsEntity } = require('./entities/skills-skill-owner-effects-conditions-entity');\nconst { SkillsSkillOwnerEffectsEntity } = require('./entities/skills-skill-owner-effects-entity');\nconst { SkillsSkillPhysicalDataEntity } = require('./entities/skills-skill-physical-data-entity');\nconst { SkillsSkillTargetEffectsConditionsEntity } = require('./entities/skills-skill-target-effects-conditions-entity');\nconst { SkillsSkillTargetEffectsEntity } = require('./entities/skills-skill-target-effects-entity');\nconst { SkillsSkillTypeEntity } = require('./entities/skills-skill-type-entity');\nconst { SnippetsEntity } = require('./entities/snippets-entity');\nconst { StatsEntity } = require('./entities/stats-entity');\nconst { TargetOptionsEntity } = require('./entities/target-options-entity');\nconst { UsersEntity } = require('./entities/users-entity');\nconst { UsersLocaleEntity } = require('./entities/users-locale-entity');\nconst { UsersLoginEntity } = require('./entities/users-login-entity');\n\nlet entitiesConfig = {\n    adsBanner: AdsBannerEntity.propertiesConfig(),\n    ads: AdsEntity.propertiesConfig(),\n    adsEventVideo: AdsEventVideoEntity.propertiesConfig(),\n    adsPlayed: AdsPlayedEntity.propertiesConfig(),\n    adsProviders: AdsProvidersEntity.propertiesConfig(),\n    adsTypes: AdsTypesEntity.propertiesConfig(),\n    audioCategories: AudioCategoriesEntity.propertiesConfig(),\n    audio: AudioEntity.propertiesConfig(),\n    audioMarkers: AudioMarkersEntity.propertiesConfig(),\n    audioPlayerConfig: AudioPlayerConfigEntity.propertiesConfig(),\n    chat: ChatEntity.propertiesConfig(),\n    chatMessageTypes: ChatMessageTypesEntity.propertiesConfig(),\n    clan: ClanEntity.propertiesConfig(),\n    clanLevels: ClanLevelsEntity.propertiesConfig(),\n    clanLevelsModifiers: ClanLevelsModifiersEntity.propertiesConfig(),\n    clanMembers: ClanMembersEntity.propertiesConfig(),\n    config: ConfigEntity.propertiesConfig(),\n    configTypes: ConfigTypesEntity.propertiesConfig(),\n    dropsAnimations: DropsAnimationsEntity.propertiesConfig(),\n    features: FeaturesEntity.propertiesConfig(),\n    itemsGroup: ItemsGroupEntity.propertiesConfig(),\n    itemsInventory: ItemsInventoryEntity.propertiesConfig(),\n    itemsItem: ItemsItemEntity.propertiesConfig(),\n    itemsItemModifiers: ItemsItemModifiersEntity.propertiesConfig(),\n    itemsTypes: ItemsTypesEntity.propertiesConfig(),\n    locale: LocaleEntity.propertiesConfig(),\n    objectsAnimations: ObjectsAnimationsEntity.propertiesConfig(),\n    objectsAssets: ObjectsAssetsEntity.propertiesConfig(),\n    objects: ObjectsEntity.propertiesConfig(),\n    objectsItemsInventory: ObjectsItemsInventoryEntity.propertiesConfig(),\n    objectsItemsRequirements: ObjectsItemsRequirementsEntity.propertiesConfig(),\n    objectsItemsRewards: ObjectsItemsRewardsEntity.propertiesConfig(),\n    objectsSkills: ObjectsSkillsEntity.propertiesConfig(),\n    objectsStats: ObjectsStatsEntity.propertiesConfig(),\n    objectsTypes: ObjectsTypesEntity.propertiesConfig(),\n    operationTypes: OperationTypesEntity.propertiesConfig(),\n    players: PlayersEntity.propertiesConfig(),\n    playersState: PlayersStateEntity.propertiesConfig(),\n    playersStats: PlayersStatsEntity.propertiesConfig(),\n    respawn: RespawnEntity.propertiesConfig(),\n    rewards: RewardsEntity.propertiesConfig(),\n    rewardsEvents: RewardsEventsEntity.propertiesConfig(),\n    rewardsEventsState: RewardsEventsStateEntity.propertiesConfig(),\n    rewardsModifiers: RewardsModifiersEntity.propertiesConfig(),\n    roomsChangePoints: RoomsChangePointsEntity.propertiesConfig(),\n    rooms: RoomsEntity.propertiesConfig(),\n    roomsReturnPoints: RoomsReturnPointsEntity.propertiesConfig(),\n    scoresDetail: ScoresDetailEntity.propertiesConfig(),\n    scores: ScoresEntity.propertiesConfig(),\n    skillsClassLevelUpAnimations: SkillsClassLevelUpAnimationsEntity.propertiesConfig(),\n    skillsClassPath: SkillsClassPathEntity.propertiesConfig(),\n    skillsClassPathLevelLabels: SkillsClassPathLevelLabelsEntity.propertiesConfig(),\n    skillsClassPathLevelSkills: SkillsClassPathLevelSkillsEntity.propertiesConfig(),\n    skillsGroups: SkillsGroupsEntity.propertiesConfig(),\n    skillsLevels: SkillsLevelsEntity.propertiesConfig(),\n    skillsLevelsModifiersConditions: SkillsLevelsModifiersConditionsEntity.propertiesConfig(),\n    skillsLevelsModifiers: SkillsLevelsModifiersEntity.propertiesConfig(),\n    skillsLevelsSet: SkillsLevelsSetEntity.propertiesConfig(),\n    skillsOwnersClassPath: SkillsOwnersClassPathEntity.propertiesConfig(),\n    skillsSkillAnimations: SkillsSkillAnimationsEntity.propertiesConfig(),\n    skillsSkillAttack: SkillsSkillAttackEntity.propertiesConfig(),\n    skillsSkill: SkillsSkillEntity.propertiesConfig(),\n    skillsSkillGroupRelation: SkillsSkillGroupRelationEntity.propertiesConfig(),\n    skillsSkillOwnerConditions: SkillsSkillOwnerConditionsEntity.propertiesConfig(),\n    skillsSkillOwnerEffectsConditions: SkillsSkillOwnerEffectsConditionsEntity.propertiesConfig(),\n    skillsSkillOwnerEffects: SkillsSkillOwnerEffectsEntity.propertiesConfig(),\n    skillsSkillPhysicalData: SkillsSkillPhysicalDataEntity.propertiesConfig(),\n    skillsSkillTargetEffectsConditions: SkillsSkillTargetEffectsConditionsEntity.propertiesConfig(),\n    skillsSkillTargetEffects: SkillsSkillTargetEffectsEntity.propertiesConfig(),\n    skillsSkillType: SkillsSkillTypeEntity.propertiesConfig(),\n    snippets: SnippetsEntity.propertiesConfig(),\n    stats: StatsEntity.propertiesConfig(),\n    targetOptions: TargetOptionsEntity.propertiesConfig(),\n    users: UsersEntity.propertiesConfig(),\n    usersLocale: UsersLocaleEntity.propertiesConfig(),\n    usersLogin: UsersLoginEntity.propertiesConfig()\n};\n\nmodule.exports.entitiesConfig = entitiesConfig;\n"
  },
  {
    "path": "generated-entities/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        'ads_banner': 'Ads Banner',\n        'ads': 'Ads',\n        'ads_event_video': 'Ads Event Video',\n        'ads_played': 'Ads Played',\n        'ads_providers': 'Ads Providers',\n        'ads_types': 'Ads Types',\n        'audio_categories': 'Audio Categories',\n        'audio': 'Audio',\n        'audio_markers': 'Audio Markers',\n        'audio_player_config': 'Audio Player Config',\n        'chat': 'Chat',\n        'chat_message_types': 'Chat Message Types',\n        'clan': 'Clan',\n        'clan_levels': 'Clan Levels',\n        'clan_levels_modifiers': 'Clan Levels Modifiers',\n        'clan_members': 'Clan Members',\n        'config': 'Config',\n        'config_types': 'Config Types',\n        'drops_animations': 'Drops Animations',\n        'features': 'Features',\n        'items_group': 'Items Group',\n        'items_inventory': 'Items Inventory',\n        'items_item': 'Items Item',\n        'items_item_modifiers': 'Items Item Modifiers',\n        'items_types': 'Items Types',\n        'locale': 'Locale',\n        'objects_animations': 'Objects Animations',\n        'objects_assets': 'Objects Assets',\n        'objects': 'Objects',\n        'objects_items_inventory': 'Objects Items Inventory',\n        'objects_items_requirements': 'Objects Items Requirements',\n        'objects_items_rewards': 'Objects Items Rewards',\n        'objects_skills': 'Objects Skills',\n        'objects_stats': 'Objects Stats',\n        'objects_types': 'Objects Types',\n        'operation_types': 'Operation Types',\n        'players': 'Players',\n        'players_state': 'Players State',\n        'players_stats': 'Players Stats',\n        'respawn': 'Respawn',\n        'rewards': 'Rewards',\n        'rewards_events': 'Rewards Events',\n        'rewards_events_state': 'Rewards Events State',\n        'rewards_modifiers': 'Rewards Modifiers',\n        'rooms_change_points': 'Rooms Change Points',\n        'rooms': 'Rooms',\n        'rooms_return_points': 'Rooms Return Points',\n        'scores_detail': 'Scores Detail',\n        'scores': 'Scores',\n        'skills_class_level_up_animations': 'Skills Class Level Up Animations',\n        'skills_class_path': 'Skills Class Path',\n        'skills_class_path_level_labels': 'Skills Class Path Level Labels',\n        'skills_class_path_level_skills': 'Skills Class Path Level Skills',\n        'skills_groups': 'Skills Groups',\n        'skills_levels': 'Skills Levels',\n        'skills_levels_modifiers_conditions': 'Skills Levels Modifiers Conditions',\n        'skills_levels_modifiers': 'Skills Levels Modifiers',\n        'skills_levels_set': 'Skills Levels Set',\n        'skills_owners_class_path': 'Skills Owners Class Path',\n        'skills_skill_animations': 'Skills Skill Animations',\n        'skills_skill_attack': 'Skills Skill Attack',\n        'skills_skill': 'Skills Skill',\n        'skills_skill_group_relation': 'Skills Skill Group Relation',\n        'skills_skill_owner_conditions': 'Skills Skill Owner Conditions',\n        'skills_skill_owner_effects_conditions': 'Skills Skill Owner Effects Conditions',\n        'skills_skill_owner_effects': 'Skills Skill Owner Effects',\n        'skills_skill_physical_data': 'Skills Skill Physical Data',\n        'skills_skill_target_effects_conditions': 'Skills Skill Target Effects Conditions',\n        'skills_skill_target_effects': 'Skills Skill Target Effects',\n        'skills_skill_type': 'Skills Skill Type',\n        'snippets': 'Snippets',\n        'stats': 'Stats',\n        'target_options': 'Target Options',\n        'users': 'Users',\n        'users_locale': 'Users Locale',\n        'users_login': 'Users Login'\n    },\n    fields: {\n        'ads_banner': {\n            'id': 'ID',\n            'ads_id': 'Ads ID',\n            'banner_data': 'Banner Data'\n        },\n        'ads': {\n            'id': 'ID',\n            'key': 'Key',\n            'provider_id': 'Provider ID',\n            'type_id': 'Type ID',\n            'width': 'Width',\n            'height': 'Height',\n            'position': 'Position',\n            'top': 'Top',\n            'bottom': 'Bottom',\n            'left': 'Left',\n            'right': 'Right',\n            'replay': 'Replay',\n            'enabled': 'Enabled',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'ads_event_video': {\n            'id': 'ID',\n            'ads_id': 'Ads ID',\n            'event_key': 'Event Key',\n            'event_data': 'Event Data'\n        },\n        'ads_played': {\n            'id': 'ID',\n            'ads_id': 'Ads ID',\n            'player_id': 'Player ID',\n            'started_at': 'Started At',\n            'ended_at': 'Ended At'\n        },\n        'ads_providers': {\n            'id': 'ID',\n            'key': 'Key',\n            'enabled': 'Enabled'\n        },\n        'ads_types': {\n            'id': 'ID',\n            'key': 'Key'\n        },\n        'audio_categories': {\n            'id': 'ID',\n            'category_key': 'Category Key',\n            'category_label': 'Category Label',\n            'enabled': 'Enabled',\n            'single_audio': 'Single Audio',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'audio': {\n            'id': 'ID',\n            'audio_key': 'Audio Key',\n            'files_name': 'Files Name',\n            'config': 'Config',\n            'room_id': 'Room ID',\n            'category_id': 'Category ID',\n            'enabled': 'Enabled',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'audio_markers': {\n            'id': 'ID',\n            'audio_id': 'Audio ID',\n            'marker_key': 'Marker Key',\n            'start': 'Start',\n            'duration': 'Duration',\n            'config': 'Config'\n        },\n        'audio_player_config': {\n            'id': 'ID',\n            'player_id': 'Player ID',\n            'category_id': 'Category ID',\n            'enabled': 'Enabled'\n        },\n        'chat': {\n            'id': 'ID',\n            'player_id': 'Player ID',\n            'room_id': 'Room ID',\n            'message': 'Message',\n            'private_player_id': 'Private Player ID',\n            'message_type': 'Message Type',\n            'message_time': 'Message Time'\n        },\n        'chat_message_types': {\n            'id': 'ID',\n            'key': 'Key',\n            'show_tab': 'Show Tab',\n            'also_show_in_type': 'Also Show In Type'\n        },\n        'clan': {\n            'id': 'ID',\n            'owner_id': 'Owner ID',\n            'name': 'Name',\n            'points': 'Points',\n            'level': 'Level',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'clan_levels': {\n            'id': 'ID',\n            'key': 'Key',\n            'label': 'Label',\n            'required_experience': 'Required Experience'\n        },\n        'clan_levels_modifiers': {\n            'id': 'ID',\n            'level_id': 'Level ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'operation': 'Operation',\n            'value': 'Value',\n            'minValue': 'MinValue',\n            'maxValue': 'MaxValue',\n            'minProperty': 'MinProperty',\n            'maxProperty': 'MaxProperty'\n        },\n        'clan_members': {\n            'id': 'ID',\n            'clan_id': 'Clan ID',\n            'player_id': 'Player ID'\n        },\n        'config': {\n            'id': 'ID',\n            'scope': 'Scope',\n            'path': 'Path',\n            'value': 'Value',\n            'type': 'Type'\n        },\n        'config_types': {\n            'id': 'ID',\n            'label': 'Label'\n        },\n        'drops_animations': {\n            'id': 'ID',\n            'item_id': 'Item ID',\n            'asset_type': 'Asset Type',\n            'asset_key': 'Asset Key',\n            'file': 'File',\n            'extra_params': 'Extra Params'\n        },\n        'features': {\n            'id': 'ID',\n            'code': 'Code',\n            'title': 'Title',\n            'is_enabled': 'Is Enabled'\n        },\n        'items_group': {\n            'id': 'ID',\n            'key': 'Key',\n            'label': 'Label',\n            'description': 'Description',\n            'files_name': 'Files Name',\n            'sort': 'Sort',\n            'items_limit': 'Items Limit',\n            'limit_per_item': 'Limit Per Item'\n        },\n        'items_inventory': {\n            'id': 'ID',\n            'owner_id': 'Owner ID',\n            'item_id': 'Item ID',\n            'qty': 'Qty',\n            'remaining_uses': 'Remaining Uses',\n            'is_active': 'Is Active'\n        },\n        'items_item': {\n            'id': 'ID',\n            'key': 'Key',\n            'type': 'Type',\n            'group_id': 'Group ID',\n            'label': 'Label',\n            'description': 'Description',\n            'qty_limit': 'Qty Limit',\n            'uses_limit': 'Uses Limit',\n            'useTimeOut': 'UseTimeOut',\n            'execTimeOut': 'ExecTimeOut',\n            'customData': 'CustomData',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'items_item_modifiers': {\n            'id': 'ID',\n            'item_id': 'Item ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'operation': 'Operation',\n            'value': 'Value',\n            'maxProperty': 'MaxProperty'\n        },\n        'items_types': {\n            'id': 'ID',\n            'key': 'Key'\n        },\n        'locale': {\n            'id': 'ID',\n            'locale': 'Locale',\n            'language_code': 'Language Code',\n            'country_code': 'Country Code',\n            'enabled': 'Enabled'\n        },\n        'objects_animations': {\n            'id': 'ID',\n            'object_id': 'Object ID',\n            'animationKey': 'AnimationKey',\n            'animationData': 'AnimationData'\n        },\n        'objects_assets': {\n            'object_asset_id': 'Object Asset ID',\n            'object_id': 'Object ID',\n            'asset_type': 'Asset Type',\n            'asset_key': 'Asset Key',\n            'asset_file': 'Asset File',\n            'extra_params': 'Extra Params'\n        },\n        'objects': {\n            'id': 'ID',\n            'room_id': 'Room ID',\n            'layer_name': 'Layer Name',\n            'tile_index': 'Tile Index',\n            'class_type': 'Class Type',\n            'object_class_key': 'Object Class Key',\n            'client_key': 'Client Key',\n            'title': 'Title',\n            'private_params': 'Private Params',\n            'client_params': 'Client Params',\n            'enabled': 'Enabled',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'objects_items_inventory': {\n            'id': 'ID',\n            'owner_id': 'Owner ID',\n            'item_id': 'Item ID',\n            'qty': 'Qty',\n            'remaining_uses': 'Remaining Uses',\n            'is_active': 'Is Active'\n        },\n        'objects_items_requirements': {\n            'id': 'ID',\n            'object_id': 'Object ID',\n            'item_key': 'Item Key',\n            'required_item_key': 'Required Item Key',\n            'required_quantity': 'Required Quantity',\n            'auto_remove_requirement': 'Auto Remove Requirement'\n        },\n        'objects_items_rewards': {\n            'id': 'ID',\n            'object_id': 'Object ID',\n            'item_key': 'Item Key',\n            'reward_item_key': 'Reward Item Key',\n            'reward_quantity': 'Reward Quantity',\n            'reward_item_is_required': 'Reward Item Is Required'\n        },\n        'objects_skills': {\n            'id': 'ID',\n            'object_id': 'Object ID',\n            'skill_id': 'Skill ID',\n            'target_id': 'Target ID'\n        },\n        'objects_stats': {\n            'id': 'ID',\n            'object_id': 'Object ID',\n            'stat_id': 'Stat ID',\n            'base_value': 'Base Value',\n            'value': 'Value'\n        },\n        'objects_types': {\n            'id': 'ID',\n            'key': 'Key'\n        },\n        'operation_types': {\n            'id': 'ID',\n            'label': 'Label',\n            'key': 'Key'\n        },\n        'players': {\n            'id': 'ID',\n            'user_id': 'User ID',\n            'name': 'Name',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'players_state': {\n            'id': 'ID',\n            'player_id': 'Player ID',\n            'room_id': 'Room ID',\n            'x': 'X',\n            'y': 'Y',\n            'dir': 'Dir'\n        },\n        'players_stats': {\n            'id': 'ID',\n            'player_id': 'Player ID',\n            'stat_id': 'Stat ID',\n            'base_value': 'Base Value',\n            'value': 'Value'\n        },\n        'respawn': {\n            'id': 'ID',\n            'object_id': 'Object ID',\n            'respawn_time': 'Respawn Time',\n            'instances_limit': 'Instances Limit',\n            'layer': 'Layer',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'rewards': {\n            'id': 'ID',\n            'object_id': 'Object ID',\n            'item_id': 'Item ID',\n            'modifier_id': 'Modifier ID',\n            'experience': 'Experience',\n            'drop_rate': 'Drop Rate',\n            'drop_quantity': 'Drop Quantity',\n            'is_unique': 'Is Unique',\n            'was_given': 'Was Given',\n            'has_drop_body': 'Has Drop Body',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'rewards_events': {\n            'id': 'ID',\n            'label': 'Label',\n            'description': 'Description',\n            'handler_key': 'Handler Key',\n            'event_key': 'Event Key',\n            'event_data': 'Event Data',\n            'position': 'Position',\n            'enabled': 'Enabled',\n            'active_from': 'Active From',\n            'active_to': 'Active To'\n        },\n        'rewards_events_state': {\n            'id': 'ID',\n            'rewards_events_id': 'Rewards Events ID',\n            'player_id': 'Player ID',\n            'state': 'State'\n        },\n        'rewards_modifiers': {\n            'id': 'ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'operation': 'Operation',\n            'value': 'Value',\n            'minValue': 'MinValue',\n            'maxValue': 'MaxValue',\n            'minProperty': 'MinProperty',\n            'maxProperty': 'MaxProperty'\n        },\n        'rooms_change_points': {\n            'id': 'ID',\n            'room_id': 'Room ID',\n            'tile_index': 'Tile Index',\n            'next_room_id': 'Next Room ID'\n        },\n        'rooms': {\n            'id': 'ID',\n            'name': 'Name',\n            'title': 'Title',\n            'map_filename': 'Map Filename',\n            'scene_images': 'Scene Images',\n            'room_class_key': 'Room Class Key',\n            'server_url': 'Server Url',\n            'customData': 'CustomData',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'rooms_return_points': {\n            'id': 'ID',\n            'room_id': 'Room ID',\n            'direction': 'Direction',\n            'x': 'X',\n            'y': 'Y',\n            'is_default': 'Is Default',\n            'from_room_id': 'From Room ID'\n        },\n        'scores_detail': {\n            'id': 'ID',\n            'player_id': 'Player ID',\n            'obtained_score': 'Obtained Score',\n            'kill_time': 'Kill Time',\n            'kill_player_id': 'Kill Player ID',\n            'kill_npc_id': 'Kill Npc ID'\n        },\n        'scores': {\n            'id': 'ID',\n            'player_id': 'Player ID',\n            'total_score': 'Total Score',\n            'players_kills_count': 'Players Kills Count',\n            'npcs_kills_count': 'Npcs Kills Count',\n            'last_player_kill_time': 'Last Player Kill Time',\n            'last_npc_kill_time': 'Last Npc Kill Time',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'skills_class_level_up_animations': {\n            'id': 'ID',\n            'class_path_id': 'Class Path ID',\n            'level_id': 'Level ID',\n            'animationData': 'AnimationData'\n        },\n        'skills_class_path': {\n            'id': 'ID',\n            'key': 'Key',\n            'label': 'Label',\n            'levels_set_id': 'Levels Set ID',\n            'enabled': 'Enabled',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'skills_class_path_level_labels': {\n            'id': 'ID',\n            'class_path_id': 'Class Path ID',\n            'level_id': 'Level ID',\n            'label': 'Label'\n        },\n        'skills_class_path_level_skills': {\n            'id': 'ID',\n            'class_path_id': 'Class Path ID',\n            'level_id': 'Level ID',\n            'skill_id': 'Skill ID'\n        },\n        'skills_groups': {\n            'id': 'ID',\n            'key': 'Key',\n            'label': 'Label',\n            'description': 'Description',\n            'sort': 'Sort'\n        },\n        'skills_levels': {\n            'id': 'ID',\n            'key': 'Key',\n            'label': 'Label',\n            'required_experience': 'Required Experience',\n            'level_set_id': 'Level Set ID'\n        },\n        'skills_levels_modifiers_conditions': {\n            'id': 'ID',\n            'levels_modifier_id': 'Levels Modifier ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'conditional': 'Conditional',\n            'value': 'Value'\n        },\n        'skills_levels_modifiers': {\n            'id': 'ID',\n            'level_id': 'Level ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'operation': 'Operation',\n            'value': 'Value',\n            'minValue': 'MinValue',\n            'maxValue': 'MaxValue',\n            'minProperty': 'MinProperty',\n            'maxProperty': 'MaxProperty'\n        },\n        'skills_levels_set': {\n            'id': 'ID',\n            'key': 'Key',\n            'label': 'Label',\n            'autoFillRanges': 'AutoFillRanges',\n            'autoFillExperienceMultiplier': 'AutoFillExperienceMultiplier',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'skills_owners_class_path': {\n            'id': 'ID',\n            'class_path_id': 'Class Path ID',\n            'owner_id': 'Owner ID',\n            'currentLevel': 'CurrentLevel',\n            'currentExp': 'CurrentExp'\n        },\n        'skills_skill_animations': {\n            'id': 'ID',\n            'skill_id': 'Skill ID',\n            'key': 'Key',\n            'classKey': 'ClassKey',\n            'animationData': 'AnimationData'\n        },\n        'skills_skill_attack': {\n            'id': 'ID',\n            'skill_id': 'Skill ID',\n            'affectedProperty': 'AffectedProperty',\n            'allowEffectBelowZero': 'AllowEffectBelowZero',\n            'hitDamage': 'HitDamage',\n            'applyDirectDamage': 'ApplyDirectDamage',\n            'attackProperties': 'AttackProperties',\n            'defenseProperties': 'DefenseProperties',\n            'aimProperties': 'AimProperties',\n            'dodgeProperties': 'DodgeProperties',\n            'dodgeFullEnabled': 'DodgeFullEnabled',\n            'dodgeOverAimSuccess': 'DodgeOverAimSuccess',\n            'damageAffected': 'DamageAffected',\n            'criticalAffected': 'CriticalAffected'\n        },\n        'skills_skill': {\n            'id': 'ID',\n            'key': 'Key',\n            'type': 'Type',\n            'label': 'Label',\n            'autoValidation': 'AutoValidation',\n            'skillDelay': 'SkillDelay',\n            'castTime': 'CastTime',\n            'usesLimit': 'UsesLimit',\n            'range': 'Range',\n            'rangeAutomaticValidation': 'RangeAutomaticValidation',\n            'rangePropertyX': 'RangePropertyX',\n            'rangePropertyY': 'RangePropertyY',\n            'rangeTargetPropertyX': 'RangeTargetPropertyX',\n            'rangeTargetPropertyY': 'RangeTargetPropertyY',\n            'allowSelfTarget': 'AllowSelfTarget',\n            'criticalChance': 'CriticalChance',\n            'criticalMultiplier': 'CriticalMultiplier',\n            'criticalFixedValue': 'CriticalFixedValue',\n            'customData': 'CustomData',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'skills_skill_group_relation': {\n            'id': 'ID',\n            'skill_id': 'Skill ID',\n            'group_id': 'Group ID'\n        },\n        'skills_skill_owner_conditions': {\n            'id': 'ID',\n            'skill_id': 'Skill ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'conditional': 'Conditional',\n            'value': 'Value'\n        },\n        'skills_skill_owner_effects_conditions': {\n            'id': 'ID',\n            'skill_owner_effect_id': 'Skill Owner Effect ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'conditional': 'Conditional',\n            'value': 'Value'\n        },\n        'skills_skill_owner_effects': {\n            'id': 'ID',\n            'skill_id': 'Skill ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'operation': 'Operation',\n            'value': 'Value',\n            'minValue': 'MinValue',\n            'maxValue': 'MaxValue',\n            'minProperty': 'MinProperty',\n            'maxProperty': 'MaxProperty'\n        },\n        'skills_skill_physical_data': {\n            'id': 'ID',\n            'skill_id': 'Skill ID',\n            'magnitude': 'Magnitude',\n            'objectWidth': 'ObjectWidth',\n            'objectHeight': 'ObjectHeight',\n            'validateTargetOnHit': 'ValidateTargetOnHit'\n        },\n        'skills_skill_target_effects_conditions': {\n            'id': 'ID',\n            'skill_target_effect_id': 'Skill Target Effect ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'conditional': 'Conditional',\n            'value': 'Value'\n        },\n        'skills_skill_target_effects': {\n            'id': 'ID',\n            'skill_id': 'Skill ID',\n            'key': 'Key',\n            'property_key': 'Property Key',\n            'operation': 'Operation',\n            'value': 'Value',\n            'minValue': 'MinValue',\n            'maxValue': 'MaxValue',\n            'minProperty': 'MinProperty',\n            'maxProperty': 'MaxProperty'\n        },\n        'skills_skill_type': {\n            'id': 'ID',\n            'key': 'Key'\n        },\n        'snippets': {\n            'id': 'ID',\n            'locale_id': 'Locale ID',\n            'key': 'Key',\n            'value': 'Value',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'stats': {\n            'id': 'ID',\n            'key': 'Key',\n            'label': 'Label',\n            'description': 'Description',\n            'base_value': 'Base Value',\n            'customData': 'CustomData',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At'\n        },\n        'target_options': {\n            'id': 'ID',\n            'target_key': 'Target Key',\n            'target_label': 'Target Label'\n        },\n        'users': {\n            'id': 'ID',\n            'email': 'Email',\n            'username': 'Username',\n            'password': 'Password',\n            'role_id': 'Role ID',\n            'status': 'Status',\n            'created_at': 'Created At',\n            'updated_at': 'Updated At',\n            'played_time': 'Played Time',\n            'login_count': 'Login Count'\n        },\n        'users_locale': {\n            'id': 'ID',\n            'locale_id': 'Locale ID',\n            'user_id': 'User ID'\n        },\n        'users_login': {\n            'id': 'ID',\n            'user_id': 'User ID',\n            'login_date': 'Login Date',\n            'logout_date': 'Logout Date'\n        }\n    }\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/ads-banner-model.js",
    "content": "/**\n *\n * Reldens - AdsBannerModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AdsBannerModel\n{\n\n    constructor(id, ads_id, banner_data)\n    {\n        this.id = id;\n        this.ads_id = ads_id;\n        this.banner_data = banner_data;\n    }\n\n    static createByProps(props)\n    {\n        const {id, ads_id, banner_data} = props;\n        return new this(id, ads_id, banner_data);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AdsBannerModel,\n    tableName: 'ads_banner',\n    properties: {\n        id: { type: 'number', primary: true },\n        ads_id: { type: 'number', persist: false },\n        banner_data: { type: 'string' },\n        related_ads: {\n            kind: 'm:1',\n            entity: 'AdsModel',\n            joinColumn: 'ads_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"ads_id\": {\n        \"relationKey\": \"related_ads\",\n        \"entityName\": \"AdsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    AdsBannerModel,\n    entity: AdsBannerModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/ads-event-video-model.js",
    "content": "/**\n *\n * Reldens - AdsEventVideoModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AdsEventVideoModel\n{\n\n    constructor(id, ads_id, event_key, event_data)\n    {\n        this.id = id;\n        this.ads_id = ads_id;\n        this.event_key = event_key;\n        this.event_data = event_data;\n    }\n\n    static createByProps(props)\n    {\n        const {id, ads_id, event_key, event_data} = props;\n        return new this(id, ads_id, event_key, event_data);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AdsEventVideoModel,\n    tableName: 'ads_event_video',\n    properties: {\n        id: { type: 'number', primary: true },\n        ads_id: { type: 'number', persist: false },\n        event_key: { type: 'string' },\n        event_data: { type: 'string' },\n        related_ads: {\n            kind: 'm:1',\n            entity: 'AdsModel',\n            joinColumn: 'ads_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"ads_id\": {\n        \"relationKey\": \"related_ads\",\n        \"entityName\": \"AdsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    AdsEventVideoModel,\n    entity: AdsEventVideoModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/ads-model.js",
    "content": "/**\n *\n * Reldens - AdsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AdsModel\n{\n\n    constructor(id, key, provider_id, type_id, width, height, position, top, bottom, left, right, replay, enabled, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.provider_id = provider_id;\n        this.type_id = type_id;\n        this.width = width;\n        this.height = height;\n        this.position = position;\n        this.top = top;\n        this.bottom = bottom;\n        this.left = left;\n        this.right = right;\n        this.replay = replay;\n        this.enabled = enabled;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, provider_id, type_id, width, height, position, top, bottom, left, right, replay, enabled, created_at, updated_at} = props;\n        return new this(id, key, provider_id, type_id, width, height, position, top, bottom, left, right, replay, enabled, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AdsModel,\n    tableName: 'ads',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        provider_id: { type: 'number', persist: false },\n        type_id: { type: 'number', persist: false },\n        width: { type: 'number', nullable: true },\n        height: { type: 'number', nullable: true },\n        position: { type: 'string', nullable: true },\n        top: { type: 'number', nullable: true },\n        bottom: { type: 'number', nullable: true },\n        left: { type: 'number', nullable: true },\n        right: { type: 'number', nullable: true },\n        replay: { type: 'number', nullable: true },\n        enabled: { type: 'number', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_ads_providers: {\n            kind: 'm:1',\n            entity: 'AdsProvidersModel',\n            joinColumn: 'provider_id'\n        },\n        related_ads_types: {\n            kind: 'm:1',\n            entity: 'AdsTypesModel',\n            joinColumn: 'type_id'\n        },\n        related_ads_banner: {\n            kind: '1:1',\n            entity: 'AdsBannerModel',\n            mappedBy: 'related_ads'\n        },\n        related_ads_event_video: {\n            kind: '1:1',\n            entity: 'AdsEventVideoModel',\n            mappedBy: 'related_ads'\n        },\n        related_ads_played: {\n            kind: '1:m',\n            entity: 'AdsPlayedModel',\n            mappedBy: 'related_ads'\n        }\n    },\n});\nschema._fkMappings = {\n    \"provider_id\": {\n        \"relationKey\": \"related_ads_providers\",\n        \"entityName\": \"AdsProvidersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"type_id\": {\n        \"relationKey\": \"related_ads_types\",\n        \"entityName\": \"AdsTypesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    AdsModel,\n    entity: AdsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/ads-played-model.js",
    "content": "/**\n *\n * Reldens - AdsPlayedModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AdsPlayedModel\n{\n\n    constructor(id, ads_id, player_id, started_at, ended_at)\n    {\n        this.id = id;\n        this.ads_id = ads_id;\n        this.player_id = player_id;\n        this.started_at = started_at;\n        this.ended_at = ended_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, ads_id, player_id, started_at, ended_at} = props;\n        return new this(id, ads_id, player_id, started_at, ended_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AdsPlayedModel,\n    tableName: 'ads_played',\n    properties: {\n        id: { type: 'number', primary: true },\n        ads_id: { type: 'number', persist: false },\n        player_id: { type: 'number', persist: false },\n        started_at: { type: 'Date', nullable: true },\n        ended_at: { type: 'Date', nullable: true },\n        related_ads: {\n            kind: 'm:1',\n            entity: 'AdsModel',\n            joinColumn: 'ads_id'\n        },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'player_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"ads_id\": {\n        \"relationKey\": \"related_ads\",\n        \"entityName\": \"AdsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"player_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    AdsPlayedModel,\n    entity: AdsPlayedModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/ads-providers-model.js",
    "content": "/**\n *\n * Reldens - AdsProvidersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AdsProvidersModel\n{\n\n    constructor(id, key, enabled)\n    {\n        this.id = id;\n        this.key = key;\n        this.enabled = enabled;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, enabled} = props;\n        return new this(id, key, enabled);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AdsProvidersModel,\n    tableName: 'ads_providers',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        enabled: { type: 'number', nullable: true },\n        related_ads: {\n            kind: '1:m',\n            entity: 'AdsModel',\n            mappedBy: 'related_ads_providers'\n        }\n    },\n});\n\nmodule.exports = {\n    AdsProvidersModel,\n    entity: AdsProvidersModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/ads-types-model.js",
    "content": "/**\n *\n * Reldens - AdsTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AdsTypesModel\n{\n\n    constructor(id, key)\n    {\n        this.id = id;\n        this.key = key;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key} = props;\n        return new this(id, key);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AdsTypesModel,\n    tableName: 'ads_types',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        related_ads: {\n            kind: '1:m',\n            entity: 'AdsModel',\n            mappedBy: 'related_ads_types'\n        }\n    },\n});\n\nmodule.exports = {\n    AdsTypesModel,\n    entity: AdsTypesModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/audio-categories-model.js",
    "content": "/**\n *\n * Reldens - AudioCategoriesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AudioCategoriesModel\n{\n\n    constructor(id, category_key, category_label, enabled, single_audio, created_at, updated_at)\n    {\n        this.id = id;\n        this.category_key = category_key;\n        this.category_label = category_label;\n        this.enabled = enabled;\n        this.single_audio = single_audio;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, category_key, category_label, enabled, single_audio, created_at, updated_at} = props;\n        return new this(id, category_key, category_label, enabled, single_audio, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AudioCategoriesModel,\n    tableName: 'audio_categories',\n    properties: {\n        id: { type: 'number', primary: true },\n        category_key: { type: 'string' },\n        category_label: { type: 'string' },\n        enabled: { type: 'number', nullable: true },\n        single_audio: { type: 'number', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_audio: {\n            kind: '1:m',\n            entity: 'AudioModel',\n            mappedBy: 'related_audio_categories'\n        },\n        related_audio_player_config: {\n            kind: '1:m',\n            entity: 'AudioPlayerConfigModel',\n            mappedBy: 'related_audio_categories'\n        }\n    },\n});\n\nmodule.exports = {\n    AudioCategoriesModel,\n    entity: AudioCategoriesModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/audio-markers-model.js",
    "content": "/**\n *\n * Reldens - AudioMarkersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AudioMarkersModel\n{\n\n    constructor(id, audio_id, marker_key, start, duration, config)\n    {\n        this.id = id;\n        this.audio_id = audio_id;\n        this.marker_key = marker_key;\n        this.start = start;\n        this.duration = duration;\n        this.config = config;\n    }\n\n    static createByProps(props)\n    {\n        const {id, audio_id, marker_key, start, duration, config} = props;\n        return new this(id, audio_id, marker_key, start, duration, config);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AudioMarkersModel,\n    tableName: 'audio_markers',\n    properties: {\n        id: { type: 'number', primary: true },\n        audio_id: { type: 'number', persist: false },\n        marker_key: { type: 'string' },\n        start: { type: 'number' },\n        duration: { type: 'number' },\n        config: { type: 'string', nullable: true },\n        related_audio: {\n            kind: 'm:1',\n            entity: 'AudioModel',\n            joinColumn: 'audio_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"audio_id\": {\n        \"relationKey\": \"related_audio\",\n        \"entityName\": \"AudioModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    AudioMarkersModel,\n    entity: AudioMarkersModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/audio-model.js",
    "content": "/**\n *\n * Reldens - AudioModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AudioModel\n{\n\n    constructor(id, audio_key, files_name, config, room_id, category_id, enabled, created_at, updated_at)\n    {\n        this.id = id;\n        this.audio_key = audio_key;\n        this.files_name = files_name;\n        this.config = config;\n        this.room_id = room_id;\n        this.category_id = category_id;\n        this.enabled = enabled;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, audio_key, files_name, config, room_id, category_id, enabled, created_at, updated_at} = props;\n        return new this(id, audio_key, files_name, config, room_id, category_id, enabled, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AudioModel,\n    tableName: 'audio',\n    properties: {\n        id: { type: 'number', primary: true },\n        audio_key: { type: 'string' },\n        files_name: { type: 'string' },\n        config: { type: 'string', nullable: true },\n        room_id: { type: 'number', persist: false },\n        category_id: { type: 'number', persist: false },\n        enabled: { type: 'number', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_rooms: {\n            kind: 'm:1',\n            entity: 'RoomsModel',\n            joinColumn: 'room_id'\n        },\n        related_audio_categories: {\n            kind: 'm:1',\n            entity: 'AudioCategoriesModel',\n            joinColumn: 'category_id'\n        },\n        related_audio_markers: {\n            kind: '1:m',\n            entity: 'AudioMarkersModel',\n            mappedBy: 'related_audio'\n        }\n    },\n});\nschema._fkMappings = {\n    \"room_id\": {\n        \"relationKey\": \"related_rooms\",\n        \"entityName\": \"RoomsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    },\n    \"category_id\": {\n        \"relationKey\": \"related_audio_categories\",\n        \"entityName\": \"AudioCategoriesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    AudioModel,\n    entity: AudioModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/audio-player-config-model.js",
    "content": "/**\n *\n * Reldens - AudioPlayerConfigModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass AudioPlayerConfigModel\n{\n\n    constructor(id, player_id, category_id, enabled)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.category_id = category_id;\n        this.enabled = enabled;\n    }\n\n    static createByProps(props)\n    {\n        const {id, player_id, category_id, enabled} = props;\n        return new this(id, player_id, category_id, enabled);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: AudioPlayerConfigModel,\n    tableName: 'audio_player_config',\n    properties: {\n        id: { type: 'number', primary: true },\n        player_id: { type: 'number', persist: false },\n        category_id: { type: 'number', persist: false },\n        enabled: { type: 'number', nullable: true },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'player_id'\n        },\n        related_audio_categories: {\n            kind: 'm:1',\n            entity: 'AudioCategoriesModel',\n            joinColumn: 'category_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"player_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"category_id\": {\n        \"relationKey\": \"related_audio_categories\",\n        \"entityName\": \"AudioCategoriesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    AudioPlayerConfigModel,\n    entity: AudioPlayerConfigModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/chat-message-types-model.js",
    "content": "/**\n *\n * Reldens - ChatMessageTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ChatMessageTypesModel\n{\n\n    constructor(id, key, show_tab, also_show_in_type)\n    {\n        this.id = id;\n        this.key = key;\n        this.show_tab = show_tab;\n        this.also_show_in_type = also_show_in_type;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, show_tab, also_show_in_type} = props;\n        return new this(id, key, show_tab, also_show_in_type);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ChatMessageTypesModel,\n    tableName: 'chat_message_types',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        show_tab: { type: 'number', nullable: true },\n        also_show_in_type: { type: 'number', persist: false },\n        related_chat_message_types: {\n            kind: 'm:1',\n            entity: 'ChatMessageTypesModel',\n            joinColumn: 'also_show_in_type'\n        },\n        related_chat: {\n            kind: '1:m',\n            entity: 'ChatModel',\n            mappedBy: 'related_chat_message_types'\n        }\n    },\n});\nschema._fkMappings = {\n    \"also_show_in_type\": {\n        \"relationKey\": \"related_chat_message_types\",\n        \"entityName\": \"ChatMessageTypesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    ChatMessageTypesModel,\n    entity: ChatMessageTypesModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/chat-model.js",
    "content": "/**\n *\n * Reldens - ChatModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ChatModel\n{\n\n    constructor(id, player_id, room_id, message, private_player_id, message_type, message_time)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.room_id = room_id;\n        this.message = message;\n        this.private_player_id = private_player_id;\n        this.message_type = message_type;\n        this.message_time = message_time;\n    }\n\n    static createByProps(props)\n    {\n        const {id, player_id, room_id, message, private_player_id, message_type, message_time} = props;\n        return new this(id, player_id, room_id, message, private_player_id, message_type, message_time);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ChatModel,\n    tableName: 'chat',\n    properties: {\n        id: { type: 'number', primary: true },\n        player_id: { type: 'number', persist: false },\n        room_id: { type: 'number', persist: false },\n        message: { type: 'string' },\n        private_player_id: { type: 'number', persist: false },\n        message_type: { type: 'number', persist: false },\n        message_time: { type: 'Date' },\n        related_players_player: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'player_id'\n        },\n        related_rooms: {\n            kind: 'm:1',\n            entity: 'RoomsModel',\n            joinColumn: 'room_id'\n        },\n        related_players_private_player: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'private_player_id'\n        },\n        related_chat_message_types: {\n            kind: 'm:1',\n            entity: 'ChatMessageTypesModel',\n            joinColumn: 'message_type'\n        }\n    },\n});\nschema._fkMappings = {\n    \"player_id\": {\n        \"relationKey\": \"related_players_player\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"room_id\": {\n        \"relationKey\": \"related_rooms\",\n        \"entityName\": \"RoomsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    },\n    \"private_player_id\": {\n        \"relationKey\": \"related_players_private_player\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    },\n    \"message_type\": {\n        \"relationKey\": \"related_chat_message_types\",\n        \"entityName\": \"ChatMessageTypesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    ChatModel,\n    entity: ChatModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/clan-levels-model.js",
    "content": "/**\n *\n * Reldens - ClanLevelsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ClanLevelsModel\n{\n\n    constructor(id, key, label, required_experience)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.required_experience = required_experience;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, label, required_experience} = props;\n        return new this(id, key, label, required_experience);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ClanLevelsModel,\n    tableName: 'clan_levels',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'number' },\n        label: { type: 'string' },\n        required_experience: { type: 'number', nullable: true },\n        related_clan: {\n            kind: '1:m',\n            entity: 'ClanModel',\n            mappedBy: 'related_clan_levels'\n        },\n        related_clan_levels_modifiers: {\n            kind: '1:m',\n            entity: 'ClanLevelsModifiersModel',\n            mappedBy: 'related_clan_levels'\n        }\n    },\n});\n\nmodule.exports = {\n    ClanLevelsModel,\n    entity: ClanLevelsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/clan-levels-modifiers-model.js",
    "content": "/**\n *\n * Reldens - ClanLevelsModifiersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ClanLevelsModifiersModel\n{\n\n    constructor(id, level_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.level_id = level_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static createByProps(props)\n    {\n        const {id, level_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty} = props;\n        return new this(id, level_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ClanLevelsModifiersModel,\n    tableName: 'clan_levels_modifiers',\n    properties: {\n        id: { type: 'number', primary: true },\n        level_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        operation: { type: 'number', persist: false },\n        value: { type: 'string' },\n        minValue: { type: 'string', nullable: true },\n        maxValue: { type: 'string', nullable: true },\n        minProperty: { type: 'string', nullable: true },\n        maxProperty: { type: 'string', nullable: true },\n        related_clan_levels: {\n            kind: 'm:1',\n            entity: 'ClanLevelsModel',\n            joinColumn: 'level_id'\n        },\n        related_operation_types: {\n            kind: 'm:1',\n            entity: 'OperationTypesModel',\n            joinColumn: 'operation'\n        }\n    },\n});\nschema._fkMappings = {\n    \"level_id\": {\n        \"relationKey\": \"related_clan_levels\",\n        \"entityName\": \"ClanLevelsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"operation\": {\n        \"relationKey\": \"related_operation_types\",\n        \"entityName\": \"OperationTypesModel\",\n        \"referencedColumn\": \"key\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ClanLevelsModifiersModel,\n    entity: ClanLevelsModifiersModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/clan-members-model.js",
    "content": "/**\n *\n * Reldens - ClanMembersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ClanMembersModel\n{\n\n    constructor(id, clan_id, player_id)\n    {\n        this.id = id;\n        this.clan_id = clan_id;\n        this.player_id = player_id;\n    }\n\n    static createByProps(props)\n    {\n        const {id, clan_id, player_id} = props;\n        return new this(id, clan_id, player_id);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ClanMembersModel,\n    tableName: 'clan_members',\n    properties: {\n        id: { type: 'number', primary: true },\n        clan_id: { type: 'number', persist: false },\n        player_id: { type: 'number', persist: false },\n        related_clan: {\n            kind: 'm:1',\n            entity: 'ClanModel',\n            joinColumn: 'clan_id'\n        },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'player_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"clan_id\": {\n        \"relationKey\": \"related_clan\",\n        \"entityName\": \"ClanModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"player_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ClanMembersModel,\n    entity: ClanMembersModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/clan-model.js",
    "content": "/**\n *\n * Reldens - ClanModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ClanModel\n{\n\n    constructor(id, owner_id, name, points, level, created_at, updated_at)\n    {\n        this.id = id;\n        this.owner_id = owner_id;\n        this.name = name;\n        this.points = points;\n        this.level = level;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, owner_id, name, points, level, created_at, updated_at} = props;\n        return new this(id, owner_id, name, points, level, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ClanModel,\n    tableName: 'clan',\n    properties: {\n        id: { type: 'number', primary: true },\n        owner_id: { type: 'number', persist: false },\n        name: { type: 'string' },\n        points: { type: 'number', nullable: true },\n        level: { type: 'number', persist: false },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'owner_id'\n        },\n        related_clan_levels: {\n            kind: 'm:1',\n            entity: 'ClanLevelsModel',\n            joinColumn: 'level'\n        },\n        related_clan_members: {\n            kind: '1:m',\n            entity: 'ClanMembersModel',\n            mappedBy: 'related_clan'\n        }\n    },\n});\nschema._fkMappings = {\n    \"owner_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"level\": {\n        \"relationKey\": \"related_clan_levels\",\n        \"entityName\": \"ClanLevelsModel\",\n        \"referencedColumn\": \"key\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ClanModel,\n    entity: ClanModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/config-model.js",
    "content": "/**\n *\n * Reldens - ConfigModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ConfigModel\n{\n\n    constructor(id, scope, path, value, type)\n    {\n        this.id = id;\n        this.scope = scope;\n        this.path = path;\n        this.value = value;\n        this.type = type;\n    }\n\n    static createByProps(props)\n    {\n        const {id, scope, path, value, type} = props;\n        return new this(id, scope, path, value, type);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ConfigModel,\n    tableName: 'config',\n    properties: {\n        id: { type: 'number', primary: true },\n        scope: { type: 'string' },\n        path: { type: 'string' },\n        value: { type: 'string' },\n        type: { type: 'number', persist: false },\n        related_config_types: {\n            kind: 'm:1',\n            entity: 'ConfigTypesModel',\n            joinColumn: 'type'\n        }\n    },\n});\nschema._fkMappings = {\n    \"type\": {\n        \"relationKey\": \"related_config_types\",\n        \"entityName\": \"ConfigTypesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ConfigModel,\n    entity: ConfigModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/config-types-model.js",
    "content": "/**\n *\n * Reldens - ConfigTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ConfigTypesModel\n{\n\n    constructor(id, label)\n    {\n        this.id = id;\n        this.label = label;\n    }\n\n    static createByProps(props)\n    {\n        const {id, label} = props;\n        return new this(id, label);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ConfigTypesModel,\n    tableName: 'config_types',\n    properties: {\n        id: { type: 'number', primary: true },\n        label: { type: 'string' },\n        related_config: {\n            kind: '1:m',\n            entity: 'ConfigModel',\n            mappedBy: 'related_config_types'\n        }\n    },\n});\n\nmodule.exports = {\n    ConfigTypesModel,\n    entity: ConfigTypesModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/drops-animations-model.js",
    "content": "/**\n *\n * Reldens - DropsAnimationsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass DropsAnimationsModel\n{\n\n    constructor(id, item_id, asset_type, asset_key, file, extra_params)\n    {\n        this.id = id;\n        this.item_id = item_id;\n        this.asset_type = asset_type;\n        this.asset_key = asset_key;\n        this.file = file;\n        this.extra_params = extra_params;\n    }\n\n    static createByProps(props)\n    {\n        const {id, item_id, asset_type, asset_key, file, extra_params} = props;\n        return new this(id, item_id, asset_type, asset_key, file, extra_params);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: DropsAnimationsModel,\n    tableName: 'drops_animations',\n    properties: {\n        id: { type: 'number', primary: true },\n        item_id: { type: 'number', persist: false },\n        asset_type: { type: 'string', nullable: true },\n        asset_key: { type: 'string' },\n        file: { type: 'string' },\n        extra_params: { type: 'string', nullable: true },\n        related_items_item: {\n            kind: 'm:1',\n            entity: 'ItemsItemModel',\n            joinColumn: 'item_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"item_id\": {\n        \"relationKey\": \"related_items_item\",\n        \"entityName\": \"ItemsItemModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    DropsAnimationsModel,\n    entity: DropsAnimationsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/features-model.js",
    "content": "/**\n *\n * Reldens - FeaturesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass FeaturesModel\n{\n\n    constructor(id, code, title, is_enabled)\n    {\n        this.id = id;\n        this.code = code;\n        this.title = title;\n        this.is_enabled = is_enabled;\n    }\n\n    static createByProps(props)\n    {\n        const {id, code, title, is_enabled} = props;\n        return new this(id, code, title, is_enabled);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: FeaturesModel,\n    tableName: 'features',\n    properties: {\n        id: { type: 'number', primary: true },\n        code: { type: 'string' },\n        title: { type: 'string' },\n        is_enabled: { type: 'number', nullable: true }\n    },\n});\n\nmodule.exports = {\n    FeaturesModel,\n    entity: FeaturesModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/items-group-model.js",
    "content": "/**\n *\n * Reldens - ItemsGroupModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ItemsGroupModel\n{\n\n    constructor(id, key, label, description, files_name, sort, items_limit, limit_per_item)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.description = description;\n        this.files_name = files_name;\n        this.sort = sort;\n        this.items_limit = items_limit;\n        this.limit_per_item = limit_per_item;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, label, description, files_name, sort, items_limit, limit_per_item} = props;\n        return new this(id, key, label, description, files_name, sort, items_limit, limit_per_item);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ItemsGroupModel,\n    tableName: 'items_group',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        label: { type: 'string' },\n        description: { type: 'string', nullable: true },\n        files_name: { type: 'string', nullable: true },\n        sort: { type: 'number', nullable: true },\n        items_limit: { type: 'number', nullable: true },\n        limit_per_item: { type: 'number', nullable: true },\n        related_items_item: {\n            kind: '1:m',\n            entity: 'ItemsItemModel',\n            mappedBy: 'related_items_group'\n        }\n    },\n});\n\nmodule.exports = {\n    ItemsGroupModel,\n    entity: ItemsGroupModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/items-inventory-model.js",
    "content": "/**\n *\n * Reldens - ItemsInventoryModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ItemsInventoryModel\n{\n\n    constructor(id, owner_id, item_id, qty, remaining_uses, is_active)\n    {\n        this.id = id;\n        this.owner_id = owner_id;\n        this.item_id = item_id;\n        this.qty = qty;\n        this.remaining_uses = remaining_uses;\n        this.is_active = is_active;\n    }\n\n    static createByProps(props)\n    {\n        const {id, owner_id, item_id, qty, remaining_uses, is_active} = props;\n        return new this(id, owner_id, item_id, qty, remaining_uses, is_active);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ItemsInventoryModel,\n    tableName: 'items_inventory',\n    properties: {\n        id: { type: 'number', primary: true },\n        owner_id: { type: 'number', persist: false },\n        item_id: { type: 'number', persist: false },\n        qty: { type: 'number', nullable: true },\n        remaining_uses: { type: 'number', nullable: true },\n        is_active: { type: 'number', nullable: true },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'owner_id'\n        },\n        related_items_item: {\n            kind: 'm:1',\n            entity: 'ItemsItemModel',\n            joinColumn: 'item_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"owner_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"item_id\": {\n        \"relationKey\": \"related_items_item\",\n        \"entityName\": \"ItemsItemModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ItemsInventoryModel,\n    entity: ItemsInventoryModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/items-item-model.js",
    "content": "/**\n *\n * Reldens - ItemsItemModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ItemsItemModel\n{\n\n    constructor(id, key, type, group_id, label, description, qty_limit, uses_limit, useTimeOut, execTimeOut, customData, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.type = type;\n        this.group_id = group_id;\n        this.label = label;\n        this.description = description;\n        this.qty_limit = qty_limit;\n        this.uses_limit = uses_limit;\n        this.useTimeOut = useTimeOut;\n        this.execTimeOut = execTimeOut;\n        this.customData = customData;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, type, group_id, label, description, qty_limit, uses_limit, useTimeOut, execTimeOut, customData, created_at, updated_at} = props;\n        return new this(id, key, type, group_id, label, description, qty_limit, uses_limit, useTimeOut, execTimeOut, customData, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ItemsItemModel,\n    tableName: 'items_item',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        type: { type: 'number', persist: false },\n        group_id: { type: 'number', persist: false },\n        label: { type: 'string' },\n        description: { type: 'string', nullable: true },\n        qty_limit: { type: 'number', nullable: true },\n        uses_limit: { type: 'number', nullable: true },\n        useTimeOut: { type: 'number', nullable: true },\n        execTimeOut: { type: 'number', nullable: true },\n        customData: { type: 'string', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_items_types: {\n            kind: 'm:1',\n            entity: 'ItemsTypesModel',\n            joinColumn: 'type'\n        },\n        related_items_group: {\n            kind: 'm:1',\n            entity: 'ItemsGroupModel',\n            joinColumn: 'group_id'\n        },\n        related_drops_animations: {\n            kind: '1:1',\n            entity: 'DropsAnimationsModel',\n            mappedBy: 'related_items_item'\n        },\n        related_items_inventory: {\n            kind: '1:m',\n            entity: 'ItemsInventoryModel',\n            mappedBy: 'related_items_item'\n        },\n        related_items_item_modifiers: {\n            kind: '1:m',\n            entity: 'ItemsItemModifiersModel',\n            mappedBy: 'related_items_item'\n        },\n        related_objects_items_inventory: {\n            kind: '1:m',\n            entity: 'ObjectsItemsInventoryModel',\n            mappedBy: 'related_items_item'\n        },\n        related_objects_items_requirements_item_key: {\n            kind: '1:m',\n            entity: 'ObjectsItemsRequirementsModel',\n            mappedBy: 'related_items_item_item_key'\n        },\n        related_objects_items_requirements_required_item_key: {\n            kind: '1:m',\n            entity: 'ObjectsItemsRequirementsModel',\n            mappedBy: 'related_items_item_item_key'\n        },\n        related_objects_items_rewards_item_key: {\n            kind: '1:m',\n            entity: 'ObjectsItemsRewardsModel',\n            mappedBy: 'related_items_item_item_key'\n        },\n        related_objects_items_rewards_reward_item_key: {\n            kind: '1:m',\n            entity: 'ObjectsItemsRewardsModel',\n            mappedBy: 'related_items_item_item_key'\n        },\n        related_rewards: {\n            kind: '1:m',\n            entity: 'RewardsModel',\n            mappedBy: 'related_items_item'\n        }\n    },\n});\nschema._fkMappings = {\n    \"type\": {\n        \"relationKey\": \"related_items_types\",\n        \"entityName\": \"ItemsTypesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"group_id\": {\n        \"relationKey\": \"related_items_group\",\n        \"entityName\": \"ItemsGroupModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    ItemsItemModel,\n    entity: ItemsItemModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/items-item-modifiers-model.js",
    "content": "/**\n *\n * Reldens - ItemsItemModifiersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ItemsItemModifiersModel\n{\n\n    constructor(id, item_id, key, property_key, operation, value, maxProperty)\n    {\n        this.id = id;\n        this.item_id = item_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.maxProperty = maxProperty;\n    }\n\n    static createByProps(props)\n    {\n        const {id, item_id, key, property_key, operation, value, maxProperty} = props;\n        return new this(id, item_id, key, property_key, operation, value, maxProperty);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ItemsItemModifiersModel,\n    tableName: 'items_item_modifiers',\n    properties: {\n        id: { type: 'number', primary: true },\n        item_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        operation: { type: 'number', persist: false },\n        value: { type: 'string' },\n        maxProperty: { type: 'string', nullable: true },\n        related_items_item: {\n            kind: 'm:1',\n            entity: 'ItemsItemModel',\n            joinColumn: 'item_id'\n        },\n        related_operation_types: {\n            kind: 'm:1',\n            entity: 'OperationTypesModel',\n            joinColumn: 'operation'\n        }\n    },\n});\nschema._fkMappings = {\n    \"item_id\": {\n        \"relationKey\": \"related_items_item\",\n        \"entityName\": \"ItemsItemModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"operation\": {\n        \"relationKey\": \"related_operation_types\",\n        \"entityName\": \"OperationTypesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ItemsItemModifiersModel,\n    entity: ItemsItemModifiersModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/items-types-model.js",
    "content": "/**\n *\n * Reldens - ItemsTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ItemsTypesModel\n{\n\n    constructor(id, key)\n    {\n        this.id = id;\n        this.key = key;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key} = props;\n        return new this(id, key);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ItemsTypesModel,\n    tableName: 'items_types',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        related_items_item: {\n            kind: '1:m',\n            entity: 'ItemsItemModel',\n            mappedBy: 'related_items_types'\n        }\n    },\n});\n\nmodule.exports = {\n    ItemsTypesModel,\n    entity: ItemsTypesModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/locale-model.js",
    "content": "/**\n *\n * Reldens - LocaleModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass LocaleModel\n{\n\n    constructor(id, locale, language_code, country_code, enabled)\n    {\n        this.id = id;\n        this.locale = locale;\n        this.language_code = language_code;\n        this.country_code = country_code;\n        this.enabled = enabled;\n    }\n\n    static createByProps(props)\n    {\n        const {id, locale, language_code, country_code, enabled} = props;\n        return new this(id, locale, language_code, country_code, enabled);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: LocaleModel,\n    tableName: 'locale',\n    properties: {\n        id: { type: 'number', primary: true },\n        locale: { type: 'string' },\n        language_code: { type: 'string' },\n        country_code: { type: 'string', nullable: true },\n        enabled: { type: 'number', nullable: true },\n        related_snippets: {\n            kind: '1:m',\n            entity: 'SnippetsModel',\n            mappedBy: 'related_locale'\n        },\n        related_users_locale: {\n            kind: '1:m',\n            entity: 'UsersLocaleModel',\n            mappedBy: 'related_locale'\n        }\n    },\n});\n\nmodule.exports = {\n    LocaleModel,\n    entity: LocaleModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/objects-animations-model.js",
    "content": "/**\n *\n * Reldens - ObjectsAnimationsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ObjectsAnimationsModel\n{\n\n    constructor(id, object_id, animationKey, animationData)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.animationKey = animationKey;\n        this.animationData = animationData;\n    }\n\n    static createByProps(props)\n    {\n        const {id, object_id, animationKey, animationData} = props;\n        return new this(id, object_id, animationKey, animationData);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ObjectsAnimationsModel,\n    tableName: 'objects_animations',\n    properties: {\n        id: { type: 'number', primary: true },\n        object_id: { type: 'number', persist: false },\n        animationKey: { type: 'string' },\n        animationData: { type: 'string' },\n        related_objects: {\n            kind: 'm:1',\n            entity: 'ObjectsModel',\n            joinColumn: 'object_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"object_id\": {\n        \"relationKey\": \"related_objects\",\n        \"entityName\": \"ObjectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ObjectsAnimationsModel,\n    entity: ObjectsAnimationsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/objects-assets-model.js",
    "content": "/**\n *\n * Reldens - ObjectsAssetsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ObjectsAssetsModel\n{\n\n    constructor(object_asset_id, object_id, asset_type, asset_key, asset_file, extra_params)\n    {\n        this.object_asset_id = object_asset_id;\n        this.object_id = object_id;\n        this.asset_type = asset_type;\n        this.asset_key = asset_key;\n        this.asset_file = asset_file;\n        this.extra_params = extra_params;\n    }\n\n    static createByProps(props)\n    {\n        const {object_asset_id, object_id, asset_type, asset_key, asset_file, extra_params} = props;\n        return new this(object_asset_id, object_id, asset_type, asset_key, asset_file, extra_params);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ObjectsAssetsModel,\n    tableName: 'objects_assets',\n    properties: {\n        object_asset_id: { type: 'number', primary: true },\n        object_id: { type: 'number', persist: false },\n        asset_type: { type: 'string' },\n        asset_key: { type: 'string' },\n        asset_file: { type: 'string' },\n        extra_params: { type: 'string', nullable: true },\n        related_objects: {\n            kind: 'm:1',\n            entity: 'ObjectsModel',\n            joinColumn: 'object_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"object_id\": {\n        \"relationKey\": \"related_objects\",\n        \"entityName\": \"ObjectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ObjectsAssetsModel,\n    entity: ObjectsAssetsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/objects-items-inventory-model.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsInventoryModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ObjectsItemsInventoryModel\n{\n\n    constructor(id, owner_id, item_id, qty, remaining_uses, is_active)\n    {\n        this.id = id;\n        this.owner_id = owner_id;\n        this.item_id = item_id;\n        this.qty = qty;\n        this.remaining_uses = remaining_uses;\n        this.is_active = is_active;\n    }\n\n    static createByProps(props)\n    {\n        const {id, owner_id, item_id, qty, remaining_uses, is_active} = props;\n        return new this(id, owner_id, item_id, qty, remaining_uses, is_active);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ObjectsItemsInventoryModel,\n    tableName: 'objects_items_inventory',\n    properties: {\n        id: { type: 'number', primary: true },\n        owner_id: { type: 'number', persist: false },\n        item_id: { type: 'number', persist: false },\n        qty: { type: 'number', nullable: true },\n        remaining_uses: { type: 'number', nullable: true },\n        is_active: { type: 'number', nullable: true },\n        related_objects: {\n            kind: 'm:1',\n            entity: 'ObjectsModel',\n            joinColumn: 'owner_id'\n        },\n        related_items_item: {\n            kind: 'm:1',\n            entity: 'ItemsItemModel',\n            joinColumn: 'item_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"owner_id\": {\n        \"relationKey\": \"related_objects\",\n        \"entityName\": \"ObjectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"item_id\": {\n        \"relationKey\": \"related_items_item\",\n        \"entityName\": \"ItemsItemModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ObjectsItemsInventoryModel,\n    entity: ObjectsItemsInventoryModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/objects-items-requirements-model.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsRequirementsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ObjectsItemsRequirementsModel\n{\n\n    constructor(id, object_id, item_key, required_item_key, required_quantity, auto_remove_requirement)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.item_key = item_key;\n        this.required_item_key = required_item_key;\n        this.required_quantity = required_quantity;\n        this.auto_remove_requirement = auto_remove_requirement;\n    }\n\n    static createByProps(props)\n    {\n        const {id, object_id, item_key, required_item_key, required_quantity, auto_remove_requirement} = props;\n        return new this(id, object_id, item_key, required_item_key, required_quantity, auto_remove_requirement);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ObjectsItemsRequirementsModel,\n    tableName: 'objects_items_requirements',\n    properties: {\n        id: { type: 'number', primary: true },\n        object_id: { type: 'number', persist: false },\n        item_key: { type: 'string', persist: false },\n        required_item_key: { type: 'string', persist: false },\n        required_quantity: { type: 'number', nullable: true },\n        auto_remove_requirement: { type: 'number', nullable: true },\n        related_objects: {\n            kind: 'm:1',\n            entity: 'ObjectsModel',\n            joinColumn: 'object_id'\n        },\n        related_items_item_item_key: {\n            kind: 'm:1',\n            entity: 'ItemsItemModel',\n            joinColumn: 'item_key'\n        },\n        related_items_item_required_item_key: {\n            kind: 'm:1',\n            entity: 'ItemsItemModel',\n            joinColumn: 'required_item_key'\n        }\n    },\n});\nschema._fkMappings = {\n    \"object_id\": {\n        \"relationKey\": \"related_objects\",\n        \"entityName\": \"ObjectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"item_key\": {\n        \"relationKey\": \"related_items_item_item_key\",\n        \"entityName\": \"ItemsItemModel\",\n        \"referencedColumn\": \"key\",\n        \"nullable\": false\n    },\n    \"required_item_key\": {\n        \"relationKey\": \"related_items_item_required_item_key\",\n        \"entityName\": \"ItemsItemModel\",\n        \"referencedColumn\": \"key\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ObjectsItemsRequirementsModel,\n    entity: ObjectsItemsRequirementsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/objects-items-rewards-model.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsRewardsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ObjectsItemsRewardsModel\n{\n\n    constructor(id, object_id, item_key, reward_item_key, reward_quantity, reward_item_is_required)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.item_key = item_key;\n        this.reward_item_key = reward_item_key;\n        this.reward_quantity = reward_quantity;\n        this.reward_item_is_required = reward_item_is_required;\n    }\n\n    static createByProps(props)\n    {\n        const {id, object_id, item_key, reward_item_key, reward_quantity, reward_item_is_required} = props;\n        return new this(id, object_id, item_key, reward_item_key, reward_quantity, reward_item_is_required);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ObjectsItemsRewardsModel,\n    tableName: 'objects_items_rewards',\n    properties: {\n        id: { type: 'number', primary: true },\n        object_id: { type: 'number', persist: false },\n        item_key: { type: 'string', persist: false },\n        reward_item_key: { type: 'string', persist: false },\n        reward_quantity: { type: 'number', nullable: true },\n        reward_item_is_required: { type: 'number', nullable: true },\n        related_objects: {\n            kind: 'm:1',\n            entity: 'ObjectsModel',\n            joinColumn: 'object_id'\n        },\n        related_items_item_item_key: {\n            kind: 'm:1',\n            entity: 'ItemsItemModel',\n            joinColumn: 'item_key'\n        },\n        related_items_item_reward_item_key: {\n            kind: 'm:1',\n            entity: 'ItemsItemModel',\n            joinColumn: 'reward_item_key'\n        }\n    },\n});\nschema._fkMappings = {\n    \"object_id\": {\n        \"relationKey\": \"related_objects\",\n        \"entityName\": \"ObjectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"item_key\": {\n        \"relationKey\": \"related_items_item_item_key\",\n        \"entityName\": \"ItemsItemModel\",\n        \"referencedColumn\": \"key\",\n        \"nullable\": false\n    },\n    \"reward_item_key\": {\n        \"relationKey\": \"related_items_item_reward_item_key\",\n        \"entityName\": \"ItemsItemModel\",\n        \"referencedColumn\": \"key\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ObjectsItemsRewardsModel,\n    entity: ObjectsItemsRewardsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/objects-model.js",
    "content": "/**\n *\n * Reldens - ObjectsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ObjectsModel\n{\n\n    constructor(id, room_id, layer_name, tile_index, class_type, object_class_key, client_key, title, private_params, client_params, enabled, created_at, updated_at)\n    {\n        this.id = id;\n        this.room_id = room_id;\n        this.layer_name = layer_name;\n        this.tile_index = tile_index;\n        this.class_type = class_type;\n        this.object_class_key = object_class_key;\n        this.client_key = client_key;\n        this.title = title;\n        this.private_params = private_params;\n        this.client_params = client_params;\n        this.enabled = enabled;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, room_id, layer_name, tile_index, class_type, object_class_key, client_key, title, private_params, client_params, enabled, created_at, updated_at} = props;\n        return new this(id, room_id, layer_name, tile_index, class_type, object_class_key, client_key, title, private_params, client_params, enabled, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ObjectsModel,\n    tableName: 'objects',\n    properties: {\n        id: { type: 'number', primary: true },\n        room_id: { type: 'number', persist: false },\n        layer_name: { type: 'string' },\n        tile_index: { type: 'number', nullable: true },\n        class_type: { type: 'number', persist: false },\n        object_class_key: { type: 'string' },\n        client_key: { type: 'string' },\n        title: { type: 'string', nullable: true },\n        private_params: { type: 'string', nullable: true },\n        client_params: { type: 'string', nullable: true },\n        enabled: { type: 'number', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_rooms: {\n            kind: 'm:1',\n            entity: 'RoomsModel',\n            joinColumn: 'room_id'\n        },\n        related_objects_types: {\n            kind: 'm:1',\n            entity: 'ObjectsTypesModel',\n            joinColumn: 'class_type'\n        },\n        related_objects_animations: {\n            kind: '1:m',\n            entity: 'ObjectsAnimationsModel',\n            mappedBy: 'related_objects'\n        },\n        related_objects_assets: {\n            kind: '1:m',\n            entity: 'ObjectsAssetsModel',\n            mappedBy: 'related_objects'\n        },\n        related_objects_items_inventory: {\n            kind: '1:m',\n            entity: 'ObjectsItemsInventoryModel',\n            mappedBy: 'related_objects'\n        },\n        related_objects_items_requirements: {\n            kind: '1:m',\n            entity: 'ObjectsItemsRequirementsModel',\n            mappedBy: 'related_objects'\n        },\n        related_objects_items_rewards: {\n            kind: '1:m',\n            entity: 'ObjectsItemsRewardsModel',\n            mappedBy: 'related_objects'\n        },\n        related_objects_skills: {\n            kind: '1:m',\n            entity: 'ObjectsSkillsModel',\n            mappedBy: 'related_objects'\n        },\n        related_objects_stats: {\n            kind: '1:m',\n            entity: 'ObjectsStatsModel',\n            mappedBy: 'related_objects'\n        },\n        related_respawn: {\n            kind: '1:m',\n            entity: 'RespawnModel',\n            mappedBy: 'related_objects'\n        },\n        related_rewards: {\n            kind: '1:m',\n            entity: 'RewardsModel',\n            mappedBy: 'related_objects'\n        }\n    },\n});\nschema._fkMappings = {\n    \"room_id\": {\n        \"relationKey\": \"related_rooms\",\n        \"entityName\": \"RoomsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"class_type\": {\n        \"relationKey\": \"related_objects_types\",\n        \"entityName\": \"ObjectsTypesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    ObjectsModel,\n    entity: ObjectsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/objects-skills-model.js",
    "content": "/**\n *\n * Reldens - ObjectsSkillsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ObjectsSkillsModel\n{\n\n    constructor(id, object_id, skill_id, target_id)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.skill_id = skill_id;\n        this.target_id = target_id;\n    }\n\n    static createByProps(props)\n    {\n        const {id, object_id, skill_id, target_id} = props;\n        return new this(id, object_id, skill_id, target_id);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ObjectsSkillsModel,\n    tableName: 'objects_skills',\n    properties: {\n        id: { type: 'number', primary: true },\n        object_id: { type: 'number', persist: false },\n        skill_id: { type: 'number', persist: false },\n        target_id: { type: 'number', persist: false },\n        related_objects: {\n            kind: 'm:1',\n            entity: 'ObjectsModel',\n            joinColumn: 'object_id'\n        },\n        related_skills_skill: {\n            kind: 'm:1',\n            entity: 'SkillsSkillModel',\n            joinColumn: 'skill_id'\n        },\n        related_target_options: {\n            kind: 'm:1',\n            entity: 'TargetOptionsModel',\n            joinColumn: 'target_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"object_id\": {\n        \"relationKey\": \"related_objects\",\n        \"entityName\": \"ObjectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"skill_id\": {\n        \"relationKey\": \"related_skills_skill\",\n        \"entityName\": \"SkillsSkillModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"target_id\": {\n        \"relationKey\": \"related_target_options\",\n        \"entityName\": \"TargetOptionsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ObjectsSkillsModel,\n    entity: ObjectsSkillsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/objects-stats-model.js",
    "content": "/**\n *\n * Reldens - ObjectsStatsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ObjectsStatsModel\n{\n\n    constructor(id, object_id, stat_id, base_value, value)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.stat_id = stat_id;\n        this.base_value = base_value;\n        this.value = value;\n    }\n\n    static createByProps(props)\n    {\n        const {id, object_id, stat_id, base_value, value} = props;\n        return new this(id, object_id, stat_id, base_value, value);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ObjectsStatsModel,\n    tableName: 'objects_stats',\n    properties: {\n        id: { type: 'number', primary: true },\n        object_id: { type: 'number', persist: false },\n        stat_id: { type: 'number', persist: false },\n        base_value: { type: 'number' },\n        value: { type: 'number' },\n        related_objects: {\n            kind: 'm:1',\n            entity: 'ObjectsModel',\n            joinColumn: 'object_id'\n        },\n        related_stats: {\n            kind: 'm:1',\n            entity: 'StatsModel',\n            joinColumn: 'stat_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"object_id\": {\n        \"relationKey\": \"related_objects\",\n        \"entityName\": \"ObjectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"stat_id\": {\n        \"relationKey\": \"related_stats\",\n        \"entityName\": \"StatsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ObjectsStatsModel,\n    entity: ObjectsStatsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/objects-types-model.js",
    "content": "/**\n *\n * Reldens - ObjectsTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ObjectsTypesModel\n{\n\n    constructor(id, key)\n    {\n        this.id = id;\n        this.key = key;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key} = props;\n        return new this(id, key);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ObjectsTypesModel,\n    tableName: 'objects_types',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        related_objects: {\n            kind: '1:m',\n            entity: 'ObjectsModel',\n            mappedBy: 'related_objects_types'\n        }\n    },\n});\n\nmodule.exports = {\n    ObjectsTypesModel,\n    entity: ObjectsTypesModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/operation-types-model.js",
    "content": "/**\n *\n * Reldens - OperationTypesModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass OperationTypesModel\n{\n\n    constructor(id, label, key)\n    {\n        this.id = id;\n        this.label = label;\n        this.key = key;\n    }\n\n    static createByProps(props)\n    {\n        const {id, label, key} = props;\n        return new this(id, label, key);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: OperationTypesModel,\n    tableName: 'operation_types',\n    properties: {\n        id: { type: 'number', primary: true },\n        label: { type: 'string', nullable: true },\n        key: { type: 'number' },\n        related_clan_levels_modifiers: {\n            kind: '1:m',\n            entity: 'ClanLevelsModifiersModel',\n            mappedBy: 'related_operation_types'\n        },\n        related_items_item_modifiers: {\n            kind: '1:m',\n            entity: 'ItemsItemModifiersModel',\n            mappedBy: 'related_operation_types'\n        },\n        related_rewards_modifiers: {\n            kind: '1:m',\n            entity: 'RewardsModifiersModel',\n            mappedBy: 'related_operation_types'\n        },\n        related_skills_levels_modifiers: {\n            kind: '1:m',\n            entity: 'SkillsLevelsModifiersModel',\n            mappedBy: 'related_operation_types'\n        },\n        related_skills_skill_owner_effects: {\n            kind: '1:m',\n            entity: 'SkillsSkillOwnerEffectsModel',\n            mappedBy: 'related_operation_types'\n        },\n        related_skills_skill_target_effects: {\n            kind: '1:m',\n            entity: 'SkillsSkillTargetEffectsModel',\n            mappedBy: 'related_operation_types'\n        }\n    },\n});\n\nmodule.exports = {\n    OperationTypesModel,\n    entity: OperationTypesModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/players-model.js",
    "content": "/**\n *\n * Reldens - PlayersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass PlayersModel\n{\n\n    constructor(id, user_id, name, created_at, updated_at)\n    {\n        this.id = id;\n        this.user_id = user_id;\n        this.name = name;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, user_id, name, created_at, updated_at} = props;\n        return new this(id, user_id, name, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: PlayersModel,\n    tableName: 'players',\n    properties: {\n        id: { type: 'number', primary: true },\n        user_id: { type: 'number', persist: false },\n        name: { type: 'string' },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_users: {\n            kind: 'm:1',\n            entity: 'UsersModel',\n            joinColumn: 'user_id'\n        },\n        related_ads_played: {\n            kind: '1:m',\n            entity: 'AdsPlayedModel',\n            mappedBy: 'related_players'\n        },\n        related_audio_player_config: {\n            kind: '1:m',\n            entity: 'AudioPlayerConfigModel',\n            mappedBy: 'related_players'\n        },\n        related_chat_player: {\n            kind: '1:m',\n            entity: 'ChatModel',\n            mappedBy: 'related_players_player'\n        },\n        related_chat_private_player: {\n            kind: '1:m',\n            entity: 'ChatModel',\n            mappedBy: 'related_players_player'\n        },\n        related_clan: {\n            kind: '1:1',\n            entity: 'ClanModel',\n            mappedBy: 'related_players'\n        },\n        related_clan_members: {\n            kind: '1:1',\n            entity: 'ClanMembersModel',\n            mappedBy: 'related_players'\n        },\n        related_items_inventory: {\n            kind: '1:m',\n            entity: 'ItemsInventoryModel',\n            mappedBy: 'related_players'\n        },\n        related_players_state: {\n            kind: '1:1',\n            entity: 'PlayersStateModel',\n            mappedBy: 'related_players'\n        },\n        related_players_stats: {\n            kind: '1:m',\n            entity: 'PlayersStatsModel',\n            mappedBy: 'related_players'\n        },\n        related_rewards_events_state: {\n            kind: '1:m',\n            entity: 'RewardsEventsStateModel',\n            mappedBy: 'related_players'\n        },\n        related_scores: {\n            kind: '1:m',\n            entity: 'ScoresModel',\n            mappedBy: 'related_players'\n        },\n        related_scores_detail: {\n            kind: '1:m',\n            entity: 'ScoresDetailModel',\n            mappedBy: 'related_players'\n        },\n        related_skills_owners_class_path: {\n            kind: '1:m',\n            entity: 'SkillsOwnersClassPathModel',\n            mappedBy: 'related_players'\n        }\n    },\n});\nschema._fkMappings = {\n    \"user_id\": {\n        \"relationKey\": \"related_users\",\n        \"entityName\": \"UsersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    PlayersModel,\n    entity: PlayersModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/players-state-model.js",
    "content": "/**\n *\n * Reldens - PlayersStateModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass PlayersStateModel\n{\n\n    constructor(id, player_id, room_id, x, y, dir)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.room_id = room_id;\n        this.x = x;\n        this.y = y;\n        this.dir = dir;\n    }\n\n    static createByProps(props)\n    {\n        const {id, player_id, room_id, x, y, dir} = props;\n        return new this(id, player_id, room_id, x, y, dir);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: PlayersStateModel,\n    tableName: 'players_state',\n    properties: {\n        id: { type: 'number', primary: true },\n        player_id: { type: 'number', persist: false },\n        room_id: { type: 'number', persist: false },\n        x: { type: 'number' },\n        y: { type: 'number' },\n        dir: { type: 'string' },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'player_id'\n        },\n        related_rooms: {\n            kind: 'm:1',\n            entity: 'RoomsModel',\n            joinColumn: 'room_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"player_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"room_id\": {\n        \"relationKey\": \"related_rooms\",\n        \"entityName\": \"RoomsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    PlayersStateModel,\n    entity: PlayersStateModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/players-stats-model.js",
    "content": "/**\n *\n * Reldens - PlayersStatsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass PlayersStatsModel\n{\n\n    constructor(id, player_id, stat_id, base_value, value)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.stat_id = stat_id;\n        this.base_value = base_value;\n        this.value = value;\n    }\n\n    static createByProps(props)\n    {\n        const {id, player_id, stat_id, base_value, value} = props;\n        return new this(id, player_id, stat_id, base_value, value);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: PlayersStatsModel,\n    tableName: 'players_stats',\n    properties: {\n        id: { type: 'number', primary: true },\n        player_id: { type: 'number', persist: false },\n        stat_id: { type: 'number', persist: false },\n        base_value: { type: 'number' },\n        value: { type: 'number' },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'player_id'\n        },\n        related_stats: {\n            kind: 'm:1',\n            entity: 'StatsModel',\n            joinColumn: 'stat_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"player_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"stat_id\": {\n        \"relationKey\": \"related_stats\",\n        \"entityName\": \"StatsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    PlayersStatsModel,\n    entity: PlayersStatsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/registered-models-mikro-orm.js",
    "content": "/**\n *\n * Reldens - Registered Models\n *\n */\n\nconst adsBannerModel = require('./ads-banner-model');\nconst adsModel = require('./ads-model');\nconst adsEventVideoModel = require('./ads-event-video-model');\nconst adsPlayedModel = require('./ads-played-model');\nconst adsProvidersModel = require('./ads-providers-model');\nconst adsTypesModel = require('./ads-types-model');\nconst audioCategoriesModel = require('./audio-categories-model');\nconst audioModel = require('./audio-model');\nconst audioMarkersModel = require('./audio-markers-model');\nconst audioPlayerConfigModel = require('./audio-player-config-model');\nconst chatModel = require('./chat-model');\nconst chatMessageTypesModel = require('./chat-message-types-model');\nconst clanModel = require('./clan-model');\nconst clanLevelsModel = require('./clan-levels-model');\nconst clanLevelsModifiersModel = require('./clan-levels-modifiers-model');\nconst clanMembersModel = require('./clan-members-model');\nconst configModel = require('./config-model');\nconst configTypesModel = require('./config-types-model');\nconst dropsAnimationsModel = require('./drops-animations-model');\nconst featuresModel = require('./features-model');\nconst itemsGroupModel = require('./items-group-model');\nconst itemsInventoryModel = require('./items-inventory-model');\nconst itemsItemModel = require('./items-item-model');\nconst itemsItemModifiersModel = require('./items-item-modifiers-model');\nconst itemsTypesModel = require('./items-types-model');\nconst localeModel = require('./locale-model');\nconst objectsAnimationsModel = require('./objects-animations-model');\nconst objectsAssetsModel = require('./objects-assets-model');\nconst objectsModel = require('./objects-model');\nconst objectsItemsInventoryModel = require('./objects-items-inventory-model');\nconst objectsItemsRequirementsModel = require('./objects-items-requirements-model');\nconst objectsItemsRewardsModel = require('./objects-items-rewards-model');\nconst objectsSkillsModel = require('./objects-skills-model');\nconst objectsStatsModel = require('./objects-stats-model');\nconst objectsTypesModel = require('./objects-types-model');\nconst operationTypesModel = require('./operation-types-model');\nconst playersModel = require('./players-model');\nconst playersStateModel = require('./players-state-model');\nconst playersStatsModel = require('./players-stats-model');\nconst respawnModel = require('./respawn-model');\nconst rewardsModel = require('./rewards-model');\nconst rewardsEventsModel = require('./rewards-events-model');\nconst rewardsEventsStateModel = require('./rewards-events-state-model');\nconst rewardsModifiersModel = require('./rewards-modifiers-model');\nconst roomsChangePointsModel = require('./rooms-change-points-model');\nconst roomsModel = require('./rooms-model');\nconst roomsReturnPointsModel = require('./rooms-return-points-model');\nconst scoresDetailModel = require('./scores-detail-model');\nconst scoresModel = require('./scores-model');\nconst skillsClassLevelUpAnimationsModel = require('./skills-class-level-up-animations-model');\nconst skillsClassPathModel = require('./skills-class-path-model');\nconst skillsClassPathLevelLabelsModel = require('./skills-class-path-level-labels-model');\nconst skillsClassPathLevelSkillsModel = require('./skills-class-path-level-skills-model');\nconst skillsGroupsModel = require('./skills-groups-model');\nconst skillsLevelsModel = require('./skills-levels-model');\nconst skillsLevelsModifiersConditionsModel = require('./skills-levels-modifiers-conditions-model');\nconst skillsLevelsModifiersModel = require('./skills-levels-modifiers-model');\nconst skillsLevelsSetModel = require('./skills-levels-set-model');\nconst skillsOwnersClassPathModel = require('./skills-owners-class-path-model');\nconst skillsSkillAnimationsModel = require('./skills-skill-animations-model');\nconst skillsSkillAttackModel = require('./skills-skill-attack-model');\nconst skillsSkillModel = require('./skills-skill-model');\nconst skillsSkillGroupRelationModel = require('./skills-skill-group-relation-model');\nconst skillsSkillOwnerConditionsModel = require('./skills-skill-owner-conditions-model');\nconst skillsSkillOwnerEffectsConditionsModel = require('./skills-skill-owner-effects-conditions-model');\nconst skillsSkillOwnerEffectsModel = require('./skills-skill-owner-effects-model');\nconst skillsSkillPhysicalDataModel = require('./skills-skill-physical-data-model');\nconst skillsSkillTargetEffectsConditionsModel = require('./skills-skill-target-effects-conditions-model');\nconst skillsSkillTargetEffectsModel = require('./skills-skill-target-effects-model');\nconst skillsSkillTypeModel = require('./skills-skill-type-model');\nconst snippetsModel = require('./snippets-model');\nconst statsModel = require('./stats-model');\nconst targetOptionsModel = require('./target-options-model');\nconst usersModel = require('./users-model');\nconst usersLocaleModel = require('./users-locale-model');\nconst usersLoginModel = require('./users-login-model');\nconst { entitiesConfig } = require('../../entities-config');\nconst { entitiesTranslations } = require('../../entities-translations');\n\nlet rawRegisteredEntities = {\n    adsBanner: adsBannerModel,\n    ads: adsModel,\n    adsEventVideo: adsEventVideoModel,\n    adsPlayed: adsPlayedModel,\n    adsProviders: adsProvidersModel,\n    adsTypes: adsTypesModel,\n    audioCategories: audioCategoriesModel,\n    audio: audioModel,\n    audioMarkers: audioMarkersModel,\n    audioPlayerConfig: audioPlayerConfigModel,\n    chat: chatModel,\n    chatMessageTypes: chatMessageTypesModel,\n    clan: clanModel,\n    clanLevels: clanLevelsModel,\n    clanLevelsModifiers: clanLevelsModifiersModel,\n    clanMembers: clanMembersModel,\n    config: configModel,\n    configTypes: configTypesModel,\n    dropsAnimations: dropsAnimationsModel,\n    features: featuresModel,\n    itemsGroup: itemsGroupModel,\n    itemsInventory: itemsInventoryModel,\n    itemsItem: itemsItemModel,\n    itemsItemModifiers: itemsItemModifiersModel,\n    itemsTypes: itemsTypesModel,\n    locale: localeModel,\n    objectsAnimations: objectsAnimationsModel,\n    objectsAssets: objectsAssetsModel,\n    objects: objectsModel,\n    objectsItemsInventory: objectsItemsInventoryModel,\n    objectsItemsRequirements: objectsItemsRequirementsModel,\n    objectsItemsRewards: objectsItemsRewardsModel,\n    objectsSkills: objectsSkillsModel,\n    objectsStats: objectsStatsModel,\n    objectsTypes: objectsTypesModel,\n    operationTypes: operationTypesModel,\n    players: playersModel,\n    playersState: playersStateModel,\n    playersStats: playersStatsModel,\n    respawn: respawnModel,\n    rewards: rewardsModel,\n    rewardsEvents: rewardsEventsModel,\n    rewardsEventsState: rewardsEventsStateModel,\n    rewardsModifiers: rewardsModifiersModel,\n    roomsChangePoints: roomsChangePointsModel,\n    rooms: roomsModel,\n    roomsReturnPoints: roomsReturnPointsModel,\n    scoresDetail: scoresDetailModel,\n    scores: scoresModel,\n    skillsClassLevelUpAnimations: skillsClassLevelUpAnimationsModel,\n    skillsClassPath: skillsClassPathModel,\n    skillsClassPathLevelLabels: skillsClassPathLevelLabelsModel,\n    skillsClassPathLevelSkills: skillsClassPathLevelSkillsModel,\n    skillsGroups: skillsGroupsModel,\n    skillsLevels: skillsLevelsModel,\n    skillsLevelsModifiersConditions: skillsLevelsModifiersConditionsModel,\n    skillsLevelsModifiers: skillsLevelsModifiersModel,\n    skillsLevelsSet: skillsLevelsSetModel,\n    skillsOwnersClassPath: skillsOwnersClassPathModel,\n    skillsSkillAnimations: skillsSkillAnimationsModel,\n    skillsSkillAttack: skillsSkillAttackModel,\n    skillsSkill: skillsSkillModel,\n    skillsSkillGroupRelation: skillsSkillGroupRelationModel,\n    skillsSkillOwnerConditions: skillsSkillOwnerConditionsModel,\n    skillsSkillOwnerEffectsConditions: skillsSkillOwnerEffectsConditionsModel,\n    skillsSkillOwnerEffects: skillsSkillOwnerEffectsModel,\n    skillsSkillPhysicalData: skillsSkillPhysicalDataModel,\n    skillsSkillTargetEffectsConditions: skillsSkillTargetEffectsConditionsModel,\n    skillsSkillTargetEffects: skillsSkillTargetEffectsModel,\n    skillsSkillType: skillsSkillTypeModel,\n    snippets: snippetsModel,\n    stats: statsModel,\n    targetOptions: targetOptionsModel,\n    users: usersModel,\n    usersLocale: usersLocaleModel,\n    usersLogin: usersLoginModel\n};\n\nmodule.exports.rawRegisteredEntities = rawRegisteredEntities;\n\nmodule.exports.entitiesConfig = entitiesConfig;\n\nmodule.exports.entitiesTranslations = entitiesTranslations;\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/respawn-model.js",
    "content": "/**\n *\n * Reldens - RespawnModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass RespawnModel\n{\n\n    constructor(id, object_id, respawn_time, instances_limit, layer, created_at, updated_at)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.respawn_time = respawn_time;\n        this.instances_limit = instances_limit;\n        this.layer = layer;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, object_id, respawn_time, instances_limit, layer, created_at, updated_at} = props;\n        return new this(id, object_id, respawn_time, instances_limit, layer, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: RespawnModel,\n    tableName: 'respawn',\n    properties: {\n        id: { type: 'number', primary: true },\n        object_id: { type: 'number', persist: false },\n        respawn_time: { type: 'number', nullable: true },\n        instances_limit: { type: 'number', nullable: true },\n        layer: { type: 'string' },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_objects: {\n            kind: 'm:1',\n            entity: 'ObjectsModel',\n            joinColumn: 'object_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"object_id\": {\n        \"relationKey\": \"related_objects\",\n        \"entityName\": \"ObjectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    RespawnModel,\n    entity: RespawnModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/rewards-events-model.js",
    "content": "/**\n *\n * Reldens - RewardsEventsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass RewardsEventsModel\n{\n\n    constructor(id, label, description, handler_key, event_key, event_data, position, enabled, active_from, active_to)\n    {\n        this.id = id;\n        this.label = label;\n        this.description = description;\n        this.handler_key = handler_key;\n        this.event_key = event_key;\n        this.event_data = event_data;\n        this.position = position;\n        this.enabled = enabled;\n        this.active_from = active_from;\n        this.active_to = active_to;\n    }\n\n    static createByProps(props)\n    {\n        const {id, label, description, handler_key, event_key, event_data, position, enabled, active_from, active_to} = props;\n        return new this(id, label, description, handler_key, event_key, event_data, position, enabled, active_from, active_to);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: RewardsEventsModel,\n    tableName: 'rewards_events',\n    properties: {\n        id: { type: 'number', primary: true },\n        label: { type: 'string' },\n        description: { type: 'string', nullable: true },\n        handler_key: { type: 'string' },\n        event_key: { type: 'string' },\n        event_data: { type: 'string' },\n        position: { type: 'number', nullable: true },\n        enabled: { type: 'number', nullable: true },\n        active_from: { type: 'Date', nullable: true },\n        active_to: { type: 'Date', nullable: true },\n        related_rewards_events_state: {\n            kind: '1:m',\n            entity: 'RewardsEventsStateModel',\n            mappedBy: 'related_rewards_events'\n        }\n    },\n});\n\nmodule.exports = {\n    RewardsEventsModel,\n    entity: RewardsEventsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/rewards-events-state-model.js",
    "content": "/**\n *\n * Reldens - RewardsEventsStateModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass RewardsEventsStateModel\n{\n\n    constructor(id, rewards_events_id, player_id, state)\n    {\n        this.id = id;\n        this.rewards_events_id = rewards_events_id;\n        this.player_id = player_id;\n        this.state = state;\n    }\n\n    static createByProps(props)\n    {\n        const {id, rewards_events_id, player_id, state} = props;\n        return new this(id, rewards_events_id, player_id, state);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: RewardsEventsStateModel,\n    tableName: 'rewards_events_state',\n    properties: {\n        id: { type: 'number', primary: true },\n        rewards_events_id: { type: 'number', persist: false },\n        player_id: { type: 'number', persist: false },\n        state: { type: 'string', nullable: true },\n        related_rewards_events: {\n            kind: 'm:1',\n            entity: 'RewardsEventsModel',\n            joinColumn: 'rewards_events_id'\n        },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'player_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"rewards_events_id\": {\n        \"relationKey\": \"related_rewards_events\",\n        \"entityName\": \"RewardsEventsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"player_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    RewardsEventsStateModel,\n    entity: RewardsEventsStateModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/rewards-model.js",
    "content": "/**\n *\n * Reldens - RewardsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass RewardsModel\n{\n\n    constructor(id, object_id, item_id, modifier_id, experience, drop_rate, drop_quantity, is_unique, was_given, has_drop_body, created_at, updated_at)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.item_id = item_id;\n        this.modifier_id = modifier_id;\n        this.experience = experience;\n        this.drop_rate = drop_rate;\n        this.drop_quantity = drop_quantity;\n        this.is_unique = is_unique;\n        this.was_given = was_given;\n        this.has_drop_body = has_drop_body;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, object_id, item_id, modifier_id, experience, drop_rate, drop_quantity, is_unique, was_given, has_drop_body, created_at, updated_at} = props;\n        return new this(id, object_id, item_id, modifier_id, experience, drop_rate, drop_quantity, is_unique, was_given, has_drop_body, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: RewardsModel,\n    tableName: 'rewards',\n    properties: {\n        id: { type: 'number', primary: true },\n        object_id: { type: 'number', persist: false },\n        item_id: { type: 'number', persist: false },\n        modifier_id: { type: 'number', persist: false },\n        experience: { type: 'number', nullable: true },\n        drop_rate: { type: 'number' },\n        drop_quantity: { type: 'number' },\n        is_unique: { type: 'number', nullable: true },\n        was_given: { type: 'number', nullable: true },\n        has_drop_body: { type: 'number', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_objects: {\n            kind: 'm:1',\n            entity: 'ObjectsModel',\n            joinColumn: 'object_id'\n        },\n        related_items_item: {\n            kind: 'm:1',\n            entity: 'ItemsItemModel',\n            joinColumn: 'item_id'\n        },\n        related_rewards_modifiers: {\n            kind: 'm:1',\n            entity: 'RewardsModifiersModel',\n            joinColumn: 'modifier_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"object_id\": {\n        \"relationKey\": \"related_objects\",\n        \"entityName\": \"ObjectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"item_id\": {\n        \"relationKey\": \"related_items_item\",\n        \"entityName\": \"ItemsItemModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    },\n    \"modifier_id\": {\n        \"relationKey\": \"related_rewards_modifiers\",\n        \"entityName\": \"RewardsModifiersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    RewardsModel,\n    entity: RewardsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/rewards-modifiers-model.js",
    "content": "/**\n *\n * Reldens - RewardsModifiersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass RewardsModifiersModel\n{\n\n    constructor(id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty} = props;\n        return new this(id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: RewardsModifiersModel,\n    tableName: 'rewards_modifiers',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        operation: { type: 'number', persist: false },\n        value: { type: 'string' },\n        minValue: { type: 'string', nullable: true },\n        maxValue: { type: 'string', nullable: true },\n        minProperty: { type: 'string', nullable: true },\n        maxProperty: { type: 'string', nullable: true },\n        related_operation_types: {\n            kind: 'm:1',\n            entity: 'OperationTypesModel',\n            joinColumn: 'operation'\n        },\n        related_rewards: {\n            kind: '1:m',\n            entity: 'RewardsModel',\n            mappedBy: 'related_rewards_modifiers'\n        }\n    },\n});\nschema._fkMappings = {\n    \"operation\": {\n        \"relationKey\": \"related_operation_types\",\n        \"entityName\": \"OperationTypesModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    RewardsModifiersModel,\n    entity: RewardsModifiersModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/rooms-change-points-model.js",
    "content": "/**\n *\n * Reldens - RoomsChangePointsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass RoomsChangePointsModel\n{\n\n    constructor(id, room_id, tile_index, next_room_id)\n    {\n        this.id = id;\n        this.room_id = room_id;\n        this.tile_index = tile_index;\n        this.next_room_id = next_room_id;\n    }\n\n    static createByProps(props)\n    {\n        const {id, room_id, tile_index, next_room_id} = props;\n        return new this(id, room_id, tile_index, next_room_id);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: RoomsChangePointsModel,\n    tableName: 'rooms_change_points',\n    properties: {\n        id: { type: 'number', primary: true },\n        room_id: { type: 'number', persist: false },\n        tile_index: { type: 'number' },\n        next_room_id: { type: 'number', persist: false },\n        related_rooms_room: {\n            kind: 'm:1',\n            entity: 'RoomsModel',\n            joinColumn: 'room_id'\n        },\n        related_rooms_next_room: {\n            kind: 'm:1',\n            entity: 'RoomsModel',\n            joinColumn: 'next_room_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"room_id\": {\n        \"relationKey\": \"related_rooms_room\",\n        \"entityName\": \"RoomsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"next_room_id\": {\n        \"relationKey\": \"related_rooms_next_room\",\n        \"entityName\": \"RoomsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    RoomsChangePointsModel,\n    entity: RoomsChangePointsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/rooms-model.js",
    "content": "/**\n *\n * Reldens - RoomsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass RoomsModel\n{\n\n    constructor(id, name, title, map_filename, scene_images, room_class_key, server_url, customData, created_at, updated_at)\n    {\n        this.id = id;\n        this.name = name;\n        this.title = title;\n        this.map_filename = map_filename;\n        this.scene_images = scene_images;\n        this.room_class_key = room_class_key;\n        this.server_url = server_url;\n        this.customData = customData;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, name, title, map_filename, scene_images, room_class_key, server_url, customData, created_at, updated_at} = props;\n        return new this(id, name, title, map_filename, scene_images, room_class_key, server_url, customData, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: RoomsModel,\n    tableName: 'rooms',\n    properties: {\n        id: { type: 'number', primary: true },\n        name: { type: 'string' },\n        title: { type: 'string' },\n        map_filename: { type: 'string' },\n        scene_images: { type: 'string' },\n        room_class_key: { type: 'string', nullable: true },\n        server_url: { type: 'string', nullable: true },\n        customData: { type: 'string', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_audio: {\n            kind: '1:m',\n            entity: 'AudioModel',\n            mappedBy: 'related_rooms'\n        },\n        related_chat: {\n            kind: '1:m',\n            entity: 'ChatModel',\n            mappedBy: 'related_rooms'\n        },\n        related_objects: {\n            kind: '1:m',\n            entity: 'ObjectsModel',\n            mappedBy: 'related_rooms'\n        },\n        related_players_state: {\n            kind: '1:m',\n            entity: 'PlayersStateModel',\n            mappedBy: 'related_rooms'\n        },\n        related_rooms_change_points_room: {\n            kind: '1:m',\n            entity: 'RoomsChangePointsModel',\n            mappedBy: 'related_rooms_room'\n        },\n        related_rooms_change_points_next_room: {\n            kind: '1:m',\n            entity: 'RoomsChangePointsModel',\n            mappedBy: 'related_rooms_room'\n        },\n        related_rooms_return_points_room: {\n            kind: '1:m',\n            entity: 'RoomsReturnPointsModel',\n            mappedBy: 'related_rooms_room'\n        },\n        related_rooms_return_points_from_room: {\n            kind: '1:m',\n            entity: 'RoomsReturnPointsModel',\n            mappedBy: 'related_rooms_room'\n        }\n    },\n});\n\nmodule.exports = {\n    RoomsModel,\n    entity: RoomsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/rooms-return-points-model.js",
    "content": "/**\n *\n * Reldens - RoomsReturnPointsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass RoomsReturnPointsModel\n{\n\n    constructor(id, room_id, direction, x, y, is_default, from_room_id)\n    {\n        this.id = id;\n        this.room_id = room_id;\n        this.direction = direction;\n        this.x = x;\n        this.y = y;\n        this.is_default = is_default;\n        this.from_room_id = from_room_id;\n    }\n\n    static createByProps(props)\n    {\n        const {id, room_id, direction, x, y, is_default, from_room_id} = props;\n        return new this(id, room_id, direction, x, y, is_default, from_room_id);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: RoomsReturnPointsModel,\n    tableName: 'rooms_return_points',\n    properties: {\n        id: { type: 'number', primary: true },\n        room_id: { type: 'number', persist: false },\n        direction: { type: 'string' },\n        x: { type: 'number' },\n        y: { type: 'number' },\n        is_default: { type: 'number', nullable: true },\n        from_room_id: { type: 'number', persist: false },\n        related_rooms_room: {\n            kind: 'm:1',\n            entity: 'RoomsModel',\n            joinColumn: 'room_id'\n        },\n        related_rooms_from_room: {\n            kind: 'm:1',\n            entity: 'RoomsModel',\n            joinColumn: 'from_room_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"room_id\": {\n        \"relationKey\": \"related_rooms_room\",\n        \"entityName\": \"RoomsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"from_room_id\": {\n        \"relationKey\": \"related_rooms_from_room\",\n        \"entityName\": \"RoomsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    RoomsReturnPointsModel,\n    entity: RoomsReturnPointsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/scores-detail-model.js",
    "content": "/**\n *\n * Reldens - ScoresDetailModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ScoresDetailModel\n{\n\n    constructor(id, player_id, obtained_score, kill_time, kill_player_id, kill_npc_id)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.obtained_score = obtained_score;\n        this.kill_time = kill_time;\n        this.kill_player_id = kill_player_id;\n        this.kill_npc_id = kill_npc_id;\n    }\n\n    static createByProps(props)\n    {\n        const {id, player_id, obtained_score, kill_time, kill_player_id, kill_npc_id} = props;\n        return new this(id, player_id, obtained_score, kill_time, kill_player_id, kill_npc_id);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ScoresDetailModel,\n    tableName: 'scores_detail',\n    properties: {\n        id: { type: 'number', primary: true },\n        player_id: { type: 'number', persist: false },\n        obtained_score: { type: 'number' },\n        kill_time: { type: 'Date', nullable: true },\n        kill_player_id: { type: 'number', nullable: true },\n        kill_npc_id: { type: 'number', nullable: true },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'player_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"player_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ScoresDetailModel,\n    entity: ScoresDetailModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/scores-model.js",
    "content": "/**\n *\n * Reldens - ScoresModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass ScoresModel\n{\n\n    constructor(id, player_id, total_score, players_kills_count, npcs_kills_count, last_player_kill_time, last_npc_kill_time, created_at, updated_at)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.total_score = total_score;\n        this.players_kills_count = players_kills_count;\n        this.npcs_kills_count = npcs_kills_count;\n        this.last_player_kill_time = last_player_kill_time;\n        this.last_npc_kill_time = last_npc_kill_time;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, player_id, total_score, players_kills_count, npcs_kills_count, last_player_kill_time, last_npc_kill_time, created_at, updated_at} = props;\n        return new this(id, player_id, total_score, players_kills_count, npcs_kills_count, last_player_kill_time, last_npc_kill_time, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: ScoresModel,\n    tableName: 'scores',\n    properties: {\n        id: { type: 'number', primary: true },\n        player_id: { type: 'number', persist: false },\n        total_score: { type: 'number' },\n        players_kills_count: { type: 'number' },\n        npcs_kills_count: { type: 'number' },\n        last_player_kill_time: { type: 'Date', nullable: true },\n        last_npc_kill_time: { type: 'Date', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'player_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"player_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    ScoresModel,\n    entity: ScoresModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-class-level-up-animations-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassLevelUpAnimationsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsClassLevelUpAnimationsModel\n{\n\n    constructor(id, class_path_id, level_id, animationData)\n    {\n        this.id = id;\n        this.class_path_id = class_path_id;\n        this.level_id = level_id;\n        this.animationData = animationData;\n    }\n\n    static createByProps(props)\n    {\n        const {id, class_path_id, level_id, animationData} = props;\n        return new this(id, class_path_id, level_id, animationData);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsClassLevelUpAnimationsModel,\n    tableName: 'skills_class_level_up_animations',\n    properties: {\n        id: { type: 'number', primary: true },\n        class_path_id: { type: 'number', persist: false },\n        level_id: { type: 'number', persist: false },\n        animationData: { type: 'string' },\n        related_skills_class_path: {\n            kind: 'm:1',\n            entity: 'SkillsClassPathModel',\n            joinColumn: 'class_path_id'\n        },\n        related_skills_levels: {\n            kind: 'm:1',\n            entity: 'SkillsLevelsModel',\n            joinColumn: 'level_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"class_path_id\": {\n        \"relationKey\": \"related_skills_class_path\",\n        \"entityName\": \"SkillsClassPathModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    },\n    \"level_id\": {\n        \"relationKey\": \"related_skills_levels\",\n        \"entityName\": \"SkillsLevelsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    SkillsClassLevelUpAnimationsModel,\n    entity: SkillsClassLevelUpAnimationsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-class-path-level-labels-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathLevelLabelsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsClassPathLevelLabelsModel\n{\n\n    constructor(id, class_path_id, level_id, label)\n    {\n        this.id = id;\n        this.class_path_id = class_path_id;\n        this.level_id = level_id;\n        this.label = label;\n    }\n\n    static createByProps(props)\n    {\n        const {id, class_path_id, level_id, label} = props;\n        return new this(id, class_path_id, level_id, label);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsClassPathLevelLabelsModel,\n    tableName: 'skills_class_path_level_labels',\n    properties: {\n        id: { type: 'number', primary: true },\n        class_path_id: { type: 'number', persist: false },\n        level_id: { type: 'number', persist: false },\n        label: { type: 'string' },\n        related_skills_class_path: {\n            kind: 'm:1',\n            entity: 'SkillsClassPathModel',\n            joinColumn: 'class_path_id'\n        },\n        related_skills_levels: {\n            kind: 'm:1',\n            entity: 'SkillsLevelsModel',\n            joinColumn: 'level_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"class_path_id\": {\n        \"relationKey\": \"related_skills_class_path\",\n        \"entityName\": \"SkillsClassPathModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"level_id\": {\n        \"relationKey\": \"related_skills_levels\",\n        \"entityName\": \"SkillsLevelsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsClassPathLevelLabelsModel,\n    entity: SkillsClassPathLevelLabelsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-class-path-level-skills-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathLevelSkillsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsClassPathLevelSkillsModel\n{\n\n    constructor(id, class_path_id, level_id, skill_id)\n    {\n        this.id = id;\n        this.class_path_id = class_path_id;\n        this.level_id = level_id;\n        this.skill_id = skill_id;\n    }\n\n    static createByProps(props)\n    {\n        const {id, class_path_id, level_id, skill_id} = props;\n        return new this(id, class_path_id, level_id, skill_id);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsClassPathLevelSkillsModel,\n    tableName: 'skills_class_path_level_skills',\n    properties: {\n        id: { type: 'number', primary: true },\n        class_path_id: { type: 'number', persist: false },\n        level_id: { type: 'number', persist: false },\n        skill_id: { type: 'number', persist: false },\n        related_skills_class_path: {\n            kind: 'm:1',\n            entity: 'SkillsClassPathModel',\n            joinColumn: 'class_path_id'\n        },\n        related_skills_levels: {\n            kind: 'm:1',\n            entity: 'SkillsLevelsModel',\n            joinColumn: 'level_id'\n        },\n        related_skills_skill: {\n            kind: 'm:1',\n            entity: 'SkillsSkillModel',\n            joinColumn: 'skill_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"class_path_id\": {\n        \"relationKey\": \"related_skills_class_path\",\n        \"entityName\": \"SkillsClassPathModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"level_id\": {\n        \"relationKey\": \"related_skills_levels\",\n        \"entityName\": \"SkillsLevelsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"skill_id\": {\n        \"relationKey\": \"related_skills_skill\",\n        \"entityName\": \"SkillsSkillModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsClassPathLevelSkillsModel,\n    entity: SkillsClassPathLevelSkillsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-class-path-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsClassPathModel\n{\n\n    constructor(id, key, label, levels_set_id, enabled, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.levels_set_id = levels_set_id;\n        this.enabled = enabled;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, label, levels_set_id, enabled, created_at, updated_at} = props;\n        return new this(id, key, label, levels_set_id, enabled, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsClassPathModel,\n    tableName: 'skills_class_path',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        label: { type: 'string', nullable: true },\n        levels_set_id: { type: 'number', persist: false },\n        enabled: { type: 'number', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_skills_levels_set: {\n            kind: 'm:1',\n            entity: 'SkillsLevelsSetModel',\n            joinColumn: 'levels_set_id'\n        },\n        related_skills_class_level_up_animations: {\n            kind: '1:m',\n            entity: 'SkillsClassLevelUpAnimationsModel',\n            mappedBy: 'related_skills_class_path'\n        },\n        related_skills_class_path_level_labels: {\n            kind: '1:m',\n            entity: 'SkillsClassPathLevelLabelsModel',\n            mappedBy: 'related_skills_class_path'\n        },\n        related_skills_class_path_level_skills: {\n            kind: '1:m',\n            entity: 'SkillsClassPathLevelSkillsModel',\n            mappedBy: 'related_skills_class_path'\n        },\n        related_skills_owners_class_path: {\n            kind: '1:m',\n            entity: 'SkillsOwnersClassPathModel',\n            mappedBy: 'related_skills_class_path'\n        }\n    },\n});\nschema._fkMappings = {\n    \"levels_set_id\": {\n        \"relationKey\": \"related_skills_levels_set\",\n        \"entityName\": \"SkillsLevelsSetModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsClassPathModel,\n    entity: SkillsClassPathModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-groups-model.js",
    "content": "/**\n *\n * Reldens - SkillsGroupsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsGroupsModel\n{\n\n    constructor(id, key, label, description, sort)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.description = description;\n        this.sort = sort;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, label, description, sort} = props;\n        return new this(id, key, label, description, sort);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsGroupsModel,\n    tableName: 'skills_groups',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        label: { type: 'string' },\n        description: { type: 'string' },\n        sort: { type: 'number', nullable: true },\n        related_skills_skill_group_relation: {\n            kind: '1:m',\n            entity: 'SkillsSkillGroupRelationModel',\n            mappedBy: 'related_skills_groups'\n        }\n    },\n});\n\nmodule.exports = {\n    SkillsGroupsModel,\n    entity: SkillsGroupsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-levels-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsLevelsModel\n{\n\n    constructor(id, key, label, required_experience, level_set_id)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.required_experience = required_experience;\n        this.level_set_id = level_set_id;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, label, required_experience, level_set_id} = props;\n        return new this(id, key, label, required_experience, level_set_id);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsLevelsModel,\n    tableName: 'skills_levels',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'number' },\n        label: { type: 'string' },\n        required_experience: { type: 'number', nullable: true },\n        level_set_id: { type: 'number', persist: false },\n        related_skills_levels_set: {\n            kind: 'm:1',\n            entity: 'SkillsLevelsSetModel',\n            joinColumn: 'level_set_id'\n        },\n        related_skills_class_level_up_animations: {\n            kind: '1:m',\n            entity: 'SkillsClassLevelUpAnimationsModel',\n            mappedBy: 'related_skills_levels'\n        },\n        related_skills_class_path_level_labels: {\n            kind: '1:m',\n            entity: 'SkillsClassPathLevelLabelsModel',\n            mappedBy: 'related_skills_levels'\n        },\n        related_skills_class_path_level_skills: {\n            kind: '1:m',\n            entity: 'SkillsClassPathLevelSkillsModel',\n            mappedBy: 'related_skills_levels'\n        },\n        related_skills_levels_modifiers: {\n            kind: '1:m',\n            entity: 'SkillsLevelsModifiersModel',\n            mappedBy: 'related_skills_levels'\n        }\n    },\n});\nschema._fkMappings = {\n    \"level_set_id\": {\n        \"relationKey\": \"related_skills_levels_set\",\n        \"entityName\": \"SkillsLevelsSetModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsLevelsModel,\n    entity: SkillsLevelsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-levels-modifiers-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModifiersConditionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsLevelsModifiersConditionsModel\n{\n\n    constructor(id, levels_modifier_id, key, property_key, conditional, value)\n    {\n        this.id = id;\n        this.levels_modifier_id = levels_modifier_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.conditional = conditional;\n        this.value = value;\n    }\n\n    static createByProps(props)\n    {\n        const {id, levels_modifier_id, key, property_key, conditional, value} = props;\n        return new this(id, levels_modifier_id, key, property_key, conditional, value);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsLevelsModifiersConditionsModel,\n    tableName: 'skills_levels_modifiers_conditions',\n    properties: {\n        id: { type: 'number', primary: true },\n        levels_modifier_id: { type: 'number' },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        conditional: { type: 'undefined' },\n        value: { type: 'string' }\n    },\n});\n\nmodule.exports = {\n    SkillsLevelsModifiersConditionsModel,\n    entity: SkillsLevelsModifiersConditionsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-levels-modifiers-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModifiersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsLevelsModifiersModel\n{\n\n    constructor(id, level_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.level_id = level_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static createByProps(props)\n    {\n        const {id, level_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty} = props;\n        return new this(id, level_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsLevelsModifiersModel,\n    tableName: 'skills_levels_modifiers',\n    properties: {\n        id: { type: 'number', primary: true },\n        level_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        operation: { type: 'number', persist: false },\n        value: { type: 'string' },\n        minValue: { type: 'string', nullable: true },\n        maxValue: { type: 'string', nullable: true },\n        minProperty: { type: 'string', nullable: true },\n        maxProperty: { type: 'string', nullable: true },\n        related_skills_levels: {\n            kind: 'm:1',\n            entity: 'SkillsLevelsModel',\n            joinColumn: 'level_id'\n        },\n        related_operation_types: {\n            kind: 'm:1',\n            entity: 'OperationTypesModel',\n            joinColumn: 'operation'\n        }\n    },\n});\nschema._fkMappings = {\n    \"level_id\": {\n        \"relationKey\": \"related_skills_levels\",\n        \"entityName\": \"SkillsLevelsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"operation\": {\n        \"relationKey\": \"related_operation_types\",\n        \"entityName\": \"OperationTypesModel\",\n        \"referencedColumn\": \"key\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsLevelsModifiersModel,\n    entity: SkillsLevelsModifiersModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-levels-set-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsSetModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsLevelsSetModel\n{\n\n    constructor(id, key, label, autoFillRanges, autoFillExperienceMultiplier, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.autoFillRanges = autoFillRanges;\n        this.autoFillExperienceMultiplier = autoFillExperienceMultiplier;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, label, autoFillRanges, autoFillExperienceMultiplier, created_at, updated_at} = props;\n        return new this(id, key, label, autoFillRanges, autoFillExperienceMultiplier, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsLevelsSetModel,\n    tableName: 'skills_levels_set',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string', nullable: true },\n        label: { type: 'string', nullable: true },\n        autoFillRanges: { type: 'number', nullable: true },\n        autoFillExperienceMultiplier: { type: 'number', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_skills_class_path: {\n            kind: '1:m',\n            entity: 'SkillsClassPathModel',\n            mappedBy: 'related_skills_levels_set'\n        },\n        related_skills_levels: {\n            kind: '1:m',\n            entity: 'SkillsLevelsModel',\n            mappedBy: 'related_skills_levels_set'\n        }\n    },\n});\n\nmodule.exports = {\n    SkillsLevelsSetModel,\n    entity: SkillsLevelsSetModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-owners-class-path-model.js",
    "content": "/**\n *\n * Reldens - SkillsOwnersClassPathModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsOwnersClassPathModel\n{\n\n    constructor(id, class_path_id, owner_id, currentLevel, currentExp)\n    {\n        this.id = id;\n        this.class_path_id = class_path_id;\n        this.owner_id = owner_id;\n        this.currentLevel = currentLevel;\n        this.currentExp = currentExp;\n    }\n\n    static createByProps(props)\n    {\n        const {id, class_path_id, owner_id, currentLevel, currentExp} = props;\n        return new this(id, class_path_id, owner_id, currentLevel, currentExp);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsOwnersClassPathModel,\n    tableName: 'skills_owners_class_path',\n    properties: {\n        id: { type: 'number', primary: true },\n        class_path_id: { type: 'number', persist: false },\n        owner_id: { type: 'number', persist: false },\n        currentLevel: { type: 'number', nullable: true },\n        currentExp: { type: 'number', nullable: true },\n        related_skills_class_path: {\n            kind: 'm:1',\n            entity: 'SkillsClassPathModel',\n            joinColumn: 'class_path_id'\n        },\n        related_players: {\n            kind: 'm:1',\n            entity: 'PlayersModel',\n            joinColumn: 'owner_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"class_path_id\": {\n        \"relationKey\": \"related_skills_class_path\",\n        \"entityName\": \"SkillsClassPathModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"owner_id\": {\n        \"relationKey\": \"related_players\",\n        \"entityName\": \"PlayersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsOwnersClassPathModel,\n    entity: SkillsOwnersClassPathModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-animations-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAnimationsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillAnimationsModel\n{\n\n    constructor(id, skill_id, key, classKey, animationData)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.key = key;\n        this.classKey = classKey;\n        this.animationData = animationData;\n    }\n\n    static createByProps(props)\n    {\n        const {id, skill_id, key, classKey, animationData} = props;\n        return new this(id, skill_id, key, classKey, animationData);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillAnimationsModel,\n    tableName: 'skills_skill_animations',\n    properties: {\n        id: { type: 'number', primary: true },\n        skill_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        classKey: { type: 'string', nullable: true },\n        animationData: { type: 'string' },\n        related_skills_skill: {\n            kind: 'm:1',\n            entity: 'SkillsSkillModel',\n            joinColumn: 'skill_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"skill_id\": {\n        \"relationKey\": \"related_skills_skill\",\n        \"entityName\": \"SkillsSkillModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillAnimationsModel,\n    entity: SkillsSkillAnimationsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-attack-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAttackModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillAttackModel\n{\n\n    constructor(id, skill_id, affectedProperty, allowEffectBelowZero, hitDamage, applyDirectDamage, attackProperties, defenseProperties, aimProperties, dodgeProperties, dodgeFullEnabled, dodgeOverAimSuccess, damageAffected, criticalAffected)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.affectedProperty = affectedProperty;\n        this.allowEffectBelowZero = allowEffectBelowZero;\n        this.hitDamage = hitDamage;\n        this.applyDirectDamage = applyDirectDamage;\n        this.attackProperties = attackProperties;\n        this.defenseProperties = defenseProperties;\n        this.aimProperties = aimProperties;\n        this.dodgeProperties = dodgeProperties;\n        this.dodgeFullEnabled = dodgeFullEnabled;\n        this.dodgeOverAimSuccess = dodgeOverAimSuccess;\n        this.damageAffected = damageAffected;\n        this.criticalAffected = criticalAffected;\n    }\n\n    static createByProps(props)\n    {\n        const {id, skill_id, affectedProperty, allowEffectBelowZero, hitDamage, applyDirectDamage, attackProperties, defenseProperties, aimProperties, dodgeProperties, dodgeFullEnabled, dodgeOverAimSuccess, damageAffected, criticalAffected} = props;\n        return new this(id, skill_id, affectedProperty, allowEffectBelowZero, hitDamage, applyDirectDamage, attackProperties, defenseProperties, aimProperties, dodgeProperties, dodgeFullEnabled, dodgeOverAimSuccess, damageAffected, criticalAffected);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillAttackModel,\n    tableName: 'skills_skill_attack',\n    properties: {\n        id: { type: 'number', primary: true },\n        skill_id: { type: 'number', persist: false },\n        affectedProperty: { type: 'string' },\n        allowEffectBelowZero: { type: 'number', nullable: true },\n        hitDamage: { type: 'number' },\n        applyDirectDamage: { type: 'number', nullable: true },\n        attackProperties: { type: 'string', nullable: true },\n        defenseProperties: { type: 'string', nullable: true },\n        aimProperties: { type: 'string', nullable: true },\n        dodgeProperties: { type: 'string', nullable: true },\n        dodgeFullEnabled: { type: 'number', nullable: true },\n        dodgeOverAimSuccess: { type: 'number', nullable: true },\n        damageAffected: { type: 'number', nullable: true },\n        criticalAffected: { type: 'number', nullable: true },\n        related_skills_skill: {\n            kind: 'm:1',\n            entity: 'SkillsSkillModel',\n            joinColumn: 'skill_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"skill_id\": {\n        \"relationKey\": \"related_skills_skill\",\n        \"entityName\": \"SkillsSkillModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillAttackModel,\n    entity: SkillsSkillAttackModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-group-relation-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillGroupRelationModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillGroupRelationModel\n{\n\n    constructor(id, skill_id, group_id)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.group_id = group_id;\n    }\n\n    static createByProps(props)\n    {\n        const {id, skill_id, group_id} = props;\n        return new this(id, skill_id, group_id);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillGroupRelationModel,\n    tableName: 'skills_skill_group_relation',\n    properties: {\n        id: { type: 'number', primary: true },\n        skill_id: { type: 'number', persist: false },\n        group_id: { type: 'number', persist: false },\n        related_skills_skill: {\n            kind: 'm:1',\n            entity: 'SkillsSkillModel',\n            joinColumn: 'skill_id'\n        },\n        related_skills_groups: {\n            kind: 'm:1',\n            entity: 'SkillsGroupsModel',\n            joinColumn: 'group_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"skill_id\": {\n        \"relationKey\": \"related_skills_skill\",\n        \"entityName\": \"SkillsSkillModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"group_id\": {\n        \"relationKey\": \"related_skills_groups\",\n        \"entityName\": \"SkillsGroupsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillGroupRelationModel,\n    entity: SkillsSkillGroupRelationModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillModel\n{\n\n    constructor(id, key, type, label, autoValidation, skillDelay, castTime, usesLimit, range, rangeAutomaticValidation, rangePropertyX, rangePropertyY, rangeTargetPropertyX, rangeTargetPropertyY, allowSelfTarget, criticalChance, criticalMultiplier, criticalFixedValue, customData, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.type = type;\n        this.label = label;\n        this.autoValidation = autoValidation;\n        this.skillDelay = skillDelay;\n        this.castTime = castTime;\n        this.usesLimit = usesLimit;\n        this.range = range;\n        this.rangeAutomaticValidation = rangeAutomaticValidation;\n        this.rangePropertyX = rangePropertyX;\n        this.rangePropertyY = rangePropertyY;\n        this.rangeTargetPropertyX = rangeTargetPropertyX;\n        this.rangeTargetPropertyY = rangeTargetPropertyY;\n        this.allowSelfTarget = allowSelfTarget;\n        this.criticalChance = criticalChance;\n        this.criticalMultiplier = criticalMultiplier;\n        this.criticalFixedValue = criticalFixedValue;\n        this.customData = customData;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, type, label, autoValidation, skillDelay, castTime, usesLimit, range, rangeAutomaticValidation, rangePropertyX, rangePropertyY, rangeTargetPropertyX, rangeTargetPropertyY, allowSelfTarget, criticalChance, criticalMultiplier, criticalFixedValue, customData, created_at, updated_at} = props;\n        return new this(id, key, type, label, autoValidation, skillDelay, castTime, usesLimit, range, rangeAutomaticValidation, rangePropertyX, rangePropertyY, rangeTargetPropertyX, rangeTargetPropertyY, allowSelfTarget, criticalChance, criticalMultiplier, criticalFixedValue, customData, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillModel,\n    tableName: 'skills_skill',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        type: { type: 'number', persist: false },\n        label: { type: 'string', nullable: true },\n        autoValidation: { type: 'number', nullable: true },\n        skillDelay: { type: 'number' },\n        castTime: { type: 'number' },\n        usesLimit: { type: 'number', nullable: true },\n        range: { type: 'number' },\n        rangeAutomaticValidation: { type: 'number', nullable: true },\n        rangePropertyX: { type: 'string' },\n        rangePropertyY: { type: 'string' },\n        rangeTargetPropertyX: { type: 'string', nullable: true },\n        rangeTargetPropertyY: { type: 'string', nullable: true },\n        allowSelfTarget: { type: 'number', nullable: true },\n        criticalChance: { type: 'number', nullable: true },\n        criticalMultiplier: { type: 'number', nullable: true },\n        criticalFixedValue: { type: 'number', nullable: true },\n        customData: { type: 'string', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_skills_skill_type: {\n            kind: 'm:1',\n            entity: 'SkillsSkillTypeModel',\n            joinColumn: 'type'\n        },\n        related_objects_skills: {\n            kind: '1:m',\n            entity: 'ObjectsSkillsModel',\n            mappedBy: 'related_skills_skill'\n        },\n        related_skills_class_path_level_skills: {\n            kind: '1:m',\n            entity: 'SkillsClassPathLevelSkillsModel',\n            mappedBy: 'related_skills_skill'\n        },\n        related_skills_skill_animations: {\n            kind: '1:m',\n            entity: 'SkillsSkillAnimationsModel',\n            mappedBy: 'related_skills_skill'\n        },\n        related_skills_skill_attack: {\n            kind: '1:1',\n            entity: 'SkillsSkillAttackModel',\n            mappedBy: 'related_skills_skill'\n        },\n        related_skills_skill_group_relation: {\n            kind: '1:1',\n            entity: 'SkillsSkillGroupRelationModel',\n            mappedBy: 'related_skills_skill'\n        },\n        related_skills_skill_owner_conditions: {\n            kind: '1:m',\n            entity: 'SkillsSkillOwnerConditionsModel',\n            mappedBy: 'related_skills_skill'\n        },\n        related_skills_skill_owner_effects: {\n            kind: '1:m',\n            entity: 'SkillsSkillOwnerEffectsModel',\n            mappedBy: 'related_skills_skill'\n        },\n        related_skills_skill_physical_data: {\n            kind: '1:1',\n            entity: 'SkillsSkillPhysicalDataModel',\n            mappedBy: 'related_skills_skill'\n        },\n        related_skills_skill_target_effects: {\n            kind: '1:m',\n            entity: 'SkillsSkillTargetEffectsModel',\n            mappedBy: 'related_skills_skill'\n        }\n    },\n});\nschema._fkMappings = {\n    \"type\": {\n        \"relationKey\": \"related_skills_skill_type\",\n        \"entityName\": \"SkillsSkillTypeModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillModel,\n    entity: SkillsSkillModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-owner-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerConditionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillOwnerConditionsModel\n{\n\n    constructor(id, skill_id, key, property_key, conditional, value)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.conditional = conditional;\n        this.value = value;\n    }\n\n    static createByProps(props)\n    {\n        const {id, skill_id, key, property_key, conditional, value} = props;\n        return new this(id, skill_id, key, property_key, conditional, value);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillOwnerConditionsModel,\n    tableName: 'skills_skill_owner_conditions',\n    properties: {\n        id: { type: 'number', primary: true },\n        skill_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        conditional: { type: 'undefined' },\n        value: { type: 'string' },\n        related_skills_skill: {\n            kind: 'm:1',\n            entity: 'SkillsSkillModel',\n            joinColumn: 'skill_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"skill_id\": {\n        \"relationKey\": \"related_skills_skill\",\n        \"entityName\": \"SkillsSkillModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillOwnerConditionsModel,\n    entity: SkillsSkillOwnerConditionsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-owner-effects-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsConditionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillOwnerEffectsConditionsModel\n{\n\n    constructor(id, skill_owner_effect_id, key, property_key, conditional, value)\n    {\n        this.id = id;\n        this.skill_owner_effect_id = skill_owner_effect_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.conditional = conditional;\n        this.value = value;\n    }\n\n    static createByProps(props)\n    {\n        const {id, skill_owner_effect_id, key, property_key, conditional, value} = props;\n        return new this(id, skill_owner_effect_id, key, property_key, conditional, value);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillOwnerEffectsConditionsModel,\n    tableName: 'skills_skill_owner_effects_conditions',\n    properties: {\n        id: { type: 'number', primary: true },\n        skill_owner_effect_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        conditional: { type: 'undefined' },\n        value: { type: 'string' },\n        related_skills_skill_owner_effects: {\n            kind: 'm:1',\n            entity: 'SkillsSkillOwnerEffectsModel',\n            joinColumn: 'skill_owner_effect_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"skill_owner_effect_id\": {\n        \"relationKey\": \"related_skills_skill_owner_effects\",\n        \"entityName\": \"SkillsSkillOwnerEffectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillOwnerEffectsConditionsModel,\n    entity: SkillsSkillOwnerEffectsConditionsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-owner-effects-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillOwnerEffectsModel\n{\n\n    constructor(id, skill_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static createByProps(props)\n    {\n        const {id, skill_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty} = props;\n        return new this(id, skill_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillOwnerEffectsModel,\n    tableName: 'skills_skill_owner_effects',\n    properties: {\n        id: { type: 'number', primary: true },\n        skill_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        operation: { type: 'number', persist: false },\n        value: { type: 'string' },\n        minValue: { type: 'string' },\n        maxValue: { type: 'string' },\n        minProperty: { type: 'string', nullable: true },\n        maxProperty: { type: 'string', nullable: true },\n        related_skills_skill: {\n            kind: 'm:1',\n            entity: 'SkillsSkillModel',\n            joinColumn: 'skill_id'\n        },\n        related_operation_types: {\n            kind: 'm:1',\n            entity: 'OperationTypesModel',\n            joinColumn: 'operation'\n        },\n        related_skills_skill_owner_effects_conditions: {\n            kind: '1:m',\n            entity: 'SkillsSkillOwnerEffectsConditionsModel',\n            mappedBy: 'related_skills_skill_owner_effects'\n        }\n    },\n});\nschema._fkMappings = {\n    \"skill_id\": {\n        \"relationKey\": \"related_skills_skill\",\n        \"entityName\": \"SkillsSkillModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"operation\": {\n        \"relationKey\": \"related_operation_types\",\n        \"entityName\": \"OperationTypesModel\",\n        \"referencedColumn\": \"key\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillOwnerEffectsModel,\n    entity: SkillsSkillOwnerEffectsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-physical-data-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillPhysicalDataModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillPhysicalDataModel\n{\n\n    constructor(id, skill_id, magnitude, objectWidth, objectHeight, validateTargetOnHit)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.magnitude = magnitude;\n        this.objectWidth = objectWidth;\n        this.objectHeight = objectHeight;\n        this.validateTargetOnHit = validateTargetOnHit;\n    }\n\n    static createByProps(props)\n    {\n        const {id, skill_id, magnitude, objectWidth, objectHeight, validateTargetOnHit} = props;\n        return new this(id, skill_id, magnitude, objectWidth, objectHeight, validateTargetOnHit);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillPhysicalDataModel,\n    tableName: 'skills_skill_physical_data',\n    properties: {\n        id: { type: 'number', primary: true },\n        skill_id: { type: 'number', persist: false },\n        magnitude: { type: 'number' },\n        objectWidth: { type: 'number' },\n        objectHeight: { type: 'number' },\n        validateTargetOnHit: { type: 'number', nullable: true },\n        related_skills_skill: {\n            kind: 'm:1',\n            entity: 'SkillsSkillModel',\n            joinColumn: 'skill_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"skill_id\": {\n        \"relationKey\": \"related_skills_skill\",\n        \"entityName\": \"SkillsSkillModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillPhysicalDataModel,\n    entity: SkillsSkillPhysicalDataModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-target-effects-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTargetEffectsConditionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillTargetEffectsConditionsModel\n{\n\n    constructor(id, skill_target_effect_id, key, property_key, conditional, value)\n    {\n        this.id = id;\n        this.skill_target_effect_id = skill_target_effect_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.conditional = conditional;\n        this.value = value;\n    }\n\n    static createByProps(props)\n    {\n        const {id, skill_target_effect_id, key, property_key, conditional, value} = props;\n        return new this(id, skill_target_effect_id, key, property_key, conditional, value);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillTargetEffectsConditionsModel,\n    tableName: 'skills_skill_target_effects_conditions',\n    properties: {\n        id: { type: 'number', primary: true },\n        skill_target_effect_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        conditional: { type: 'undefined' },\n        value: { type: 'string' },\n        related_skills_skill_target_effects: {\n            kind: 'm:1',\n            entity: 'SkillsSkillTargetEffectsModel',\n            joinColumn: 'skill_target_effect_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"skill_target_effect_id\": {\n        \"relationKey\": \"related_skills_skill_target_effects\",\n        \"entityName\": \"SkillsSkillTargetEffectsModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillTargetEffectsConditionsModel,\n    entity: SkillsSkillTargetEffectsConditionsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-target-effects-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTargetEffectsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillTargetEffectsModel\n{\n\n    constructor(id, skill_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static createByProps(props)\n    {\n        const {id, skill_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty} = props;\n        return new this(id, skill_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillTargetEffectsModel,\n    tableName: 'skills_skill_target_effects',\n    properties: {\n        id: { type: 'number', primary: true },\n        skill_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        property_key: { type: 'string' },\n        operation: { type: 'number', persist: false },\n        value: { type: 'string' },\n        minValue: { type: 'string' },\n        maxValue: { type: 'string' },\n        minProperty: { type: 'string', nullable: true },\n        maxProperty: { type: 'string', nullable: true },\n        related_skills_skill: {\n            kind: 'm:1',\n            entity: 'SkillsSkillModel',\n            joinColumn: 'skill_id'\n        },\n        related_operation_types: {\n            kind: 'm:1',\n            entity: 'OperationTypesModel',\n            joinColumn: 'operation'\n        },\n        related_skills_skill_target_effects_conditions: {\n            kind: '1:m',\n            entity: 'SkillsSkillTargetEffectsConditionsModel',\n            mappedBy: 'related_skills_skill_target_effects'\n        }\n    },\n});\nschema._fkMappings = {\n    \"skill_id\": {\n        \"relationKey\": \"related_skills_skill\",\n        \"entityName\": \"SkillsSkillModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    },\n    \"operation\": {\n        \"relationKey\": \"related_operation_types\",\n        \"entityName\": \"OperationTypesModel\",\n        \"referencedColumn\": \"key\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SkillsSkillTargetEffectsModel,\n    entity: SkillsSkillTargetEffectsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/skills-skill-type-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTypeModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SkillsSkillTypeModel\n{\n\n    constructor(id, key)\n    {\n        this.id = id;\n        this.key = key;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key} = props;\n        return new this(id, key);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SkillsSkillTypeModel,\n    tableName: 'skills_skill_type',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        related_skills_skill: {\n            kind: '1:m',\n            entity: 'SkillsSkillModel',\n            mappedBy: 'related_skills_skill_type'\n        }\n    },\n});\n\nmodule.exports = {\n    SkillsSkillTypeModel,\n    entity: SkillsSkillTypeModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/snippets-model.js",
    "content": "/**\n *\n * Reldens - SnippetsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass SnippetsModel\n{\n\n    constructor(id, locale_id, key, value, created_at, updated_at)\n    {\n        this.id = id;\n        this.locale_id = locale_id;\n        this.key = key;\n        this.value = value;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, locale_id, key, value, created_at, updated_at} = props;\n        return new this(id, locale_id, key, value, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: SnippetsModel,\n    tableName: 'snippets',\n    properties: {\n        id: { type: 'number', primary: true },\n        locale_id: { type: 'number', persist: false },\n        key: { type: 'string' },\n        value: { type: 'string' },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_locale: {\n            kind: 'm:1',\n            entity: 'LocaleModel',\n            joinColumn: 'locale_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"locale_id\": {\n        \"relationKey\": \"related_locale\",\n        \"entityName\": \"LocaleModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    SnippetsModel,\n    entity: SnippetsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/stats-model.js",
    "content": "/**\n *\n * Reldens - StatsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass StatsModel\n{\n\n    constructor(id, key, label, description, base_value, customData, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.description = description;\n        this.base_value = base_value;\n        this.customData = customData;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static createByProps(props)\n    {\n        const {id, key, label, description, base_value, customData, created_at, updated_at} = props;\n        return new this(id, key, label, description, base_value, customData, created_at, updated_at);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: StatsModel,\n    tableName: 'stats',\n    properties: {\n        id: { type: 'number', primary: true },\n        key: { type: 'string' },\n        label: { type: 'string' },\n        description: { type: 'string' },\n        base_value: { type: 'number' },\n        customData: { type: 'string', nullable: true },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        related_objects_stats: {\n            kind: '1:m',\n            entity: 'ObjectsStatsModel',\n            mappedBy: 'related_stats'\n        },\n        related_players_stats: {\n            kind: '1:m',\n            entity: 'PlayersStatsModel',\n            mappedBy: 'related_stats'\n        }\n    },\n});\n\nmodule.exports = {\n    StatsModel,\n    entity: StatsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/target-options-model.js",
    "content": "/**\n *\n * Reldens - TargetOptionsModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass TargetOptionsModel\n{\n\n    constructor(id, target_key, target_label)\n    {\n        this.id = id;\n        this.target_key = target_key;\n        this.target_label = target_label;\n    }\n\n    static createByProps(props)\n    {\n        const {id, target_key, target_label} = props;\n        return new this(id, target_key, target_label);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: TargetOptionsModel,\n    tableName: 'target_options',\n    properties: {\n        id: { type: 'number', primary: true },\n        target_key: { type: 'string' },\n        target_label: { type: 'string', nullable: true },\n        related_objects_skills: {\n            kind: '1:m',\n            entity: 'ObjectsSkillsModel',\n            mappedBy: 'related_target_options'\n        }\n    },\n});\n\nmodule.exports = {\n    TargetOptionsModel,\n    entity: TargetOptionsModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/users-locale-model.js",
    "content": "/**\n *\n * Reldens - UsersLocaleModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass UsersLocaleModel\n{\n\n    constructor(id, locale_id, user_id)\n    {\n        this.id = id;\n        this.locale_id = locale_id;\n        this.user_id = user_id;\n    }\n\n    static createByProps(props)\n    {\n        const {id, locale_id, user_id} = props;\n        return new this(id, locale_id, user_id);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: UsersLocaleModel,\n    tableName: 'users_locale',\n    properties: {\n        id: { type: 'number', primary: true },\n        locale_id: { type: 'number', persist: false },\n        user_id: { type: 'number', persist: false },\n        related_locale: {\n            kind: 'm:1',\n            entity: 'LocaleModel',\n            joinColumn: 'locale_id'\n        },\n        related_users: {\n            kind: 'm:1',\n            entity: 'UsersModel',\n            joinColumn: 'user_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"locale_id\": {\n        \"relationKey\": \"related_locale\",\n        \"entityName\": \"LocaleModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    },\n    \"user_id\": {\n        \"relationKey\": \"related_users\",\n        \"entityName\": \"UsersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": true\n    }\n};\nmodule.exports = {\n    UsersLocaleModel,\n    entity: UsersLocaleModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/users-login-model.js",
    "content": "/**\n *\n * Reldens - UsersLoginModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass UsersLoginModel\n{\n\n    constructor(id, user_id, login_date, logout_date)\n    {\n        this.id = id;\n        this.user_id = user_id;\n        this.login_date = login_date;\n        this.logout_date = logout_date;\n    }\n\n    static createByProps(props)\n    {\n        const {id, user_id, login_date, logout_date} = props;\n        return new this(id, user_id, login_date, logout_date);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: UsersLoginModel,\n    tableName: 'users_login',\n    properties: {\n        id: { type: 'number', primary: true },\n        user_id: { type: 'number', persist: false },\n        login_date: { type: 'Date', nullable: true },\n        logout_date: { type: 'Date', nullable: true },\n        related_users: {\n            kind: 'm:1',\n            entity: 'UsersModel',\n            joinColumn: 'user_id'\n        }\n    },\n});\nschema._fkMappings = {\n    \"user_id\": {\n        \"relationKey\": \"related_users\",\n        \"entityName\": \"UsersModel\",\n        \"referencedColumn\": \"id\",\n        \"nullable\": false\n    }\n};\nmodule.exports = {\n    UsersLoginModel,\n    entity: UsersLoginModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/mikro-orm/users-model.js",
    "content": "/**\n *\n * Reldens - UsersModel\n *\n */\n\nconst { MikroOrmCore } = require('@reldens/storage');\nconst { EntitySchema } = MikroOrmCore;\n\nclass UsersModel\n{\n\n    constructor(id, email, username, password, role_id, status, created_at, updated_at, played_time, login_count)\n    {\n        this.id = id;\n        this.email = email;\n        this.username = username;\n        this.password = password;\n        this.role_id = role_id;\n        this.status = status;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n        this.played_time = played_time;\n        this.login_count = login_count;\n    }\n\n    static createByProps(props)\n    {\n        const {id, email, username, password, role_id, status, created_at, updated_at, played_time, login_count} = props;\n        return new this(id, email, username, password, role_id, status, created_at, updated_at, played_time, login_count);\n    }\n    \n}\n\nconst schema = new EntitySchema({\n    class: UsersModel,\n    tableName: 'users',\n    properties: {\n        id: { type: 'number', primary: true },\n        email: { type: 'string' },\n        username: { type: 'string' },\n        password: { type: 'string' },\n        role_id: { type: 'number' },\n        status: { type: 'string' },\n        created_at: { type: 'Date', nullable: true },\n        updated_at: { type: 'Date', nullable: true },\n        played_time: { type: 'number', nullable: true },\n        login_count: { type: 'number', nullable: true },\n        related_players: {\n            kind: '1:m',\n            entity: 'PlayersModel',\n            mappedBy: 'related_users'\n        },\n        related_users_locale: {\n            kind: '1:m',\n            entity: 'UsersLocaleModel',\n            mappedBy: 'related_users'\n        },\n        related_users_login: {\n            kind: '1:m',\n            entity: 'UsersLoginModel',\n            mappedBy: 'related_users'\n        }\n    },\n});\n\nmodule.exports = {\n    UsersModel,\n    entity: UsersModel,\n    schema: schema\n};\n"
  },
  {
    "path": "generated-entities/models/objection-js/ads-banner-model.js",
    "content": "/**\n *\n * Reldens - AdsBannerModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsBannerModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'ads_banner';\n    }\n\n    static get relationMappings()\n    {\n        const { AdsModel } = require('./ads-model');\n        return {\n            related_ads: {\n                relation: this.BelongsToOneRelation,\n                modelClass: AdsModel,\n                join: {\n                    from: this.tableName+'.ads_id',\n                    to: AdsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AdsBannerModel = AdsBannerModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/ads-event-video-model.js",
    "content": "/**\n *\n * Reldens - AdsEventVideoModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsEventVideoModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'ads_event_video';\n    }\n\n    static get relationMappings()\n    {\n        const { AdsModel } = require('./ads-model');\n        return {\n            related_ads: {\n                relation: this.BelongsToOneRelation,\n                modelClass: AdsModel,\n                join: {\n                    from: this.tableName+'.ads_id',\n                    to: AdsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AdsEventVideoModel = AdsEventVideoModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/ads-model.js",
    "content": "/**\n *\n * Reldens - AdsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'ads';\n    }\n\n    static get relationMappings()\n    {\n        const { AdsProvidersModel } = require('./ads-providers-model');\n        const { AdsTypesModel } = require('./ads-types-model');\n        const { AdsBannerModel } = require('./ads-banner-model');\n        const { AdsEventVideoModel } = require('./ads-event-video-model');\n        const { AdsPlayedModel } = require('./ads-played-model');\n        return {\n            related_ads_providers: {\n                relation: this.BelongsToOneRelation,\n                modelClass: AdsProvidersModel,\n                join: {\n                    from: this.tableName+'.provider_id',\n                    to: AdsProvidersModel.tableName+'.id'\n                }\n            },\n            related_ads_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: AdsTypesModel,\n                join: {\n                    from: this.tableName+'.type_id',\n                    to: AdsTypesModel.tableName+'.id'\n                }\n            },\n            related_ads_banner: {\n                relation: this.HasOneRelation,\n                modelClass: AdsBannerModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AdsBannerModel.tableName+'.ads_id'\n                }\n            },\n            related_ads_event_video: {\n                relation: this.HasOneRelation,\n                modelClass: AdsEventVideoModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AdsEventVideoModel.tableName+'.ads_id'\n                }\n            },\n            related_ads_played: {\n                relation: this.HasManyRelation,\n                modelClass: AdsPlayedModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AdsPlayedModel.tableName+'.ads_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AdsModel = AdsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/ads-played-model.js",
    "content": "/**\n *\n * Reldens - AdsPlayedModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsPlayedModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'ads_played';\n    }\n\n    static get relationMappings()\n    {\n        const { AdsModel } = require('./ads-model');\n        const { PlayersModel } = require('./players-model');\n        return {\n            related_ads: {\n                relation: this.BelongsToOneRelation,\n                modelClass: AdsModel,\n                join: {\n                    from: this.tableName+'.ads_id',\n                    to: AdsModel.tableName+'.id'\n                }\n            },\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AdsPlayedModel = AdsPlayedModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/ads-providers-model.js",
    "content": "/**\n *\n * Reldens - AdsProvidersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsProvidersModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'ads_providers';\n    }\n\n    static get relationMappings()\n    {\n        const { AdsModel } = require('./ads-model');\n        return {\n            related_ads: {\n                relation: this.HasManyRelation,\n                modelClass: AdsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AdsModel.tableName+'.provider_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AdsProvidersModel = AdsProvidersModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/ads-types-model.js",
    "content": "/**\n *\n * Reldens - AdsTypesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AdsTypesModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'ads_types';\n    }\n\n    static get relationMappings()\n    {\n        const { AdsModel } = require('./ads-model');\n        return {\n            related_ads: {\n                relation: this.HasManyRelation,\n                modelClass: AdsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AdsModel.tableName+'.type_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AdsTypesModel = AdsTypesModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/audio-categories-model.js",
    "content": "/**\n *\n * Reldens - AudioCategoriesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AudioCategoriesModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'audio_categories';\n    }\n\n    static get relationMappings()\n    {\n        const { AudioModel } = require('./audio-model');\n        const { AudioPlayerConfigModel } = require('./audio-player-config-model');\n        return {\n            related_audio: {\n                relation: this.HasManyRelation,\n                modelClass: AudioModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AudioModel.tableName+'.category_id'\n                }\n            },\n            related_audio_player_config: {\n                relation: this.HasManyRelation,\n                modelClass: AudioPlayerConfigModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AudioPlayerConfigModel.tableName+'.category_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AudioCategoriesModel = AudioCategoriesModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/audio-markers-model.js",
    "content": "/**\n *\n * Reldens - AudioMarkersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AudioMarkersModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'audio_markers';\n    }\n\n    static get relationMappings()\n    {\n        const { AudioModel } = require('./audio-model');\n        return {\n            related_audio: {\n                relation: this.BelongsToOneRelation,\n                modelClass: AudioModel,\n                join: {\n                    from: this.tableName+'.audio_id',\n                    to: AudioModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AudioMarkersModel = AudioMarkersModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/audio-model.js",
    "content": "/**\n *\n * Reldens - AudioModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AudioModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'audio';\n    }\n\n    static get relationMappings()\n    {\n        const { RoomsModel } = require('./rooms-model');\n        const { AudioCategoriesModel } = require('./audio-categories-model');\n        const { AudioMarkersModel } = require('./audio-markers-model');\n        return {\n            related_rooms: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RoomsModel,\n                join: {\n                    from: this.tableName+'.room_id',\n                    to: RoomsModel.tableName+'.id'\n                }\n            },\n            related_audio_categories: {\n                relation: this.BelongsToOneRelation,\n                modelClass: AudioCategoriesModel,\n                join: {\n                    from: this.tableName+'.category_id',\n                    to: AudioCategoriesModel.tableName+'.id'\n                }\n            },\n            related_audio_markers: {\n                relation: this.HasManyRelation,\n                modelClass: AudioMarkersModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AudioMarkersModel.tableName+'.audio_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AudioModel = AudioModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/audio-player-config-model.js",
    "content": "/**\n *\n * Reldens - AudioPlayerConfigModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass AudioPlayerConfigModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'audio_player_config';\n    }\n\n    static get relationMappings()\n    {\n        const { PlayersModel } = require('./players-model');\n        const { AudioCategoriesModel } = require('./audio-categories-model');\n        return {\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            },\n            related_audio_categories: {\n                relation: this.BelongsToOneRelation,\n                modelClass: AudioCategoriesModel,\n                join: {\n                    from: this.tableName+'.category_id',\n                    to: AudioCategoriesModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.AudioPlayerConfigModel = AudioPlayerConfigModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/chat-message-types-model.js",
    "content": "/**\n *\n * Reldens - ChatMessageTypesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ChatMessageTypesModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'chat_message_types';\n    }\n\n    static get relationMappings()\n    {\n        const { ChatMessageTypesModel } = require('./chat-message-types-model');\n        const { ChatModel } = require('./chat-model');\n        return {\n            related_chat_message_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ChatMessageTypesModel,\n                join: {\n                    from: this.tableName+'.also_show_in_type',\n                    to: ChatMessageTypesModel.tableName+'.id'\n                }\n            },\n            related_chat: {\n                relation: this.HasManyRelation,\n                modelClass: ChatModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ChatModel.tableName+'.message_type'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ChatMessageTypesModel = ChatMessageTypesModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/chat-model.js",
    "content": "/**\n *\n * Reldens - ChatModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ChatModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'chat';\n    }\n\n    static get relationMappings()\n    {\n        const { PlayersModel } = require('./players-model');\n        const { RoomsModel } = require('./rooms-model');\n        const { ChatMessageTypesModel } = require('./chat-message-types-model');\n        return {\n            related_players_player: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            },\n            related_rooms: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RoomsModel,\n                join: {\n                    from: this.tableName+'.room_id',\n                    to: RoomsModel.tableName+'.id'\n                }\n            },\n            related_players_private_player: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.private_player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            },\n            related_chat_message_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ChatMessageTypesModel,\n                join: {\n                    from: this.tableName+'.message_type',\n                    to: ChatMessageTypesModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ChatModel = ChatModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/clan-levels-model.js",
    "content": "/**\n *\n * Reldens - ClanLevelsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ClanLevelsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'clan_levels';\n    }\n\n    static get relationMappings()\n    {\n        const { ClanModel } = require('./clan-model');\n        const { ClanLevelsModifiersModel } = require('./clan-levels-modifiers-model');\n        return {\n            related_clan: {\n                relation: this.HasManyRelation,\n                modelClass: ClanModel,\n                join: {\n                    from: this.tableName+'.key',\n                    to: ClanModel.tableName+'.level'\n                }\n            },\n            related_clan_levels_modifiers: {\n                relation: this.HasManyRelation,\n                modelClass: ClanLevelsModifiersModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ClanLevelsModifiersModel.tableName+'.level_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ClanLevelsModel = ClanLevelsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/clan-levels-modifiers-model.js",
    "content": "/**\n *\n * Reldens - ClanLevelsModifiersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ClanLevelsModifiersModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'clan_levels_modifiers';\n    }\n\n    static get relationMappings()\n    {\n        const { ClanLevelsModel } = require('./clan-levels-model');\n        const { OperationTypesModel } = require('./operation-types-model');\n        return {\n            related_clan_levels: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ClanLevelsModel,\n                join: {\n                    from: this.tableName+'.level_id',\n                    to: ClanLevelsModel.tableName+'.id'\n                }\n            },\n            related_operation_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: OperationTypesModel,\n                join: {\n                    from: this.tableName+'.operation',\n                    to: OperationTypesModel.tableName+'.key'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ClanLevelsModifiersModel = ClanLevelsModifiersModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/clan-members-model.js",
    "content": "/**\n *\n * Reldens - ClanMembersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ClanMembersModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'clan_members';\n    }\n\n    static get relationMappings()\n    {\n        const { ClanModel } = require('./clan-model');\n        const { PlayersModel } = require('./players-model');\n        return {\n            related_clan: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ClanModel,\n                join: {\n                    from: this.tableName+'.clan_id',\n                    to: ClanModel.tableName+'.id'\n                }\n            },\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ClanMembersModel = ClanMembersModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/clan-model.js",
    "content": "/**\n *\n * Reldens - ClanModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ClanModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'clan';\n    }\n\n    static get relationMappings()\n    {\n        const { PlayersModel } = require('./players-model');\n        const { ClanLevelsModel } = require('./clan-levels-model');\n        const { ClanMembersModel } = require('./clan-members-model');\n        return {\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.owner_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            },\n            related_clan_levels: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ClanLevelsModel,\n                join: {\n                    from: this.tableName+'.level',\n                    to: ClanLevelsModel.tableName+'.key'\n                }\n            },\n            related_clan_members: {\n                relation: this.HasManyRelation,\n                modelClass: ClanMembersModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ClanMembersModel.tableName+'.clan_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ClanModel = ClanModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/config-model.js",
    "content": "/**\n *\n * Reldens - ConfigModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ConfigModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'config';\n    }\n\n    static get relationMappings()\n    {\n        const { ConfigTypesModel } = require('./config-types-model');\n        return {\n            related_config_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ConfigTypesModel,\n                join: {\n                    from: this.tableName+'.type',\n                    to: ConfigTypesModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ConfigModel = ConfigModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/config-types-model.js",
    "content": "/**\n *\n * Reldens - ConfigTypesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ConfigTypesModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'config_types';\n    }\n\n    static get relationMappings()\n    {\n        const { ConfigModel } = require('./config-model');\n        return {\n            related_config: {\n                relation: this.HasManyRelation,\n                modelClass: ConfigModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ConfigModel.tableName+'.type'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ConfigTypesModel = ConfigTypesModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/drops-animations-model.js",
    "content": "/**\n *\n * Reldens - DropsAnimationsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass DropsAnimationsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'drops_animations';\n    }\n\n    static get relationMappings()\n    {\n        const { ItemsItemModel } = require('./items-item-model');\n        return {\n            related_items_item: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.item_id',\n                    to: ItemsItemModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.DropsAnimationsModel = DropsAnimationsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/features-model.js",
    "content": "/**\n *\n * Reldens - FeaturesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass FeaturesModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'features';\n    }\n\n}\n\nmodule.exports.FeaturesModel = FeaturesModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/items-group-model.js",
    "content": "/**\n *\n * Reldens - ItemsGroupModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ItemsGroupModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'items_group';\n    }\n\n    static get relationMappings()\n    {\n        const { ItemsItemModel } = require('./items-item-model');\n        return {\n            related_items_item: {\n                relation: this.HasManyRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ItemsItemModel.tableName+'.group_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ItemsGroupModel = ItemsGroupModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/items-inventory-model.js",
    "content": "/**\n *\n * Reldens - ItemsInventoryModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ItemsInventoryModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'items_inventory';\n    }\n\n    static get relationMappings()\n    {\n        const { PlayersModel } = require('./players-model');\n        const { ItemsItemModel } = require('./items-item-model');\n        return {\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.owner_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            },\n            related_items_item: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.item_id',\n                    to: ItemsItemModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ItemsInventoryModel = ItemsInventoryModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/items-item-model.js",
    "content": "/**\n *\n * Reldens - ItemsItemModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ItemsItemModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'items_item';\n    }\n\n    static get relationMappings()\n    {\n        const { ItemsTypesModel } = require('./items-types-model');\n        const { ItemsGroupModel } = require('./items-group-model');\n        const { DropsAnimationsModel } = require('./drops-animations-model');\n        const { ItemsInventoryModel } = require('./items-inventory-model');\n        const { ItemsItemModifiersModel } = require('./items-item-modifiers-model');\n        const { ObjectsItemsInventoryModel } = require('./objects-items-inventory-model');\n        const { ObjectsItemsRequirementsModel } = require('./objects-items-requirements-model');\n        const { ObjectsItemsRewardsModel } = require('./objects-items-rewards-model');\n        const { RewardsModel } = require('./rewards-model');\n        return {\n            related_items_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsTypesModel,\n                join: {\n                    from: this.tableName+'.type',\n                    to: ItemsTypesModel.tableName+'.id'\n                }\n            },\n            related_items_group: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsGroupModel,\n                join: {\n                    from: this.tableName+'.group_id',\n                    to: ItemsGroupModel.tableName+'.id'\n                }\n            },\n            related_drops_animations: {\n                relation: this.HasOneRelation,\n                modelClass: DropsAnimationsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: DropsAnimationsModel.tableName+'.item_id'\n                }\n            },\n            related_items_inventory: {\n                relation: this.HasManyRelation,\n                modelClass: ItemsInventoryModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ItemsInventoryModel.tableName+'.item_id'\n                }\n            },\n            related_items_item_modifiers: {\n                relation: this.HasManyRelation,\n                modelClass: ItemsItemModifiersModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ItemsItemModifiersModel.tableName+'.item_id'\n                }\n            },\n            related_objects_items_inventory: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsItemsInventoryModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsItemsInventoryModel.tableName+'.item_id'\n                }\n            },\n            related_objects_items_requirements_item_key: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsItemsRequirementsModel,\n                join: {\n                    from: this.tableName+'.key',\n                    to: ObjectsItemsRequirementsModel.tableName+'.item_key'\n                }\n            },\n            related_objects_items_requirements_required_item_key: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsItemsRequirementsModel,\n                join: {\n                    from: this.tableName+'.key',\n                    to: ObjectsItemsRequirementsModel.tableName+'.required_item_key'\n                }\n            },\n            related_objects_items_rewards_item_key: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsItemsRewardsModel,\n                join: {\n                    from: this.tableName+'.key',\n                    to: ObjectsItemsRewardsModel.tableName+'.item_key'\n                }\n            },\n            related_objects_items_rewards_reward_item_key: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsItemsRewardsModel,\n                join: {\n                    from: this.tableName+'.key',\n                    to: ObjectsItemsRewardsModel.tableName+'.reward_item_key'\n                }\n            },\n            related_rewards: {\n                relation: this.HasManyRelation,\n                modelClass: RewardsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RewardsModel.tableName+'.item_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ItemsItemModel = ItemsItemModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/items-item-modifiers-model.js",
    "content": "/**\n *\n * Reldens - ItemsItemModifiersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ItemsItemModifiersModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'items_item_modifiers';\n    }\n\n    static get relationMappings()\n    {\n        const { ItemsItemModel } = require('./items-item-model');\n        const { OperationTypesModel } = require('./operation-types-model');\n        return {\n            related_items_item: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.item_id',\n                    to: ItemsItemModel.tableName+'.id'\n                }\n            },\n            related_operation_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: OperationTypesModel,\n                join: {\n                    from: this.tableName+'.operation',\n                    to: OperationTypesModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ItemsItemModifiersModel = ItemsItemModifiersModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/items-types-model.js",
    "content": "/**\n *\n * Reldens - ItemsTypesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ItemsTypesModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'items_types';\n    }\n\n    static get relationMappings()\n    {\n        const { ItemsItemModel } = require('./items-item-model');\n        return {\n            related_items_item: {\n                relation: this.HasManyRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ItemsItemModel.tableName+'.type'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ItemsTypesModel = ItemsTypesModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/locale-model.js",
    "content": "/**\n *\n * Reldens - LocaleModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass LocaleModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'locale';\n    }\n\n    static get relationMappings()\n    {\n        const { SnippetsModel } = require('./snippets-model');\n        const { UsersLocaleModel } = require('./users-locale-model');\n        return {\n            related_snippets: {\n                relation: this.HasManyRelation,\n                modelClass: SnippetsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SnippetsModel.tableName+'.locale_id'\n                }\n            },\n            related_users_locale: {\n                relation: this.HasManyRelation,\n                modelClass: UsersLocaleModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: UsersLocaleModel.tableName+'.locale_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.LocaleModel = LocaleModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/objects-animations-model.js",
    "content": "/**\n *\n * Reldens - ObjectsAnimationsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ObjectsAnimationsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'objects_animations';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        return {\n            related_objects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.object_id',\n                    to: ObjectsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ObjectsAnimationsModel = ObjectsAnimationsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/objects-assets-model.js",
    "content": "/**\n *\n * Reldens - ObjectsAssetsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ObjectsAssetsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'objects_assets';\n    }\n\n    static get idColumn()\n    {\n        return 'object_asset_id';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        return {\n            related_objects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.object_id',\n                    to: ObjectsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ObjectsAssetsModel = ObjectsAssetsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/objects-items-inventory-model.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsInventoryModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ObjectsItemsInventoryModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'objects_items_inventory';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        const { ItemsItemModel } = require('./items-item-model');\n        return {\n            related_objects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.owner_id',\n                    to: ObjectsModel.tableName+'.id'\n                }\n            },\n            related_items_item: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.item_id',\n                    to: ItemsItemModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ObjectsItemsInventoryModel = ObjectsItemsInventoryModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/objects-items-requirements-model.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsRequirementsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ObjectsItemsRequirementsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'objects_items_requirements';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        const { ItemsItemModel } = require('./items-item-model');\n        return {\n            related_objects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.object_id',\n                    to: ObjectsModel.tableName+'.id'\n                }\n            },\n            related_items_item_item_key: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.item_key',\n                    to: ItemsItemModel.tableName+'.key'\n                }\n            },\n            related_items_item_required_item_key: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.required_item_key',\n                    to: ItemsItemModel.tableName+'.key'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ObjectsItemsRequirementsModel = ObjectsItemsRequirementsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/objects-items-rewards-model.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsRewardsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ObjectsItemsRewardsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'objects_items_rewards';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        const { ItemsItemModel } = require('./items-item-model');\n        return {\n            related_objects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.object_id',\n                    to: ObjectsModel.tableName+'.id'\n                }\n            },\n            related_items_item_item_key: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.item_key',\n                    to: ItemsItemModel.tableName+'.key'\n                }\n            },\n            related_items_item_reward_item_key: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.reward_item_key',\n                    to: ItemsItemModel.tableName+'.key'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ObjectsItemsRewardsModel = ObjectsItemsRewardsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/objects-model.js",
    "content": "/**\n *\n * Reldens - ObjectsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ObjectsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'objects';\n    }\n\n    static get relationMappings()\n    {\n        const { RoomsModel } = require('./rooms-model');\n        const { ObjectsTypesModel } = require('./objects-types-model');\n        const { ObjectsAnimationsModel } = require('./objects-animations-model');\n        const { ObjectsAssetsModel } = require('./objects-assets-model');\n        const { ObjectsItemsInventoryModel } = require('./objects-items-inventory-model');\n        const { ObjectsItemsRequirementsModel } = require('./objects-items-requirements-model');\n        const { ObjectsItemsRewardsModel } = require('./objects-items-rewards-model');\n        const { ObjectsSkillsModel } = require('./objects-skills-model');\n        const { ObjectsStatsModel } = require('./objects-stats-model');\n        const { RespawnModel } = require('./respawn-model');\n        const { RewardsModel } = require('./rewards-model');\n        return {\n            related_rooms: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RoomsModel,\n                join: {\n                    from: this.tableName+'.room_id',\n                    to: RoomsModel.tableName+'.id'\n                }\n            },\n            related_objects_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsTypesModel,\n                join: {\n                    from: this.tableName+'.class_type',\n                    to: ObjectsTypesModel.tableName+'.id'\n                }\n            },\n            related_objects_animations: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsAnimationsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsAnimationsModel.tableName+'.object_id'\n                }\n            },\n            related_objects_assets: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsAssetsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsAssetsModel.tableName+'.object_id'\n                }\n            },\n            related_objects_items_inventory: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsItemsInventoryModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsItemsInventoryModel.tableName+'.owner_id'\n                }\n            },\n            related_objects_items_requirements: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsItemsRequirementsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsItemsRequirementsModel.tableName+'.object_id'\n                }\n            },\n            related_objects_items_rewards: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsItemsRewardsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsItemsRewardsModel.tableName+'.object_id'\n                }\n            },\n            related_objects_skills: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsSkillsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsSkillsModel.tableName+'.object_id'\n                }\n            },\n            related_objects_stats: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsStatsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsStatsModel.tableName+'.object_id'\n                }\n            },\n            related_respawn: {\n                relation: this.HasManyRelation,\n                modelClass: RespawnModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RespawnModel.tableName+'.object_id'\n                }\n            },\n            related_rewards: {\n                relation: this.HasManyRelation,\n                modelClass: RewardsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RewardsModel.tableName+'.object_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ObjectsModel = ObjectsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/objects-skills-model.js",
    "content": "/**\n *\n * Reldens - ObjectsSkillsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ObjectsSkillsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'objects_skills';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        const { TargetOptionsModel } = require('./target-options-model');\n        return {\n            related_objects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.object_id',\n                    to: ObjectsModel.tableName+'.id'\n                }\n            },\n            related_skills_skill: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.skill_id',\n                    to: SkillsSkillModel.tableName+'.id'\n                }\n            },\n            related_target_options: {\n                relation: this.BelongsToOneRelation,\n                modelClass: TargetOptionsModel,\n                join: {\n                    from: this.tableName+'.target_id',\n                    to: TargetOptionsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ObjectsSkillsModel = ObjectsSkillsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/objects-stats-model.js",
    "content": "/**\n *\n * Reldens - ObjectsStatsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ObjectsStatsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'objects_stats';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        const { StatsModel } = require('./stats-model');\n        return {\n            related_objects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.object_id',\n                    to: ObjectsModel.tableName+'.id'\n                }\n            },\n            related_stats: {\n                relation: this.BelongsToOneRelation,\n                modelClass: StatsModel,\n                join: {\n                    from: this.tableName+'.stat_id',\n                    to: StatsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ObjectsStatsModel = ObjectsStatsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/objects-types-model.js",
    "content": "/**\n *\n * Reldens - ObjectsTypesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ObjectsTypesModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'objects_types';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        return {\n            related_objects: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsModel.tableName+'.class_type'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ObjectsTypesModel = ObjectsTypesModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/operation-types-model.js",
    "content": "/**\n *\n * Reldens - OperationTypesModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass OperationTypesModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'operation_types';\n    }\n\n    static get relationMappings()\n    {\n        const { ClanLevelsModifiersModel } = require('./clan-levels-modifiers-model');\n        const { ItemsItemModifiersModel } = require('./items-item-modifiers-model');\n        const { RewardsModifiersModel } = require('./rewards-modifiers-model');\n        const { SkillsLevelsModifiersModel } = require('./skills-levels-modifiers-model');\n        const { SkillsSkillOwnerEffectsModel } = require('./skills-skill-owner-effects-model');\n        const { SkillsSkillTargetEffectsModel } = require('./skills-skill-target-effects-model');\n        return {\n            related_clan_levels_modifiers: {\n                relation: this.HasManyRelation,\n                modelClass: ClanLevelsModifiersModel,\n                join: {\n                    from: this.tableName+'.key',\n                    to: ClanLevelsModifiersModel.tableName+'.operation'\n                }\n            },\n            related_items_item_modifiers: {\n                relation: this.HasManyRelation,\n                modelClass: ItemsItemModifiersModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ItemsItemModifiersModel.tableName+'.operation'\n                }\n            },\n            related_rewards_modifiers: {\n                relation: this.HasManyRelation,\n                modelClass: RewardsModifiersModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RewardsModifiersModel.tableName+'.operation'\n                }\n            },\n            related_skills_levels_modifiers: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsLevelsModifiersModel,\n                join: {\n                    from: this.tableName+'.key',\n                    to: SkillsLevelsModifiersModel.tableName+'.operation'\n                }\n            },\n            related_skills_skill_owner_effects: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillOwnerEffectsModel,\n                join: {\n                    from: this.tableName+'.key',\n                    to: SkillsSkillOwnerEffectsModel.tableName+'.operation'\n                }\n            },\n            related_skills_skill_target_effects: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillTargetEffectsModel,\n                join: {\n                    from: this.tableName+'.key',\n                    to: SkillsSkillTargetEffectsModel.tableName+'.operation'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.OperationTypesModel = OperationTypesModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/players-model.js",
    "content": "/**\n *\n * Reldens - PlayersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass PlayersModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'players';\n    }\n\n    static get relationMappings()\n    {\n        const { UsersModel } = require('./users-model');\n        const { AdsPlayedModel } = require('./ads-played-model');\n        const { AudioPlayerConfigModel } = require('./audio-player-config-model');\n        const { ChatModel } = require('./chat-model');\n        const { ClanModel } = require('./clan-model');\n        const { ClanMembersModel } = require('./clan-members-model');\n        const { ItemsInventoryModel } = require('./items-inventory-model');\n        const { PlayersStateModel } = require('./players-state-model');\n        const { PlayersStatsModel } = require('./players-stats-model');\n        const { RewardsEventsStateModel } = require('./rewards-events-state-model');\n        const { ScoresModel } = require('./scores-model');\n        const { ScoresDetailModel } = require('./scores-detail-model');\n        const { SkillsOwnersClassPathModel } = require('./skills-owners-class-path-model');\n        return {\n            related_users: {\n                relation: this.BelongsToOneRelation,\n                modelClass: UsersModel,\n                join: {\n                    from: this.tableName+'.user_id',\n                    to: UsersModel.tableName+'.id'\n                }\n            },\n            related_ads_played: {\n                relation: this.HasManyRelation,\n                modelClass: AdsPlayedModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AdsPlayedModel.tableName+'.player_id'\n                }\n            },\n            related_audio_player_config: {\n                relation: this.HasManyRelation,\n                modelClass: AudioPlayerConfigModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AudioPlayerConfigModel.tableName+'.player_id'\n                }\n            },\n            related_chat_player: {\n                relation: this.HasManyRelation,\n                modelClass: ChatModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ChatModel.tableName+'.player_id'\n                }\n            },\n            related_chat_private_player: {\n                relation: this.HasManyRelation,\n                modelClass: ChatModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ChatModel.tableName+'.private_player_id'\n                }\n            },\n            related_clan: {\n                relation: this.HasOneRelation,\n                modelClass: ClanModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ClanModel.tableName+'.owner_id'\n                }\n            },\n            related_clan_members: {\n                relation: this.HasOneRelation,\n                modelClass: ClanMembersModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ClanMembersModel.tableName+'.player_id'\n                }\n            },\n            related_items_inventory: {\n                relation: this.HasManyRelation,\n                modelClass: ItemsInventoryModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ItemsInventoryModel.tableName+'.owner_id'\n                }\n            },\n            related_players_state: {\n                relation: this.HasOneRelation,\n                modelClass: PlayersStateModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: PlayersStateModel.tableName+'.player_id'\n                }\n            },\n            related_players_stats: {\n                relation: this.HasManyRelation,\n                modelClass: PlayersStatsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: PlayersStatsModel.tableName+'.player_id'\n                }\n            },\n            related_rewards_events_state: {\n                relation: this.HasManyRelation,\n                modelClass: RewardsEventsStateModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RewardsEventsStateModel.tableName+'.player_id'\n                }\n            },\n            related_scores: {\n                relation: this.HasManyRelation,\n                modelClass: ScoresModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ScoresModel.tableName+'.player_id'\n                }\n            },\n            related_scores_detail: {\n                relation: this.HasManyRelation,\n                modelClass: ScoresDetailModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ScoresDetailModel.tableName+'.player_id'\n                }\n            },\n            related_skills_owners_class_path: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsOwnersClassPathModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsOwnersClassPathModel.tableName+'.owner_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.PlayersModel = PlayersModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/players-state-model.js",
    "content": "/**\n *\n * Reldens - PlayersStateModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass PlayersStateModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'players_state';\n    }\n\n    static get relationMappings()\n    {\n        const { PlayersModel } = require('./players-model');\n        const { RoomsModel } = require('./rooms-model');\n        return {\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            },\n            related_rooms: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RoomsModel,\n                join: {\n                    from: this.tableName+'.room_id',\n                    to: RoomsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.PlayersStateModel = PlayersStateModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/players-stats-model.js",
    "content": "/**\n *\n * Reldens - PlayersStatsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass PlayersStatsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'players_stats';\n    }\n\n    static get relationMappings()\n    {\n        const { PlayersModel } = require('./players-model');\n        const { StatsModel } = require('./stats-model');\n        return {\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            },\n            related_stats: {\n                relation: this.BelongsToOneRelation,\n                modelClass: StatsModel,\n                join: {\n                    from: this.tableName+'.stat_id',\n                    to: StatsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.PlayersStatsModel = PlayersStatsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/registered-models-objection-js.js",
    "content": "/**\n *\n * Reldens - Registered Models\n *\n */\n\nconst { AdsBannerModel } = require('./ads-banner-model');\nconst { AdsModel } = require('./ads-model');\nconst { AdsEventVideoModel } = require('./ads-event-video-model');\nconst { AdsPlayedModel } = require('./ads-played-model');\nconst { AdsProvidersModel } = require('./ads-providers-model');\nconst { AdsTypesModel } = require('./ads-types-model');\nconst { AudioCategoriesModel } = require('./audio-categories-model');\nconst { AudioModel } = require('./audio-model');\nconst { AudioMarkersModel } = require('./audio-markers-model');\nconst { AudioPlayerConfigModel } = require('./audio-player-config-model');\nconst { ChatModel } = require('./chat-model');\nconst { ChatMessageTypesModel } = require('./chat-message-types-model');\nconst { ClanModel } = require('./clan-model');\nconst { ClanLevelsModel } = require('./clan-levels-model');\nconst { ClanLevelsModifiersModel } = require('./clan-levels-modifiers-model');\nconst { ClanMembersModel } = require('./clan-members-model');\nconst { ConfigModel } = require('./config-model');\nconst { ConfigTypesModel } = require('./config-types-model');\nconst { DropsAnimationsModel } = require('./drops-animations-model');\nconst { FeaturesModel } = require('./features-model');\nconst { ItemsGroupModel } = require('./items-group-model');\nconst { ItemsInventoryModel } = require('./items-inventory-model');\nconst { ItemsItemModel } = require('./items-item-model');\nconst { ItemsItemModifiersModel } = require('./items-item-modifiers-model');\nconst { ItemsTypesModel } = require('./items-types-model');\nconst { LocaleModel } = require('./locale-model');\nconst { ObjectsAnimationsModel } = require('./objects-animations-model');\nconst { ObjectsAssetsModel } = require('./objects-assets-model');\nconst { ObjectsModel } = require('./objects-model');\nconst { ObjectsItemsInventoryModel } = require('./objects-items-inventory-model');\nconst { ObjectsItemsRequirementsModel } = require('./objects-items-requirements-model');\nconst { ObjectsItemsRewardsModel } = require('./objects-items-rewards-model');\nconst { ObjectsSkillsModel } = require('./objects-skills-model');\nconst { ObjectsStatsModel } = require('./objects-stats-model');\nconst { ObjectsTypesModel } = require('./objects-types-model');\nconst { OperationTypesModel } = require('./operation-types-model');\nconst { PlayersModel } = require('./players-model');\nconst { PlayersStateModel } = require('./players-state-model');\nconst { PlayersStatsModel } = require('./players-stats-model');\nconst { RespawnModel } = require('./respawn-model');\nconst { RewardsModel } = require('./rewards-model');\nconst { RewardsEventsModel } = require('./rewards-events-model');\nconst { RewardsEventsStateModel } = require('./rewards-events-state-model');\nconst { RewardsModifiersModel } = require('./rewards-modifiers-model');\nconst { RoomsChangePointsModel } = require('./rooms-change-points-model');\nconst { RoomsModel } = require('./rooms-model');\nconst { RoomsReturnPointsModel } = require('./rooms-return-points-model');\nconst { ScoresDetailModel } = require('./scores-detail-model');\nconst { ScoresModel } = require('./scores-model');\nconst { SkillsClassLevelUpAnimationsModel } = require('./skills-class-level-up-animations-model');\nconst { SkillsClassPathModel } = require('./skills-class-path-model');\nconst { SkillsClassPathLevelLabelsModel } = require('./skills-class-path-level-labels-model');\nconst { SkillsClassPathLevelSkillsModel } = require('./skills-class-path-level-skills-model');\nconst { SkillsGroupsModel } = require('./skills-groups-model');\nconst { SkillsLevelsModel } = require('./skills-levels-model');\nconst { SkillsLevelsModifiersConditionsModel } = require('./skills-levels-modifiers-conditions-model');\nconst { SkillsLevelsModifiersModel } = require('./skills-levels-modifiers-model');\nconst { SkillsLevelsSetModel } = require('./skills-levels-set-model');\nconst { SkillsOwnersClassPathModel } = require('./skills-owners-class-path-model');\nconst { SkillsSkillAnimationsModel } = require('./skills-skill-animations-model');\nconst { SkillsSkillAttackModel } = require('./skills-skill-attack-model');\nconst { SkillsSkillModel } = require('./skills-skill-model');\nconst { SkillsSkillGroupRelationModel } = require('./skills-skill-group-relation-model');\nconst { SkillsSkillOwnerConditionsModel } = require('./skills-skill-owner-conditions-model');\nconst { SkillsSkillOwnerEffectsConditionsModel } = require('./skills-skill-owner-effects-conditions-model');\nconst { SkillsSkillOwnerEffectsModel } = require('./skills-skill-owner-effects-model');\nconst { SkillsSkillPhysicalDataModel } = require('./skills-skill-physical-data-model');\nconst { SkillsSkillTargetEffectsConditionsModel } = require('./skills-skill-target-effects-conditions-model');\nconst { SkillsSkillTargetEffectsModel } = require('./skills-skill-target-effects-model');\nconst { SkillsSkillTypeModel } = require('./skills-skill-type-model');\nconst { SnippetsModel } = require('./snippets-model');\nconst { StatsModel } = require('./stats-model');\nconst { TargetOptionsModel } = require('./target-options-model');\nconst { UsersModel } = require('./users-model');\nconst { UsersLocaleModel } = require('./users-locale-model');\nconst { UsersLoginModel } = require('./users-login-model');\nconst { entitiesConfig } = require('../../entities-config');\nconst { entitiesTranslations } = require('../../entities-translations');\n\nlet rawRegisteredEntities = {\n    adsBanner: AdsBannerModel,\n    ads: AdsModel,\n    adsEventVideo: AdsEventVideoModel,\n    adsPlayed: AdsPlayedModel,\n    adsProviders: AdsProvidersModel,\n    adsTypes: AdsTypesModel,\n    audioCategories: AudioCategoriesModel,\n    audio: AudioModel,\n    audioMarkers: AudioMarkersModel,\n    audioPlayerConfig: AudioPlayerConfigModel,\n    chat: ChatModel,\n    chatMessageTypes: ChatMessageTypesModel,\n    clan: ClanModel,\n    clanLevels: ClanLevelsModel,\n    clanLevelsModifiers: ClanLevelsModifiersModel,\n    clanMembers: ClanMembersModel,\n    config: ConfigModel,\n    configTypes: ConfigTypesModel,\n    dropsAnimations: DropsAnimationsModel,\n    features: FeaturesModel,\n    itemsGroup: ItemsGroupModel,\n    itemsInventory: ItemsInventoryModel,\n    itemsItem: ItemsItemModel,\n    itemsItemModifiers: ItemsItemModifiersModel,\n    itemsTypes: ItemsTypesModel,\n    locale: LocaleModel,\n    objectsAnimations: ObjectsAnimationsModel,\n    objectsAssets: ObjectsAssetsModel,\n    objects: ObjectsModel,\n    objectsItemsInventory: ObjectsItemsInventoryModel,\n    objectsItemsRequirements: ObjectsItemsRequirementsModel,\n    objectsItemsRewards: ObjectsItemsRewardsModel,\n    objectsSkills: ObjectsSkillsModel,\n    objectsStats: ObjectsStatsModel,\n    objectsTypes: ObjectsTypesModel,\n    operationTypes: OperationTypesModel,\n    players: PlayersModel,\n    playersState: PlayersStateModel,\n    playersStats: PlayersStatsModel,\n    respawn: RespawnModel,\n    rewards: RewardsModel,\n    rewardsEvents: RewardsEventsModel,\n    rewardsEventsState: RewardsEventsStateModel,\n    rewardsModifiers: RewardsModifiersModel,\n    roomsChangePoints: RoomsChangePointsModel,\n    rooms: RoomsModel,\n    roomsReturnPoints: RoomsReturnPointsModel,\n    scoresDetail: ScoresDetailModel,\n    scores: ScoresModel,\n    skillsClassLevelUpAnimations: SkillsClassLevelUpAnimationsModel,\n    skillsClassPath: SkillsClassPathModel,\n    skillsClassPathLevelLabels: SkillsClassPathLevelLabelsModel,\n    skillsClassPathLevelSkills: SkillsClassPathLevelSkillsModel,\n    skillsGroups: SkillsGroupsModel,\n    skillsLevels: SkillsLevelsModel,\n    skillsLevelsModifiersConditions: SkillsLevelsModifiersConditionsModel,\n    skillsLevelsModifiers: SkillsLevelsModifiersModel,\n    skillsLevelsSet: SkillsLevelsSetModel,\n    skillsOwnersClassPath: SkillsOwnersClassPathModel,\n    skillsSkillAnimations: SkillsSkillAnimationsModel,\n    skillsSkillAttack: SkillsSkillAttackModel,\n    skillsSkill: SkillsSkillModel,\n    skillsSkillGroupRelation: SkillsSkillGroupRelationModel,\n    skillsSkillOwnerConditions: SkillsSkillOwnerConditionsModel,\n    skillsSkillOwnerEffectsConditions: SkillsSkillOwnerEffectsConditionsModel,\n    skillsSkillOwnerEffects: SkillsSkillOwnerEffectsModel,\n    skillsSkillPhysicalData: SkillsSkillPhysicalDataModel,\n    skillsSkillTargetEffectsConditions: SkillsSkillTargetEffectsConditionsModel,\n    skillsSkillTargetEffects: SkillsSkillTargetEffectsModel,\n    skillsSkillType: SkillsSkillTypeModel,\n    snippets: SnippetsModel,\n    stats: StatsModel,\n    targetOptions: TargetOptionsModel,\n    users: UsersModel,\n    usersLocale: UsersLocaleModel,\n    usersLogin: UsersLoginModel\n};\n\nmodule.exports.rawRegisteredEntities = rawRegisteredEntities;\n\nmodule.exports.entitiesConfig = entitiesConfig;\n\nmodule.exports.entitiesTranslations = entitiesTranslations;\n"
  },
  {
    "path": "generated-entities/models/objection-js/respawn-model.js",
    "content": "/**\n *\n * Reldens - RespawnModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass RespawnModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'respawn';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        return {\n            related_objects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.object_id',\n                    to: ObjectsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.RespawnModel = RespawnModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/rewards-events-model.js",
    "content": "/**\n *\n * Reldens - RewardsEventsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass RewardsEventsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'rewards_events';\n    }\n\n    static get relationMappings()\n    {\n        const { RewardsEventsStateModel } = require('./rewards-events-state-model');\n        return {\n            related_rewards_events_state: {\n                relation: this.HasManyRelation,\n                modelClass: RewardsEventsStateModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RewardsEventsStateModel.tableName+'.rewards_events_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.RewardsEventsModel = RewardsEventsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/rewards-events-state-model.js",
    "content": "/**\n *\n * Reldens - RewardsEventsStateModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass RewardsEventsStateModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'rewards_events_state';\n    }\n\n    static get relationMappings()\n    {\n        const { RewardsEventsModel } = require('./rewards-events-model');\n        const { PlayersModel } = require('./players-model');\n        return {\n            related_rewards_events: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RewardsEventsModel,\n                join: {\n                    from: this.tableName+'.rewards_events_id',\n                    to: RewardsEventsModel.tableName+'.id'\n                }\n            },\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.RewardsEventsStateModel = RewardsEventsStateModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/rewards-model.js",
    "content": "/**\n *\n * Reldens - RewardsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass RewardsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'rewards';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsModel } = require('./objects-model');\n        const { ItemsItemModel } = require('./items-item-model');\n        const { RewardsModifiersModel } = require('./rewards-modifiers-model');\n        return {\n            related_objects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.object_id',\n                    to: ObjectsModel.tableName+'.id'\n                }\n            },\n            related_items_item: {\n                relation: this.BelongsToOneRelation,\n                modelClass: ItemsItemModel,\n                join: {\n                    from: this.tableName+'.item_id',\n                    to: ItemsItemModel.tableName+'.id'\n                }\n            },\n            related_rewards_modifiers: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RewardsModifiersModel,\n                join: {\n                    from: this.tableName+'.modifier_id',\n                    to: RewardsModifiersModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.RewardsModel = RewardsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/rewards-modifiers-model.js",
    "content": "/**\n *\n * Reldens - RewardsModifiersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass RewardsModifiersModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'rewards_modifiers';\n    }\n\n    static get relationMappings()\n    {\n        const { OperationTypesModel } = require('./operation-types-model');\n        const { RewardsModel } = require('./rewards-model');\n        return {\n            related_operation_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: OperationTypesModel,\n                join: {\n                    from: this.tableName+'.operation',\n                    to: OperationTypesModel.tableName+'.id'\n                }\n            },\n            related_rewards: {\n                relation: this.HasManyRelation,\n                modelClass: RewardsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RewardsModel.tableName+'.modifier_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.RewardsModifiersModel = RewardsModifiersModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/rooms-change-points-model.js",
    "content": "/**\n *\n * Reldens - RoomsChangePointsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass RoomsChangePointsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'rooms_change_points';\n    }\n\n    static get relationMappings()\n    {\n        const { RoomsModel } = require('./rooms-model');\n        return {\n            related_rooms_room: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RoomsModel,\n                join: {\n                    from: this.tableName+'.room_id',\n                    to: RoomsModel.tableName+'.id'\n                }\n            },\n            related_rooms_next_room: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RoomsModel,\n                join: {\n                    from: this.tableName+'.next_room_id',\n                    to: RoomsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.RoomsChangePointsModel = RoomsChangePointsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/rooms-model.js",
    "content": "/**\n *\n * Reldens - RoomsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass RoomsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'rooms';\n    }\n\n    static get relationMappings()\n    {\n        const { AudioModel } = require('./audio-model');\n        const { ChatModel } = require('./chat-model');\n        const { ObjectsModel } = require('./objects-model');\n        const { PlayersStateModel } = require('./players-state-model');\n        const { RoomsChangePointsModel } = require('./rooms-change-points-model');\n        const { RoomsReturnPointsModel } = require('./rooms-return-points-model');\n        return {\n            related_audio: {\n                relation: this.HasManyRelation,\n                modelClass: AudioModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: AudioModel.tableName+'.room_id'\n                }\n            },\n            related_chat: {\n                relation: this.HasManyRelation,\n                modelClass: ChatModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ChatModel.tableName+'.room_id'\n                }\n            },\n            related_objects: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsModel.tableName+'.room_id'\n                }\n            },\n            related_players_state: {\n                relation: this.HasManyRelation,\n                modelClass: PlayersStateModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: PlayersStateModel.tableName+'.room_id'\n                }\n            },\n            related_rooms_change_points_room: {\n                relation: this.HasManyRelation,\n                modelClass: RoomsChangePointsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RoomsChangePointsModel.tableName+'.room_id'\n                }\n            },\n            related_rooms_change_points_next_room: {\n                relation: this.HasManyRelation,\n                modelClass: RoomsChangePointsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RoomsChangePointsModel.tableName+'.next_room_id'\n                }\n            },\n            related_rooms_return_points_room: {\n                relation: this.HasManyRelation,\n                modelClass: RoomsReturnPointsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RoomsReturnPointsModel.tableName+'.room_id'\n                }\n            },\n            related_rooms_return_points_from_room: {\n                relation: this.HasManyRelation,\n                modelClass: RoomsReturnPointsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: RoomsReturnPointsModel.tableName+'.from_room_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.RoomsModel = RoomsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/rooms-return-points-model.js",
    "content": "/**\n *\n * Reldens - RoomsReturnPointsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass RoomsReturnPointsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'rooms_return_points';\n    }\n\n    static get relationMappings()\n    {\n        const { RoomsModel } = require('./rooms-model');\n        return {\n            related_rooms_room: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RoomsModel,\n                join: {\n                    from: this.tableName+'.room_id',\n                    to: RoomsModel.tableName+'.id'\n                }\n            },\n            related_rooms_from_room: {\n                relation: this.BelongsToOneRelation,\n                modelClass: RoomsModel,\n                join: {\n                    from: this.tableName+'.from_room_id',\n                    to: RoomsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.RoomsReturnPointsModel = RoomsReturnPointsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/scores-detail-model.js",
    "content": "/**\n *\n * Reldens - ScoresDetailModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ScoresDetailModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'scores_detail';\n    }\n\n    static get relationMappings()\n    {\n        const { PlayersModel } = require('./players-model');\n        return {\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ScoresDetailModel = ScoresDetailModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/scores-model.js",
    "content": "/**\n *\n * Reldens - ScoresModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass ScoresModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'scores';\n    }\n\n    static get relationMappings()\n    {\n        const { PlayersModel } = require('./players-model');\n        return {\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.player_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.ScoresModel = ScoresModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-class-level-up-animations-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassLevelUpAnimationsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsClassLevelUpAnimationsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_class_level_up_animations';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsClassPathModel } = require('./skills-class-path-model');\n        const { SkillsLevelsModel } = require('./skills-levels-model');\n        return {\n            related_skills_class_path: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsClassPathModel,\n                join: {\n                    from: this.tableName+'.class_path_id',\n                    to: SkillsClassPathModel.tableName+'.id'\n                }\n            },\n            related_skills_levels: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsLevelsModel,\n                join: {\n                    from: this.tableName+'.level_id',\n                    to: SkillsLevelsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsClassLevelUpAnimationsModel = SkillsClassLevelUpAnimationsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-class-path-level-labels-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathLevelLabelsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsClassPathLevelLabelsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_class_path_level_labels';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsClassPathModel } = require('./skills-class-path-model');\n        const { SkillsLevelsModel } = require('./skills-levels-model');\n        return {\n            related_skills_class_path: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsClassPathModel,\n                join: {\n                    from: this.tableName+'.class_path_id',\n                    to: SkillsClassPathModel.tableName+'.id'\n                }\n            },\n            related_skills_levels: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsLevelsModel,\n                join: {\n                    from: this.tableName+'.level_id',\n                    to: SkillsLevelsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsClassPathLevelLabelsModel = SkillsClassPathLevelLabelsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-class-path-level-skills-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathLevelSkillsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsClassPathLevelSkillsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_class_path_level_skills';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsClassPathModel } = require('./skills-class-path-model');\n        const { SkillsLevelsModel } = require('./skills-levels-model');\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        return {\n            related_skills_class_path: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsClassPathModel,\n                join: {\n                    from: this.tableName+'.class_path_id',\n                    to: SkillsClassPathModel.tableName+'.id'\n                }\n            },\n            related_skills_levels: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsLevelsModel,\n                join: {\n                    from: this.tableName+'.level_id',\n                    to: SkillsLevelsModel.tableName+'.id'\n                }\n            },\n            related_skills_skill: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.skill_id',\n                    to: SkillsSkillModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsClassPathLevelSkillsModel = SkillsClassPathLevelSkillsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-class-path-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsClassPathModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_class_path';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsLevelsSetModel } = require('./skills-levels-set-model');\n        const { SkillsClassLevelUpAnimationsModel } = require('./skills-class-level-up-animations-model');\n        const { SkillsClassPathLevelLabelsModel } = require('./skills-class-path-level-labels-model');\n        const { SkillsClassPathLevelSkillsModel } = require('./skills-class-path-level-skills-model');\n        const { SkillsOwnersClassPathModel } = require('./skills-owners-class-path-model');\n        return {\n            related_skills_levels_set: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsLevelsSetModel,\n                join: {\n                    from: this.tableName+'.levels_set_id',\n                    to: SkillsLevelsSetModel.tableName+'.id'\n                }\n            },\n            related_skills_class_level_up_animations: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsClassLevelUpAnimationsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsClassLevelUpAnimationsModel.tableName+'.class_path_id'\n                }\n            },\n            related_skills_class_path_level_labels: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsClassPathLevelLabelsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsClassPathLevelLabelsModel.tableName+'.class_path_id'\n                }\n            },\n            related_skills_class_path_level_skills: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsClassPathLevelSkillsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsClassPathLevelSkillsModel.tableName+'.class_path_id'\n                }\n            },\n            related_skills_owners_class_path: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsOwnersClassPathModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsOwnersClassPathModel.tableName+'.class_path_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsClassPathModel = SkillsClassPathModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-groups-model.js",
    "content": "/**\n *\n * Reldens - SkillsGroupsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsGroupsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_groups';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillGroupRelationModel } = require('./skills-skill-group-relation-model');\n        return {\n            related_skills_skill_group_relation: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillGroupRelationModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillGroupRelationModel.tableName+'.group_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsGroupsModel = SkillsGroupsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-levels-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsLevelsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_levels';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsLevelsSetModel } = require('./skills-levels-set-model');\n        const { SkillsClassLevelUpAnimationsModel } = require('./skills-class-level-up-animations-model');\n        const { SkillsClassPathLevelLabelsModel } = require('./skills-class-path-level-labels-model');\n        const { SkillsClassPathLevelSkillsModel } = require('./skills-class-path-level-skills-model');\n        const { SkillsLevelsModifiersModel } = require('./skills-levels-modifiers-model');\n        return {\n            related_skills_levels_set: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsLevelsSetModel,\n                join: {\n                    from: this.tableName+'.level_set_id',\n                    to: SkillsLevelsSetModel.tableName+'.id'\n                }\n            },\n            related_skills_class_level_up_animations: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsClassLevelUpAnimationsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsClassLevelUpAnimationsModel.tableName+'.level_id'\n                }\n            },\n            related_skills_class_path_level_labels: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsClassPathLevelLabelsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsClassPathLevelLabelsModel.tableName+'.level_id'\n                }\n            },\n            related_skills_class_path_level_skills: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsClassPathLevelSkillsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsClassPathLevelSkillsModel.tableName+'.level_id'\n                }\n            },\n            related_skills_levels_modifiers: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsLevelsModifiersModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsLevelsModifiersModel.tableName+'.level_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsLevelsModel = SkillsLevelsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-levels-modifiers-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModifiersConditionsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsLevelsModifiersConditionsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_levels_modifiers_conditions';\n    }\n\n}\n\nmodule.exports.SkillsLevelsModifiersConditionsModel = SkillsLevelsModifiersConditionsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-levels-modifiers-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModifiersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsLevelsModifiersModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_levels_modifiers';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsLevelsModel } = require('./skills-levels-model');\n        const { OperationTypesModel } = require('./operation-types-model');\n        return {\n            related_skills_levels: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsLevelsModel,\n                join: {\n                    from: this.tableName+'.level_id',\n                    to: SkillsLevelsModel.tableName+'.id'\n                }\n            },\n            related_operation_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: OperationTypesModel,\n                join: {\n                    from: this.tableName+'.operation',\n                    to: OperationTypesModel.tableName+'.key'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsLevelsModifiersModel = SkillsLevelsModifiersModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-levels-set-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsSetModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsLevelsSetModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_levels_set';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsClassPathModel } = require('./skills-class-path-model');\n        const { SkillsLevelsModel } = require('./skills-levels-model');\n        return {\n            related_skills_class_path: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsClassPathModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsClassPathModel.tableName+'.levels_set_id'\n                }\n            },\n            related_skills_levels: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsLevelsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsLevelsModel.tableName+'.level_set_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsLevelsSetModel = SkillsLevelsSetModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-owners-class-path-model.js",
    "content": "/**\n *\n * Reldens - SkillsOwnersClassPathModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsOwnersClassPathModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_owners_class_path';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsClassPathModel } = require('./skills-class-path-model');\n        const { PlayersModel } = require('./players-model');\n        return {\n            related_skills_class_path: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsClassPathModel,\n                join: {\n                    from: this.tableName+'.class_path_id',\n                    to: SkillsClassPathModel.tableName+'.id'\n                }\n            },\n            related_players: {\n                relation: this.BelongsToOneRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.owner_id',\n                    to: PlayersModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsOwnersClassPathModel = SkillsOwnersClassPathModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-animations-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAnimationsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillAnimationsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_animations';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        return {\n            related_skills_skill: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.skill_id',\n                    to: SkillsSkillModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillAnimationsModel = SkillsSkillAnimationsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-attack-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAttackModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillAttackModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_attack';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        return {\n            related_skills_skill: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.skill_id',\n                    to: SkillsSkillModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillAttackModel = SkillsSkillAttackModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-group-relation-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillGroupRelationModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillGroupRelationModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_group_relation';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        const { SkillsGroupsModel } = require('./skills-groups-model');\n        return {\n            related_skills_skill: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.skill_id',\n                    to: SkillsSkillModel.tableName+'.id'\n                }\n            },\n            related_skills_groups: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsGroupsModel,\n                join: {\n                    from: this.tableName+'.group_id',\n                    to: SkillsGroupsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillGroupRelationModel = SkillsSkillGroupRelationModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillTypeModel } = require('./skills-skill-type-model');\n        const { ObjectsSkillsModel } = require('./objects-skills-model');\n        const { SkillsClassPathLevelSkillsModel } = require('./skills-class-path-level-skills-model');\n        const { SkillsSkillAnimationsModel } = require('./skills-skill-animations-model');\n        const { SkillsSkillAttackModel } = require('./skills-skill-attack-model');\n        const { SkillsSkillGroupRelationModel } = require('./skills-skill-group-relation-model');\n        const { SkillsSkillOwnerConditionsModel } = require('./skills-skill-owner-conditions-model');\n        const { SkillsSkillOwnerEffectsModel } = require('./skills-skill-owner-effects-model');\n        const { SkillsSkillPhysicalDataModel } = require('./skills-skill-physical-data-model');\n        const { SkillsSkillTargetEffectsModel } = require('./skills-skill-target-effects-model');\n        return {\n            related_skills_skill_type: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillTypeModel,\n                join: {\n                    from: this.tableName+'.type',\n                    to: SkillsSkillTypeModel.tableName+'.id'\n                }\n            },\n            related_objects_skills: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsSkillsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsSkillsModel.tableName+'.skill_id'\n                }\n            },\n            related_skills_class_path_level_skills: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsClassPathLevelSkillsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsClassPathLevelSkillsModel.tableName+'.skill_id'\n                }\n            },\n            related_skills_skill_animations: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillAnimationsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillAnimationsModel.tableName+'.skill_id'\n                }\n            },\n            related_skills_skill_attack: {\n                relation: this.HasOneRelation,\n                modelClass: SkillsSkillAttackModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillAttackModel.tableName+'.skill_id'\n                }\n            },\n            related_skills_skill_group_relation: {\n                relation: this.HasOneRelation,\n                modelClass: SkillsSkillGroupRelationModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillGroupRelationModel.tableName+'.skill_id'\n                }\n            },\n            related_skills_skill_owner_conditions: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillOwnerConditionsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillOwnerConditionsModel.tableName+'.skill_id'\n                }\n            },\n            related_skills_skill_owner_effects: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillOwnerEffectsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillOwnerEffectsModel.tableName+'.skill_id'\n                }\n            },\n            related_skills_skill_physical_data: {\n                relation: this.HasOneRelation,\n                modelClass: SkillsSkillPhysicalDataModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillPhysicalDataModel.tableName+'.skill_id'\n                }\n            },\n            related_skills_skill_target_effects: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillTargetEffectsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillTargetEffectsModel.tableName+'.skill_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillModel = SkillsSkillModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-owner-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerConditionsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillOwnerConditionsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_owner_conditions';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        return {\n            related_skills_skill: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.skill_id',\n                    to: SkillsSkillModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillOwnerConditionsModel = SkillsSkillOwnerConditionsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-owner-effects-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsConditionsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillOwnerEffectsConditionsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_owner_effects_conditions';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillOwnerEffectsModel } = require('./skills-skill-owner-effects-model');\n        return {\n            related_skills_skill_owner_effects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillOwnerEffectsModel,\n                join: {\n                    from: this.tableName+'.skill_owner_effect_id',\n                    to: SkillsSkillOwnerEffectsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillOwnerEffectsConditionsModel = SkillsSkillOwnerEffectsConditionsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-owner-effects-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillOwnerEffectsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_owner_effects';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        const { OperationTypesModel } = require('./operation-types-model');\n        const { SkillsSkillOwnerEffectsConditionsModel } = require('./skills-skill-owner-effects-conditions-model');\n        return {\n            related_skills_skill: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.skill_id',\n                    to: SkillsSkillModel.tableName+'.id'\n                }\n            },\n            related_operation_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: OperationTypesModel,\n                join: {\n                    from: this.tableName+'.operation',\n                    to: OperationTypesModel.tableName+'.key'\n                }\n            },\n            related_skills_skill_owner_effects_conditions: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillOwnerEffectsConditionsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillOwnerEffectsConditionsModel.tableName+'.skill_owner_effect_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillOwnerEffectsModel = SkillsSkillOwnerEffectsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-physical-data-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillPhysicalDataModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillPhysicalDataModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_physical_data';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        return {\n            related_skills_skill: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.skill_id',\n                    to: SkillsSkillModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillPhysicalDataModel = SkillsSkillPhysicalDataModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-target-effects-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTargetEffectsConditionsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillTargetEffectsConditionsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_target_effects_conditions';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillTargetEffectsModel } = require('./skills-skill-target-effects-model');\n        return {\n            related_skills_skill_target_effects: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillTargetEffectsModel,\n                join: {\n                    from: this.tableName+'.skill_target_effect_id',\n                    to: SkillsSkillTargetEffectsModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillTargetEffectsConditionsModel = SkillsSkillTargetEffectsConditionsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-target-effects-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTargetEffectsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillTargetEffectsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_target_effects';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        const { OperationTypesModel } = require('./operation-types-model');\n        const { SkillsSkillTargetEffectsConditionsModel } = require('./skills-skill-target-effects-conditions-model');\n        return {\n            related_skills_skill: {\n                relation: this.BelongsToOneRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.skill_id',\n                    to: SkillsSkillModel.tableName+'.id'\n                }\n            },\n            related_operation_types: {\n                relation: this.BelongsToOneRelation,\n                modelClass: OperationTypesModel,\n                join: {\n                    from: this.tableName+'.operation',\n                    to: OperationTypesModel.tableName+'.key'\n                }\n            },\n            related_skills_skill_target_effects_conditions: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillTargetEffectsConditionsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillTargetEffectsConditionsModel.tableName+'.skill_target_effect_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillTargetEffectsModel = SkillsSkillTargetEffectsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/skills-skill-type-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTypeModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SkillsSkillTypeModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'skills_skill_type';\n    }\n\n    static get relationMappings()\n    {\n        const { SkillsSkillModel } = require('./skills-skill-model');\n        return {\n            related_skills_skill: {\n                relation: this.HasManyRelation,\n                modelClass: SkillsSkillModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: SkillsSkillModel.tableName+'.type'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SkillsSkillTypeModel = SkillsSkillTypeModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/snippets-model.js",
    "content": "/**\n *\n * Reldens - SnippetsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass SnippetsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'snippets';\n    }\n\n    static get relationMappings()\n    {\n        const { LocaleModel } = require('./locale-model');\n        return {\n            related_locale: {\n                relation: this.BelongsToOneRelation,\n                modelClass: LocaleModel,\n                join: {\n                    from: this.tableName+'.locale_id',\n                    to: LocaleModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.SnippetsModel = SnippetsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/stats-model.js",
    "content": "/**\n *\n * Reldens - StatsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass StatsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'stats';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsStatsModel } = require('./objects-stats-model');\n        const { PlayersStatsModel } = require('./players-stats-model');\n        return {\n            related_objects_stats: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsStatsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsStatsModel.tableName+'.stat_id'\n                }\n            },\n            related_players_stats: {\n                relation: this.HasManyRelation,\n                modelClass: PlayersStatsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: PlayersStatsModel.tableName+'.stat_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.StatsModel = StatsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/target-options-model.js",
    "content": "/**\n *\n * Reldens - TargetOptionsModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass TargetOptionsModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'target_options';\n    }\n\n    static get relationMappings()\n    {\n        const { ObjectsSkillsModel } = require('./objects-skills-model');\n        return {\n            related_objects_skills: {\n                relation: this.HasManyRelation,\n                modelClass: ObjectsSkillsModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: ObjectsSkillsModel.tableName+'.target_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.TargetOptionsModel = TargetOptionsModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/users-locale-model.js",
    "content": "/**\n *\n * Reldens - UsersLocaleModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass UsersLocaleModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'users_locale';\n    }\n\n    static get relationMappings()\n    {\n        const { LocaleModel } = require('./locale-model');\n        const { UsersModel } = require('./users-model');\n        return {\n            related_locale: {\n                relation: this.BelongsToOneRelation,\n                modelClass: LocaleModel,\n                join: {\n                    from: this.tableName+'.locale_id',\n                    to: LocaleModel.tableName+'.id'\n                }\n            },\n            related_users: {\n                relation: this.BelongsToOneRelation,\n                modelClass: UsersModel,\n                join: {\n                    from: this.tableName+'.user_id',\n                    to: UsersModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.UsersLocaleModel = UsersLocaleModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/users-login-model.js",
    "content": "/**\n *\n * Reldens - UsersLoginModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass UsersLoginModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'users_login';\n    }\n\n    static get relationMappings()\n    {\n        const { UsersModel } = require('./users-model');\n        return {\n            related_users: {\n                relation: this.BelongsToOneRelation,\n                modelClass: UsersModel,\n                join: {\n                    from: this.tableName+'.user_id',\n                    to: UsersModel.tableName+'.id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.UsersLoginModel = UsersLoginModel;\n"
  },
  {
    "path": "generated-entities/models/objection-js/users-model.js",
    "content": "/**\n *\n * Reldens - UsersModel\n *\n */\n\nconst { ObjectionJsRawModel } = require('@reldens/storage');\n\nclass UsersModel extends ObjectionJsRawModel\n{\n\n    static get tableName()\n    {\n        return 'users';\n    }\n\n    static get relationMappings()\n    {\n        const { PlayersModel } = require('./players-model');\n        const { UsersLocaleModel } = require('./users-locale-model');\n        const { UsersLoginModel } = require('./users-login-model');\n        return {\n            related_players: {\n                relation: this.HasManyRelation,\n                modelClass: PlayersModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: PlayersModel.tableName+'.user_id'\n                }\n            },\n            related_users_locale: {\n                relation: this.HasManyRelation,\n                modelClass: UsersLocaleModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: UsersLocaleModel.tableName+'.user_id'\n                }\n            },\n            related_users_login: {\n                relation: this.HasManyRelation,\n                modelClass: UsersLoginModel,\n                join: {\n                    from: this.tableName+'.id',\n                    to: UsersLoginModel.tableName+'.user_id'\n                }\n            }\n        };\n    }\n}\n\nmodule.exports.UsersModel = UsersModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/ads-banner-model.js",
    "content": "/**\n *\n * Reldens - AdsBannerModel\n *\n */\n\nclass AdsBannerModel\n{\n\n    constructor(id, ads_id, banner_data)\n    {\n        this.id = id;\n        this.ads_id = ads_id;\n        this.banner_data = banner_data;\n    }\n\n    static get tableName()\n    {\n        return 'ads_banner';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            ads: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_ads': 'ads'\n        };\n    }\n}\n\nmodule.exports.AdsBannerModel = AdsBannerModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/ads-event-video-model.js",
    "content": "/**\n *\n * Reldens - AdsEventVideoModel\n *\n */\n\nclass AdsEventVideoModel\n{\n\n    constructor(id, ads_id, event_key, event_data)\n    {\n        this.id = id;\n        this.ads_id = ads_id;\n        this.event_key = event_key;\n        this.event_data = event_data;\n    }\n\n    static get tableName()\n    {\n        return 'ads_event_video';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            ads: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_ads': 'ads'\n        };\n    }\n}\n\nmodule.exports.AdsEventVideoModel = AdsEventVideoModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/ads-model.js",
    "content": "/**\n *\n * Reldens - AdsModel\n *\n */\n\nclass AdsModel\n{\n\n    constructor(id, key, provider_id, type_id, width, height, position, top, bottom, left, right, replay, enabled, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.provider_id = provider_id;\n        this.type_id = type_id;\n        this.width = width;\n        this.height = height;\n        this.position = position;\n        this.top = top;\n        this.bottom = bottom;\n        this.left = left;\n        this.right = right;\n        this.replay = replay;\n        this.enabled = enabled;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'ads';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            ads_providers: 'one',\n            ads_types: 'one',\n            ads_banner: 'one',\n            ads_event_video: 'one',\n            ads_played: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_ads_providers': 'ads_providers',\n            'related_ads_types': 'ads_types',\n            'related_ads_banner': 'ads_banner',\n            'related_ads_event_video': 'ads_event_video',\n            'related_ads_played': 'ads_played'\n        };\n    }\n}\n\nmodule.exports.AdsModel = AdsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/ads-played-model.js",
    "content": "/**\n *\n * Reldens - AdsPlayedModel\n *\n */\n\nclass AdsPlayedModel\n{\n\n    constructor(id, ads_id, player_id, started_at, ended_at)\n    {\n        this.id = id;\n        this.ads_id = ads_id;\n        this.player_id = player_id;\n        this.started_at = started_at;\n        this.ended_at = ended_at;\n    }\n\n    static get tableName()\n    {\n        return 'ads_played';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            ads: 'one',\n            players: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_ads': 'ads',\n            'related_players': 'players'\n        };\n    }\n}\n\nmodule.exports.AdsPlayedModel = AdsPlayedModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/ads-providers-model.js",
    "content": "/**\n *\n * Reldens - AdsProvidersModel\n *\n */\n\nclass AdsProvidersModel\n{\n\n    constructor(id, key, enabled)\n    {\n        this.id = id;\n        this.key = key;\n        this.enabled = enabled;\n    }\n\n    static get tableName()\n    {\n        return 'ads_providers';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            ads: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_ads': 'ads'\n        };\n    }\n}\n\nmodule.exports.AdsProvidersModel = AdsProvidersModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/ads-types-model.js",
    "content": "/**\n *\n * Reldens - AdsTypesModel\n *\n */\n\nclass AdsTypesModel\n{\n\n    constructor(id, key)\n    {\n        this.id = id;\n        this.key = key;\n    }\n\n    static get tableName()\n    {\n        return 'ads_types';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            ads: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_ads': 'ads'\n        };\n    }\n}\n\nmodule.exports.AdsTypesModel = AdsTypesModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/audio-categories-model.js",
    "content": "/**\n *\n * Reldens - AudioCategoriesModel\n *\n */\n\nclass AudioCategoriesModel\n{\n\n    constructor(id, category_key, category_label, enabled, single_audio, created_at, updated_at)\n    {\n        this.id = id;\n        this.category_key = category_key;\n        this.category_label = category_label;\n        this.enabled = enabled;\n        this.single_audio = single_audio;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'audio_categories';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            audio: 'many',\n            audio_player_config: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_audio': 'audio',\n            'related_audio_player_config': 'audio_player_config'\n        };\n    }\n}\n\nmodule.exports.AudioCategoriesModel = AudioCategoriesModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/audio-markers-model.js",
    "content": "/**\n *\n * Reldens - AudioMarkersModel\n *\n */\n\nclass AudioMarkersModel\n{\n\n    constructor(id, audio_id, marker_key, start, duration, config)\n    {\n        this.id = id;\n        this.audio_id = audio_id;\n        this.marker_key = marker_key;\n        this.start = start;\n        this.duration = duration;\n        this.config = config;\n    }\n\n    static get tableName()\n    {\n        return 'audio_markers';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            audio: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_audio': 'audio'\n        };\n    }\n}\n\nmodule.exports.AudioMarkersModel = AudioMarkersModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/audio-model.js",
    "content": "/**\n *\n * Reldens - AudioModel\n *\n */\n\nclass AudioModel\n{\n\n    constructor(id, audio_key, files_name, config, room_id, category_id, enabled, created_at, updated_at)\n    {\n        this.id = id;\n        this.audio_key = audio_key;\n        this.files_name = files_name;\n        this.config = config;\n        this.room_id = room_id;\n        this.category_id = category_id;\n        this.enabled = enabled;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'audio';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            audio_categories: 'one',\n            rooms: 'one',\n            audio_markers: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_rooms': 'rooms',\n            'related_audio_categories': 'audio_categories',\n            'related_audio_markers': 'audio_markers'\n        };\n    }\n}\n\nmodule.exports.AudioModel = AudioModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/audio-player-config-model.js",
    "content": "/**\n *\n * Reldens - AudioPlayerConfigModel\n *\n */\n\nclass AudioPlayerConfigModel\n{\n\n    constructor(id, player_id, category_id, enabled)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.category_id = category_id;\n        this.enabled = enabled;\n    }\n\n    static get tableName()\n    {\n        return 'audio_player_config';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            audio_categories: 'one',\n            players: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_players': 'players',\n            'related_audio_categories': 'audio_categories'\n        };\n    }\n}\n\nmodule.exports.AudioPlayerConfigModel = AudioPlayerConfigModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/chat-message-types-model.js",
    "content": "/**\n *\n * Reldens - ChatMessageTypesModel\n *\n */\n\nclass ChatMessageTypesModel\n{\n\n    constructor(id, key, show_tab, also_show_in_type)\n    {\n        this.id = id;\n        this.key = key;\n        this.show_tab = show_tab;\n        this.also_show_in_type = also_show_in_type;\n    }\n\n    static get tableName()\n    {\n        return 'chat_message_types';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            chat: 'many',\n            chat_message_types: 'one',\n            other_chat_message_types: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_chat_message_types': 'other_chat_message_types',\n            'related_chat': 'chat'\n        };\n    }\n}\n\nmodule.exports.ChatMessageTypesModel = ChatMessageTypesModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/chat-model.js",
    "content": "/**\n *\n * Reldens - ChatModel\n *\n */\n\nclass ChatModel\n{\n\n    constructor(id, player_id, room_id, message, private_player_id, message_type, message_time)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.room_id = room_id;\n        this.message = message;\n        this.private_player_id = private_player_id;\n        this.message_type = message_type;\n        this.message_time = message_time;\n    }\n\n    static get tableName()\n    {\n        return 'chat';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            players_chat_player_idToplayers: 'one',\n            players_chat_private_player_idToplayers: 'one',\n            rooms: 'one',\n            chat_message_types: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_players_player': 'players_chat_player_idToplayers',\n            'related_rooms': 'rooms',\n            'related_players_private_player': 'players_chat_private_player_idToplayers',\n            'related_chat_message_types': 'chat_message_types'\n        };\n    }\n}\n\nmodule.exports.ChatModel = ChatModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/clan-levels-model.js",
    "content": "/**\n *\n * Reldens - ClanLevelsModel\n *\n */\n\nclass ClanLevelsModel\n{\n\n    constructor(id, key, label, required_experience)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.required_experience = required_experience;\n    }\n\n    static get tableName()\n    {\n        return 'clan_levels';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            clan: 'many',\n            clan_levels_modifiers: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_clan': 'clan',\n            'related_clan_levels_modifiers': 'clan_levels_modifiers'\n        };\n    }\n}\n\nmodule.exports.ClanLevelsModel = ClanLevelsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/clan-levels-modifiers-model.js",
    "content": "/**\n *\n * Reldens - ClanLevelsModifiersModel\n *\n */\n\nclass ClanLevelsModifiersModel\n{\n\n    constructor(id, level_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.level_id = level_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static get tableName()\n    {\n        return 'clan_levels_modifiers';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            clan_levels: 'one',\n            operation_types: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_clan_levels': 'clan_levels',\n            'related_operation_types': 'operation_types'\n        };\n    }\n}\n\nmodule.exports.ClanLevelsModifiersModel = ClanLevelsModifiersModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/clan-members-model.js",
    "content": "/**\n *\n * Reldens - ClanMembersModel\n *\n */\n\nclass ClanMembersModel\n{\n\n    constructor(id, clan_id, player_id)\n    {\n        this.id = id;\n        this.clan_id = clan_id;\n        this.player_id = player_id;\n    }\n\n    static get tableName()\n    {\n        return 'clan_members';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            clan: 'one',\n            players: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_clan': 'clan',\n            'related_players': 'players'\n        };\n    }\n}\n\nmodule.exports.ClanMembersModel = ClanMembersModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/clan-model.js",
    "content": "/**\n *\n * Reldens - ClanModel\n *\n */\n\nclass ClanModel\n{\n\n    constructor(id, owner_id, name, points, level, created_at, updated_at)\n    {\n        this.id = id;\n        this.owner_id = owner_id;\n        this.name = name;\n        this.points = points;\n        this.level = level;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'clan';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            clan_levels: 'one',\n            players: 'one',\n            clan_members: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_players': 'players',\n            'related_clan_levels': 'clan_levels',\n            'related_clan_members': 'clan_members'\n        };\n    }\n}\n\nmodule.exports.ClanModel = ClanModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/config-model.js",
    "content": "/**\n *\n * Reldens - ConfigModel\n *\n */\n\nclass ConfigModel\n{\n\n    constructor(id, scope, path, value, type)\n    {\n        this.id = id;\n        this.scope = scope;\n        this.path = path;\n        this.value = value;\n        this.type = type;\n    }\n\n    static get tableName()\n    {\n        return 'config';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            config_types: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_config_types': 'config_types'\n        };\n    }\n}\n\nmodule.exports.ConfigModel = ConfigModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/config-types-model.js",
    "content": "/**\n *\n * Reldens - ConfigTypesModel\n *\n */\n\nclass ConfigTypesModel\n{\n\n    constructor(id, label)\n    {\n        this.id = id;\n        this.label = label;\n    }\n\n    static get tableName()\n    {\n        return 'config_types';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            config: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_config': 'config'\n        };\n    }\n}\n\nmodule.exports.ConfigTypesModel = ConfigTypesModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/drops-animations-model.js",
    "content": "/**\n *\n * Reldens - DropsAnimationsModel\n *\n */\n\nclass DropsAnimationsModel\n{\n\n    constructor(id, item_id, asset_type, asset_key, file, extra_params)\n    {\n        this.id = id;\n        this.item_id = item_id;\n        this.asset_type = asset_type;\n        this.asset_key = asset_key;\n        this.file = file;\n        this.extra_params = extra_params;\n    }\n\n    static get tableName()\n    {\n        return 'drops_animations';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            items_item: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_items_item': 'items_item'\n        };\n    }\n}\n\nmodule.exports.DropsAnimationsModel = DropsAnimationsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/features-model.js",
    "content": "/**\n *\n * Reldens - FeaturesModel\n *\n */\n\nclass FeaturesModel\n{\n\n    constructor(id, code, title, is_enabled)\n    {\n        this.id = id;\n        this.code = code;\n        this.title = title;\n        this.is_enabled = is_enabled;\n    }\n\n    static get tableName()\n    {\n        return 'features';\n    }\n    \n}\n\nmodule.exports.FeaturesModel = FeaturesModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/items-group-model.js",
    "content": "/**\n *\n * Reldens - ItemsGroupModel\n *\n */\n\nclass ItemsGroupModel\n{\n\n    constructor(id, key, label, description, files_name, sort, items_limit, limit_per_item)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.description = description;\n        this.files_name = files_name;\n        this.sort = sort;\n        this.items_limit = items_limit;\n        this.limit_per_item = limit_per_item;\n    }\n\n    static get tableName()\n    {\n        return 'items_group';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            items_item: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_items_item': 'items_item'\n        };\n    }\n}\n\nmodule.exports.ItemsGroupModel = ItemsGroupModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/items-inventory-model.js",
    "content": "/**\n *\n * Reldens - ItemsInventoryModel\n *\n */\n\nclass ItemsInventoryModel\n{\n\n    constructor(id, owner_id, item_id, qty, remaining_uses, is_active)\n    {\n        this.id = id;\n        this.owner_id = owner_id;\n        this.item_id = item_id;\n        this.qty = qty;\n        this.remaining_uses = remaining_uses;\n        this.is_active = is_active;\n    }\n\n    static get tableName()\n    {\n        return 'items_inventory';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            items_item: 'one',\n            players: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_players': 'players',\n            'related_items_item': 'items_item'\n        };\n    }\n}\n\nmodule.exports.ItemsInventoryModel = ItemsInventoryModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/items-item-model.js",
    "content": "/**\n *\n * Reldens - ItemsItemModel\n *\n */\n\nclass ItemsItemModel\n{\n\n    constructor(id, key, type, group_id, label, description, qty_limit, uses_limit, useTimeOut, execTimeOut, customData, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.type = type;\n        this.group_id = group_id;\n        this.label = label;\n        this.description = description;\n        this.qty_limit = qty_limit;\n        this.uses_limit = uses_limit;\n        this.useTimeOut = useTimeOut;\n        this.execTimeOut = execTimeOut;\n        this.customData = customData;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'items_item';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            drops_animations: 'one',\n            items_inventory: 'many',\n            items_group: 'one',\n            items_types: 'one',\n            items_item_modifiers: 'many',\n            objects_items_inventory: 'many',\n            objects_items_requirements_objects_items_requirements_item_keyToitems_item: 'many',\n            objects_items_requirements_objects_items_requirements_required_item_keyToitems_item: 'many',\n            objects_items_rewards_objects_items_rewards_item_keyToitems_item: 'many',\n            objects_items_rewards_objects_items_rewards_reward_item_keyToitems_item: 'many',\n            rewards: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_items_types': 'items_types',\n            'related_items_group': 'items_group',\n            'related_drops_animations': 'drops_animations',\n            'related_items_inventory': 'items_inventory',\n            'related_items_item_modifiers': 'items_item_modifiers',\n            'related_objects_items_inventory': 'objects_items_inventory',\n            'related_objects_items_requirements_item_key': 'objects_items_requirements_objects_items_requirements_item_keyToitems_item',\n            'related_objects_items_requirements_required_item_key': 'objects_items_requirements_objects_items_requirements_required_item_keyToitems_item',\n            'related_objects_items_rewards_item_key': 'objects_items_rewards_objects_items_rewards_item_keyToitems_item',\n            'related_objects_items_rewards_reward_item_key': 'objects_items_rewards_objects_items_rewards_reward_item_keyToitems_item',\n            'related_rewards': 'rewards'\n        };\n    }\n}\n\nmodule.exports.ItemsItemModel = ItemsItemModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/items-item-modifiers-model.js",
    "content": "/**\n *\n * Reldens - ItemsItemModifiersModel\n *\n */\n\nclass ItemsItemModifiersModel\n{\n\n    constructor(id, item_id, key, property_key, operation, value, maxProperty)\n    {\n        this.id = id;\n        this.item_id = item_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.maxProperty = maxProperty;\n    }\n\n    static get tableName()\n    {\n        return 'items_item_modifiers';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            items_item: 'one',\n            operation_types: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_items_item': 'items_item',\n            'related_operation_types': 'operation_types'\n        };\n    }\n}\n\nmodule.exports.ItemsItemModifiersModel = ItemsItemModifiersModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/items-types-model.js",
    "content": "/**\n *\n * Reldens - ItemsTypesModel\n *\n */\n\nclass ItemsTypesModel\n{\n\n    constructor(id, key)\n    {\n        this.id = id;\n        this.key = key;\n    }\n\n    static get tableName()\n    {\n        return 'items_types';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            items_item: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_items_item': 'items_item'\n        };\n    }\n}\n\nmodule.exports.ItemsTypesModel = ItemsTypesModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/locale-model.js",
    "content": "/**\n *\n * Reldens - LocaleModel\n *\n */\n\nclass LocaleModel\n{\n\n    constructor(id, locale, language_code, country_code, enabled)\n    {\n        this.id = id;\n        this.locale = locale;\n        this.language_code = language_code;\n        this.country_code = country_code;\n        this.enabled = enabled;\n    }\n\n    static get tableName()\n    {\n        return 'locale';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            snippets: 'many',\n            users_locale: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_snippets': 'snippets',\n            'related_users_locale': 'users_locale'\n        };\n    }\n}\n\nmodule.exports.LocaleModel = LocaleModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/objects-animations-model.js",
    "content": "/**\n *\n * Reldens - ObjectsAnimationsModel\n *\n */\n\nclass ObjectsAnimationsModel\n{\n\n    constructor(id, object_id, animationKey, animationData)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.animationKey = animationKey;\n        this.animationData = animationData;\n    }\n\n    static get tableName()\n    {\n        return 'objects_animations';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects'\n        };\n    }\n}\n\nmodule.exports.ObjectsAnimationsModel = ObjectsAnimationsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/objects-assets-model.js",
    "content": "/**\n *\n * Reldens - ObjectsAssetsModel\n *\n */\n\nclass ObjectsAssetsModel\n{\n\n    constructor(object_asset_id, object_id, asset_type, asset_key, asset_file, extra_params)\n    {\n        this.object_asset_id = object_asset_id;\n        this.object_id = object_id;\n        this.asset_type = asset_type;\n        this.asset_key = asset_key;\n        this.asset_file = asset_file;\n        this.extra_params = extra_params;\n    }\n\n    static get tableName()\n    {\n        return 'objects_assets';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects'\n        };\n    }\n}\n\nmodule.exports.ObjectsAssetsModel = ObjectsAssetsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/objects-items-inventory-model.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsInventoryModel\n *\n */\n\nclass ObjectsItemsInventoryModel\n{\n\n    constructor(id, owner_id, item_id, qty, remaining_uses, is_active)\n    {\n        this.id = id;\n        this.owner_id = owner_id;\n        this.item_id = item_id;\n        this.qty = qty;\n        this.remaining_uses = remaining_uses;\n        this.is_active = is_active;\n    }\n\n    static get tableName()\n    {\n        return 'objects_items_inventory';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            items_item: 'one',\n            objects: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects',\n            'related_items_item': 'items_item'\n        };\n    }\n}\n\nmodule.exports.ObjectsItemsInventoryModel = ObjectsItemsInventoryModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/objects-items-requirements-model.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsRequirementsModel\n *\n */\n\nclass ObjectsItemsRequirementsModel\n{\n\n    constructor(id, object_id, item_key, required_item_key, required_quantity, auto_remove_requirement)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.item_key = item_key;\n        this.required_item_key = required_item_key;\n        this.required_quantity = required_quantity;\n        this.auto_remove_requirement = auto_remove_requirement;\n    }\n\n    static get tableName()\n    {\n        return 'objects_items_requirements';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            items_item_objects_items_requirements_item_keyToitems_item: 'one',\n            items_item_objects_items_requirements_required_item_keyToitems_item: 'one',\n            objects: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects',\n            'related_items_item_item_key': 'items_item_objects_items_requirements_item_keyToitems_item',\n            'related_items_item_required_item_key': 'items_item_objects_items_requirements_required_item_keyToitems_item'\n        };\n    }\n}\n\nmodule.exports.ObjectsItemsRequirementsModel = ObjectsItemsRequirementsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/objects-items-rewards-model.js",
    "content": "/**\n *\n * Reldens - ObjectsItemsRewardsModel\n *\n */\n\nclass ObjectsItemsRewardsModel\n{\n\n    constructor(id, object_id, item_key, reward_item_key, reward_quantity, reward_item_is_required)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.item_key = item_key;\n        this.reward_item_key = reward_item_key;\n        this.reward_quantity = reward_quantity;\n        this.reward_item_is_required = reward_item_is_required;\n    }\n\n    static get tableName()\n    {\n        return 'objects_items_rewards';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            items_item_objects_items_rewards_item_keyToitems_item: 'one',\n            items_item_objects_items_rewards_reward_item_keyToitems_item: 'one',\n            objects: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects',\n            'related_items_item_item_key': 'items_item_objects_items_rewards_item_keyToitems_item',\n            'related_items_item_reward_item_key': 'items_item_objects_items_rewards_reward_item_keyToitems_item'\n        };\n    }\n}\n\nmodule.exports.ObjectsItemsRewardsModel = ObjectsItemsRewardsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/objects-model.js",
    "content": "/**\n *\n * Reldens - ObjectsModel\n *\n */\n\nclass ObjectsModel\n{\n\n    constructor(id, room_id, layer_name, tile_index, class_type, object_class_key, client_key, title, private_params, client_params, enabled, created_at, updated_at)\n    {\n        this.id = id;\n        this.room_id = room_id;\n        this.layer_name = layer_name;\n        this.tile_index = tile_index;\n        this.class_type = class_type;\n        this.object_class_key = object_class_key;\n        this.client_key = client_key;\n        this.title = title;\n        this.private_params = private_params;\n        this.client_params = client_params;\n        this.enabled = enabled;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'objects';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects_types: 'one',\n            rooms: 'one',\n            objects_animations: 'many',\n            objects_assets: 'many',\n            objects_items_inventory: 'many',\n            objects_items_requirements: 'many',\n            objects_items_rewards: 'many',\n            objects_skills: 'many',\n            objects_stats: 'many',\n            respawn: 'many',\n            rewards: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_rooms': 'rooms',\n            'related_objects_types': 'objects_types',\n            'related_objects_animations': 'objects_animations',\n            'related_objects_assets': 'objects_assets',\n            'related_objects_items_inventory': 'objects_items_inventory',\n            'related_objects_items_requirements': 'objects_items_requirements',\n            'related_objects_items_rewards': 'objects_items_rewards',\n            'related_objects_skills': 'objects_skills',\n            'related_objects_stats': 'objects_stats',\n            'related_respawn': 'respawn',\n            'related_rewards': 'rewards'\n        };\n    }\n}\n\nmodule.exports.ObjectsModel = ObjectsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/objects-skills-model.js",
    "content": "/**\n *\n * Reldens - ObjectsSkillsModel\n *\n */\n\nclass ObjectsSkillsModel\n{\n\n    constructor(id, object_id, skill_id, target_id)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.skill_id = skill_id;\n        this.target_id = target_id;\n    }\n\n    static get tableName()\n    {\n        return 'objects_skills';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects: 'one',\n            skills_skill: 'one',\n            target_options: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects',\n            'related_skills_skill': 'skills_skill',\n            'related_target_options': 'target_options'\n        };\n    }\n}\n\nmodule.exports.ObjectsSkillsModel = ObjectsSkillsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/objects-stats-model.js",
    "content": "/**\n *\n * Reldens - ObjectsStatsModel\n *\n */\n\nclass ObjectsStatsModel\n{\n\n    constructor(id, object_id, stat_id, base_value, value)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.stat_id = stat_id;\n        this.base_value = base_value;\n        this.value = value;\n    }\n\n    static get tableName()\n    {\n        return 'objects_stats';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects: 'one',\n            stats: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects',\n            'related_stats': 'stats'\n        };\n    }\n}\n\nmodule.exports.ObjectsStatsModel = ObjectsStatsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/objects-types-model.js",
    "content": "/**\n *\n * Reldens - ObjectsTypesModel\n *\n */\n\nclass ObjectsTypesModel\n{\n\n    constructor(id, key)\n    {\n        this.id = id;\n        this.key = key;\n    }\n\n    static get tableName()\n    {\n        return 'objects_types';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects'\n        };\n    }\n}\n\nmodule.exports.ObjectsTypesModel = ObjectsTypesModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/operation-types-model.js",
    "content": "/**\n *\n * Reldens - OperationTypesModel\n *\n */\n\nclass OperationTypesModel\n{\n\n    constructor(id, label, key)\n    {\n        this.id = id;\n        this.label = label;\n        this.key = key;\n    }\n\n    static get tableName()\n    {\n        return 'operation_types';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            clan_levels_modifiers: 'many',\n            items_item_modifiers: 'many',\n            rewards_modifiers: 'many',\n            skills_levels_modifiers: 'many',\n            skills_skill_owner_effects: 'many',\n            skills_skill_target_effects: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_clan_levels_modifiers': 'clan_levels_modifiers',\n            'related_items_item_modifiers': 'items_item_modifiers',\n            'related_rewards_modifiers': 'rewards_modifiers',\n            'related_skills_levels_modifiers': 'skills_levels_modifiers',\n            'related_skills_skill_owner_effects': 'skills_skill_owner_effects',\n            'related_skills_skill_target_effects': 'skills_skill_target_effects'\n        };\n    }\n}\n\nmodule.exports.OperationTypesModel = OperationTypesModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/players-model.js",
    "content": "/**\n *\n * Reldens - PlayersModel\n *\n */\n\nclass PlayersModel\n{\n\n    constructor(id, user_id, name, created_at, updated_at)\n    {\n        this.id = id;\n        this.user_id = user_id;\n        this.name = name;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'players';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            ads_played: 'many',\n            audio_player_config: 'many',\n            chat_chat_player_idToplayers: 'many',\n            chat_chat_private_player_idToplayers: 'many',\n            clan: 'one',\n            clan_members: 'one',\n            items_inventory: 'many',\n            users: 'one',\n            players_state: 'one',\n            players_stats: 'many',\n            rewards_events_state: 'many',\n            scores: 'many',\n            scores_detail: 'many',\n            skills_owners_class_path: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_users': 'users',\n            'related_ads_played': 'ads_played',\n            'related_audio_player_config': 'audio_player_config',\n            'related_chat_player': 'chat_chat_player_idToplayers',\n            'related_chat_private_player': 'chat_chat_private_player_idToplayers',\n            'related_clan': 'clan',\n            'related_clan_members': 'clan_members',\n            'related_items_inventory': 'items_inventory',\n            'related_players_state': 'players_state',\n            'related_players_stats': 'players_stats',\n            'related_rewards_events_state': 'rewards_events_state',\n            'related_scores': 'scores',\n            'related_scores_detail': 'scores_detail',\n            'related_skills_owners_class_path': 'skills_owners_class_path'\n        };\n    }\n}\n\nmodule.exports.PlayersModel = PlayersModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/players-state-model.js",
    "content": "/**\n *\n * Reldens - PlayersStateModel\n *\n */\n\nclass PlayersStateModel\n{\n\n    constructor(id, player_id, room_id, x, y, dir)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.room_id = room_id;\n        this.x = x;\n        this.y = y;\n        this.dir = dir;\n    }\n\n    static get tableName()\n    {\n        return 'players_state';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            players: 'one',\n            rooms: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_players': 'players',\n            'related_rooms': 'rooms'\n        };\n    }\n}\n\nmodule.exports.PlayersStateModel = PlayersStateModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/players-stats-model.js",
    "content": "/**\n *\n * Reldens - PlayersStatsModel\n *\n */\n\nclass PlayersStatsModel\n{\n\n    constructor(id, player_id, stat_id, base_value, value)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.stat_id = stat_id;\n        this.base_value = base_value;\n        this.value = value;\n    }\n\n    static get tableName()\n    {\n        return 'players_stats';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            players: 'one',\n            stats: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_players': 'players',\n            'related_stats': 'stats'\n        };\n    }\n}\n\nmodule.exports.PlayersStatsModel = PlayersStatsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/registered-models-prisma.js",
    "content": "/**\n *\n * Reldens - Registered Models\n *\n */\n\nconst { AdsBannerModel } = require('./ads-banner-model');\nconst { AdsModel } = require('./ads-model');\nconst { AdsEventVideoModel } = require('./ads-event-video-model');\nconst { AdsPlayedModel } = require('./ads-played-model');\nconst { AdsProvidersModel } = require('./ads-providers-model');\nconst { AdsTypesModel } = require('./ads-types-model');\nconst { AudioCategoriesModel } = require('./audio-categories-model');\nconst { AudioModel } = require('./audio-model');\nconst { AudioMarkersModel } = require('./audio-markers-model');\nconst { AudioPlayerConfigModel } = require('./audio-player-config-model');\nconst { ChatModel } = require('./chat-model');\nconst { ChatMessageTypesModel } = require('./chat-message-types-model');\nconst { ClanModel } = require('./clan-model');\nconst { ClanLevelsModel } = require('./clan-levels-model');\nconst { ClanLevelsModifiersModel } = require('./clan-levels-modifiers-model');\nconst { ClanMembersModel } = require('./clan-members-model');\nconst { ConfigModel } = require('./config-model');\nconst { ConfigTypesModel } = require('./config-types-model');\nconst { DropsAnimationsModel } = require('./drops-animations-model');\nconst { FeaturesModel } = require('./features-model');\nconst { ItemsGroupModel } = require('./items-group-model');\nconst { ItemsInventoryModel } = require('./items-inventory-model');\nconst { ItemsItemModel } = require('./items-item-model');\nconst { ItemsItemModifiersModel } = require('./items-item-modifiers-model');\nconst { ItemsTypesModel } = require('./items-types-model');\nconst { LocaleModel } = require('./locale-model');\nconst { ObjectsAnimationsModel } = require('./objects-animations-model');\nconst { ObjectsAssetsModel } = require('./objects-assets-model');\nconst { ObjectsModel } = require('./objects-model');\nconst { ObjectsItemsInventoryModel } = require('./objects-items-inventory-model');\nconst { ObjectsItemsRequirementsModel } = require('./objects-items-requirements-model');\nconst { ObjectsItemsRewardsModel } = require('./objects-items-rewards-model');\nconst { ObjectsSkillsModel } = require('./objects-skills-model');\nconst { ObjectsStatsModel } = require('./objects-stats-model');\nconst { ObjectsTypesModel } = require('./objects-types-model');\nconst { OperationTypesModel } = require('./operation-types-model');\nconst { PlayersModel } = require('./players-model');\nconst { PlayersStateModel } = require('./players-state-model');\nconst { PlayersStatsModel } = require('./players-stats-model');\nconst { RespawnModel } = require('./respawn-model');\nconst { RewardsModel } = require('./rewards-model');\nconst { RewardsEventsModel } = require('./rewards-events-model');\nconst { RewardsEventsStateModel } = require('./rewards-events-state-model');\nconst { RewardsModifiersModel } = require('./rewards-modifiers-model');\nconst { RoomsChangePointsModel } = require('./rooms-change-points-model');\nconst { RoomsModel } = require('./rooms-model');\nconst { RoomsReturnPointsModel } = require('./rooms-return-points-model');\nconst { ScoresDetailModel } = require('./scores-detail-model');\nconst { ScoresModel } = require('./scores-model');\nconst { SkillsClassLevelUpAnimationsModel } = require('./skills-class-level-up-animations-model');\nconst { SkillsClassPathModel } = require('./skills-class-path-model');\nconst { SkillsClassPathLevelLabelsModel } = require('./skills-class-path-level-labels-model');\nconst { SkillsClassPathLevelSkillsModel } = require('./skills-class-path-level-skills-model');\nconst { SkillsGroupsModel } = require('./skills-groups-model');\nconst { SkillsLevelsModel } = require('./skills-levels-model');\nconst { SkillsLevelsModifiersConditionsModel } = require('./skills-levels-modifiers-conditions-model');\nconst { SkillsLevelsModifiersModel } = require('./skills-levels-modifiers-model');\nconst { SkillsLevelsSetModel } = require('./skills-levels-set-model');\nconst { SkillsOwnersClassPathModel } = require('./skills-owners-class-path-model');\nconst { SkillsSkillAnimationsModel } = require('./skills-skill-animations-model');\nconst { SkillsSkillAttackModel } = require('./skills-skill-attack-model');\nconst { SkillsSkillModel } = require('./skills-skill-model');\nconst { SkillsSkillGroupRelationModel } = require('./skills-skill-group-relation-model');\nconst { SkillsSkillOwnerConditionsModel } = require('./skills-skill-owner-conditions-model');\nconst { SkillsSkillOwnerEffectsConditionsModel } = require('./skills-skill-owner-effects-conditions-model');\nconst { SkillsSkillOwnerEffectsModel } = require('./skills-skill-owner-effects-model');\nconst { SkillsSkillPhysicalDataModel } = require('./skills-skill-physical-data-model');\nconst { SkillsSkillTargetEffectsConditionsModel } = require('./skills-skill-target-effects-conditions-model');\nconst { SkillsSkillTargetEffectsModel } = require('./skills-skill-target-effects-model');\nconst { SkillsSkillTypeModel } = require('./skills-skill-type-model');\nconst { SnippetsModel } = require('./snippets-model');\nconst { StatsModel } = require('./stats-model');\nconst { TargetOptionsModel } = require('./target-options-model');\nconst { UsersModel } = require('./users-model');\nconst { UsersLocaleModel } = require('./users-locale-model');\nconst { UsersLoginModel } = require('./users-login-model');\nconst { entitiesConfig } = require('../../entities-config');\nconst { entitiesTranslations } = require('../../entities-translations');\n\nlet rawRegisteredEntities = {\n    adsBanner: AdsBannerModel,\n    ads: AdsModel,\n    adsEventVideo: AdsEventVideoModel,\n    adsPlayed: AdsPlayedModel,\n    adsProviders: AdsProvidersModel,\n    adsTypes: AdsTypesModel,\n    audioCategories: AudioCategoriesModel,\n    audio: AudioModel,\n    audioMarkers: AudioMarkersModel,\n    audioPlayerConfig: AudioPlayerConfigModel,\n    chat: ChatModel,\n    chatMessageTypes: ChatMessageTypesModel,\n    clan: ClanModel,\n    clanLevels: ClanLevelsModel,\n    clanLevelsModifiers: ClanLevelsModifiersModel,\n    clanMembers: ClanMembersModel,\n    config: ConfigModel,\n    configTypes: ConfigTypesModel,\n    dropsAnimations: DropsAnimationsModel,\n    features: FeaturesModel,\n    itemsGroup: ItemsGroupModel,\n    itemsInventory: ItemsInventoryModel,\n    itemsItem: ItemsItemModel,\n    itemsItemModifiers: ItemsItemModifiersModel,\n    itemsTypes: ItemsTypesModel,\n    locale: LocaleModel,\n    objectsAnimations: ObjectsAnimationsModel,\n    objectsAssets: ObjectsAssetsModel,\n    objects: ObjectsModel,\n    objectsItemsInventory: ObjectsItemsInventoryModel,\n    objectsItemsRequirements: ObjectsItemsRequirementsModel,\n    objectsItemsRewards: ObjectsItemsRewardsModel,\n    objectsSkills: ObjectsSkillsModel,\n    objectsStats: ObjectsStatsModel,\n    objectsTypes: ObjectsTypesModel,\n    operationTypes: OperationTypesModel,\n    players: PlayersModel,\n    playersState: PlayersStateModel,\n    playersStats: PlayersStatsModel,\n    respawn: RespawnModel,\n    rewards: RewardsModel,\n    rewardsEvents: RewardsEventsModel,\n    rewardsEventsState: RewardsEventsStateModel,\n    rewardsModifiers: RewardsModifiersModel,\n    roomsChangePoints: RoomsChangePointsModel,\n    rooms: RoomsModel,\n    roomsReturnPoints: RoomsReturnPointsModel,\n    scoresDetail: ScoresDetailModel,\n    scores: ScoresModel,\n    skillsClassLevelUpAnimations: SkillsClassLevelUpAnimationsModel,\n    skillsClassPath: SkillsClassPathModel,\n    skillsClassPathLevelLabels: SkillsClassPathLevelLabelsModel,\n    skillsClassPathLevelSkills: SkillsClassPathLevelSkillsModel,\n    skillsGroups: SkillsGroupsModel,\n    skillsLevels: SkillsLevelsModel,\n    skillsLevelsModifiersConditions: SkillsLevelsModifiersConditionsModel,\n    skillsLevelsModifiers: SkillsLevelsModifiersModel,\n    skillsLevelsSet: SkillsLevelsSetModel,\n    skillsOwnersClassPath: SkillsOwnersClassPathModel,\n    skillsSkillAnimations: SkillsSkillAnimationsModel,\n    skillsSkillAttack: SkillsSkillAttackModel,\n    skillsSkill: SkillsSkillModel,\n    skillsSkillGroupRelation: SkillsSkillGroupRelationModel,\n    skillsSkillOwnerConditions: SkillsSkillOwnerConditionsModel,\n    skillsSkillOwnerEffectsConditions: SkillsSkillOwnerEffectsConditionsModel,\n    skillsSkillOwnerEffects: SkillsSkillOwnerEffectsModel,\n    skillsSkillPhysicalData: SkillsSkillPhysicalDataModel,\n    skillsSkillTargetEffectsConditions: SkillsSkillTargetEffectsConditionsModel,\n    skillsSkillTargetEffects: SkillsSkillTargetEffectsModel,\n    skillsSkillType: SkillsSkillTypeModel,\n    snippets: SnippetsModel,\n    stats: StatsModel,\n    targetOptions: TargetOptionsModel,\n    users: UsersModel,\n    usersLocale: UsersLocaleModel,\n    usersLogin: UsersLoginModel\n};\n\nmodule.exports.rawRegisteredEntities = rawRegisteredEntities;\n\nmodule.exports.entitiesConfig = entitiesConfig;\n\nmodule.exports.entitiesTranslations = entitiesTranslations;\n"
  },
  {
    "path": "generated-entities/models/prisma/respawn-model.js",
    "content": "/**\n *\n * Reldens - RespawnModel\n *\n */\n\nclass RespawnModel\n{\n\n    constructor(id, object_id, respawn_time, instances_limit, layer, created_at, updated_at)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.respawn_time = respawn_time;\n        this.instances_limit = instances_limit;\n        this.layer = layer;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'respawn';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects'\n        };\n    }\n}\n\nmodule.exports.RespawnModel = RespawnModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/rewards-events-model.js",
    "content": "/**\n *\n * Reldens - RewardsEventsModel\n *\n */\n\nclass RewardsEventsModel\n{\n\n    constructor(id, label, description, handler_key, event_key, event_data, position, enabled, active_from, active_to)\n    {\n        this.id = id;\n        this.label = label;\n        this.description = description;\n        this.handler_key = handler_key;\n        this.event_key = event_key;\n        this.event_data = event_data;\n        this.position = position;\n        this.enabled = enabled;\n        this.active_from = active_from;\n        this.active_to = active_to;\n    }\n\n    static get tableName()\n    {\n        return 'rewards_events';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            rewards_events_state: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_rewards_events_state': 'rewards_events_state'\n        };\n    }\n}\n\nmodule.exports.RewardsEventsModel = RewardsEventsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/rewards-events-state-model.js",
    "content": "/**\n *\n * Reldens - RewardsEventsStateModel\n *\n */\n\nclass RewardsEventsStateModel\n{\n\n    constructor(id, rewards_events_id, player_id, state)\n    {\n        this.id = id;\n        this.rewards_events_id = rewards_events_id;\n        this.player_id = player_id;\n        this.state = state;\n    }\n\n    static get tableName()\n    {\n        return 'rewards_events_state';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            rewards_events: 'one',\n            players: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_rewards_events': 'rewards_events',\n            'related_players': 'players'\n        };\n    }\n}\n\nmodule.exports.RewardsEventsStateModel = RewardsEventsStateModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/rewards-model.js",
    "content": "/**\n *\n * Reldens - RewardsModel\n *\n */\n\nclass RewardsModel\n{\n\n    constructor(id, object_id, item_id, modifier_id, experience, drop_rate, drop_quantity, is_unique, was_given, has_drop_body, created_at, updated_at)\n    {\n        this.id = id;\n        this.object_id = object_id;\n        this.item_id = item_id;\n        this.modifier_id = modifier_id;\n        this.experience = experience;\n        this.drop_rate = drop_rate;\n        this.drop_quantity = drop_quantity;\n        this.is_unique = is_unique;\n        this.was_given = was_given;\n        this.has_drop_body = has_drop_body;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'rewards';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            items_item: 'one',\n            objects: 'one',\n            rewards_modifiers: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects': 'objects',\n            'related_items_item': 'items_item',\n            'related_rewards_modifiers': 'rewards_modifiers'\n        };\n    }\n}\n\nmodule.exports.RewardsModel = RewardsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/rewards-modifiers-model.js",
    "content": "/**\n *\n * Reldens - RewardsModifiersModel\n *\n */\n\nclass RewardsModifiersModel\n{\n\n    constructor(id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static get tableName()\n    {\n        return 'rewards_modifiers';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            rewards: 'many',\n            operation_types: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_operation_types': 'operation_types',\n            'related_rewards': 'rewards'\n        };\n    }\n}\n\nmodule.exports.RewardsModifiersModel = RewardsModifiersModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/rooms-change-points-model.js",
    "content": "/**\n *\n * Reldens - RoomsChangePointsModel\n *\n */\n\nclass RoomsChangePointsModel\n{\n\n    constructor(id, room_id, tile_index, next_room_id)\n    {\n        this.id = id;\n        this.room_id = room_id;\n        this.tile_index = tile_index;\n        this.next_room_id = next_room_id;\n    }\n\n    static get tableName()\n    {\n        return 'rooms_change_points';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            rooms_rooms_change_points_room_idTorooms: 'one',\n            rooms_rooms_change_points_next_room_idTorooms: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_rooms_room': 'rooms_rooms_change_points_room_idTorooms',\n            'related_rooms_next_room': 'rooms_rooms_change_points_next_room_idTorooms',\n            'related_rooms_change_points_room': 'rooms_rooms_change_points_room_idTorooms',\n            'related_rooms_change_points_next_room': 'rooms_rooms_change_points_next_room_idTorooms'\n        };\n    }\n}\n\nmodule.exports.RoomsChangePointsModel = RoomsChangePointsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/rooms-model.js",
    "content": "/**\n *\n * Reldens - RoomsModel\n *\n */\n\nclass RoomsModel\n{\n\n    constructor(id, name, title, map_filename, scene_images, room_class_key, server_url, customData, created_at, updated_at)\n    {\n        this.id = id;\n        this.name = name;\n        this.title = title;\n        this.map_filename = map_filename;\n        this.scene_images = scene_images;\n        this.room_class_key = room_class_key;\n        this.server_url = server_url;\n        this.customData = customData;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'rooms';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            audio: 'many',\n            chat: 'many',\n            objects: 'many',\n            players_state: 'many',\n            rooms_change_points_rooms_change_points_room_idTorooms: 'many',\n            rooms_change_points_rooms_change_points_next_room_idTorooms: 'many',\n            rooms_return_points_rooms_return_points_from_room_idTorooms: 'many',\n            rooms_return_points_rooms_return_points_room_idTorooms: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_audio': 'audio',\n            'related_chat': 'chat',\n            'related_objects': 'objects',\n            'related_players_state': 'players_state',\n            'related_rooms_change_points_room': 'rooms_change_points_rooms_change_points_room_idTorooms',\n            'related_rooms_change_points_next_room': 'rooms_change_points_rooms_change_points_next_room_idTorooms',\n            'related_rooms_return_points_from_room': 'rooms_return_points_rooms_return_points_from_room_idTorooms',\n            'related_rooms_return_points_room': 'rooms_return_points_rooms_return_points_room_idTorooms'\n        };\n    }\n}\n\nmodule.exports.RoomsModel = RoomsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/rooms-return-points-model.js",
    "content": "/**\n *\n * Reldens - RoomsReturnPointsModel\n *\n */\n\nclass RoomsReturnPointsModel\n{\n\n    constructor(id, room_id, direction, x, y, is_default, from_room_id)\n    {\n        this.id = id;\n        this.room_id = room_id;\n        this.direction = direction;\n        this.x = x;\n        this.y = y;\n        this.is_default = is_default;\n        this.from_room_id = from_room_id;\n    }\n\n    static get tableName()\n    {\n        return 'rooms_return_points';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            rooms_rooms_return_points_from_room_idTorooms: 'one',\n            rooms_rooms_return_points_room_idTorooms: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_rooms_room': 'rooms_rooms_return_points_from_room_idTorooms',\n            'related_rooms_from_room': 'rooms_rooms_return_points_from_room_idTorooms',\n            'related_rooms_return_points_from_room': 'rooms_rooms_return_points_from_room_idTorooms',\n            'related_rooms_return_points_room': 'rooms_rooms_return_points_room_idTorooms'\n        };\n    }\n}\n\nmodule.exports.RoomsReturnPointsModel = RoomsReturnPointsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/scores-detail-model.js",
    "content": "/**\n *\n * Reldens - ScoresDetailModel\n *\n */\n\nclass ScoresDetailModel\n{\n\n    constructor(id, player_id, obtained_score, kill_time, kill_player_id, kill_npc_id)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.obtained_score = obtained_score;\n        this.kill_time = kill_time;\n        this.kill_player_id = kill_player_id;\n        this.kill_npc_id = kill_npc_id;\n    }\n\n    static get tableName()\n    {\n        return 'scores_detail';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            players: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_players': 'players'\n        };\n    }\n}\n\nmodule.exports.ScoresDetailModel = ScoresDetailModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/scores-model.js",
    "content": "/**\n *\n * Reldens - ScoresModel\n *\n */\n\nclass ScoresModel\n{\n\n    constructor(id, player_id, total_score, players_kills_count, npcs_kills_count, last_player_kill_time, last_npc_kill_time, created_at, updated_at)\n    {\n        this.id = id;\n        this.player_id = player_id;\n        this.total_score = total_score;\n        this.players_kills_count = players_kills_count;\n        this.npcs_kills_count = npcs_kills_count;\n        this.last_player_kill_time = last_player_kill_time;\n        this.last_npc_kill_time = last_npc_kill_time;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'scores';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            players: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_players': 'players'\n        };\n    }\n}\n\nmodule.exports.ScoresModel = ScoresModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-class-level-up-animations-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassLevelUpAnimationsModel\n *\n */\n\nclass SkillsClassLevelUpAnimationsModel\n{\n\n    constructor(id, class_path_id, level_id, animationData)\n    {\n        this.id = id;\n        this.class_path_id = class_path_id;\n        this.level_id = level_id;\n        this.animationData = animationData;\n    }\n\n    static get tableName()\n    {\n        return 'skills_class_level_up_animations';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_class_path: 'one',\n            skills_levels: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_class_path': 'skills_class_path',\n            'related_skills_levels': 'skills_levels'\n        };\n    }\n}\n\nmodule.exports.SkillsClassLevelUpAnimationsModel = SkillsClassLevelUpAnimationsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-class-path-level-labels-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathLevelLabelsModel\n *\n */\n\nclass SkillsClassPathLevelLabelsModel\n{\n\n    constructor(id, class_path_id, level_id, label)\n    {\n        this.id = id;\n        this.class_path_id = class_path_id;\n        this.level_id = level_id;\n        this.label = label;\n    }\n\n    static get tableName()\n    {\n        return 'skills_class_path_level_labels';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_class_path: 'one',\n            skills_levels: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_class_path': 'skills_class_path',\n            'related_skills_levels': 'skills_levels'\n        };\n    }\n}\n\nmodule.exports.SkillsClassPathLevelLabelsModel = SkillsClassPathLevelLabelsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-class-path-level-skills-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathLevelSkillsModel\n *\n */\n\nclass SkillsClassPathLevelSkillsModel\n{\n\n    constructor(id, class_path_id, level_id, skill_id)\n    {\n        this.id = id;\n        this.class_path_id = class_path_id;\n        this.level_id = level_id;\n        this.skill_id = skill_id;\n    }\n\n    static get tableName()\n    {\n        return 'skills_class_path_level_skills';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_class_path: 'one',\n            skills_levels: 'one',\n            skills_skill: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_class_path': 'skills_class_path',\n            'related_skills_levels': 'skills_levels',\n            'related_skills_skill': 'skills_skill'\n        };\n    }\n}\n\nmodule.exports.SkillsClassPathLevelSkillsModel = SkillsClassPathLevelSkillsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-class-path-model.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathModel\n *\n */\n\nclass SkillsClassPathModel\n{\n\n    constructor(id, key, label, levels_set_id, enabled, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.levels_set_id = levels_set_id;\n        this.enabled = enabled;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'skills_class_path';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_class_level_up_animations: 'many',\n            skills_levels_set: 'one',\n            skills_class_path_level_labels: 'many',\n            skills_class_path_level_skills: 'many',\n            skills_owners_class_path: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_levels_set': 'skills_levels_set',\n            'related_skills_class_level_up_animations': 'skills_class_level_up_animations',\n            'related_skills_class_path_level_labels': 'skills_class_path_level_labels',\n            'related_skills_class_path_level_skills': 'skills_class_path_level_skills',\n            'related_skills_owners_class_path': 'skills_owners_class_path'\n        };\n    }\n}\n\nmodule.exports.SkillsClassPathModel = SkillsClassPathModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-groups-model.js",
    "content": "/**\n *\n * Reldens - SkillsGroupsModel\n *\n */\n\nclass SkillsGroupsModel\n{\n\n    constructor(id, key, label, description, sort)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.description = description;\n        this.sort = sort;\n    }\n\n    static get tableName()\n    {\n        return 'skills_groups';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_skill_group_relation: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill_group_relation': 'skills_skill_group_relation'\n        };\n    }\n}\n\nmodule.exports.SkillsGroupsModel = SkillsGroupsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-levels-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModel\n *\n */\n\nclass SkillsLevelsModel\n{\n\n    constructor(id, key, label, required_experience, level_set_id)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.required_experience = required_experience;\n        this.level_set_id = level_set_id;\n    }\n\n    static get tableName()\n    {\n        return 'skills_levels';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_class_level_up_animations: 'many',\n            skills_class_path_level_labels: 'many',\n            skills_class_path_level_skills: 'many',\n            skills_levels_set: 'one',\n            skills_levels_modifiers: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_levels_set': 'skills_levels_set',\n            'related_skills_class_level_up_animations': 'skills_class_level_up_animations',\n            'related_skills_class_path_level_labels': 'skills_class_path_level_labels',\n            'related_skills_class_path_level_skills': 'skills_class_path_level_skills',\n            'related_skills_levels_modifiers': 'skills_levels_modifiers'\n        };\n    }\n}\n\nmodule.exports.SkillsLevelsModel = SkillsLevelsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-levels-modifiers-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModifiersConditionsModel\n *\n */\n\nclass SkillsLevelsModifiersConditionsModel\n{\n\n    constructor(id, levels_modifier_id, key, property_key, conditional, value)\n    {\n        this.id = id;\n        this.levels_modifier_id = levels_modifier_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.conditional = conditional;\n        this.value = value;\n    }\n\n    static get tableName()\n    {\n        return 'skills_levels_modifiers_conditions';\n    }\n    \n}\n\nmodule.exports.SkillsLevelsModifiersConditionsModel = SkillsLevelsModifiersConditionsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-levels-modifiers-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModifiersModel\n *\n */\n\nclass SkillsLevelsModifiersModel\n{\n\n    constructor(id, level_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.level_id = level_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static get tableName()\n    {\n        return 'skills_levels_modifiers';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            operation_types: 'one',\n            skills_levels: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_levels': 'skills_levels',\n            'related_operation_types': 'operation_types'\n        };\n    }\n}\n\nmodule.exports.SkillsLevelsModifiersModel = SkillsLevelsModifiersModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-levels-set-model.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsSetModel\n *\n */\n\nclass SkillsLevelsSetModel\n{\n\n    constructor(id, key, label, autoFillRanges, autoFillExperienceMultiplier, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.autoFillRanges = autoFillRanges;\n        this.autoFillExperienceMultiplier = autoFillExperienceMultiplier;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'skills_levels_set';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_class_path: 'many',\n            skills_levels: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_class_path': 'skills_class_path',\n            'related_skills_levels': 'skills_levels'\n        };\n    }\n}\n\nmodule.exports.SkillsLevelsSetModel = SkillsLevelsSetModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-owners-class-path-model.js",
    "content": "/**\n *\n * Reldens - SkillsOwnersClassPathModel\n *\n */\n\nclass SkillsOwnersClassPathModel\n{\n\n    constructor(id, class_path_id, owner_id, currentLevel, currentExp)\n    {\n        this.id = id;\n        this.class_path_id = class_path_id;\n        this.owner_id = owner_id;\n        this.currentLevel = currentLevel;\n        this.currentExp = currentExp;\n    }\n\n    static get tableName()\n    {\n        return 'skills_owners_class_path';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            players: 'one',\n            skills_class_path: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_class_path': 'skills_class_path',\n            'related_players': 'players'\n        };\n    }\n}\n\nmodule.exports.SkillsOwnersClassPathModel = SkillsOwnersClassPathModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-animations-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAnimationsModel\n *\n */\n\nclass SkillsSkillAnimationsModel\n{\n\n    constructor(id, skill_id, key, classKey, animationData)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.key = key;\n        this.classKey = classKey;\n        this.animationData = animationData;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_animations';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_skill: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill': 'skills_skill'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillAnimationsModel = SkillsSkillAnimationsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-attack-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAttackModel\n *\n */\n\nclass SkillsSkillAttackModel\n{\n\n    constructor(id, skill_id, affectedProperty, allowEffectBelowZero, hitDamage, applyDirectDamage, attackProperties, defenseProperties, aimProperties, dodgeProperties, dodgeFullEnabled, dodgeOverAimSuccess, damageAffected, criticalAffected)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.affectedProperty = affectedProperty;\n        this.allowEffectBelowZero = allowEffectBelowZero;\n        this.hitDamage = hitDamage;\n        this.applyDirectDamage = applyDirectDamage;\n        this.attackProperties = attackProperties;\n        this.defenseProperties = defenseProperties;\n        this.aimProperties = aimProperties;\n        this.dodgeProperties = dodgeProperties;\n        this.dodgeFullEnabled = dodgeFullEnabled;\n        this.dodgeOverAimSuccess = dodgeOverAimSuccess;\n        this.damageAffected = damageAffected;\n        this.criticalAffected = criticalAffected;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_attack';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_skill: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill': 'skills_skill'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillAttackModel = SkillsSkillAttackModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-group-relation-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillGroupRelationModel\n *\n */\n\nclass SkillsSkillGroupRelationModel\n{\n\n    constructor(id, skill_id, group_id)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.group_id = group_id;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_group_relation';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_groups: 'one',\n            skills_skill: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill': 'skills_skill',\n            'related_skills_groups': 'skills_groups'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillGroupRelationModel = SkillsSkillGroupRelationModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillModel\n *\n */\n\nclass SkillsSkillModel\n{\n\n    constructor(id, key, type, label, autoValidation, skillDelay, castTime, usesLimit, range, rangeAutomaticValidation, rangePropertyX, rangePropertyY, rangeTargetPropertyX, rangeTargetPropertyY, allowSelfTarget, criticalChance, criticalMultiplier, criticalFixedValue, customData, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.type = type;\n        this.label = label;\n        this.autoValidation = autoValidation;\n        this.skillDelay = skillDelay;\n        this.castTime = castTime;\n        this.usesLimit = usesLimit;\n        this.range = range;\n        this.rangeAutomaticValidation = rangeAutomaticValidation;\n        this.rangePropertyX = rangePropertyX;\n        this.rangePropertyY = rangePropertyY;\n        this.rangeTargetPropertyX = rangeTargetPropertyX;\n        this.rangeTargetPropertyY = rangeTargetPropertyY;\n        this.allowSelfTarget = allowSelfTarget;\n        this.criticalChance = criticalChance;\n        this.criticalMultiplier = criticalMultiplier;\n        this.criticalFixedValue = criticalFixedValue;\n        this.customData = customData;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects_skills: 'many',\n            skills_class_path_level_skills: 'many',\n            skills_skill_type: 'one',\n            skills_skill_animations: 'many',\n            skills_skill_attack: 'one',\n            skills_skill_group_relation: 'one',\n            skills_skill_owner_conditions: 'many',\n            skills_skill_owner_effects: 'many',\n            skills_skill_physical_data: 'one',\n            skills_skill_target_effects: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill_type': 'skills_skill_type',\n            'related_objects_skills': 'objects_skills',\n            'related_skills_class_path_level_skills': 'skills_class_path_level_skills',\n            'related_skills_skill_animations': 'skills_skill_animations',\n            'related_skills_skill_attack': 'skills_skill_attack',\n            'related_skills_skill_group_relation': 'skills_skill_group_relation',\n            'related_skills_skill_owner_conditions': 'skills_skill_owner_conditions',\n            'related_skills_skill_owner_effects': 'skills_skill_owner_effects',\n            'related_skills_skill_physical_data': 'skills_skill_physical_data',\n            'related_skills_skill_target_effects': 'skills_skill_target_effects'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillModel = SkillsSkillModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-owner-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerConditionsModel\n *\n */\n\nclass SkillsSkillOwnerConditionsModel\n{\n\n    constructor(id, skill_id, key, property_key, conditional, value)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.conditional = conditional;\n        this.value = value;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_owner_conditions';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_skill: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill': 'skills_skill'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillOwnerConditionsModel = SkillsSkillOwnerConditionsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-owner-effects-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsConditionsModel\n *\n */\n\nclass SkillsSkillOwnerEffectsConditionsModel\n{\n\n    constructor(id, skill_owner_effect_id, key, property_key, conditional, value)\n    {\n        this.id = id;\n        this.skill_owner_effect_id = skill_owner_effect_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.conditional = conditional;\n        this.value = value;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_owner_effects_conditions';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_skill_owner_effects: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill_owner_effects': 'skills_skill_owner_effects'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillOwnerEffectsConditionsModel = SkillsSkillOwnerEffectsConditionsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-owner-effects-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsModel\n *\n */\n\nclass SkillsSkillOwnerEffectsModel\n{\n\n    constructor(id, skill_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_owner_effects';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            operation_types: 'one',\n            skills_skill: 'one',\n            skills_skill_owner_effects_conditions: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill': 'skills_skill',\n            'related_operation_types': 'operation_types',\n            'related_skills_skill_owner_effects_conditions': 'skills_skill_owner_effects_conditions'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillOwnerEffectsModel = SkillsSkillOwnerEffectsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-physical-data-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillPhysicalDataModel\n *\n */\n\nclass SkillsSkillPhysicalDataModel\n{\n\n    constructor(id, skill_id, magnitude, objectWidth, objectHeight, validateTargetOnHit)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.magnitude = magnitude;\n        this.objectWidth = objectWidth;\n        this.objectHeight = objectHeight;\n        this.validateTargetOnHit = validateTargetOnHit;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_physical_data';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_skill: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill': 'skills_skill'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillPhysicalDataModel = SkillsSkillPhysicalDataModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-target-effects-conditions-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTargetEffectsConditionsModel\n *\n */\n\nclass SkillsSkillTargetEffectsConditionsModel\n{\n\n    constructor(id, skill_target_effect_id, key, property_key, conditional, value)\n    {\n        this.id = id;\n        this.skill_target_effect_id = skill_target_effect_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.conditional = conditional;\n        this.value = value;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_target_effects_conditions';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_skill_target_effects: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill_target_effects': 'skills_skill_target_effects'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillTargetEffectsConditionsModel = SkillsSkillTargetEffectsConditionsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-target-effects-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTargetEffectsModel\n *\n */\n\nclass SkillsSkillTargetEffectsModel\n{\n\n    constructor(id, skill_id, key, property_key, operation, value, minValue, maxValue, minProperty, maxProperty)\n    {\n        this.id = id;\n        this.skill_id = skill_id;\n        this.key = key;\n        this.property_key = property_key;\n        this.operation = operation;\n        this.value = value;\n        this.minValue = minValue;\n        this.maxValue = maxValue;\n        this.minProperty = minProperty;\n        this.maxProperty = maxProperty;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_target_effects';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_skill: 'one',\n            operation_types: 'one',\n            skills_skill_target_effects_conditions: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill': 'skills_skill',\n            'related_operation_types': 'operation_types',\n            'related_skills_skill_target_effects_conditions': 'skills_skill_target_effects_conditions'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillTargetEffectsModel = SkillsSkillTargetEffectsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/skills-skill-type-model.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTypeModel\n *\n */\n\nclass SkillsSkillTypeModel\n{\n\n    constructor(id, key)\n    {\n        this.id = id;\n        this.key = key;\n    }\n\n    static get tableName()\n    {\n        return 'skills_skill_type';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            skills_skill: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_skills_skill': 'skills_skill'\n        };\n    }\n}\n\nmodule.exports.SkillsSkillTypeModel = SkillsSkillTypeModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/snippets-model.js",
    "content": "/**\n *\n * Reldens - SnippetsModel\n *\n */\n\nclass SnippetsModel\n{\n\n    constructor(id, locale_id, key, value, created_at, updated_at)\n    {\n        this.id = id;\n        this.locale_id = locale_id;\n        this.key = key;\n        this.value = value;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'snippets';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            locale: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_locale': 'locale'\n        };\n    }\n}\n\nmodule.exports.SnippetsModel = SnippetsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/stats-model.js",
    "content": "/**\n *\n * Reldens - StatsModel\n *\n */\n\nclass StatsModel\n{\n\n    constructor(id, key, label, description, base_value, customData, created_at, updated_at)\n    {\n        this.id = id;\n        this.key = key;\n        this.label = label;\n        this.description = description;\n        this.base_value = base_value;\n        this.customData = customData;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n    }\n\n    static get tableName()\n    {\n        return 'stats';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects_stats: 'many',\n            players_stats: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects_stats': 'objects_stats',\n            'related_players_stats': 'players_stats'\n        };\n    }\n}\n\nmodule.exports.StatsModel = StatsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/target-options-model.js",
    "content": "/**\n *\n * Reldens - TargetOptionsModel\n *\n */\n\nclass TargetOptionsModel\n{\n\n    constructor(id, target_key, target_label)\n    {\n        this.id = id;\n        this.target_key = target_key;\n        this.target_label = target_label;\n    }\n\n    static get tableName()\n    {\n        return 'target_options';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            objects_skills: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_objects_skills': 'objects_skills'\n        };\n    }\n}\n\nmodule.exports.TargetOptionsModel = TargetOptionsModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/users-locale-model.js",
    "content": "/**\n *\n * Reldens - UsersLocaleModel\n *\n */\n\nclass UsersLocaleModel\n{\n\n    constructor(id, locale_id, user_id)\n    {\n        this.id = id;\n        this.locale_id = locale_id;\n        this.user_id = user_id;\n    }\n\n    static get tableName()\n    {\n        return 'users_locale';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            locale: 'one',\n            users: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_locale': 'locale',\n            'related_users': 'users'\n        };\n    }\n}\n\nmodule.exports.UsersLocaleModel = UsersLocaleModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/users-login-model.js",
    "content": "/**\n *\n * Reldens - UsersLoginModel\n *\n */\n\nclass UsersLoginModel\n{\n\n    constructor(id, user_id, login_date, logout_date)\n    {\n        this.id = id;\n        this.user_id = user_id;\n        this.login_date = login_date;\n        this.logout_date = logout_date;\n    }\n\n    static get tableName()\n    {\n        return 'users_login';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            users: 'one'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_users': 'users'\n        };\n    }\n}\n\nmodule.exports.UsersLoginModel = UsersLoginModel;\n"
  },
  {
    "path": "generated-entities/models/prisma/users-model.js",
    "content": "/**\n *\n * Reldens - UsersModel\n *\n */\n\nclass UsersModel\n{\n\n    constructor(id, email, username, password, role_id, status, created_at, updated_at, played_time, login_count)\n    {\n        this.id = id;\n        this.email = email;\n        this.username = username;\n        this.password = password;\n        this.role_id = role_id;\n        this.status = status;\n        this.created_at = created_at;\n        this.updated_at = updated_at;\n        this.played_time = played_time;\n        this.login_count = login_count;\n    }\n\n    static get tableName()\n    {\n        return 'users';\n    }\n    \n\n    static get relationTypes()\n    {\n        return {\n            players: 'many',\n            users_locale: 'many',\n            users_login: 'many'\n        };\n    }\n\n    static get relationMappings()\n    {\n        return {\n            'related_players': 'players',\n            'related_users_locale': 'users_locale',\n            'related_users_login': 'users_login'\n        };\n    }\n}\n\nmodule.exports.UsersModel = UsersModel;\n"
  },
  {
    "path": "install/css/styles.scss",
    "content": "/**\n *\n * Reldens - Installer\n *\n */\n\n$normalFont: Verdana, Geneva, sans-serif;\n$reldensFont: \"Play\", sans-serif;\n$cReldens: #2f7dde;\n$cDarkBlue: #37517e;\n$cWhite: #fff;\n$cLightGrey: #ccc;\n$cBlack: #000;\n$cRed: #ff0000;\n$titleBackground: #f2f2f2;\n$boxBackground: rgba(255, 255, 255, 0.6);\n\nbody, html {\n    height: 100%;\n    margin: 0;\n    padding: 0;\n}\n\nbody {\n    font-family: $normalFont;\n    background-color: transparent;\n    user-select: none;\n\n    .wrapper {\n        display: flex;\n        flex-direction: column;\n        justify-content: space-between;\n        min-height: 100%;\n        overflow: auto;\n        z-index: 10000;\n        background-size: cover;\n        background-color: $cDarkBlue;\n\n        .header,\n        .footer,\n        .content {\n            width: 100%;\n        }\n\n        .header,\n        .footer {\n            color: $cWhite;\n        }\n\n        .header {\n            display: flex;\n            flex-wrap: wrap;\n            flex-direction: row;\n            align-items: center;\n            background-color: $cBlack;\n            height: 14%;\n            max-height: 100px;\n        }\n\n        .content {\n            height: 80%;\n        }\n\n        .footer {\n            display: flex;\n            height: 6%;\n            background-color: $cBlack;\n            padding: min(10px, 1%) 0;\n        }\n\n    }\n\n}\n\n.text-black {\n    color: $cBlack;\n}\n\n.hidden {\n    display: none;\n}\n\n.header {\n    #your-logo {\n        margin-left: 2%;\n    }\n\n    h1 {\n        position: relative;\n        display: block;\n        margin: 0 auto;\n        padding: 2% 0;\n        font-family: $reldensFont;\n        font-size: 1.5em;\n\n        strong {\n            color: $cReldens;\n            font-weight: bold;\n        }\n\n    }\n\n    @media (max-height: 390px) {\n\n        h1 {\n            font-size: 1em;\n            padding-top: 0.2em;\n        }\n\n    }\n\n}\n\n.footer {\n    .copyright {\n        position: relative;\n        display: block;\n        width: 100%;\n        margin: 0;\n        padding: 0;\n        text-align: center;\n\n        a, a:hover, a:visited {\n            display: block;\n            color: #fff;\n            text-decoration: none;\n            padding: 0;\n        }\n\n    }\n\n}\n\n.content {\n    min-height: 300px;\n\n    .forms-container {\n        display: flex;\n        flex-direction: row;\n        height: 100%;\n        width: 100%;\n        justify-content: center;\n\n        .install-form {\n            display:flex;\n            max-width: 1000px;\n            flex-direction: row;\n            flex-wrap: wrap;\n            margin: 0 auto;\n            padding: 2%;\n            background-color: $boxBackground;\n            border: 2px solid $cWhite;\n            box-shadow: 10px 10px 14px 2px rgba(0, 0, 0, 0.6);\n        }\n    }\n\n}\n\nbutton,\ninput[type=\"button\"],\ninput[type=\"submit\"] {\n    cursor: pointer;\n}\n\n.row {\n    display: flex;\n    position: relative;\n    width: 100%;\n    margin: 0 auto 10px;\n    padding: 0;\n    box-sizing: border-box;\n    border: none;\n\n    &.hidden {\n        display: none;\n    }\n}\n\n.col-2 {\n    display: flex;\n    position: relative;\n    flex-direction: column;\n    flex-wrap: wrap;\n    width: 46%;\n    margin: 0;\n    padding: 2%;\n}\n\n.col-left {\n    align-content: end;\n}\n\n.col-right {\n    align-content: start;\n}\n\n@media (max-width: 725px) {\n\n    .row {\n        max-width: none;\n    }\n\n    .col-2 {\n        width: 90%;\n        padding: 0;\n        margin: 0 auto;\n    }\n\n    .footer {\n        display: none;\n    }\n\n    .content {\n        height: 92%;\n\n        .forms-container {\n            flex-direction: column;\n        }\n    }\n\n}\n\n@media (min-width: 725px) and (max-width: 751px) {\n    form .input-box.reg-re-password label {\n        margin-top: 1px;\n    }\n}\n\nh3.form-title {\n    text-align: center;\n    background: $titleBackground;\n    padding: 10px 0;\n    border: 1px solid #ccc;\n}\n\nform {\n    .input-box {\n        display: flex;\n        position: relative;\n        flex-direction: row;\n        justify-content: space-between;\n        width: 100%;\n        margin-bottom: 10px;\n\n        &.db-basic-config,\n        &.app-allow-packages-installation {\n            display: flex;\n            flex-direction: column;\n            background: $boxBackground;\n            margin-bottom: 0;\n\n            label {\n                width: auto;\n            }\n\n            input {\n                top: 5px;\n            }\n\n            .db-basic-config-checkbox,\n            .app-allow-packages-installation-checkbox {\n                display: flex;\n                flex-direction: row;\n                justify-content: end;\n                padding: 0 0 6px;\n            }\n\n            .notice-box,\n            .db-basic-config-notice,\n            .app-allow-packages-installation-notice {\n                margin-bottom: 0;\n                background: none;\n            }\n\n        }\n\n        &.db-sample-data,\n        &.app-use-https,\n        &.app-use-monitor,\n        &.app-secure-monitor,\n        &.mailer-enable,\n        &.mailer-secure,\n        &.firebase-enable,\n        &.app-admin-hot-plug {\n            justify-content: end;\n            margin-top: 4px;\n            padding: 0 0 6px 0;\n            background: $boxBackground;\n\n            label {\n                width: auto;\n            }\n\n            input {\n                top: 5px;\n            }\n        }\n\n        &.hidden, &.https-filter, &.monitor-filter, &.mailer-filter, &.firebase-filter {\n            display: none;\n        }\n\n        &.submit-container,\n        &.terms-and-conditions-link-container {\n            justify-content: end;\n        }\n\n        &.submit-container {\n            padding: 0 2%;\n            box-sizing: border-box;\n            justify-content: end;\n            align-items: start;\n            gap: 1rem;\n        }\n\n        label {\n            display: block;\n            position: relative;\n            font-size: 12px;\n            margin-top: 10px;\n            width: 40%;\n            text-align: right;\n        }\n\n        input {\n            display: block;\n            position: relative;\n            border: 1px solid $cLightGrey;\n            padding: 8px;\n        }\n\n        input[type=\"text\"],\n        input[type=\"email\"],\n        input[type=\"password\"] {\n            width: 50%;\n            max-width: 268px;\n        }\n\n        select {\n            height: 2rem;\n            width: 100%;\n            max-width: 250px;\n        }\n\n    }\n\n    .notice-box,\n    .db-basic-config-notice,\n    .app-allow-packages-installation-notice {\n        display: flex;\n        justify-content: flex-end;\n        background: $boxBackground;\n        margin-bottom: 10px;\n        font-size: 12px;\n        font-weight: normal;\n\n        ul {\n            margin-bottom: 0;\n        }\n\n        span {\n            color: $cBlack;\n            padding: 10px;\n            &.danger {\n                font-weight: bold;\n                color: $cRed;\n                cursor: pointer;\n                width: 100%;\n                text-align: center;\n\n                ul {\n                    display: none;\n                    text-align: left;\n\n                    &.expanded {\n                        display: block;\n                    }\n                }\n            }\n        }\n    }\n\n    .notice-box {\n        justify-content: flex-start;\n        padding: 0 0 1rem;\n    }\n\n}\n\n.installation-successful {\n    display: block;\n    padding: 10px;\n    background: $boxBackground;\n    text-align: center;\n    text-decoration: none;\n    font-size: 2em;\n    color: #000;\n}\n\n.app-error, .db-error {\n    p {\n        display: none;\n        width: 100%;\n        padding: 2%;\n        background: $boxBackground;\n        font-size: 12px;\n        font-weight: bold;\n        color: $cRed;\n    }\n\n    p.active {\n        display: block;\n    }\n}\n\n.loading-status-wrapper {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    gap: 8px;\n\n    &.hidden {\n        display: none;\n    }\n}\n\n.install-loading {\n    max-width: 50px;\n}\n\n.install-status-message {\n    padding: 8px 12px;\n    font-size: 11px;\n    font-weight: bold;\n    color: $cDarkBlue;\n    background: $boxBackground;\n    border-radius: 3px;\n    text-align: center;\n    white-space: nowrap;\n}\n\n#install-submit-button.disabled {\n    background-color: $boxBackground;\n}\n"
  },
  {
    "path": "install/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>DwDeveloper - Reldens | MMORPG Platform</title>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Play:300,300i,400,400i,500,500i,600,600i,700,700i\" rel=\"stylesheet\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"./assets/favicons/apple-touch-icon.png\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"./assets/favicons/favicon-32x32.png\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"./assets/favicons/favicon-16x16.png\"/>\n    <link rel=\"manifest\" href=\"./site.webmanifest\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"./css/styles.scss\"/>\n    <script type=\"module\" src=\"./index.js\"></script>\n</head>\n<body>\n<div class=\"wrapper\">\n    <div class=\"header\">\n        <h1 class=\"title\">\n            - <strong>Reldens</strong> - <span id=\"current-version\">Installation</span>\n        </h1>\n    </div>\n    <div class=\"content\">\n        <div class=\"forms-container\">\n            <div class=\"row\">\n                <form name=\"install-form\" id=\"install-form\" class=\"install-form\" action=\"/install\" method=\"post\">\n                    <div class=\"col-2\">\n                        <!-- APP -->\n                        <h3 class=\"form-title\">- App -</h3>\n                        <div class=\"input-box app-host\">\n                            <label for=\"app-host\">Host</label>\n                            <input type=\"text\" name=\"app-host\" id=\"app-host\" value=\"{{app-host}}\" class=\"required\" required/>\n                        </div>\n                        <div class=\"input-box app-port\">\n                            <label for=\"app-port\">Port</label>\n                            <input type=\"text\" name=\"app-port\" id=\"app-port\" value=\"{{app-port}}\" class=\"required\" required/>\n                        </div>\n                        <div class=\"input-box app-trusted-proxy\">\n                            <label for=\"app-trusted-proxy\">Trusted Proxy (or reverse proxy)</label>\n                            <input type=\"text\" name=\"app-trusted-proxy\" id=\"app-trusted-proxy\" value=\"{{app-trusted-proxy}}\"/>\n                        </div>\n                        <div class=\"input-box app-public-url\">\n                            <label for=\"app-public-url\">Public URL (useful if you have a reverse proxy)</label>\n                            <input type=\"text\" name=\"app-public-url\" id=\"app-public-url\" value=\"{{app-public-url}}\" class=\"required\" required/>\n                        </div>\n                        <div class=\"input-box app-admin-path\">\n                            <label for=\"app-admin-path\">Admin Panel Path</label>\n                            <input type=\"text\" name=\"app-admin-path\" id=\"app-admin-path\" value=\"{{app-admin-path}}\"/>\n                        </div>\n                        <div class=\"input-box app-admin-secret\">\n                            <label for=\"app-admin-secret\">Admin Panel Secret Key</label>\n                            <input type=\"text\" name=\"app-admin-secret\" id=\"app-admin-secret\" value=\"{{app-admin-secret}}\" class=\"required\" required/>\n                        </div>\n                        <div class=\"input-box app-admin-hot-plug\">\n                            <label for=\"app-admin-hot-plug\">Hot-Plug</label>\n                            <input type=\"checkbox\" value=\"1\" name=\"app-admin-hot-plug\" id=\"app-admin-hot-plug\"{{&app-admin-hot-plug-checked}}/>\n                        </div>\n                        <div class=\"input-box app-allow-packages-installation\">\n                            <div class=\"app-allow-packages-installation-notice\">\n                                <span class=\"danger\">\n                                    DANGER (?)\n                                    <ul>\n                                        <li>The installer will attempt to run npm install for missing packages.</li>\n                                        <li>Uncheck this only if you have manually installed all required packages or if you are not using NPM.</li>\n                                        <li>Required packages: @reldens/storage (always), @prisma/client (Prisma driver only).</li>\n                                    </ul>\n                                </span>\n                            </div>\n                            <div class=\"app-allow-packages-installation-checkbox\">\n                                <label for=\"app-allow-packages-installation\">Allow installer to run npm install for missing packages</label>\n                                <input type=\"checkbox\" value=\"1\" name=\"app-allow-packages-installation\" id=\"app-allow-packages-installation\"{{&app-allow-packages-installation-checked}}/>\n                            </div>\n                        </div>\n                        <div class=\"input-box app-error\">\n                            <p class=\"installation-process-failed\">There was an error during the installation process.</p>\n                        </div>\n\n                        <!-- HTTPS -->\n                        <div class=\"input-box app-use-https\">\n                            <label for=\"app-use-https\">Use HTTPS</label>\n                            <input type=\"checkbox\" value=\"1\" name=\"app-use-https\" id=\"app-use-https\"{{&app-use-https-checked}}/>\n                        </div>\n                        <div class=\"notice-box https-filter\">\n                            <ul>\n                                <li>Key: Accept .key or .pem</li>\n                                <li>Cert: Accept .crt, .cer, or .pem</li>\n                                <li>Chain: Accept .ca-bundle, .chain.pem, .pem, or .ca.pem</li>\n                            </ul>\n                        </div>\n                        <div class=\"input-box app-https-key-pem https-filter\">\n                            <label for=\"app-https-key-pem\">Path to the key file</label>\n                            <input type=\"text\" name=\"app-https-key-pem\" id=\"app-https-key-pem\" value=\"{{app-https-key-pem}}\"/>\n                        </div>\n                        <div class=\"input-box app-https-cert-pem https-filter\">\n                            <label for=\"app-https-cert-pem\">Path to the certificate file</label>\n                            <input type=\"text\" name=\"app-https-cert-pem\" id=\"app-https-cert-pem\" value=\"{{app-https-cert-pem}}\"/>\n                        </div>\n                        <div class=\"input-box app-https-chain-pem https-filter\">\n                            <label for=\"app-https-chain-pem\">Path to the chain file</label>\n                            <input type=\"text\" name=\"app-https-chain-pem\" id=\"app-https-chain-pem\" value=\"{{app-https-chain-pem}}\"/>\n                        </div>\n                        <div class=\"input-box app-https-passphrase https-filter\">\n                            <label for=\"app-https-passphrase\">Passphrase</label>\n                            <input type=\"password\" name=\"app-https-passphrase\" id=\"app-https-passphrase\" value=\"{{app-https-passphrase}}\"/>\n                        </div>\n\n                        <!-- MONITOR -->\n                        <div class=\"input-box app-use-monitor\">\n                            <label for=\"app-use-monitor\">Enable Monitor</label>\n                            <input type=\"checkbox\" value=\"1\" name=\"app-use-monitor\" id=\"app-use-monitor\"{{&app-use-monitor-checked}}/>\n                        </div>\n                        <div class=\"input-box app-secure-monitor monitor-filter\">\n                            <label for=\"app-secure-monitor\">Secure Monitor</label>\n                            <input type=\"checkbox\" value=\"1\" name=\"app-secure-monitor\" id=\"app-secure-monitor\"{{&app-secure-monitor-checked}}/>\n                        </div>\n                        <div class=\"input-box app-monitor-user monitor-filter secure-monitor-filter\">\n                            <label for=\"app-monitor-user\">Monitor username</label>\n                            <input type=\"text\" name=\"app-monitor-user\" id=\"app-monitor-user\" value=\"{{app-monitor-user}}\"/>\n                        </div>\n                        <div class=\"input-box app-monitor-password monitor-filter secure-monitor-filter\">\n                            <label for=\"app-monitor-password\">Monitor password</label>\n                            <input type=\"password\" name=\"app-monitor-password\" id=\"app-monitor-password\" value=\"{{app-monitor-password}}\"/>\n                        </div>\n                    </div>\n                    <div class=\"col-2\">\n                        <!-- STORAGE -->\n                        <h3 class=\"form-title\">- Storage -</h3>\n                        <div class=\"input-box db-storage-driver\">\n                            <label for=\"db-storage-driver\">Storage Driver</label>\n                            <select name=\"db-storage-driver\" id=\"db-storage-driver\" class=\"required\" required>\n                                <option value=\"prisma\"{{&db-storage-driver-prisma}}>Prisma</option>\n                                <option value=\"objection-js\"{{&db-storage-driver-objection-js}}>Objection JS</option>\n                                <option value=\"mikro-orm\"{{&db-storage-driver-mikro-orm}}>MikroORM (untested)</option>\n                            </select>\n                        </div>\n                        <div class=\"input-box db-client\">\n                            <label for=\"db-client\">Client</label>\n                            <select name=\"db-client\" id=\"db-client\" class=\"required\" required>\n                                <option value=\"{{db-client}}\">{{db-client}}</option>\n                            </select>\n                        </div>\n                        <div class=\"input-box db-host\">\n                            <label for=\"db-host\">Host</label>\n                            <input type=\"text\" name=\"db-host\" id=\"db-host\" value=\"{{db-host}}\" class=\"required\" required/>\n                        </div>\n                        <div class=\"input-box db-port\">\n                            <label for=\"db-port\">Port</label>\n                            <input type=\"text\" name=\"db-port\" id=\"db-port\" value=\"{{db-port}}\" class=\"required\" required/>\n                        </div>\n                        <div class=\"input-box db-name\">\n                            <label for=\"db-name\">Database Name</label>\n                            <input type=\"text\" name=\"db-name\" id=\"db-name\" value=\"{{db-name}}\" class=\"required\" required/>\n                        </div>\n                        <div class=\"input-box db-username\">\n                            <label for=\"db-username\">Username</label>\n                            <input type=\"text\" name=\"db-username\" id=\"db-username\" value=\"{{db-username}}\" class=\"required\" required/>\n                        </div>\n                        <div class=\"input-box db-password\">\n                            <label for=\"db-password\">Password</label>\n                            <input type=\"password\" name=\"db-password\" id=\"db-password\" value=\"{{db-password}}\" class=\"required\" required autocomplete=\"off\"/>\n                        </div>\n                        <div class=\"input-box db-error\">\n                            <p class=\"connection-failed\">Connection failed, please check the storage configuration.</p>\n                            <p class=\"invalid-driver\">Invalid storage driver.</p>\n                            <p class=\"raw-query-not-found\">Method \"rawQuery\" not found in the specified storage driver.</p>\n                            <p class=\"db-installation-process-failed\">There was an error during the installation process.</p>\n                        </div>\n                        <div class=\"input-box db-basic-config\">\n                            <div class=\"db-basic-config-notice\">\n                                <span class=\"danger\">\n                                    DANGER (?)\n                                    <ul>\n                                        <li>The automatic installation for the basic configuration and the sample data are only available for the MySQL client.</li>\n                                        <li>Uncheck this is only if you know what you are doing. <br/>Without this you will get all the tables empty, even the ones with default required values.</li>\n                                    </ul>\n                                </span>\n                            </div>\n                            <div class=\"db-basic-config-checkbox\">\n                                <label for=\"db-basic-config\">Install minimal configuration</label>\n                                <input type=\"checkbox\" value=\"1\" name=\"db-basic-config\" id=\"db-basic-config\"{{&db-basic-config-checked}}/>\n                            </div>\n                        </div>\n                        <div class=\"input-box db-sample-data\">\n                            <label for=\"db-sample-data\">Install sample data</label>\n                            <input type=\"checkbox\" value=\"1\" name=\"db-sample-data\" id=\"db-sample-data\"{{&db-sample-data-checked}}/>\n                        </div>\n                    </div>\n                    <div class=\"col-2\">\n                        <!-- MAILER -->\n                        <h3 class=\"form-title\">- Mailer -</h3>\n                        <div class=\"input-box mailer-enable\">\n                            <label for=\"mailer-enable\">Enable NodeMailer</label>\n                            <input type=\"checkbox\" value=\"1\" name=\"mailer-enable\" id=\"mailer-enable\"{{&mailer-enable-checked}}/>\n                        </div>\n                        <div class=\"input-box mailer-service mailer-filter\">\n                            <label for=\"mailer-service\">Service</label>\n                            <select name=\"mailer-service\" id=\"mailer-service\">\n                                <option value=\"sendgrid\"{{&mailer-service-sendgrid}}>SendGrid</option>\n                                <option value=\"nodemailer\"{{&mailer-service-nodemailer}}>NodeMailer</option>\n                            </select>\n                        </div>\n                        <div class=\"input-box mailer-host mailer-filter\">\n                            <label for=\"mailer-host\">Host</label>\n                            <input type=\"text\" name=\"mailer-host\" id=\"mailer-host\"/>\n                        </div>\n                        <div class=\"input-box mailer-secure mailer-filter\">\n                            <label for=\"mailer-secure\">Secure (SSL)</label>\n                            <input type=\"checkbox\" value=\"1\" name=\"mailer-secure\" id=\"mailer-secure\"{{&mailer-secure-checked}}/>\n                        </div>\n                        <div class=\"input-box mailer-port mailer-filter\">\n                            <label for=\"mailer-port\">Port</label>\n                            <input type=\"text\" name=\"mailer-port\" id=\"mailer-port\" value=\"{{mailer-port}}\"/>\n                        </div>\n                        <div class=\"input-box mailer-username mailer-filter\">\n                            <label for=\"mailer-username\">Username</label>\n                            <input type=\"text\" name=\"mailer-username\" id=\"mailer-username\" value=\"{{mailer-username}}\"/>\n                        </div>\n                        <div class=\"input-box mailer-password mailer-filter\">\n                            <label for=\"mailer-password\">Password</label>\n                            <input type=\"password\" name=\"mailer-password\" id=\"mailer-password\" value=\"{{mailer-password}}\" autocomplete=\"off\"/>\n                        </div>\n                        <div class=\"input-box mailer-from mailer-filter\">\n                            <label for=\"mailer-from\">From email</label>\n                            <input type=\"text\" name=\"mailer-from\" id=\"mailer-from\" value=\"{{mailer-from}}\"/>\n                        </div>\n                    </div>\n                    <div class=\"col-2\">\n                        <!-- FIREBASE -->\n                        <h3 class=\"form-title\">- Firebase (for login) -</h3>\n                        <div class=\"input-box firebase-enable\">\n                            <label for=\"firebase-enable\">Enable Firebase</label>\n                            <input type=\"checkbox\" value=\"1\" name=\"firebase-enable\" id=\"firebase-enable\"{{&firebase-enable-checked}}/>\n                        </div>\n                        <div class=\"input-box firebase-api-key firebase-filter\">\n                            <label for=\"firebase-api-key\">API key</label>\n                            <input type=\"text\" name=\"firebase-api-key\" id=\"firebase-api-key\" value=\"{{firebase-api-key}}\"/>\n                        </div>\n                        <div class=\"input-box firebase-api-id firebase-filter\">\n                            <label for=\"firebase-api-id\">Api ID</label>\n                            <input type=\"text\" name=\"firebase-api-id\" id=\"firebase-api-id\" value=\"{{firebase-api-id}}\"/>\n                        </div>\n                        <div class=\"input-box firebase-auth-domain firebase-filter\">\n                            <label for=\"firebase-auth-domain\">Auth domain</label>\n                            <input type=\"text\" name=\"firebase-auth-domain\" id=\"firebase-auth-domain\" value=\"{{firebase-auth-domain}}\"/>\n                        </div>\n                        <div class=\"input-box firebase-database-url firebase-filter\">\n                            <label for=\"firebase-database-url\">Database URL</label>\n                            <input type=\"text\" name=\"firebase-database-url\" id=\"firebase-database-url\" value=\"{{firebase-database-url}}\"/>\n                        </div>\n                        <div class=\"input-box firebase-project-id firebase-filter\">\n                            <label for=\"firebase-project-id\">Project ID</label>\n                            <input type=\"text\" name=\"firebase-project-id\" id=\"firebase-project-id\" value=\"{{firebase-project-id}}\"/>\n                        </div>\n                        <div class=\"input-box firebase-storage-bucket firebase-filter\">\n                            <label for=\"firebase-storage-bucket\">Storage bucket</label>\n                            <input type=\"text\" name=\"firebase-storage-bucket\" id=\"firebase-storage-bucket\" value=\"{{firebase-storage-bucket}}\"/>\n                        </div>\n                        <div class=\"input-box firebase-sender-id firebase-filter\">\n                            <label for=\"firebase-sender-id\">Sender ID</label>\n                            <input type=\"text\" name=\"firebase-sender-id\" id=\"firebase-sender-id\" value=\"{{firebase-sender-id}}\"/>\n                        </div>\n                        <div class=\"input-box firebase-measurement-id firebase-filter\">\n                            <label for=\"firebase-measurement-id\">Measurement ID (GA)</label>\n                            <input type=\"text\" name=\"firebase-measurement-id\" id=\"firebase-measurement-id\" value=\"{{firebase-measurement-id}}\"/>\n                        </div>\n                    </div>\n                    <!-- SUBMIT -->\n                    <div class=\"input-box submit-container\">\n                        <div class=\"loading-status-wrapper hidden\">\n                            <div class=\"install-status-message\">This may take a few minutes...</div>\n                            <img class=\"install-loading\" src=\"./assets/web/loading.gif\" alt=\"loading\"/>\n                        </div>\n                        <input id=\"install-submit-button\" type=\"submit\" value=\"Install\"/>\n                    </div>\n                    <div class=\"input-box response-error\"></div>\n                </form>\n            </div>\n        </div>\n    </div>\n    <div class=\"footer\">\n        <div class=\"copyright\">\n            <a href=\"https://www.dwdeveloper.com/\">by DwDeveloper</a>\n        </div>\n    </div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "install/index.js",
    "content": "/**\n *\n * Reldens - Install\n *\n */\n\nconst DB_CLIENTS_MAP = {\n    'prisma': [\n        {value: 'mysql', label: 'MySQL'},\n        {value: 'postgresql', label: 'PostgreSQL (manual)'},\n        {value: 'sqlite', label: 'SQLite (manual)'},\n        {value: 'sqlserver', label: 'SQL Server (manual)'},\n        {value: 'mongodb', label: 'MongoDB (manual)'},\n        {value: 'cockroachdb', label: 'CockroachDB (manual)'}\n    ],\n    'objection-js': [\n        {value: 'mysql', label: 'MySQL (native)'},\n        {value: 'mysql2', label: 'MySQL2 (recommended)'},\n        {value: 'pg', label: 'PostgreSQL (manual)'},\n        {value: 'sqlite3', label: 'SQLite3 (manual)'},\n        {value: 'better-sqlite3', label: 'Better-SQLite3 (manual)'},\n        {value: 'mssql', label: 'SQL Server (manual)'},\n        {value: 'oracledb', label: 'Oracle DB (manual)'},\n        {value: 'cockroachdb', label: 'CockroachDB (manual)'}\n    ],\n    'mikro-orm': [\n        {value: 'mysql', label: 'MySQL'},\n        {value: 'mariadb', label: 'MariaDB (manual)'},\n        {value: 'postgresql', label: 'PostgreSQL (manual)'},\n        {value: 'sqlite', label: 'SQLite (manual)'},\n        {value: 'mongodb', label: 'MongoDB (manual)'},\n        {value: 'mssql', label: 'SQL Server (manual)'},\n        {value: 'better-sqlite3', label: 'Better-SQLite3 (manual)'}\n    ]\n};\n\nwindow.addEventListener('load', () => {\n\n    const expanders = [\n        {key: 'app-use-https', filterClass: 'https-filter'},\n        {key: 'app-use-monitor', filterClass: 'monitor-filter'},\n        {key: 'app-secure-monitor', filterClass: 'secure-monitor-filter'},\n        {key: 'mailer-enable', filterClass: 'mailer-filter'},\n        {key: 'firebase-enable', filterClass: 'firebase-filter'}\n    ];\n\n    function toggleExpander(isChecked, expander)\n    {\n        const display = isChecked ? 'flex' : 'none';\n        const elements = document.getElementsByClassName(expander.filterClass);\n        for (let element of elements) {\n            element.style.display = display;\n        }\n    }\n\n    for(let expander of expanders){\n        let expanderElement = document.getElementById(expander.key);\n        expanderElement.addEventListener('click', (event) => {\n            toggleExpander(event?.currentTarget?.checked, expander);\n            if('app-use-monitor' === expander.key && event?.currentTarget?.checked){\n                let secureMonitorElement = document.getElementById('app-secure-monitor');\n                if(secureMonitorElement){\n                    toggleExpander(secureMonitorElement.checked, {key: 'app-secure-monitor', filterClass: 'secure-monitor-filter'});\n                }\n            }\n        });\n        toggleExpander(expanderElement.checked, expander);\n    }\n\n    let useMonitorElement = document.getElementById('app-use-monitor');\n    let secureMonitorElement = document.getElementById('app-secure-monitor');\n    if(useMonitorElement?.checked && secureMonitorElement){\n        toggleExpander(secureMonitorElement.checked, {key: 'app-secure-monitor', filterClass: 'secure-monitor-filter'});\n    }\n\n    let dangerSpans = document.querySelectorAll('span.danger');\n    for(let dangerSpan of dangerSpans){\n        dangerSpan.addEventListener('click', () => {\n            let ulElement = dangerSpan.querySelector('ul');\n            if(ulElement){\n                ulElement.classList.toggle('expanded');\n            }\n        });\n    }\n\n    let urlParams = new URL(window.location.href).searchParams;\n    if('1' === urlParams.get('success')){\n        document.querySelector('.forms-container').style.display = 'none';\n        let newLink = document.createElement('a');\n        newLink.href = '/?ready=1';\n        newLink.target = '_blank';\n        newLink.innerHTML = 'Installation successful, click here to open your game!';\n        newLink.classList.add('installation-successful');\n        document.querySelector('.content').append(newLink);\n    }\n\n    function showInstallError(code)\n    {\n        let errorElement = document.querySelector('.'+code);\n        if(!errorElement){\n            let responseError = document.querySelector('.response-error');\n            if(responseError){\n                responseError.textContent = 'Installation failed with error: '+code;\n            }\n            return;\n        }\n        errorElement.classList.add('active');\n    }\n\n    let errorCode = (urlParams.get('error') || '').toString();\n    if('' !== errorCode){\n        showInstallError(errorCode);\n    }\n\n    function updateClientOptions(driverValue, currentClient)\n    {\n        let clientSelect = document.getElementById('db-client');\n        if(!clientSelect){\n            return;\n        }\n        clientSelect.innerHTML = '';\n        let clients = DB_CLIENTS_MAP[driverValue] || DB_CLIENTS_MAP['prisma'];\n        for(let client of clients){\n            let option = document.createElement('option');\n            option.value = client.value;\n            option.text = client.label;\n            if(currentClient && client.value === currentClient){\n                option.selected = true;\n            }\n            clientSelect.appendChild(option);\n        }\n        if(!currentClient){\n            let defaultClient = 'objection-js' === driverValue ? 'mysql2' : 'mysql';\n            for(let i = 0; i < clientSelect.options.length; i++){\n                if(clientSelect.options[i].value === defaultClient){\n                    clientSelect.selectedIndex = i;\n                    break;\n                }\n            }\n        }\n    }\n\n    let storageDriverSelect = document.getElementById('db-storage-driver');\n    if(storageDriverSelect){\n        let currentClient = document.getElementById('db-client')?.value || '';\n        updateClientOptions(storageDriverSelect.value, currentClient);\n        storageDriverSelect.addEventListener('change', (event) => {\n            updateClientOptions(event.target.value, null);\n        });\n    }\n\n    let statusIntervalId = null;\n    let lastStatusMessage = '';\n\n    function startStatusPolling()\n    {\n        if(statusIntervalId){\n            return;\n        }\n        statusIntervalId = setInterval(() => {\n            fetch('/install-status.json?t='+Date.now())\n                .then(response => {\n                    if(!response.ok){\n                        return null;\n                    }\n                    return response.json();\n                })\n                .then(data => {\n                    if(!data || !data.message){\n                        return;\n                    }\n                    if(data.message === lastStatusMessage){\n                        return;\n                    }\n                    lastStatusMessage = data.message;\n                    let statusContainer = document.querySelector('.install-status-message');\n                    if(statusContainer){\n                        statusContainer.textContent = data.message;\n                    }\n                })\n                .catch(() => {\n                });\n        }, 2000);\n    }\n\n    document.getElementById('install-form').addEventListener('submit', () => {\n        let loadingWrapper = document.querySelector('.loading-status-wrapper');\n        if(loadingWrapper){\n            loadingWrapper.classList.remove('hidden');\n        }\n        let installButton = document.getElementById('install-submit-button');\n        if(installButton){\n            installButton.classList.add('disabled');\n            installButton.disabled = true;\n        }\n        startStatusPolling();\n    });\n\n});\n"
  },
  {
    "path": "install/site.webmanifest",
    "content": "{\"name\":\"\",\"short_name\":\"\",\"icons\":[{\"src\":\"./assets/favicons/android-chrome-192x192.png\",\"sizes\":\"192x192\",\"type\":\"image/png\"},{\"src\":\"./assets/favicons/android-chrome-512x512.png\",\"sizes\":\"512x512\",\"type\":\"image/png\"}],\"theme_color\":\"#ffffff\",\"background_color\":\"#ffffff\",\"display\":\"standalone\"}"
  },
  {
    "path": "lib/actions/client/game-manager-enricher.js",
    "content": "/**\n *\n * Reldens - GameManagerEnricher\n *\n * Enriches the GameManager with a ReceiverWrapper instance for skill message processing.\n *\n */\n\nconst { ReceiverWrapper } = require('./receiver-wrapper');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../users/client/player-engine').PlayerEngine} PlayerEngine\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager - CUSTOM DYNAMIC\n * @typedef {import('../../game/client/room-events').RoomEvents} RoomEvents\n */\nclass GameManagerEnricher\n{\n\n    /**\n     * @param {PlayerEngine} player\n     * @param {RoomEvents} roomEvents\n     * @param {GameManager} gameManager\n     * @returns {boolean|void}\n     */\n    static withReceiver(player, roomEvents, gameManager)\n    {\n        if(!player || !roomEvents || !gameManager){\n            Logger.error('Invalid input parameters for GameManagerEnricher.withReceiver method.');\n            return false;\n        }\n        if(player?.playerId !== roomEvents?.room.sessionId){\n            return false;\n        }\n        if(!gameManager.skills){\n            gameManager.skills = new ReceiverWrapper({owner: player, roomEvents, events: gameManager.events});\n        }\n        if(!gameManager.skillsQueue?.length){\n            return false;\n        }\n        for(let message of gameManager.skillsQueue){\n            gameManager.skills.processMessage(message);\n        }\n        gameManager.skillsQueue = [];\n    }\n\n}\n\nmodule.exports.GameManagerEnricher = GameManagerEnricher;\n"
  },
  {
    "path": "lib/actions/client/messages-guard.js",
    "content": "/**\n *\n * Reldens - MessagesGuard\n *\n * Validates messages to ensure they contain valid action identifiers.\n *\n */\n\nconst { SkillConst } = require('@reldens/skills');\nconst { ActionsConst } = require('../constants');\n\n/**\n * @typedef {Object} ActionMessage\n * @property {string} [act]\n */\nclass MessagesGuard\n{\n\n    /**\n     * @param {ActionMessage} message\n     * @returns {boolean}\n     */\n    static validate(message)\n    {\n        if(!message.act){\n            return false;\n        }\n        return (\n            0 === message.act.indexOf(SkillConst.ACTIONS_PREF)\n            || -1 !== message.act.indexOf(ActionsConst.ACTIONS.SUFFIX.ATTACK)\n            || -1 !== message.act.indexOf(ActionsConst.ACTIONS.SUFFIX.EFFECT)\n            || -1 !== message.act.indexOf(ActionsConst.ACTIONS.SUFFIX.HIT)\n        );\n    }\n\n}\n\nmodule.exports.MessagesGuard = MessagesGuard;\n"
  },
  {
    "path": "lib/actions/client/messages-handler.js",
    "content": "/**\n *\n * Reldens - MessagesHandler\n *\n * Processes or queues action messages based on the current game state.\n *\n */\n\nconst { MessagesGuard } = require('./messages-guard');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n *\n * @typedef {Object} ActionMessage\n * @property {string} act\n */\nclass MessagesHandler\n{\n\n    /**\n     * @param {ActionMessage} message\n     * @param {GameManager} gameManager\n     * @returns {boolean|void}\n     */\n    static processOrQueueMessage(message, gameManager)\n    {\n        if(!MessagesGuard.validate(message)){\n            return false;\n        }\n        let currentScene = gameManager.getActiveScene();\n        if(currentScene && currentScene.player){\n            return gameManager.skills.processMessage(message);\n        }\n        if(!sc.hasOwn(gameManager, 'skillsQueue')){\n            gameManager.skillsQueue = [];\n        }\n        gameManager.skillsQueue.push(message);\n    }\n\n}\n\nmodule.exports.MessagesHandler = MessagesHandler;\n"
  },
  {
    "path": "lib/actions/client/player-selector.js",
    "content": "/**\n *\n * Reldens - PlayerSelector.\n *\n * Manages the class path selector for player creation.\n *\n */\n\nconst { ActionsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-dom').GameDom} GameDom\n *\n * @typedef {Object} PlayerSelectorProps\n * @property {GameManager} [gameManager]\n * @property {EventsManager} [events]\n */\nclass PlayerSelector\n{\n\n    /**\n     * @param {PlayerSelectorProps} props\n     */\n    constructor(props)\n    {\n        /** @type {GameManager|false} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in ActionsPlugin PlayerSelector.');\n        }\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in ActionsPlugin PlayerSelector.');\n        }\n        /** @type {GameDom} */\n        this.gameDom = this.gameManager.gameDom;\n    }\n\n    /**\n     * @param {Object<string, any>} classesData\n     * @param {Object} playersConfig\n     * @param {Object} activePlayer\n     * @returns {boolean}\n     */\n    populateClassesSelector(classesData, playersConfig, activePlayer)\n    {\n        if(!sc.isObject(classesData) || 0 === Object.keys(classesData).length){\n            Logger.error('Classes not defined, can not populate the classes selector.');\n            this.gameDom.getElement('.player-selection-form-errors')?.append(\n                this.gameManager.services?.translator.t('game.errors.missingClasses')\n            );\n            return false;\n        }\n        let multiConfig = sc.get(playersConfig, 'multiplePlayers', false);\n        if((!multiConfig || !multiConfig.enabled) && activePlayer){\n            return false;\n        }\n        let playerAdditional = this.gameDom.getElement(ActionsConst.SELECTORS.PLAYER_CREATION_ADDITIONAL_INFO);\n        if(!playerAdditional){\n            return false;\n        }\n        // @TODO - BETA - Extract all the DOM objects creation, move into the gameDom.\n        this.gameDom.getElement(ActionsConst.SELECTORS.PLAYER_CREATE_FORM)?.classList.remove('hidden');\n        let div = this.gameDom.createElement('div');\n        div.id = 'class-path-selector-box';\n        div.classList.add('input-box');\n        let label = this.gameDom.createElement('label');\n        let classPathSelectId = 'class-path-select';\n        label.htmlFor = classPathSelectId;\n        label.innerText = this.gameManager.services.translator.t(ActionsConst.SNIPPETS.SELECT_CLASS_PATH);\n        let select = this.gameDom.createElement('select');\n        select.id = classPathSelectId;\n        select.name = 'class_path_select';\n        for(let id of Object.keys(classesData)){\n            let option = new Option(classesData[id].label, id);\n            option.dataset.key = classesData[id].key;\n            select.append(option);\n        }\n        div.append(label);\n        div.append(select);\n        if(this.gameManager.config.getWithoutLogs('client/players/multiplePlayers/showAvatar', true)){\n            let avatarDiv = this.gameDom.createElement('div');\n            avatarDiv.className = 'avatar-container';\n            this.appendAvatarOnSelector(select, avatarDiv, playersConfig);\n            div.append(avatarDiv);\n        }\n        playerAdditional.append(div);\n        return true;\n    }\n\n    /**\n     * @param {HTMLSelectElement} select\n     * @param {HTMLElement} container\n     * @param {Object} playersConfig\n     */\n    appendAvatarOnSelector(select, container, playersConfig)\n    {\n        // @TODO - BETA - Refactor, extract all the styles and replace the avatar background by an element.\n        let avatar = this.gameDom.createElement('div');\n        let avatarKey = select.options[select.selectedIndex].dataset.key;\n        avatar.classList.add('class-path-select-avatar');\n        avatar.style.backgroundImage = `url('/assets/custom/sprites/${avatarKey}${GameConst.FILES.EXTENSIONS.PNG}')`;\n        let widthInPx = playersConfig.size.width+'px';\n        avatar.style.backgroundPositionX = '-'+widthInPx;\n        avatar.style.width = widthInPx;\n        avatar.style.height = playersConfig.size.height+'px';\n        select.addEventListener('change', () => {\n            let avatarKey = select.options[select.selectedIndex].dataset.key;\n            avatar.style.backgroundImage = `url('/assets/custom/sprites/${avatarKey}${GameConst.FILES.EXTENSIONS.PNG}')`;\n        });\n        container.append(avatar);\n    }\n\n}\n\nmodule.exports.PlayerSelector = PlayerSelector;\n"
  },
  {
    "path": "lib/actions/client/plugin.js",
    "content": "/**\n *\n * Reldens - ActionsPlugin\n *\n * Client-side plugin for managing actions, skills, and class paths.\n *\n */\n\nconst { SkillsUi } = require('./skills-ui');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { PlayerSelector } = require('./player-selector');\nconst { PreloaderHandler } = require('./preloader-handler');\nconst { MessagesHandler } = require('./messages-handler');\nconst { GameManagerEnricher } = require('./game-manager-enricher');\nconst Translations = require('./snippets/en_US');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst { ActionsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass ActionsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    setup(props)\n    {\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in ActionsPlugin.');\n        }\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in ActionsPlugin.');\n        }\n        this.playerSelector = new PlayerSelector(props);\n        this.preloaderHandler = new PreloaderHandler(props);\n        this.setTranslations();\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    setTranslations()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations, ActionsConst.MESSAGE.DATA_VALUES);\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events || !this.gameManager){\n            return false;\n        }\n        this.events.on('reldens.preloadUiScene', (uiScene) => {\n            this.preloaderHandler.loadContents(uiScene);\n        });\n        this.events.on('reldens.createPreload', (preloadScene) => {\n            this.preloaderHandler.createAnimations(preloadScene);\n        });\n        this.events.on('reldens.createUiScene', (preloadScene) => {\n            this.uiManager = new SkillsUi(preloadScene);\n            this.uiManager.createUi();\n        });\n        this.events.on('reldens.beforeCreateEngine', (initialGameData) => {\n            this.playerSelector.populateClassesSelector(\n                sc.get(initialGameData, 'classesData', {}),\n                initialGameData.gameConfig.client.players,\n                initialGameData.player\n            );\n        });\n        this.events.on('reldens.activateRoom', (room) => {\n            room.onMessage('*', (message) => {\n                MessagesHandler.processOrQueueMessage(message, this.gameManager);\n            });\n        });\n        this.events.on('reldens.playersOnAddReady', (props) => {\n            GameManagerEnricher.withReceiver(props.player, props.roomEvents, this.gameManager);\n        });\n    }\n\n}\n\nmodule.exports.ActionsPlugin = ActionsPlugin;\n"
  },
  {
    "path": "lib/actions/client/preloader-handler.js",
    "content": "/**\n *\n * Reldens - PreloaderHandler.\n *\n * Manages preloading and creation of animations for skills and class paths.\n *\n */\n\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('phaser').Scene} PhaserScene\n *\n * @typedef {Object} PreloaderHandlerProps\n * @property {GameManager} [gameManager]\n * @property {EventsManager} [events]\n * @property {string} [assetsCustomActionsSpritesPath]\n *\n * @typedef {Object} AnimationData\n * @property {string} key\n * @property {string} [skillKey]\n * @property {Object} animationData\n * @property {Object} [classKey]\n */\nclass PreloaderHandler\n{\n\n    /**\n     * @param {PreloaderHandlerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {GameManager|false} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in ActionsPlugin PreloaderHandler.');\n        }\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in ActionsPlugin PreloaderHandler.');\n        }\n        this.setProperties(props);\n    }\n\n    /**\n     * @param {PreloaderHandlerProps} props\n     * @returns {boolean|void}\n     */\n    setProperties(props)\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        this.gameDom = this.gameManager.gameDom;\n        this.initialGameData = this.gameManager.initialGameData;\n        this.levelsAnimConfig = this.gameManager.config.get('client/levels/animations');\n        this.skillsAnimConfig = this.gameManager.config.get('client/skills/animations');\n        this.assetsCustomActionsSpritesPath = sc.get(\n            props,\n            'assetsCustomActionsSpritesPath',\n            'assets/custom/actions/sprites/'\n        );\n        if(!this.gameManager.loadedAssets){\n            this.gameManager.loadedAssets = {};\n        }\n        if(!this.gameManager.createdAnimations){\n            this.gameManager.createdAnimations = {};\n        }\n    }\n\n    /**\n     * @param {PhaserScene} uiScene\n     */\n    loadContents(uiScene)\n    {\n        uiScene.load.html('skillsClassPath', '/assets/features/skills/templates/ui-class-path.html');\n        uiScene.load.html('skillsLevel', '/assets/features/skills/templates/ui-level.html');\n        uiScene.load.html('skillsExperience', '/assets/features/skills/templates/ui-experience.html');\n        uiScene.load.html('skills', '/assets/features/skills/templates/ui-skills.html');\n        uiScene.load.html('skillBox', '/assets/features/skills/templates/ui-skill-box.html');\n        uiScene.load.html('actionBox', '/assets/html/ui-action-box.html');\n        this.preloadClassPaths(uiScene);\n        this.loopAnimationsAnd(this.levelsAnimConfig, 'preload', uiScene);\n        this.loopAnimationsAnd(this.skillsAnimConfig, 'preload', uiScene);\n    }\n\n    /**\n     * @param {PhaserScene} uiScene\n     * @returns {boolean|void}\n     */\n    preloadClassPaths(uiScene)\n    {\n        let classesData = sc.get(this.initialGameData, 'classesData', false);\n        if(!classesData){\n            return false;\n        }\n        for(let i of Object.keys(classesData)){\n            let avatarKey = classesData[i].key;\n            let spriteSheetLoader = uiScene.load.spritesheet(\n                avatarKey,\n                '/assets/custom/sprites/'+avatarKey+GameConst.FILES.EXTENSIONS.PNG,\n                uiScene.playerSpriteSize\n            );\n            spriteSheetLoader.on('filecomplete', async (completedKey) => {\n                this.gameManager.loadedAssets[completedKey] = completedKey;\n            });\n        }\n    }\n\n    /**\n     * @param {PhaserScene} preloadScene\n     */\n    createAnimations(preloadScene)\n    {\n        let levelsAnimations = this.levelsAnimConfig;\n        this.loopAnimationsAnd(levelsAnimations, 'create', preloadScene);\n        let skillsAnimations = this.skillsAnimConfig;\n        this.loopAnimationsAnd(skillsAnimations, 'create', preloadScene);\n        this.createAvatarsAnimations(preloadScene);\n    }\n\n    /**\n     * @param {PhaserScene} preloadScene\n     * @returns {Object<string, string>|boolean}\n     */\n    createAvatarsAnimations(preloadScene)\n    {\n        let classesData = sc.get(this.initialGameData, 'classesData', false);\n        if(!classesData){\n            Logger.debug('Classes data not found. Fallback to player avatar.');\n            return false;\n        }\n        if(!this.gameManager.mappedAvatars){\n            this.gameManager.mappedAvatars = {};\n        }\n        Logger.debug({availableClassesData: classesData});\n        for(let i of Object.keys(classesData)){\n            let avatarKey = classesData[i].key;\n            if(!this.gameManager.loadedAssets[avatarKey]){\n                avatarKey = GameConst.IMAGE_PLAYER;\n                Logger.info('Avatar for class path \"'+avatarKey+'\" not found in assets. Fallback to player avatar.');\n            }\n            this.gameManager.mappedAvatars[avatarKey] = avatarKey;\n            preloadScene.createPlayerAnimations(avatarKey);\n        }\n        return this.gameManager.mappedAvatars;\n    }\n\n    /**\n     * @param {Object<string, AnimationData>} animations\n     * @param {string} command\n     * @param {PhaserScene} uiScene\n     * @returns {boolean|void}\n     */\n    loopAnimationsAnd(animations, command, uiScene)\n    {\n        if(!animations){\n            Logger.warning('Animations not found.', animations);\n            return false;\n        }\n        for(let i of Object.keys(animations)){\n            let data = animations[i];\n            if(!data.animationData.enabled){\n                Logger.debug('Animation \"'+i+'\" not enabled, skipping.', data);\n                continue;\n            }\n            Logger.debug({[command+'Animation']: data});\n            this[command+'Animation'](data, uiScene);\n        }\n    }\n\n    /**\n     * @param {AnimationData} data\n     * @param {PhaserScene} uiScene\n     */\n    preloadAnimation(data, uiScene)\n    {\n        // @TODO - BETA - Remove the hardcoded file extensions.\n        // @NOTE: here we use have two keys, the animation key and the animationData.img, this is because we could have\n        // a single sprite with multiple attacks, and use the start and end frame to run the required one.\n        if(\n            sc.hasOwn(data.animationData, ['type', 'img'])\n            && GameConst.ANIMATIONS_TYPE.SPRITESHEET === data.animationData.type\n        ){\n            this.preloadAnimationsInDirections(data, uiScene);\n        }\n        if(data.classKey && sc.isFunction(data.classKey['prepareAnimation'])){\n            data.classKey['prepareAnimation']({data, uiScene, pack: this});\n        }\n    }\n\n    /**\n     * @param {AnimationData} data\n     * @param {PhaserScene} uiScene\n     */\n    preloadAnimationsInDirections(data, uiScene)\n    {\n        // try load directions:\n        // - 1: both (this is to include diagonals)\n        // - 2: up/down\n        // - 3: left/right\n        let animDir = sc.get(data.animationData, 'dir', 0);\n        if(0 === animDir){\n            uiScene.load.spritesheet(\n                this.getAnimationKey(data),\n                this.assetsCustomActionsSpritesPath + data.animationData.img+GameConst.FILES.EXTENSIONS.PNG,\n                data.animationData\n            );\n            return;\n        }\n        // @TODO - BETA - Refactor and implement animDir = 1 (both): up_right, up_left, down_right, down_left.\n        if(1 === animDir || 2 === animDir){\n            this.preloadSpriteInDirection(uiScene, data, GameConst.UP);\n            this.preloadSpriteInDirection(uiScene, data, GameConst.DOWN);\n        }\n        if(1 === animDir || 3 === animDir){\n            this.preloadSpriteInDirection(uiScene, data, GameConst.LEFT);\n            this.preloadSpriteInDirection(uiScene, data, GameConst.RIGHT);\n        }\n    }\n\n    /**\n     * @param {PhaserScene} uiScene\n     * @param {AnimationData} data\n     * @param {string} direction\n     */\n    preloadSpriteInDirection(uiScene, data, direction)\n    {\n        uiScene.load.spritesheet(\n            this.getAnimationKey(data, direction),\n            this.assetsCustomActionsSpritesPath+data.animationData.img+'_'+direction+GameConst.FILES.EXTENSIONS.PNG,\n            data.animationData\n        );\n    }\n\n    /**\n     * @param {AnimationData} data\n     * @param {PhaserScene} uiScene\n     */\n    createAnimation(data, uiScene)\n    {\n        if(\n            sc.hasOwn(data.animationData, ['type', 'img'])\n            && data.animationData.type === GameConst.ANIMATIONS_TYPE.SPRITESHEET\n        ){\n            let animDir = sc.get(data.animationData, 'dir', 0);\n            0 < animDir\n                ? this.createWithMultipleDirections(uiScene, data, animDir)\n                : this.createWithDirection(data, uiScene);\n        }\n        if(data.classKey && sc.isFunction(data.classKey['createAnimation'])){\n            data.classKey['createAnimation']({data, uiScene, pack: this});\n        }\n    }\n\n    /**\n     * @param {PhaserScene} uiScene\n     * @param {AnimationData} data\n     * @param {number} animDir\n     */\n    createWithMultipleDirections(uiScene, data, animDir)\n    {\n        // @TODO - BETA - Refactor and implement animDir = 1 (both): up_right, up_left, down_right,\n        //   down_left.\n        uiScene.directionalAnimations[this.getAnimationKey(data)] = data.animationData.dir;\n        if(1 === animDir || 2 === animDir){\n            this.createWithDirection(data, uiScene, GameConst.UP);\n            this.createWithDirection(data, uiScene, GameConst.DOWN);\n        }\n        if(1 === animDir || 3 === animDir){\n            this.createWithDirection(data, uiScene, GameConst.LEFT);\n            this.createWithDirection(data, uiScene, GameConst.RIGHT);\n        }\n    }\n\n    /**\n     * @param {AnimationData} data\n     * @param {PhaserScene} uiScene\n     * @param {string} [direction]\n     * @returns {Object}\n     */\n    createWithDirection(data, uiScene, direction = '')\n    {\n        let animationCreateData = this.prepareAnimationData(data, uiScene, direction);\n        if(this.gameManager.createdAnimations[animationCreateData.key]){\n            return this.gameManager.createdAnimations[animationCreateData.key];\n        }\n        let newAnimation = uiScene.anims.create(animationCreateData);\n        if(sc.hasOwn(data.animationData, 'destroyTime')){\n            newAnimation.destroyTime = data.animationData.destroyTime;\n        }\n        if(sc.hasOwn(data.animationData, 'depthByPlayer')){\n            newAnimation.depthByPlayer = data.animationData.depthByPlayer;\n        }\n        this.gameManager.createdAnimations[animationCreateData.key] = newAnimation;\n        return this.gameManager.createdAnimations[animationCreateData.key];\n    }\n\n    /**\n     * @param {AnimationData} data\n     * @param {PhaserScene} uiScene\n     * @param {string} [direction]\n     * @returns {Object}\n     */\n    prepareAnimationData(data, uiScene, direction = '')\n    {\n        // @NOTE: here we use have two keys, the animation key and the animationData.img, this is because we could have\n        // a single sprite with multiple attacks, and use the start and end frame to run the required one.\n        let imageKey = this.getAnimationKey(data, direction);\n        let animationCreateData = {\n            key: imageKey,\n            frames: uiScene.anims.generateFrameNumbers(imageKey, data.animationData),\n            hideOnComplete: sc.get(data.animationData, 'hide', true),\n        };\n        if(sc.hasOwn(data.animationData, 'duration')){\n            animationCreateData.duration = data.animationData.duration;\n        } else {\n            animationCreateData.frameRate = sc.get(data.animationData, 'frameRate', uiScene.configuredFrameRate);\n        }\n        if(sc.hasOwn(data.animationData, 'repeat')){\n            animationCreateData.repeat = data.animationData.repeat;\n        }\n        return animationCreateData;\n    }\n\n    /**\n     * @param {AnimationData} data\n     * @param {string} [direction]\n     * @returns {string}\n     */\n    getAnimationKey(data, direction = '')\n    {\n        return (data.skillKey ? data.skillKey+'_' : '')+data.key+(direction && '' !== direction ? '_'+direction : '');\n    }\n\n}\n\nmodule.exports.PreloaderHandler = PreloaderHandler;\n"
  },
  {
    "path": "lib/actions/client/receiver-wrapper.js",
    "content": "/**\n *\n * Reldens - ReceiverWrapper\n *\n * Handles skill messages and plays animations for attacks, effects, and level progression.\n *\n */\n\nconst { GameConst } = require('../../game/constants');\nconst { ActionsConst } = require('../constants');\nconst { Receiver } = require('@reldens/skills');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@colyseus/core').Room} ColyseusRoom\n * @typedef {import('phaser').Scene} PhaserScene\n *\n * @typedef {Object} ReceiverWrapperProps\n * @property {EventsManager} [events]\n * @property {Object} [roomEvents]\n * @property {GameManager} roomEvents.gameManager\n * @property {ColyseusRoom} roomEvents.room\n *\n * @typedef {Object} SkillMessage\n * @property {string} act\n * @property {number} [x]\n * @property {number} [y]\n * @property {string} [owner]\n * @property {string} [target]\n * @property {Object} [data]\n */\nclass ReceiverWrapper extends Receiver\n{\n\n    /**\n     * @param {ReceiverWrapperProps} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in ReceiverWrapper.');\n        }\n        /** @type {GameManager|false} */\n        this.gameManager = sc.get(props.roomEvents, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in ReceiverWrapper.');\n        }\n        // @TODO - BETA - Extract and replace Colyseus Room instances by a new communications room driver.\n        /** @type {ColyseusRoom|false} */\n        this.room = sc.get(props.roomEvents, 'room', false);\n        if(!this.room){\n            Logger.error('Room undefined in ReceiverWrapper.');\n        }\n        /** @type {Object|undefined} */\n        this.translator = this.gameManager?.services?.translator;\n    }\n\n    /**\n     * @param {SkillMessage} message\n     * @returns {boolean|void}\n     */\n    processMessage(message)\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        let currentScene = this.gameManager.getActiveScene();\n        if(!currentScene || !currentScene.player){\n            return false;\n        }\n        super.processMessage(message);\n        this.playAttackOrEffectAnimation(message, currentScene);\n        this.playHitAnimation(message, currentScene);\n    }\n\n    /**\n     * @param {SkillMessage} message\n     * @param {PhaserScene} currentScene\n     */\n    playHitAnimation(message, currentScene)\n    {\n        if(-1 === message.act.indexOf('_hit')){\n            return;\n        }\n        this.runHitAnimation(message.x, message.y, currentScene, message.act);\n    }\n\n    /**\n     * @param {SkillMessage} message\n     * @param {PhaserScene} currentScene\n     */\n    playAttackOrEffectAnimation(message, currentScene)\n    {\n        let isEffect = -1 !== message.act.indexOf('_eff');\n        let isAttack = -1 !== message.act.indexOf('_atk');\n        if(!isAttack && !isEffect){\n            return;\n        }\n        this.events.emitSync('reldens.playerAttack', message, this.room);\n        let actKey = isEffect ? '_eff' : '_atk';\n        let animKey = message.act.substring(0, message.act.indexOf(actKey));\n        let {ownerSprite, targetSprite, targetType} = this.extractOwnerTargetAndType(currentScene, message);\n        // @TODO - BETA - Refactor to use a single play animation method and make sure the animation is valid.\n        let actAnimKey = sc.get(this.gameManager.config.client.skills.animations, animKey, 'default' + actKey);\n        if(ownerSprite && currentScene.getAnimationByKey(actAnimKey)){\n            let ownerAnim = currentScene.physics.add.sprite(ownerSprite.x, ownerSprite.y, actAnimKey);\n            ownerAnim.setDepth(200000);\n            // @TODO - BETA - Refactor and implement animDir = 1 (both): up_right, up_left, down_right,\n            //   down_left.\n            let playDir = '';\n            if(sc.hasOwn(this.gameManager.gameEngine.uiScene.directionalAnimations, actAnimKey)){\n                let animDir = this.gameManager.gameEngine.uiScene.directionalAnimations[actAnimKey];\n                playDir = (animDir === 3) ?\n                    (ownerSprite.x < targetSprite.x ? '_right' : '_left')\n                    : (ownerSprite.y < targetSprite.y ? '_down' : '_up');\n            }\n            ownerAnim.anims.play(actAnimKey + playDir, true).on('animationcomplete', () => {\n                ownerAnim.destroy();\n            });\n        }\n        if(targetSprite){\n            this.runHitAnimation(\n                targetSprite.x,\n                targetSprite.y,\n                currentScene,\n                animKey + '_hit',\n                message.target,\n                targetType\n            );\n        }\n    }\n\n    /**\n     * @param {PhaserScene} currentScene\n     * @param {SkillMessage} message\n     * @returns {Object|boolean}\n     */\n    extractOwnerTargetAndType(currentScene, message)\n    {\n        if(!currentScene){\n            Logger.critical('Current scene not found.', currentScene, message);\n            return false;\n        }\n        let ownerSprite = false;\n        let targetSprite = false;\n        let targetType = ActionsConst.DATA_TYPE_VALUE_PLAYER;\n        let playersList = currentScene.player.players;\n        let objectsList = currentScene.objectsAnimations;\n        let isPvP = (sc.hasOwn(playersList, message.owner) && sc.hasOwn(playersList, message.target));\n        if(isPvP){\n            ownerSprite = playersList[message.owner];\n            targetSprite = playersList[message.target];\n            return {ownerSprite, targetSprite, targetType};\n        }\n        if(sc.hasOwn(objectsList, message.owner)){\n            ownerSprite = objectsList[message.owner].sceneSprite;\n            targetSprite = playersList[message.target];\n        }\n        if(sc.hasOwn(objectsList, message.target)){\n            targetSprite = objectsList[message.target].sceneSprite;\n            ownerSprite = playersList[message.owner];\n            targetType = ActionsConst.DATA_TYPE_VALUE_OBJECT;\n        }\n        return {ownerSprite, targetSprite, targetType};\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @param {PhaserScene} currentScene\n     * @param {string} hitKey\n     * @param {string} [targetKey]\n     * @param {string} [targetType]\n     * @returns {boolean|void}\n     */\n    runHitAnimation(x, y, currentScene, hitKey, targetKey, targetType)\n    {\n        // @TODO - BETA - Refactor.\n        let allAnimations = this.gameManager.config.client.skills.animations;\n        let hitAnimKey = sc.hasOwn(allAnimations, hitKey) ? hitKey : ActionsConst.DEFAULT_HIT_ANIMATION_KEY;\n        if(!currentScene.getAnimationByKey(hitAnimKey) || !sc.hasOwn(allAnimations, hitAnimKey)){\n            return false;\n        }\n        let targetSprite = false;\n        let targetSpriteId = false;\n        if(targetType === ActionsConst.DATA_TYPE_VALUE_PLAYER){\n            targetSprite = this.gameManager.getCurrentPlayer().players[targetKey];\n            targetSpriteId = targetSprite.playerId;\n        }\n        if(targetType === ActionsConst.DATA_TYPE_VALUE_OBJECT){\n            targetSprite = currentScene.objectsAnimations[targetKey];\n            targetSpriteId = targetKey;\n        }\n        let hitSprite = currentScene.physics.add.sprite(x, y, hitAnimKey);\n        hitSprite = this.setTargetSpriteDepth(targetSprite, hitAnimKey, targetSpriteId, hitSprite, allAnimations);\n        hitSprite.anims.play(hitAnimKey, true).on('animationcomplete', () => {\n            hitSprite.destroy();\n            if(targetSprite && sc.hasOwn(targetSprite, 'moveSprites')){\n                delete targetSprite.moveSprites[hitAnimKey+'_'+targetSpriteId];\n            }\n        });\n    }\n\n    /**\n     * @param {Object} targetSprite\n     * @param {string} hitAnimKey\n     * @param {string|number} targetSpriteId\n     * @param {Object} hitSprite\n     * @param {Object} allAnimations\n     * @returns {Object}\n     */\n    setTargetSpriteDepth(targetSprite, hitAnimKey, targetSpriteId, hitSprite, allAnimations)\n    {\n        if(!targetSprite){\n            hitSprite.setDepth(300000);\n            return hitSprite;\n        }\n        if(sc.hasOwn(targetSprite, 'targetSprite')){\n            targetSprite.moveSprites[hitAnimKey + '_' + targetSpriteId] = hitSprite;\n        }\n        let animData = allAnimations[hitAnimKey];\n        let depth = targetSprite.depth+('above' === sc.get(animData.animationData, 'depthByPlayer', '') ? 100 : -0.1);\n        hitSprite.depthByPlayer = animData.animationData.depthByPlayer;\n        hitSprite.setDepth(depth);\n        return hitSprite;\n    }\n\n    /**\n     * @param {SkillMessage} message\n     */\n    updateLevelAndExperience(message)\n    {\n        this.gameManager.gameDom.updateContent(\n            ActionsConst.SELECTORS.LEVEL_LABEL,\n            this.translator.t(\n                ActionsConst.SNIPPETS.LEVEL,\n                {currentLevel: message.data[ActionsConst.MESSAGE.DATA.LEVEL]}\n            )\n        );\n        this.onLevelExperienceAdded(message);\n        let classPathLabel = message.data[ActionsConst.MESSAGE.DATA.CLASS_PATH_LABEL];\n        if(classPathLabel){\n            this.gameManager.gameDom.updateContent(\n                ActionsConst.SELECTORS.CLASS_PATH_LABEL,\n                this.translator.t(ActionsConst.SNIPPETS.CLASS_PATH_LABEL, {classPathLabel})\n            );\n        }\n        let nextLevelExperience = message.data[ActionsConst.MESSAGE.DATA.NEXT_LEVEL_EXPERIENCE];\n        if(nextLevelExperience){\n            this.gameManager.gameDom.updateContent(\n                ActionsConst.SELECTORS.NEXT_LEVEL_EXPERIENCE,\n                this.translator.t(ActionsConst.SNIPPETS.NEXT_LEVEL_EXPERIENCE, {nextLevelExperience})\n            );\n        }\n    }\n\n    /**\n     * @param {SkillMessage} message\n     * @returns {boolean|void}\n     */\n    onInitClassPathEnd(message)\n    {\n        // @NOTE: careful with messages received and double ui elements generation.\n        if(this.gameManager.skills && this.gameManager.skills.uiCreated){\n            return false;\n        }\n        this.gameManager.skills.uiCreated = true;\n        this.updateLevelAndExperience(message);\n        this.gameManager.skills.skills = message.data[ActionsConst.MESSAGE.DATA.SKILL_LEVEL];\n        this.gameManager.getFeature('actions').uiManager.appendSkills(message.data.skl);\n    }\n\n    /**\n     * @param {SkillMessage} message\n     */\n    onLevelUp(message)\n    {\n        this.updateLevelAndExperience(message);\n        if(sc.hasOwn(message.data, 'skl')){\n            Object.assign(this.gameManager.skills.skills, message.data.skl);\n            this.gameManager.getFeature('actions').uiManager.appendSkills(message.data.skl);\n        }\n        let levelUpAnimKey = this.getLevelUpAnimationKey(message.data.skl);\n        if(levelUpAnimKey){\n            this.playSkillPlayerAnimation(this.gameManager.getCurrentPlayer().playerId, levelUpAnimKey);\n        }\n    }\n\n    /**\n     * @param {number} level\n     * @returns {string|boolean}\n     */\n    getLevelUpAnimationKey(level)\n    {\n        let animationsListObj = this.gameManager.config.client.levels.animations;\n        let exactKey = 'level_'+this.gameManager.playerData.avatarKey+'_'+level;\n        if(sc.hasOwn(animationsListObj, exactKey)){\n            return exactKey;\n        }\n        let avatarKey = 'level_'+this.gameManager.playerData.avatarKey;\n        if(sc.hasOwn(animationsListObj, avatarKey)){\n            return avatarKey;\n        }\n        let levelKey = 'level_'+level;\n        if(sc.hasOwn(animationsListObj, levelKey)){\n            return levelKey;\n        }\n        if(sc.hasOwn(animationsListObj, 'level_default')){\n            return 'level_default';\n        }\n        return false;\n    }\n\n    /**\n     * @param {SkillMessage} message\n     */\n    onLevelExperienceAdded(message)\n    {\n        this.gameManager.gameDom.updateContent(\n            ActionsConst.SELECTORS.CURRENT_EXPERIENCE,\n            this.translator.t(\n                ActionsConst.SNIPPETS.EXPERIENCE,\n                {experience: message.data[ActionsConst.MESSAGE.DATA.EXPERIENCE]}\n            )\n        );\n    }\n\n    /**\n     * @param {SkillMessage} message\n     */\n    onSkillBeforeCast(message)\n    {\n        this.playSkillPlayerAnimation(\n            message.data.extraData[ActionsConst.DATA_OWNER_KEY],\n            this.determineCastKey(message)\n        );\n    }\n\n    /**\n     * @param {SkillMessage} message\n     * @returns {string}\n     */\n    determineCastKey(message)\n    {\n        let castKey = message.data.skillKey + '_cast';\n        if(sc.hasOwn(this.gameManager.config.client.skills.animations, castKey)){\n            return castKey;\n        }\n        return 'default_cast';\n    }\n\n    /**\n     * @param {string|number} ownerId\n     * @param {string} animationKey\n     * @returns {boolean|void}\n     */\n    playSkillPlayerAnimation(ownerId, animationKey)\n    {\n        let currentScene = this.gameManager.getActiveScene();\n        let sceneAnimation = currentScene.getAnimationByKey(animationKey);\n        if(!sceneAnimation){\n            if(-1 === animationKey.indexOf('default')){\n                Logger.error(\n                    'Animation sprite not found for \"'+animationKey+'\".',\n                    this.gameManager.config.client.skills.animations\n                );\n            }\n            return false;\n        }\n        let ownerSprite = this.gameManager.getCurrentPlayer().players[ownerId];\n        let spriteX = ownerSprite.x;\n        let spriteY = ownerSprite.y;\n        let animationSprite = currentScene.physics.add.sprite(spriteX, spriteY, animationKey);\n        // the default value will be the caster depth - 1 so the animation will be played below the player.\n        let depth = sc.hasOwn(sceneAnimation, 'depthByPlayer') && 'above' === sceneAnimation['depthByPlayer']\n            ? ownerSprite.depth + 1 : ownerSprite.depth - 0.1;\n        animationSprite.depthByPlayer = sceneAnimation.depthByPlayer;\n        animationSprite.setDepth(depth);\n        let blockMovement = sc.get(sceneAnimation, 'blockMovement', false);\n        if(!blockMovement){\n            ownerSprite.moveSprites[animationKey+'_'+ownerSprite.playerId] = animationSprite;\n        }\n        animationSprite.anims.play(animationKey, true);\n        let destroyTime = sc.get(sceneAnimation, 'destroyTime', false);\n        if(destroyTime){\n            setTimeout(() => {\n                animationSprite.destroy();\n                delete ownerSprite.moveSprites[animationKey+'_'+ownerSprite.playerId];\n            }, destroyTime);\n        }\n    }\n\n    /**\n     * @param {SkillMessage} message\n     * @returns {boolean|void}\n     */\n    onSkillAfterCast(message)\n    {\n        let currentPlayer = this.gameManager.getCurrentPlayer();\n        if(\n            !sc.hasOwn(message.data.extraData, ActionsConst.DATA_OWNER_TYPE)\n            || !sc.hasOwn(message.data.extraData, ActionsConst.DATA_OWNER_KEY)\n            || message.data.extraData[ActionsConst.DATA_OWNER_TYPE] !== ActionsConst.DATA_TYPE_VALUE_PLAYER\n            || !sc.hasOwn(currentPlayer.players, message.data.extraData[ActionsConst.DATA_OWNER_KEY])\n        ){\n            return false;\n        }\n        let currentScene = this.gameManager.getActiveScene();\n        let ownerSprite = this.gameManager.getCurrentPlayer()\n            .players[message.data.extraData[ActionsConst.DATA_OWNER_KEY]];\n        let playDirection = this.getPlayDirection(message.data.extraData, ownerSprite, currentPlayer, currentScene);\n        if(playDirection){\n            ownerSprite.anims.play(ownerSprite.avatarKey+'_'+playDirection, true);\n            ownerSprite.anims.stop();\n        }\n    }\n\n    /**\n     * @param {SkillMessage} message\n     * @returns {boolean|void}\n     */\n    onSkillAttackApplyDamage(message)\n    {\n        let damageConfig = this.gameManager.config.get('client/actions/damage');\n        if(!damageConfig.enabled){\n            return false;\n        }\n        let currentPlayer = this.gameManager.getCurrentPlayer();\n        if(!damageConfig.showAll && message.data.extraData[ActionsConst.DATA_OWNER_KEY] !== currentPlayer.playerId){\n            return false;\n        }\n        let currentScene = this.gameManager.getActiveScene();\n        let target = currentScene.getObjectFromExtraData(\n            ActionsConst.DATA_OBJECT_KEY_TARGET,\n            message.data.extraData,\n            currentPlayer\n        );\n        if(!target){\n            return false;\n        }\n        currentScene.createFloatingText(\n            target.x,\n            target.y,\n            message.data.d,\n            damageConfig.color,\n            damageConfig.font,\n            damageConfig.fontSize,\n            damageConfig.duration,\n            damageConfig.top,\n            damageConfig.stroke,\n            damageConfig.strokeThickness,\n            damageConfig.shadowColor\n        );\n    }\n\n    /**\n     * @param {Object} extraData\n     * @param {Object} ownerSprite\n     * @param {Object} currentPlayer\n     * @param {PhaserScene} currentScene\n     * @returns {string|boolean}\n     */\n    getPlayDirection(extraData, ownerSprite, currentPlayer, currentScene)\n    {\n        let playDirection = false;\n        let target = currentScene.getObjectFromExtraData(ActionsConst.DATA_OBJECT_KEY_TARGET, extraData, currentPlayer);\n        if(!target){\n            return false;\n        }\n        let playX = target.x - ownerSprite.x;\n        let playY = target.y - ownerSprite.y;\n        playDirection = (playX >= 0) ? GameConst.RIGHT : GameConst.LEFT;\n        if(Math.abs(playX) < Math.abs(playY)){\n            playDirection = (playY >= 0) ? GameConst.DOWN : GameConst.UP;\n        }\n        return playDirection;\n    }\n\n}\n\nmodule.exports.ReceiverWrapper = ReceiverWrapper;\n"
  },
  {
    "path": "lib/actions/client/skills-ui.js",
    "content": "/**\n *\n * Reldens - SkillsUi\n *\n * Manages the user interface for skills display and interaction.\n *\n */\n\nconst { ActionsConst } = require('../constants');\n\n/**\n * @typedef {import('phaser').Scene} PhaserScene\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass SkillsUi\n{\n\n    /**\n     * @param {PhaserScene} uiScene\n     */\n    constructor(uiScene)\n    {\n        /** @type {PhaserScene} */\n        this.uiScene = uiScene;\n        /** @type {GameManager} */\n        this.gameManager = this.uiScene.gameManager;\n        /** @type {string|null} */\n        this.defaultAction = this.gameManager.config.get('client/ui/controls/defaultActionKey');\n    }\n\n    createUi()\n    {\n        let selector = ActionsConst.SELECTORS.UI_PLAYER_EXTRAS;\n        this.appendToUiContainer(selector, 'skillsClassPath');\n        this.appendToUiContainer(selector, 'skillsLevel');\n        this.appendToUiContainer(selector, 'skillsExperience', {\n            experienceLabel: this.gameManager.services.translator.t(ActionsConst.SNIPPETS.EXPERIENCE_LABEL)\n        });\n        this.createUiBox('skills', 7);\n    }\n\n    /**\n     * @param {Object<string, any>} skills\n     * @returns {boolean|void}\n     */\n    appendSkills(skills)\n    {\n        // @TODO - BETA - Implement skills groups.\n        let skillsList = Object.keys(skills);\n        // if the default action is a skill we won't show a duplicated box:\n        if(0 === skillsList.length){\n            return false;\n        }\n        for(let i of skillsList){\n            let skill = skills[i];\n            if(skill === this.defaultAction){\n                continue;\n            }\n            this.createSkillBox(skill);\n        }\n    }\n\n    /**\n     * @param {string} containerSelector\n     * @param {string} skillsUiTemplate\n     * @param {Object<string, any>} [snippets]\n     */\n    appendToUiContainer(containerSelector, skillsUiTemplate, snippets = {})\n    {\n        let messageTemplate = this.uiScene.cache.html.get(skillsUiTemplate);\n        let snippetsKeys = Object.keys(snippets);\n        if(0 < snippetsKeys.length){\n            messageTemplate = this.gameManager.gameEngine.parseTemplate(messageTemplate, snippets);\n        }\n        this.gameManager.gameDom.appendToElement(containerSelector, messageTemplate);\n    }\n\n    /**\n     * @param {string} codeName\n     * @param {number} depth\n     */\n    createUiBox(codeName, depth)\n    {\n        // @TODO - BETA - Replace by UserInterface.\n        let {uiX, uiY} = this.uiScene.getUiConfig(codeName);\n        let generatedUi = this.uiScene.add.dom(uiX, uiY).createFromCache(codeName);\n        generatedUi.setDepth(depth);\n        this.uiScene.elementsUi[codeName] = generatedUi;\n    }\n\n    /**\n     * @param {string} skill\n     */\n    createSkillBox(skill)\n    {\n        let skillBox = this.parseSkillTemplate(skill);\n        this.gameManager.gameDom.appendToElement(ActionsConst.SELECTORS.SKILLS_CONTAINER, skillBox);\n        this.uiScene.setupActionButtonInBox(skill, this.uiScene.getUiElement('skills'));\n    }\n\n    /**\n     * @param {string} skill\n     * @returns {string}\n     */\n    parseSkillTemplate(skill)\n    {\n        let skillTemplate = this.uiScene.cache.html.get('skillBox');\n        return this.gameManager.gameEngine.parseTemplate(skillTemplate, {\n            key: skill,\n            // @TODO - BETA - Get all the required skill data on the client, from the label to the delay time counter.\n            skillName: skill\n        });\n    }\n\n}\n\nmodule.exports.SkillsUi = SkillsUi;\n"
  },
  {
    "path": "lib/actions/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    actions: {\n        selectClassPath: 'Select Your Class-Path',\n        currentLevel: 'Level %currentLevel',\n        experience: '%experience',\n        experienceLabel: 'XP',\n        classPathLabel: '%classPathLabel',\n        nextLevelExperience: '%nextLevelExperience'\n    }\n}\n"
  },
  {
    "path": "lib/actions/constants.js",
    "content": "/**\n *\n * Reldens - ActionsConst\n *\n */\n\nlet snippetsPrefix = 'actions.';\n\nmodule.exports.ActionsConst = {\n    BATTLE_TYPE_PER_TARGET: 'bt',\n    BATTLE_TYPE_GENERAL: 'bg',\n    BATTLE_ENDED: 'bend',\n    TARGET_POSITION: 'tgp',\n    TARGET_PLAYER: 'tga',\n    TARGET_OBJECT: 'tgo',\n    FULL_SKILLS_LIST: 'fkl',\n    ACTION: 'action',\n    DATA_OBJECT_KEY_TARGET: 't',\n    DATA_OBJECT_KEY_OWNER: 'o',\n    DATA_TARGET_TYPE: 'tT',\n    DATA_TARGET_KEY: 'tK',\n    DATA_OWNER_TYPE: 'oT',\n    DATA_OWNER_KEY: 'oK',\n    DATA_TYPE_VALUE_ENEMY: 'e',\n    DATA_TYPE_VALUE_PLAYER: 'p',\n    DATA_TYPE_VALUE_OBJECT: 'o',\n    EXTRA_DATA: {\n        KEY: 'sked',\n        SKILL_DELAY: 'sd'\n    },\n    DEFAULT_HIT_ANIMATION_KEY: 'default_hit',\n    ACTIONS: {\n        SUFFIX: {\n            ATTACK: '_atk',\n            EFFECT: '_eff',\n            HIT: '_hit'\n        }\n    },\n    MESSAGE: {\n        DATA: {\n            LEVEL: 'lvl',\n            EXPERIENCE: 'exp',\n            CLASS_PATH_LABEL: 'lab',\n            NEXT_LEVEL_EXPERIENCE: 'ne',\n            SKILL_LEVEL: 'skl',\n            LAST_ATTACK_KEY: 'k'\n        },\n        DATA_VALUES: {\n            NAMESPACE: 'actions',\n            lvl: 'level',\n            exp: 'experience',\n            lab: 'classPathLabel',\n            ne: 'nextLevelExperience',\n            skl: 'skillLevel'\n        }\n    },\n    SELECTORS: {\n        LEVEL_LABEL: '.level-container .level-label',\n        CURRENT_EXPERIENCE: '.experience-container .current-experience',\n        NEXT_LEVEL_EXPERIENCE: '.experience-container .next-level-experience',\n        PLAYER_CREATE_FORM: '#player-create-form',\n        UI_PLAYER_EXTRAS: '#ui-player-extras',\n        PLAYER_CREATION_ADDITIONAL_INFO: '.player-creation-additional-info',\n        PLAYER_SELECTION_ADDITIONAL_INFO: '.player-selection-additional-info',\n        CLASS_PATH_LABEL: '.class-path-container .class-path-label',\n        SKILLS_CONTAINER: '.skills-container'\n    },\n    SNIPPETS: {\n        PREFIX: snippetsPrefix,\n        SELECT_CLASS_PATH: snippetsPrefix+'selectClassPath',\n        EXPERIENCE_LABEL: snippetsPrefix+'experienceLabel',\n        LEVEL: snippetsPrefix+'currentLevel',\n        CLASS_PATH_LABEL: snippetsPrefix+'classPathLabel',\n        NEXT_LEVEL_EXPERIENCE: snippetsPrefix+'nextLevelExperience',\n        EXPERIENCE: snippetsPrefix+'experience'\n    }\n};\n"
  },
  {
    "path": "lib/actions/factories/class-path-key-factory.js",
    "content": "/**\n *\n * Reldens - ClassPathKeyFactory\n *\n * Generates standardized keys from class path labels.\n *\n */\n\nclass ClassPathKeyFactory\n{\n\n    /**\n     * @param {string} label\n     * @returns {string}\n     */\n    static fromLabel(label)\n    {\n        return label.toLowerCase().replace(/ /g, '-').replace('---', '-');\n    }\n\n}\n\nmodule.exports.ClassPathKeyFactory = ClassPathKeyFactory;\n"
  },
  {
    "path": "lib/actions/factories/skill-data-factory.js",
    "content": "/**\n *\n * Reldens - SkillDataFactory\n *\n * Factory for creating and validating skill data structures.\n *\n */\n\nconst { SkillSchema } = require('../schemas/skill-schema');\nconst { SchemaValidator, sc, Logger} = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').SchemaValidator} SchemaValidator\n */\nclass SkillDataFactory\n{\n\n    constructor()\n    {\n        /** @type {number|null} */\n        this.id = null;\n        /** @type {string|null} */\n        this.key = null;\n        /** @type {string|null} */\n        this.type = null;\n        /** @type {boolean|null} */\n        this.autoValidation = null;\n        /** @type {number|null} */\n        this.skillDelay = null;\n        /** @type {number|null} */\n        this.castTime = null;\n        /** @type {number|null} */\n        this.usesLimit = null;\n        /** @type {number|null} */\n        this.range = null;\n        /** @type {boolean|null} */\n        this.rangeAutomaticValidation = null;\n        /** @type {string|null} */\n        this.rangePropertyX = null;\n        /** @type {string|null} */\n        this.rangePropertyY = null;\n        /** @type {string|null} */\n        this.rangeTargetPropertyX = null;\n        /** @type {string|null} */\n        this.rangeTargetPropertyY = null;\n        /** @type {boolean|null} */\n        this.allowSelfTarget = null;\n        /** @type {number|null} */\n        this.criticalChance = null;\n        /** @type {number|null} */\n        this.criticalMultiplier = null;\n        /** @type {number|null} */\n        this.criticalFixedValue = null;\n        /** @type {Object|null} */\n        this.customData = null;\n        /** @type {Array<Object>} */\n        this.classPaths = [];\n        /** @type {Array<Object>} */\n        this.objects = [];\n        /** @type {Array<Object>} */\n        this.animations = [];\n        /** @type {Object|null} */\n        this.attack = null;\n        /** @type {Object|null} */\n        this.physicalData = null;\n        /** @type {Array<Object>} */\n        this.targetEffects = [];\n        /** @type {Array<Object>} */\n        this.ownerEffects = [];\n        /** @type {Array<Object>} */\n        this.ownerConditions = [];\n        /** @type {Array<string>} */\n        this.clearPrevious = [];\n        /** @type {Object} */\n        this.schema = SkillSchema;\n        /** @type {SchemaValidator} */\n        this.schemaValidator = new SchemaValidator(this.schema);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isValid()\n    {\n        return this.schemaValidator.validate(this);\n    }\n\n    /**\n     * @param {string} key\n     * @param {Object} data\n     * @param {Object} defaults\n     * @returns {SkillDataFactory}\n     */\n    mapData(key, data, defaults)\n    {\n        Object.assign(this, {key}, sc.get(defaults, 'properties', {}), sc.get(data, 'properties', {}));\n        this.clearPrevious = sc.get(data, 'clearPrevious', []);\n        let skillType = sc.get(data.typeData, 'key', false);\n        if(skillType){\n            let typeDefaults = sc.get(defaults, skillType, {});\n            this[skillType] = Object.assign({}, typeDefaults, sc.get(data.typeData, 'properties', {}));\n        }\n        let physicalData = sc.get(data, 'physicalData', false);\n        if(physicalData){\n            this.physicalData = Object.assign({}, sc.get(defaults, 'physicalData', {}), physicalData);\n        }\n        this.mapTargetEffects(data, defaults);\n        this.mapOwnerEffects(data, defaults);\n        this.mapOwnerConditions(data, defaults);\n        this.mapClassPaths(data, defaults);\n        this.mapObjects(data, defaults);\n        this.mapAnimations(key, data, defaults);\n        return this;\n    }\n\n    /**\n     * @param {Object} data\n     * @param {Object} defaults\n     */\n    mapClassPaths(data, defaults)\n    {\n        let classPathsKeys = Object.keys(defaults.classPaths);\n        if(0 === classPathsKeys.length){\n            return;\n        }\n        let relatedClassPaths = sc.get(data, 'classPathLevelRelations', {});\n        let relatedClassPathsKeys = Object.keys(relatedClassPaths);\n        let relateAll = -1 !== relatedClassPathsKeys.indexOf('all');\n        let loopClassPaths = relateAll ? Object.keys(defaults.classPaths) : relatedClassPathsKeys;\n        for(let i of loopClassPaths){\n            let existentClassPath = defaults.classPaths[i];\n            if(!existentClassPath){\n                Logger.warning('Class path not found: \"'+i+'\".');\n                continue;\n            }\n            let loopIndex = relateAll ? 'all' : i;\n            let relatedClassPathLevel = existentClassPath.relatedLevels[relatedClassPaths[loopIndex]];\n            if(!relatedClassPathLevel){\n                Logger.warning('Level \"'+relatedClassPaths[i]+'\" not found in class path: \"'+loopIndex+'\".');\n                continue;\n            }\n            this.classPaths.push({class_path_id: existentClassPath.id, level_id: relatedClassPathLevel.id});\n        }\n    }\n\n    /**\n     * @param {Object} data\n     * @param {Object} defaults\n     */\n    mapObjects(data, defaults)\n    {\n        let objectsRelations = sc.get(data, 'objectsRelations', {});\n        let objectsRelationsKeys = Object.keys(objectsRelations);\n        if(0 === objectsRelationsKeys.length){\n            return;\n        }\n        for(let i of objectsRelationsKeys){\n            this.objects.push({objectKey: i, target_id: defaults.targetOptions[objectsRelations[i]].id});\n        }\n    }\n\n    /**\n     * @param {string} key\n     * @param {Object} data\n     * @param {Object} defaults\n     */\n    mapAnimations(key, data, defaults)\n    {\n        let animations = sc.get(data, 'animations', {});\n        let animationKeys = Object.keys(animations);\n        if(0 === animationKeys.length){\n            return;\n        }\n        let animationsDefaults = sc.get(defaults, 'animations', {});\n        let animationDefaultData = animationsDefaults.defaults;\n        for(let i of animationKeys){\n            let animationData = Object.assign({}, animationDefaultData, animationsDefaults[i], animations[i]);\n            if(animationsDefaults.appendSkillKeyOnAnimationImage || animations[i].appendSkillKeyOnAnimationImage){\n                animationData.img = key + animationData.img;\n            }\n            this.animations.push({key: i, animationData});\n        }\n    }\n\n    /**\n     * @param {Object} data\n     * @param {Object} defaults\n     */\n    mapOwnerConditions(data, defaults)\n    {\n        let ownerConditions = sc.get(data, 'ownerConditions', []);\n        if(0 === ownerConditions.length){\n            return;\n        }\n        for(let ownerCondition of ownerConditions){\n            this.ownerConditions.push(\n                Object.assign(\n                    {},\n                    sc.get(defaults, 'ownerConditions', {}),\n                    ownerCondition,\n                    {property_key: ownerCondition.propertyKey}\n                )\n            );\n        }\n    }\n\n    /**\n     * @param {Object} data\n     * @param {Object} defaults\n     */\n    mapOwnerEffects(data, defaults)\n    {\n        let ownerEffects = sc.get(data, 'ownerEffects', []);\n        if(0 === ownerEffects.length){\n            return;\n        }\n        for(let ownerEffect of ownerEffects){\n            this.ownerEffects.push(\n                Object.assign(\n                    {},\n                    sc.get(defaults, 'ownerEffects', {}),\n                    ownerEffect,\n                    {property_key: ownerEffect.propertyKey}\n                )\n            );\n        }\n    }\n\n    /**\n     * @param {Object} data\n     * @param {Object} defaults\n     */\n    mapTargetEffects(data, defaults)\n    {\n        let targetEffects = sc.get(data, 'targetEffects', []);\n        if(0 === targetEffects.length){\n            return;\n        }\n        for(let targetEffect of targetEffects){\n            this.targetEffects.push(\n                Object.assign(\n                    {},\n                    sc.get(defaults, 'targetEffects', {}),\n                    targetEffect,\n                    {property_key: targetEffect.propertyKey}\n                )\n            );\n        }\n    }\n\n    /**\n     * @returns {Object}\n     */\n    skillBaseData()\n    {\n        return {\n            key: this.key,\n            type: this.type,\n            autoValidation: this.autoValidation,\n            skillDelay: this.skillDelay,\n            castTime: this.castTime,\n            usesLimit: this.usesLimit,\n            range: this.range,\n            rangeAutomaticValidation: this.rangeAutomaticValidation,\n            rangePropertyX: this.rangePropertyX,\n            rangePropertyY: this.rangePropertyY,\n            rangeTargetPropertyX: this.rangeTargetPropertyX,\n            rangeTargetPropertyY: this.rangeTargetPropertyY,\n            allowSelfTarget: this.allowSelfTarget,\n            criticalChance: this.criticalChance,\n            criticalMultiplier: this.criticalMultiplier,\n            criticalFixedValue: this.criticalFixedValue,\n            customData: this.customData\n        };\n    }\n\n}\n\nmodule.exports.SkillDataFactory = SkillDataFactory;\n"
  },
  {
    "path": "lib/actions/schemas/skill-schema.js",
    "content": "/**\n *\n * Reldens - SkillSchema\n *\n */\n\nmodule.exports.SkillSchema = {\n    // id: {type: 'int'},\n    key: {type: 'string'},\n    type: {type: 'int'},\n    autoValidation: {type: 'int'},\n    skillDelay: {type: 'int'},\n    castTime: {type: 'int'},\n    usesLimit: {type: 'int'},\n    range: {type: 'int'},\n    rangeAutomaticValidation: {type: 'int'},\n    rangePropertyX: {type: 'string'},\n    rangePropertyY: {type: 'string'},\n    // rangeTargetPropertyX: {type: 'string'},\n    // rangeTargetPropertyY: {type: 'string'},\n    allowSelfTarget: {type: 'int'},\n    // criticalChance: {type: 'int'},\n    // criticalMultiplier: {type: 'int'},\n    // criticalFixedValue: {type: 'int'},\n    // customData: {type: 'string'},\n};\n"
  },
  {
    "path": "lib/actions/server/battle-end-action.js",
    "content": "/**\n *\n * Reldens - BattleEndAction\n *\n * Represents the end of a battle action with position and target data.\n *\n */\n\nconst { GameConst } = require('../../game/constants');\nconst { ActionsConst } = require('../constants');\n\nclass BattleEndAction\n{\n\n    /**\n     * @param {number} positionX\n     * @param {number} positionY\n     * @param {string} targetKey\n     * @param {string} lastAttackKey\n     */\n    constructor(positionX, positionY, targetKey, lastAttackKey)\n    {\n        this[GameConst.ACTION_KEY] = ActionsConst.BATTLE_ENDED;\n        this.x = positionX;\n        this.y = positionY;\n        this[ActionsConst.DATA_OBJECT_KEY_TARGET] = targetKey\n        this[ActionsConst.MESSAGE.DATA.LAST_ATTACK_KEY] = lastAttackKey\n    }\n\n}\n\nmodule.exports.BattleEndAction = BattleEndAction;\n"
  },
  {
    "path": "lib/actions/server/battle.js",
    "content": "/**\n *\n * Reldens - Battle\n *\n * Base battle system handling combat execution and player death/revive logic.\n *\n */\n\nconst { BattleEndAction } = require('./battle-end-action');\nconst { PlayerDeathEvent } = require('./events/player-death-event');\nconst { ActionsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n *\n * @typedef {Object} BattleProps\n * @property {number|boolean} [battleTimeOff]\n * @property {string} [timerType]\n * @property {EventsManager} [events]\n */\nclass Battle\n{\n\n    /**\n     * @param {BattleProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Object<string, Object>} */\n        this.inBattleWith = {};\n        /** @type {number|boolean} */\n        this.battleTimeOff = props.battleTimeOff || false;\n        /** @type {Object|false} */\n        this.battleTimer = false;\n        /** @type {Object|false} */\n        this.playerReviveTimer = false;\n        /** @type {string} */\n        this.timerType = props.timerType || ActionsConst.BATTLE_TYPE_PER_TARGET;\n        /** @type {number|boolean} */\n        this.lastAttack = false;\n        /** @type {string|boolean} */\n        this.lastAttackKey = false;\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in Battle \"'+this.constructor.name+'\".');\n        }\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {Object} target\n     * @returns {Promise<Object|boolean>}\n     */\n    async runBattle(playerSchema, target)\n    {\n        let playerState = playerSchema?.state?.inState;\n        if(GameConst.STATUS.ACTIVE !== playerState){\n            Logger.error('Battle inactive player with ID \"'+playerSchema.player_id+'\".', playerState);\n            delete this.inBattleWith[target.id];\n            return false;\n        }\n        let targetState = target?.state?.inState;\n        if(targetState && GameConst.STATUS.ACTIVE.toString() !== targetState.toString()){\n            //Logger.debug('Inactive target ID \"'+(target.uid || target.player_id)+'\" in state \"'+targetState+'\".');\n            delete this.inBattleWith[target.id];\n            return false;\n        }\n        // @NOTE: each attack will have different properties to validate like range, delay, etc.\n        let currentAction = this.getCurrentAction(playerSchema);\n        if(!currentAction){\n            Logger.error('Actions not defined for this player with ID \"'+playerSchema.player_id+'\".');\n            delete this.inBattleWith[target.id];\n            return false;\n        }\n        currentAction.currentBattle = this;\n        this.lastAttackKey = currentAction.key;\n        let executeResult = await currentAction.execute(target);\n        // include the target in the battle list:\n        this.lastAttack = Date.now();\n        this.inBattleWith[target.id] = {target: target, time: this.lastAttack, battleTimer: false};\n        let useTimerObj = this;\n        if(this.timerType === ActionsConst.BATTLE_TYPE_PER_TARGET){\n            useTimerObj = this.inBattleWith[target.id];\n        }\n        this.setTimerOn(useTimerObj, target);\n        playerSchema.currentAction = false; // reset action.\n        return executeResult;\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @returns {Object}\n     */\n    getCurrentAction(playerSchema)\n    {\n        let currentAction = playerSchema.currentAction;\n        return sc.get(\n            playerSchema.actions,\n            currentAction,\n            playerSchema.skillsServer.classPath.currentSkills[currentAction]\n        );\n    }\n\n    /**\n     * @param {Object} useTimerObj\n     * @param {Object} target\n     */\n    setTimerOn(useTimerObj, target)\n    {\n        if(useTimerObj.battleTimer){\n            clearTimeout(useTimerObj.battleTimer);\n            delete this.inBattleWith[target.id];\n        }\n        if(this.battleTimeOff){\n            useTimerObj.battleTimer = setTimeout(() => {\n                delete this.inBattleWith[target.id];\n            }, this.battleTimeOff);\n        }\n    }\n\n    /**\n     * @param {Object} targetClient\n     * @param {Player} targetSchema\n     * @param {string|number} attackerId\n     * @param {RoomScene} room\n     * @param {Player} [attackerPlayer]\n     * @returns {Promise<boolean>}\n     */\n    async updateTargetClient(targetClient, targetSchema, attackerId, room, attackerPlayer)\n    {\n        if(!targetSchema.stats){\n            Logger.warning('Target schema for player (ID: '+targetSchema?.player_id+') with undefined stats.');\n            return false;\n        }\n        let affectedProperty = room.config.get('client/actions/skills/affectedProperty');\n        if(0 === targetSchema.stats[affectedProperty]){\n            return await this.clientDeathUpdate(\n                targetSchema,\n                room,\n                targetClient,\n                affectedProperty,\n                attackerId,\n                attackerPlayer\n            );\n        }\n        return await room.savePlayerStats(targetSchema, targetClient);\n    }\n\n    /**\n     * @param {Player} targetSchema\n     * @param {RoomScene} room\n     * @param {Object} targetClient\n     * @param {string} affectedProperty\n     * @param {string|number} attackerId\n     * @param {Player} [attackerPlayer]\n     * @returns {Promise<boolean>}\n     */\n    async clientDeathUpdate(targetSchema, room, targetClient, affectedProperty, attackerId, attackerPlayer)\n    {\n        if(!targetSchema.player_id){\n            Logger.error('Target is not a player.', targetSchema.player_id);\n            return false;\n        }\n        if(targetSchema.isDeath() || targetSchema.isDisabled()){\n            //Logger.debug('Target is already death.', targetSchema.player_id);\n            // expected when multiple enemies get the player life = 0 as response from the last hit in battle:\n            return false;\n        }\n        //Logger.debug('Player with ID \"'+targetSchema.player_id+'\" is death.');\n        room.deactivatePlayer(targetSchema, GameConst.STATUS.DEATH);\n        let actionData = new BattleEndAction(\n            targetSchema.state.x,\n            targetSchema.state.y,\n            targetSchema.sessionId,\n            this.lastAttackKey\n        );\n        let body = targetSchema.physicalBody;\n        room.roomWorld.removeBodies.push(body);\n        room.broadcast('*', actionData);\n        await room.savePlayerState(targetSchema.sessionId);\n        targetClient.send('*', {act: GameConst.GAME_OVER});\n        await room.savePlayerStats(targetSchema, targetClient);\n        targetSchema.setPrivate(\n            'playerDeathTimer',\n            this.playerReviveTimer = setTimeout(\n                async () => {\n                    return await this.revivePlayer(room, body, targetSchema, affectedProperty, targetClient);\n                },\n                (room.config.get('server/players/gameOver/timeOut') || 1)\n            )\n        );\n        room.events.emit('reldens.playerDeath', new PlayerDeathEvent({\n            targetSchema,\n            room,\n            targetClient,\n            affectedProperty,\n            attackerPlayer\n        }));\n        return false;\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @param {Object} body\n     * @param {Player} targetSchema\n     * @param {string} affectedProperty\n     * @param {Object} targetClient\n     * @returns {Promise<boolean>}\n     */\n    async revivePlayer(room, body, targetSchema, affectedProperty, targetClient)\n    {\n        if(!room.roomWorld){\n            Logger.critical('Room world not available to set player death timer.');\n            return false;\n        }\n        let sessionId = targetSchema.sessionId;\n        if(!room.activePlayerBySessionId(sessionId, room.roomId)){\n            // @NOTE: expected if the player disconnected while is death and timer keeps running after disconnection.\n            return false;\n        }\n        try {\n            if(sc.isFunction(room.roomWorld.addBody)){\n                room.roomWorld.addBody(body);\n            }\n            room.activatePlayer(targetSchema, GameConst.STATUS.ACTIVE);\n            // player is dead! reinitialize the stats using its base value:\n            targetSchema.stats[affectedProperty] = targetSchema.statsBase[affectedProperty];\n            await room.savePlayerStats(targetSchema, targetClient);\n            room.broadcast('*', {act: GameConst.REVIVED, t: sessionId});\n            //Logger.debug('Revived: '+targetSchema.player_id+' ('+ sessionId+' / '+targetSchema.state.inState+')');\n            return true;\n        } catch (error) {\n            Logger.error('There was an error on setting player death timer. ' + error.message);\n        }\n        return false;\n    }\n}\n\nmodule.exports.Battle = Battle;\n"
  },
  {
    "path": "lib/actions/server/data-loader.js",
    "content": "/**\n *\n * Reldens - DataLoader\n *\n * Loads skills, class paths, and animation data from the database into configuration.\n *\n */\n\nconst { TypeAttack, TypeEffect, TypePhysicalAttack, TypePhysicalEffect } = require('./skills/types');\nconst { SkillConst} = require('@reldens/skills');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('./models-manager').ModelsManager} ModelsManager\n */\nclass DataLoader\n{\n\n    /**\n     * @param {Object} configProcessor\n     * @param {ModelsManager} skillsModelsManager\n     * @param {BaseDataServer} dataServer\n     * @returns {Promise<void>}\n     */\n    static async enrichConfig(configProcessor, skillsModelsManager, dataServer)\n    {\n        await this.prepareConfigProcessor(configProcessor);\n        await this.loadSkillsFullList(configProcessor, skillsModelsManager);\n        await this.loadGroupsFullList(configProcessor, dataServer);\n        await this.loadClassPathFullList(configProcessor, skillsModelsManager);\n        await this.appendSkillsAnimations(configProcessor, dataServer);\n        await this.appendLevelsAnimations(configProcessor, dataServer);\n    }\n\n    /**\n     * @param {Object} configProcessor\n     * @returns {Promise<any>}\n     */\n    static async prepareConfigProcessor(configProcessor)\n    {\n        if(!sc.hasOwn(configProcessor, 'skills')){\n            configProcessor.skills = {skillsList: {}};\n        }\n        if(!sc.hasOwn(configProcessor.skills, 'defaultSkills')){\n            configProcessor.skills.defaultSkills = {};\n        }\n        configProcessor.skills.defaultSkills[SkillConst.SKILL.TYPE.ATTACK] = TypeAttack;\n        configProcessor.skills.defaultSkills[SkillConst.SKILL.TYPE.EFFECT] = TypeEffect;\n        configProcessor.skills.defaultSkills[SkillConst.SKILL.TYPE.PHYSICAL_ATTACK] = TypePhysicalAttack;\n        configProcessor.skills.defaultSkills[SkillConst.SKILL.TYPE.PHYSICAL_EFFECT] = TypePhysicalEffect;\n        return configProcessor;\n    }\n\n    /**\n     * @param {Object} configProcessor\n     * @param {ModelsManager} skillsModelsManager\n     * @returns {Promise<void>}\n     */\n    static async loadSkillsFullList(configProcessor, skillsModelsManager)\n    {\n        let skillsClasses = configProcessor.getWithoutLogs('server/customClasses/skills/skillsList', {});\n        // defined in this same class on the reldens.serverReady listener:\n        Object.assign(skillsClasses, configProcessor.skills.defaultSkills);\n        configProcessor.skills = await skillsModelsManager.generateSkillsDataFromModels(skillsClasses);\n    }\n\n    /**\n     * @param {Object} configProcessor\n     * @param {BaseDataServer} dataServer\n     * @returns {Promise<void>}\n     */\n    static async loadGroupsFullList(configProcessor, dataServer)\n    {\n        let groupsModels = await dataServer.getEntity('skillsGroups').loadAll();\n        if(0 < groupsModels.length){\n            configProcessor.skills.groups = groupsModels;\n        }\n    }\n\n    /**\n     * @param {Object} configProcessor\n     * @param {ModelsManager} skillsModelsManager\n     * @returns {Promise<void>}\n     */\n    static async loadClassPathFullList(configProcessor, skillsModelsManager)\n    {\n        configProcessor.skills.classPaths = await skillsModelsManager.generateClassPathInstances(\n            configProcessor.getWithoutLogs('server/customClasses/skills/classPath', {})\n        );\n        //Logger.debug('Config Processor skills class paths:', configProcessor.skills.classPaths);\n    }\n\n    /**\n     * @param {Object} config\n     * @param {BaseDataServer} dataServer\n     * @returns {Promise<Object>}\n     */\n    static async appendSkillsAnimations(config, dataServer)\n    {\n        let animationsModels = await dataServer.getEntity('skillsSkillAnimations').loadAllWithRelations();\n        if(0 === animationsModels.length){\n            Logger.debug('None animations models found.');\n            return config.client.skills.animations;\n        }\n        for(let skillAnim of animationsModels){\n            let animationData = sc.toJson(skillAnim.animationData, {});\n            let customDataJson = sc.toJson(skillAnim.related_skills_skill.customData, {});\n            if(sc.hasOwn(customDataJson, 'blockMovement')){\n                animationData.blockMovement = customDataJson.blockMovement;\n            }\n            config.client.skills.animations[skillAnim.related_skills_skill.key+'_'+skillAnim.key] = {\n                skillId: skillAnim.skill_id,\n                skillKey: skillAnim.related_skills_skill.key,\n                key: skillAnim.key,\n                class: skillAnim.classKey,\n                animationData\n            }\n        }\n        return config.client.skills.animations;\n    }\n\n    /**\n     * @param {Object} config\n     * @param {BaseDataServer} dataServer\n     * @returns {Promise<Object>}\n     */\n    static async appendLevelsAnimations(config, dataServer)\n    {\n        if(!sc.hasOwn(config.client, 'levels')){\n            config.client.levels = {};\n        }\n        if(!sc.hasOwn(config.client.levels, 'animations')){\n            config.client.levels.animations = {};\n        }\n        let levelsAnimationsModels = await dataServer.getEntity('skillsClassLevelUpAnimations').loadAllWithRelations();\n        if(0 === levelsAnimationsModels.length){\n            return config.client.levels.animations;\n        }\n        for(let levelAnimation of levelsAnimationsModels){\n            let animationData = sc.toJson(levelAnimation.animationData, {});\n            let animationKey = this.generateAnimationKey(levelAnimation);\n            config.client.levels.animations[animationKey] = {\n                key: animationKey,\n                levelId: sc.get(levelAnimation.related_skills_levels, 'id', null),\n                classKey: sc.get(levelAnimation.related_skills_class_path, 'key', null),\n                animationData\n            }\n        }\n        return config.client.levels.animations;\n    }\n\n    /**\n     * @param {Object} levelAnimation\n     * @returns {string}\n     */\n    static generateAnimationKey(levelAnimation)\n    {\n        let levelKey = sc.get(levelAnimation.related_skills_levels, 'id', '');\n        let classPathKey = sc.get(levelAnimation.related_skills_class_path, 'key', '');\n        if('' === levelKey && '' === classPathKey){\n            return 'level_default';\n        }\n        let animationKey = 'level';\n        if('' !== classPathKey){\n            classPathKey = '_'+classPathKey;\n        }\n        if('' !== levelKey){\n            levelKey = '_'+levelKey;\n        }\n        return animationKey+classPathKey+levelKey;\n    }\n\n}\n\nmodule.exports.DataLoader = DataLoader;\n"
  },
  {
    "path": "lib/actions/server/entities/operation-types-entity-override.js",
    "content": "/**\n *\n * Reldens - OperationTypesEntityOverride\n *\n * Custom entity override for operation types with admin panel configuration.\n *\n */\n\nconst { OperationTypesEntity } = require('../../../../generated-entities/entities/operation-types-entity');\n\nclass OperationTypesEntityOverride extends OperationTypesEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 2020;\n        return config;\n    }\n\n}\n\nmodule.exports.OperationTypesEntityOverride = OperationTypesEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities/skills-class-path-entity-override.js",
    "content": "/**\n *\n * Reldens - SkillsClassPathEntityOverride\n *\n * Entity override for skills class path with admin navigation configuration.\n *\n */\n\nconst { SkillsClassPathEntity } = require('../../../../generated-entities/entities/skills-class-path-entity');\n\nclass SkillsClassPathEntityOverride extends SkillsClassPathEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 110;\n        return config;\n    }\n\n}\n\nmodule.exports.SkillsClassPathEntityOverride = SkillsClassPathEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities/skills-levels-modifiers-entity-override.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsModifiersEntityOverride\n *\n * Entity override for skills level modifiers with property configuration.\n *\n */\n\nconst { SkillsLevelsModifiersEntity } = require(\n    '../../../../generated-entities/entities/skills-levels-modifiers-entity'\n);\nconst { sc } = require('@reldens/utils');\n\nclass SkillsLevelsModifiersEntityOverride extends SkillsLevelsModifiersEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties = sc.removeFromArray(config.listProperties, [\n            'minValue',\n            'maxValue',\n            'minProperty',\n            'maxProperty'\n        ]);\n        return config;\n    }\n\n}\n\nmodule.exports.SkillsLevelsModifiersEntityOverride = SkillsLevelsModifiersEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities/skills-levels-set-entity-override.js",
    "content": "/**\n *\n * Reldens - SkillsLevelsSetEntityOverride\n *\n * Entity override for skills levels set with admin navigation configuration.\n *\n */\n\nconst { SkillsLevelsSetEntity } = require('../../../../generated-entities/entities/skills-levels-set-entity');\n\nclass SkillsLevelsSetEntityOverride extends SkillsLevelsSetEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 100;\n        return config;\n    }\n\n}\n\nmodule.exports.SkillsLevelsSetEntityOverride = SkillsLevelsSetEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities/skills-owners-class-path-entity-override.js",
    "content": "/**\n *\n * Reldens - SkillsOwnersClassPathEntityOverride\n *\n * Entity override for skills owners class path with property configuration.\n *\n */\n\nconst { SkillsOwnersClassPathEntity } = require(\n    '../../../../generated-entities/entities/skills-owners-class-path-entity'\n);\n\nclass SkillsOwnersClassPathEntityOverride extends SkillsOwnersClassPathEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 990;\n        return config;\n    }\n\n}\n\nmodule.exports.SkillsOwnersClassPathEntityOverride = SkillsOwnersClassPathEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities/skills-skill-animations-entity-override.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAnimationsEntityOverride\n *\n * Entity override for skills animations with property configuration.\n *\n */\n\nconst { SkillsSkillAnimationsEntity } = require(\n    '../../../../generated-entities/entities/skills-skill-animations-entity'\n);\n\nclass SkillsSkillAnimationsEntityOverride extends SkillsSkillAnimationsEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties.splice(config.listProperties.indexOf('classKey'), 1);\n        return config;\n    }\n\n}\n\nmodule.exports.SkillsSkillAnimationsEntityOverride = SkillsSkillAnimationsEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities/skills-skill-attack-entity-override.js",
    "content": "/**\n *\n * Reldens - SkillsSkillAttackEntityOverride\n *\n * Entity override for skills attack with property configuration.\n *\n */\n\nconst { SkillsSkillAttackEntity } = require('../../../../generated-entities/entities/skills-skill-attack-entity');\nconst { sc } = require('@reldens/utils');\n\nclass SkillsSkillAttackEntityOverride extends SkillsSkillAttackEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties = sc.removeFromArray(config.listProperties, [\n            'allowEffectBelowZero',\n            'applyDirectDamage',\n            'dodgeFullEnabled',\n            'dodgeOverAimSuccess',\n            'damageAffected',\n            'criticalAffected'\n        ]);\n        return config;\n    }\n\n}\n\nmodule.exports.SkillsSkillAttackEntityOverride = SkillsSkillAttackEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities/skills-skill-entity-override.js",
    "content": "/**\n *\n * Reldens - SkillsSkillEntityOverride\n *\n * Entity override for skills with property and navigation configuration.\n *\n */\n\nconst { SkillsSkillEntity } = require('../../../../generated-entities/entities/skills-skill-entity');\nconst { sc } = require('@reldens/utils');\n\nclass SkillsSkillEntityOverride extends SkillsSkillEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties = sc.removeFromArray(config.listProperties, [\n            'autoValidation',\n            'rangeAutomaticValidation',\n            'rangePropertyX',\n            'rangePropertyY',\n            'rangeTargetPropertyX',\n            'rangeTargetPropertyY',\n            'allowSelfTarget',\n            'criticalChance',\n            'criticalMultiplier',\n            'criticalFixedValue'\n        ]);\n        config.navigationPosition = 200;\n        return config;\n    }\n\n}\n\nmodule.exports.SkillsSkillEntityOverride = SkillsSkillEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities/skills-skill-owner-effects-entity-override.js",
    "content": "/**\n *\n * Reldens - SkillsSkillOwnerEffectsEntityOverride\n *\n * Entity override for skills owner effects with property configuration.\n *\n */\n\nconst { SkillsSkillOwnerEffectsEntity } = require(\n    '../../../../generated-entities/entities/skills-skill-owner-effects-entity'\n);\nconst { sc } = require('@reldens/utils');\n\nclass SkillsSkillOwnerEffectsEntityOverride extends SkillsSkillOwnerEffectsEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties = sc.removeFromArray(config.listProperties, [\n            'minValue',\n            'maxValue',\n            'minProperty',\n            'maxProperty'\n        ]);\n        return config;\n    }\n\n}\n\nmodule.exports.SkillsSkillOwnerEffectsEntityOverride = SkillsSkillOwnerEffectsEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities/skills-skill-target-effects-entity-override.js",
    "content": "/**\n *\n * Reldens - SkillsSkillTargetEffectsEntityOverride\n *\n * Entity override for skills target effects with property configuration.\n *\n */\n\nconst { SkillsSkillTargetEffectsEntity } = require(\n    '../../../../generated-entities/entities/skills-skill-target-effects-entity'\n);\nconst { sc } = require('@reldens/utils');\n\nclass SkillsSkillTargetEffectsEntityOverride extends SkillsSkillTargetEffectsEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties = sc.removeFromArray(config.listProperties, [\n            'minValue',\n            'maxValue',\n            'minProperty',\n            'maxProperty'\n        ]);\n        return config;\n    }\n\n}\n\nmodule.exports.SkillsSkillTargetEffectsEntityOverride = SkillsSkillTargetEffectsEntityOverride;\n"
  },
  {
    "path": "lib/actions/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { SkillsSkillAnimationsEntityOverride } = require('./entities/skills-skill-animations-entity-override');\nconst { SkillsClassPathEntityOverride } = require('./entities/skills-class-path-entity-override');\nconst { SkillsLevelsModifiersEntityOverride } = require('./entities/skills-levels-modifiers-entity-override');\nconst { SkillsLevelsSetEntityOverride } = require('./entities/skills-levels-set-entity-override');\nconst { OperationTypesEntityOverride } = require('./entities/operation-types-entity-override');\nconst { SkillsOwnersClassPathEntityOverride } = require('./entities/skills-owners-class-path-entity-override');\nconst { SkillsSkillAttackEntityOverride } = require('./entities/skills-skill-attack-entity-override');\nconst { SkillsSkillEntityOverride } = require('./entities/skills-skill-entity-override');\nconst { SkillsSkillOwnerEffectsEntityOverride } = require('./entities/skills-skill-owner-effects-entity-override');\nconst { SkillsSkillTargetEffectsEntityOverride } = require('./entities/skills-skill-target-effects-entity-override');\n\nmodule.exports.entitiesConfig = {\n    skillsSkillAnimations: SkillsSkillAnimationsEntityOverride,\n    skillsClassPath: SkillsClassPathEntityOverride,\n    skillsLevelsModifiers: SkillsLevelsModifiersEntityOverride,\n    skillsLevelsSet: SkillsLevelsSetEntityOverride,\n    operationTypes: OperationTypesEntityOverride,\n    skillsOwnersClassPath: SkillsOwnersClassPathEntityOverride,\n    skillsSkillAttack: SkillsSkillAttackEntityOverride,\n    skillsSkill: SkillsSkillEntityOverride,\n    skillsSkillOwnerEffects: SkillsSkillOwnerEffectsEntityOverride,\n    skillsSkillTargetEffects: SkillsSkillTargetEffectsEntityOverride\n};\n"
  },
  {
    "path": "lib/actions/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        skills_class_level_up_animations: 'Level Up Animations',\n        skills_class_path: 'Class Paths',\n        skills_class_path_level_labels: 'Levels Labels',\n        skills_class_path_level_skills: 'Levels Skills',\n        skills_groups: 'Groups',\n        skills_levels: 'Levels',\n        skills_levels_modifiers_conditions: 'Levels Modifiers Conditions',\n        skills_levels_modifiers: 'Levels Modifiers',\n        skills_levels_set: 'Levels Sets',\n        skills_owners_class_path: 'Players Class Path',\n        skills_skill_animations: 'Animations',\n        skills_skill_attack: 'Attack Properties',\n        skills_skill: 'Skills',\n        skills_skill_group_relation: 'Groups Relation',\n        skills_skill_owner_conditions: 'Owner Conditions',\n        skills_skill_owner_effects_conditions: 'Owner Effects Conditions',\n        skills_skill_owner_effects: 'Owner Effects',\n        skills_skill_physical_data: 'Physics Data',\n        skills_skill_target_effects_conditions: 'Target Effects Conditions',\n        skills_skill_target_effects: 'Target Effects Properties',\n        skills_skill_type: 'Skill Types',\n    }\n};\n"
  },
  {
    "path": "lib/actions/server/event-listeners.js",
    "content": "/**\n *\n * Reldens - EventListeners\n *\n * Manages event listeners for skill casting and movement blocking.\n *\n */\n\nconst { SkillsEvents } = require('@reldens/skills');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass EventListeners\n{\n\n    /**\n     * @param {Object} props\n     * @param {Object} props.classPath\n     * @param {EventsManager} props.events\n     * @param {Object} props.actionsPlugin\n     * @returns {Promise<void>}\n     */\n    static async attachCastMovementEvents(props)\n    {\n        let {classPath, events, actionsPlugin} = props;\n        if(!classPath || !events || !actionsPlugin){\n            Logger.critical('EventListeners: classPath, events or actionsPlugin undefined.', props);\n            return;\n        }\n        let ownerId = classPath.getOwnerEventKey();\n        classPath.listenEvent(\n            SkillsEvents.SKILL_BEFORE_CAST,\n            async (skill) => {\n                if(this.validateSkillData(skill)){\n                    return;\n                }\n                skill.owner.physicalBody.isBlocked = true;\n            },\n            classPath.getOwnerUniqueEventKey('skillBeforeCastPack'),\n            ownerId\n        );\n        classPath.listenEvent(\n            SkillsEvents.SKILL_AFTER_CAST,\n            async (skill) => {\n                if(this.validateSkillData(skill)){\n                    return;\n                }\n                skill.owner.physicalBody.isBlocked = false;\n            },\n            classPath.getOwnerUniqueEventKey('skillAfterCastPack'),\n            ownerId\n        );\n        await events.emit('reldens.actionsPrepareEventsListeners', actionsPlugin, classPath);\n    }\n\n    /**\n     * @param {Object} skill\n     * @returns {boolean}\n     */\n    static validateSkillData(skill)\n    {\n        let customDataJson = sc.toJson(skill.customData);\n        return !customDataJson\n            || !sc.get(customDataJson, 'blockMovement', false)\n            || !sc.hasOwn(skill.owner, 'physicalBody');\n    }\n\n}\n\nmodule.exports.EventListeners = EventListeners;\n"
  },
  {
    "path": "lib/actions/server/events/battle-ended-event.js",
    "content": "/**\n *\n * Reldens - BattleEndedEvent\n *\n * Event emitted when a PvE battle ends.\n *\n */\n\n/**\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../pve').Pve} Pve\n *\n * @typedef {Object} BattleEndedEventProps\n * @property {Player} playerSchema\n * @property {Pve} pve\n * @property {Object} actionData\n * @property {RoomScene} room\n */\nclass BattleEndedEvent\n{\n\n    /**\n     * @param {BattleEndedEventProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Player} */\n        this.playerSchema = props.playerSchema;\n        /** @type {Pve} */\n        this.pve = props.pve\n        /** @type {Object} */\n        this.actionData = props.actionData;\n        /** @type {RoomScene} */\n        this.room = props.room;\n    }\n\n}\n\nmodule.exports.BattleEndedEvent = BattleEndedEvent;\n"
  },
  {
    "path": "lib/actions/server/events/player-death-event.js",
    "content": "/**\n *\n * Reldens - PlayerDeathEvent\n *\n * Event emitted when a player dies in combat.\n *\n */\n\n/**\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n *\n * @typedef {Object} PlayerDeathEventProps\n * @property {Player} targetSchema\n * @property {RoomScene} room\n * @property {Object} targetClient\n * @property {string} affectedProperty\n * @property {Player} [attackerPlayer]\n */\nclass PlayerDeathEvent\n{\n\n    /**\n     * @param {PlayerDeathEventProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Player} */\n        this.targetSchema = props.targetSchema;\n        /** @type {RoomScene} */\n        this.room = props.room;\n        /** @type {Object} */\n        this.targetClient = props.targetClient\n        /** @type {string} */\n        this.affectedProperty = props.affectedProperty;\n        /** @type {Player|undefined} */\n        this.attackerPlayer = props.attackerPlayer;\n    }\n\n}\n\nmodule.exports.PlayerDeathEvent = PlayerDeathEvent;\n"
  },
  {
    "path": "lib/actions/server/initial-game-data-enricher.js",
    "content": "/**\n *\n * Reldens - InitialGameDataEnricher\n *\n * Enriches initial game data with class path labels for the client.\n *\n */\n\n/**\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass InitialGameDataEnricher\n{\n\n    constructor()\n    {\n        /** @type {Object<string, Object>|boolean} */\n        this.classesData = false;\n    }\n\n    /**\n     * @param {RoomScene} roomGame\n     * @param {Object} superInitialGameData\n     * @returns {Promise<void>}\n     */\n    async withClassPathLabels(roomGame, superInitialGameData)\n    {\n        if(!roomGame.config.skills.classPaths.classPathsByKey){\n            return;\n        }\n        if(!this.classesData){\n            let classPathsLabelsByKey = {};\n            for(let i of Object.keys(roomGame.config.skills.classPaths.classPathsByKey)){\n                let classPath = roomGame.config.skills.classPaths.classPathsByKey[i];\n                classPathsLabelsByKey[classPath.data.id] = {key: i, label: classPath.data.label};\n            }\n            this.classesData = classPathsLabelsByKey;\n        }\n        superInitialGameData.classesData = this.classesData;\n    }\n\n}\n\nmodule.exports.InitialGameDataEnricher = InitialGameDataEnricher;\n"
  },
  {
    "path": "lib/actions/server/message-actions.js",
    "content": "/**\n *\n * Reldens - ActionsMessageActions\n *\n * Processes action messages and validates targets for skill execution.\n *\n */\n\nconst { GameConst } = require('../../game/constants');\nconst { ActionsConst } = require('../../actions/constants');\nconst { ObjectsConst } = require('../../objects/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} ColyseusClient\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass ActionsMessageActions\n{\n\n    /**\n     * @param {ColyseusClient} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {Player} playerSchema\n     * @returns {Promise<boolean|void>}\n     */\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        let bodyToMove = playerSchema.physicalBody;\n        if(playerSchema.isCasting || bodyToMove.isBlocked || bodyToMove.isChangingScene){\n            // if body is blocked do NOTHING! it could be because a scene change, or a skill activation or an item\n            return false;\n        }\n        if(playerSchema.isDeath() || playerSchema.isDisabled()){\n            return false;\n        }\n        if(ActionsConst.ACTION !== data.act || !data.target){\n            return false;\n        }\n        let validTarget = this.validateTarget(data.target, room);\n        if(!validTarget){\n            return false;\n        }\n        let currentAction = this.preparePlayerCurrentAction(playerSchema, data);\n        if(!currentAction){\n            return false;\n        }\n        // run skill validations (range, time, conditions, etc):\n        if(!currentAction.validateRange(validTarget) || !currentAction.validate()){\n            return false;\n        }\n        currentAction.room = room;\n        if(data.target.type === GameConst.TYPE_PLAYER && playerSchema.actions['pvp']){\n            await playerSchema.actions['pvp'].runBattle(playerSchema, validTarget, room);\n        }\n        if(data.target.type === ObjectsConst.TYPE_OBJECT && sc.hasOwn(validTarget, 'battle')){\n            await validTarget.battle.runBattle(playerSchema, validTarget, room);\n        }\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {Object} data\n     * @returns {any|boolean}\n     */\n    preparePlayerCurrentAction(playerSchema, data)\n    {\n        let runAction = data.type;\n        let playerAction = sc.get(playerSchema.actions, runAction, false);\n        let classPathSkill = sc.get(playerSchema.skillsServer.classPath.currentSkills, runAction, false);\n        // @NOTE: actions could be anything the player will apply on the target, for example an action button\n        // could send the type \"dig\", and that will run an action that will make the player \"find something\".\n        // For that matter the action could always validate the target as true anywhere on the ground, so the\n        // current position / layer on the map could be validated.\n        // On the other hand skills have their own behavior and in most of the cases it will trigger a battle.\n        // Skills come from a specific system to which we have direct access from here.\n        if(!runAction || (!playerAction && !classPathSkill)){\n            Logger.error('Action not available:', runAction, data);\n            return false;\n        }\n        playerSchema.currentAction = runAction;\n        // if one is not available because of the condition above the other will be:\n        return playerAction ? playerAction : classPathSkill;\n    }\n\n    /**\n     * @param {Object} target\n     * @param {RoomScene} room\n     * @returns {any|boolean}\n     */\n    validateTarget(target, room)\n    {\n        let validTarget = false;\n        if(target.type === GameConst.TYPE_PLAYER){\n            validTarget = room.playerBySessionIdFromState(target.id);\n        }\n        if(target.type === ObjectsConst.TYPE_OBJECT){\n            validTarget = room.objectsManager.roomObjects[target.id];\n        }\n        if(target.type === ActionsConst.TARGET_POSITION){\n            validTarget = target;\n        }\n        return validTarget;\n    }\n\n}\n\nmodule.exports.ActionsMessageActions = ActionsMessageActions;\n"
  },
  {
    "path": "lib/actions/server/models-manager.js",
    "content": "/**\n *\n * Reldens - Skills - ModelsManager\n *\n * Manages database operations for skills, class paths, and related entities.\n *\n */\n\nconst { ClassPathGenerator } = require('./storage/class-path-generator');\nconst { SkillsGenerator } = require('./storage/skills-generator');\nconst { SkillsClassPathLoader } = require('./skills-class-path-loader');\nconst { EventsManagerSingleton, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n *\n * @typedef {Object} ModelsManagerProps\n * @property {BaseDataServer} [dataServer]\n * @property {EventsManager} [events]\n */\nclass ModelsManager\n{\n\n    /**\n     * @param {ModelsManagerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {BaseDataServer|false} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        /** @type {EventsManager} */\n        this.events = sc.get(props, 'events', EventsManagerSingleton);\n    }\n\n    /**\n     * @param {string} entityName\n     * @returns {any|false}\n     */\n    getEntity(entityName)\n    {\n        if(!entityName){\n            Logger.warning('Entity name is missing.');\n            return false;\n        }\n        if(!this.dataServer){\n            Logger.warning('Data server is missing.');\n            return false;\n        }\n        return this.dataServer.entityManager.get(entityName);\n    }\n\n    /**\n     * @param {number} ownerId\n     * @returns {Promise<any>}\n     */\n    async loadOwnerClassPath(ownerId)\n    {\n        return await this.getEntity('skillsOwnersClassPath').loadOneByWithRelations(\n            'owner_id',\n            ownerId,\n            'related_skills_class_path'\n        );\n    }\n\n    /**\n     * @param {Object} levelsSet\n     * @returns {Promise<any>}\n     */\n    async updateLevel(levelsSet)\n    {\n        return await this.getEntity('skillsOwnersClassPath').updateBy(\n            'owner_id',\n            levelsSet.getOwnerId(),\n            {currentLevel: levelsSet.currentLevel}\n        );\n    }\n\n    /**\n     * @param {Object} levelsSet\n     * @returns {Promise<any>}\n     */\n    async updateExperience(levelsSet)\n    {\n        return await this.getEntity('skillsOwnersClassPath').updateBy(\n            'owner_id',\n            levelsSet.getOwnerId(),\n            {currentExp: levelsSet.currentExp}\n        );\n    }\n\n    /**\n     * @param {Object} skillsClasses\n     * @returns {Promise<Object>}\n     */\n    async generateSkillsDataFromModels(skillsClasses)\n    {\n        // @TODO - BETA - Replace relations by constants on the registered-entities definition.\n        //   This way we will be able to use the get method, save the entity in a variable and call the relations list\n        //   from it.\n        let skillsModels = await this.getEntity('skillsSkill').loadAllWithRelations([\n            'related_skills_skill_attack',\n            'related_skills_skill_physical_data',\n            'related_skills_skill_owner_conditions',\n            'related_skills_skill_owner_effects',\n            'related_skills_skill_target_effects'\n        ]);\n        //Logger.debug('Skills Models:', skillsModels, 'Skills Classes:', skillsClasses);\n        return SkillsGenerator.dataFromSkillsModelsWithClasses(skillsModels, skillsClasses, this.events);\n    }\n\n    /**\n     * @param {Object} classPathClasses\n     * @returns {Promise<Object>}\n     */\n    async generateClassPathInstances(classPathClasses)\n    {\n        let loader = new SkillsClassPathLoader({dataServer: this.dataServer});\n        return ClassPathGenerator.fromClassPathModels(await loader.loadFullPathData(), classPathClasses);\n    }\n\n    /**\n     * @param {Object} owner\n     * @param {string} ownerIdProperty\n     * @param {Object} classPathsListById\n     * @param {Object} skillsClassesList\n     * @returns {Promise<Object|boolean>}\n     */\n    async prepareClassPathData(owner, ownerIdProperty, classPathsListById, skillsClassesList)\n    {\n        // @TODO - BETA - Temporal one class path per player, we will have optional multiple classes.\n        let currentPlayerClassPath = await this.loadOwnerClassPath(owner[ownerIdProperty]);\n        if(!currentPlayerClassPath){\n            Logger.error(['Undefined class path for player.', 'ID:', owner[ownerIdProperty]]);\n            return false;\n        }\n        let currentClassPath = classPathsListById[currentPlayerClassPath.class_path_id];\n        //Logger.debug('Current class path:', currentClassPath);\n        let skillsByLevel = SkillsGenerator.skillsByLevelsFromSkillsModels(\n            currentClassPath.data.related_skills_class_path_level_skills,\n            owner,\n            ownerIdProperty,\n            skillsClassesList,\n            this.events\n        );\n        //Logger.debug('Current Class Path:', currentClassPath);\n        return {\n            key: currentClassPath.data.key,\n            label: currentClassPath.data.label,\n            owner,\n            ownerIdProperty,\n            levels: currentClassPath.data.classPathLevels,\n            labelsByLevel: currentClassPath.data.labelsByLevel,\n            skillsByLevel,\n            autoFillRanges: currentClassPath.data.related_skills_levels_set.autoFillRanges,\n            autoSortLevels: currentClassPath.data.related_skills_levels_set.autoSortLevels,\n            currentLevel: currentPlayerClassPath.currentLevel,\n            currentExp: currentPlayerClassPath.currentExp,\n        };\n    }\n\n}\n\nmodule.exports.ModelsManager = ModelsManager;\n"
  },
  {
    "path": "lib/actions/server/player-class-path-handler.js",
    "content": "/**\n *\n * Reldens - PlayerClassPathHandler\n *\n * Creates player class path assignments during login.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n */\nclass PlayerClassPathHandler\n{\n\n    /**\n     * @param {Object} props\n     * @param {Object} props.loginManager\n     * @param {Object} props.loginData\n     * @param {Object} props.player\n     * @param {BaseDataServer} props.dataServer\n     * @returns {Promise<Object>}\n     */\n    static async createFromLoginData(props)\n    {\n        let {loginManager, loginData, player, dataServer} = props;\n        let defaultClassPathId = loginManager.config.get('server/players/actions/initialClassPathId');\n        let initialClassPathId = sc.get(loginData, 'class_path_select', defaultClassPathId);\n        let data = {\n            class_path_id: initialClassPathId,\n            owner_id: player.id,\n            currentLevel: 1,\n            currentExp: 0\n        };\n        return dataServer.getEntity('skillsOwnersClassPath').create(data);\n    }\n\n}\n\nmodule.exports.PlayerClassPathHandler = PlayerClassPathHandler;\n"
  },
  {
    "path": "lib/actions/server/player-enricher.js",
    "content": "/**\n *\n * Reldens - PlayerEnricher\n *\n * Enriches players with skills, class paths, and combat capabilities.\n *\n */\n\nconst { Pvp } = require('./pvp');\nconst { SkillsExtraDataMapper } = require('./skills-extra-data-mapper');\nconst { ClientWrapper } = require('../../game/server/client-wrapper');\nconst SkillsServer = require('@reldens/skills/lib/server');\nconst { StorageObserver } = require('./storage-observer');\nconst { SkillConst } = require('@reldens/skills');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('./models-manager').ModelsManager} ModelsManager\n *\n * @typedef {Object} PlayerEnricherProps\n * @property {ConfigManager} config\n * @property {EventsManager} events\n * @property {ModelsManager} skillsModelsManager\n */\nclass PlayerEnricher\n{\n\n    /**\n     * @param {PlayerEnricherProps} props\n     */\n    constructor(props)\n    {\n        /** @type {ConfigManager} */\n        this.config = props.config;\n        /** @type {EventsManager} */\n        this.events = props.events;\n        /** @type {ModelsManager} */\n        this.skillsModelsManager = props.skillsModelsManager;\n        /** @type {boolean} */\n        this.pvpEnabled = this.config.getWithoutLogs('server/actions/pvp/enabled', true);\n        /** @type {Object} */\n        this.pvpConfig = Object.assign({events: this.events}, this.config.get('server/actions/pvp'));\n        /** @type {string} */\n        this.affectedProperty = this.config.get('client/actions/skills/affectedProperty');\n        /** @type {SkillsExtraDataMapper} */\n        this.skillsExtraDataMapper = new SkillsExtraDataMapper();\n    }\n\n    /**\n     * @param {RoomScene} roomGame\n     * @param {Object} superInitialGameData\n     * @returns {Promise<void>}\n     */\n    async withClassPath(roomGame, superInitialGameData)\n    {\n        //Logger.debug('Players Models:', superInitialGameData.players);\n        if(!superInitialGameData.players){\n            return;\n        }\n        for(let i of Object.keys(superInitialGameData.players)){\n            let player = superInitialGameData.players[i];\n            let classPath = await this.skillsModelsManager.loadOwnerClassPath(player.id);\n            if(!classPath){\n                continue;\n            }\n            player.currentLevel = classPath.currentLevel;\n            player.currentClassPathLabel = classPath.related_skills_class_path.label;\n            player.currentClassPathKey = player.avatarKey = classPath.related_skills_class_path.key;\n        }\n    }\n\n    /**\n     * @param {Player} currentPlayer\n     * @param {RoomScene} room\n     * @returns {Promise<void>}\n     */\n    async withActions(currentPlayer, room)\n    {\n        currentPlayer.actions = {};\n        if(this.pvpEnabled && false !== sc.get(room.customData, 'pvpEnabled', true)){\n            currentPlayer.actions['pvp'] = new Pvp(this.pvpConfig);\n        }\n        currentPlayer.getSkillExtraData = (params) => {\n            return this.skillsExtraDataMapper.extractSkillExtraData(params);\n        };\n        currentPlayer.executePhysicalSkill = this.playerExecutePhysicalSkillCallback(\n            currentPlayer,\n            room.config.client.skills.animations\n        );\n    }\n\n    /**\n     * @param {Player} currentPlayer\n     * @param {Object} skillsAnimationsData\n     * @returns {Function}\n     */\n    playerExecutePhysicalSkillCallback(currentPlayer, skillsAnimationsData)\n    {\n        // @TODO - BETA - Replace with bind.\n        return async (target, executedSkill) => {\n            let messageData = Object.assign({skillKey: executedSkill.key}, executedSkill.owner.getPosition());\n            if(sc.isObjectFunction(executedSkill.owner, 'getSkillExtraData')){\n                let params = {skill: executedSkill, target};\n                Object.assign(messageData, {extraData: executedSkill.owner.getSkillExtraData(params)});\n            }\n            await currentPlayer.skillsServer.client.runBehaviors(\n                messageData,\n                SkillConst.ACTION_SKILL_AFTER_CAST,\n                SkillConst.BEHAVIOR_BROADCAST,\n                executedSkill.getOwnerId()\n            );\n            let from = {x: currentPlayer.state.x, y: currentPlayer.state.y};\n            executedSkill.initialPosition = from;\n            let animData = sc.get(skillsAnimationsData, executedSkill.key + '_bullet', false);\n            if(animData){\n                executedSkill.animDir = sc.get(animData.animationData, 'dir', false);\n            }\n            // player disconnection would cause the physicalBody to be removed, so we need to validate it:\n            let physicalBody = currentPlayer.physicalBody;\n            if(!physicalBody){\n                Logger.info('Player body is missing.');\n                return false;\n            }\n            if(!physicalBody.world){\n                Logger.error('Player body world is missing. Body ID: '+ physicalBody.id);\n                return false;\n            }\n            physicalBody.world.shootBullet(from, {x: target.state.x, y: target.state.y}, executedSkill);\n        };\n    }\n\n    /**\n     * @param {Object} props\n     * @param {Object} props.client\n     * @param {Player} props.currentPlayer\n     * @param {RoomScene} props.room\n     * @param {ModelsManager} props.skillsModelsManager\n     * @param {BaseDataServer} props.dataServer\n     * @param {EventsManager} props.events\n     * @returns {Promise<void>}\n     */\n    async withSkillsServerAndClassPath(props)\n    {\n        let {client, currentPlayer, room, skillsModelsManager, dataServer, events} = props;\n        // @TODO - BETA - Improve prepareClassPathData to avoid loadOwnerClassPath double queries on each room.\n        let classPathData = await skillsModelsManager.prepareClassPathData(\n            currentPlayer,\n            'player_id',\n            room.config.skills.classPaths.classPathsById,\n            room.config.skills.skillsList\n        );\n        if(!classPathData){\n            return;\n        }\n        Object.assign(classPathData, {\n            events: events,\n            persistence: true,\n            dataServer: dataServer,\n            affectedProperty: this.affectedProperty,\n            client: new ClientWrapper({client, room})\n        });\n        currentPlayer.skillsServer = new SkillsServer(classPathData);\n        this.storageObserver = new StorageObserver({\n            classPath: currentPlayer.skillsServer.classPath,\n            dataServer: dataServer,\n            modelsManager: skillsModelsManager,\n        });\n        this.storageObserver.registerListeners();\n        currentPlayer.avatarKey = classPathData.key;\n    }\n\n}\n\nmodule.exports.PlayerEnricher = PlayerEnricher;\n"
  },
  {
    "path": "lib/actions/server/plugin.js",
    "content": "/**\n *\n * Reldens - ActionsPlugin\n *\n * Plugin that integrates the actions/skills system into the game server.\n *\n */\n\nconst { ActionsMessageActions } = require('./message-actions');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { InitialGameDataEnricher } = require('./initial-game-data-enricher');\nconst { PlayerEnricher } = require('./player-enricher');\nconst { DataLoader } = require('./data-loader');\nconst { EventListeners } = require('./event-listeners');\nconst { PlayerClassPathHandler } = require('./player-class-path-handler');\nconst { ModelsManager } = require('./models-manager');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass ActionsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    setup(props)\n    {\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in ActionsPlugin.');\n        }\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('Data Server undefined in ActionsPlugin.');\n        }\n        this.config = sc.get(props, 'config', false);\n        if(!this.config){\n            Logger.error('Config undefined in ActionsPlugin.');\n        }\n        this.skillsModelsManager = new ModelsManager({events: this.events, dataServer: this.dataServer});\n        this.playerEnricher = new PlayerEnricher({\n            events: this.events,\n            config: this.config,\n            skillsModelsManager: this.skillsModelsManager\n        });\n        this.initialGameDataEnricher = new InitialGameDataEnricher();\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        this.events.on('reldens.serverReady', this.serverReadyDataLoaderEnrichConfig.bind(this));\n        this.events.on('reldens.beforeSuperInitialGameData', this.enrichInitialGameDataWithClassPathData.bind(this));\n        this.events.on('reldens.roomsMessageActionsByRoom', this.appendRoomActions.bind(this));\n        this.events.on('reldens.createdPlayerSchema', this.enrichPlayerWithSkillsAndActions.bind(this));\n        this.events.on('reldens.createdNewPlayer', this.createPlayerClassPath.bind(this));\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<void>}\n     */\n    async serverReadyDataLoaderEnrichConfig(event)\n    {\n        await DataLoader.enrichConfig(event.serverManager.configManager, this.skillsModelsManager, this.dataServer);\n    }\n\n    /**\n     * @param {Object} superInitialGameData\n     * @param {RoomScene} roomGame\n     * @returns {Promise<void>}\n     */\n    async enrichInitialGameDataWithClassPathData(superInitialGameData, roomGame)\n    {\n        await this.initialGameDataEnricher.withClassPathLabels(roomGame, superInitialGameData);\n        await this.playerEnricher.withClassPath(roomGame, superInitialGameData);\n    }\n\n    /**\n     * @param {RoomScene} roomMessageActions\n     * @returns {Promise<void>}\n     */\n    async appendRoomActions(roomMessageActions)\n    {\n        roomMessageActions.actions = new ActionsMessageActions();\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} userModel\n     * @param {Player} currentPlayer\n     * @param {RoomScene} room\n     * @returns {Promise<void>}\n     */\n    async enrichPlayerWithSkillsAndActions(client, userModel, currentPlayer, room)\n    {\n        await this.playerEnricher.withActions(currentPlayer, room, this.events);\n        // @TODO - BETA - Improve login performance.\n        await this.playerEnricher.withSkillsServerAndClassPath({\n            client,\n            room,\n            skillsModelsManager: this.skillsModelsManager,\n            currentPlayer,\n            dataServer: this.dataServer,\n            events: this.events\n        });\n        await EventListeners.attachCastMovementEvents({\n            classPath: currentPlayer.skillsServer.classPath,\n            events: this.events,\n            actionsPlugin: this\n        });\n    }\n\n    /**\n     * @param {Player} player\n     * @param {Object} loginData\n     * @param {Object} loginManager\n     * @returns {Promise<any>}\n     */\n    async createPlayerClassPath(player, loginData, loginManager)\n    {\n        return PlayerClassPathHandler.createFromLoginData({\n            loginManager,\n            loginData,\n            player,\n            dataServer: this.dataServer\n        });\n    }\n\n}\n\nmodule.exports.ActionsPlugin = ActionsPlugin;\n"
  },
  {
    "path": "lib/actions/server/pve.js",
    "content": "/**\n *\n * Reldens - Pve\n *\n * Handles player versus environment (NPC/enemy) combat logic.\n *\n */\n\nconst { Battle } = require('./battle');\nconst { BattleEndAction } = require('./battle-end-action');\nconst { BattleEndedEvent } = require('./events/battle-ended-event');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass Pve extends Battle\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {boolean} */\n        this.chaseMultiple = sc.get(props, 'chaseMultiple', false);\n        /** @type {Object<string, boolean>} */\n        this.inBattleWithPlayers = {};\n        /** @type {boolean} */\n        this.isBattleEndProcessing = false;\n        /** @type {string} */\n        this.uid = sc.randomChars(8)+'-'+(new Date()).getTime();\n    }\n\n    /**\n     * @param {Object} targetObject\n     */\n    setTargetObject(targetObject)\n    {\n        this.targetObject = targetObject;\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {Object} target\n     * @param {RoomScene} roomScene\n     * @returns {Promise<boolean>}\n     */\n    async runBattle(playerSchema, target, roomScene)\n    {\n        //Logger.debug('Running Battle between \"'+playerSchema.sessionId+'\" and \"'+target.id+'\".', this.uid);\n        if(GameConst.STATUS.ACTIVE !== playerSchema.state.inState){\n            //Logger.debug('PvE inactive player.', playerSchema.state.inState);\n            delete this.inBattleWith[target.id];\n            return false;\n        }\n        if(!this.targetObject){\n            // @NOTE: this will be the expected case when the player was killed in between different NPCs attacks.\n            // Logger.debug('Target Object reference removed.');\n            return false;\n        }\n        let affectedProperty = roomScene.config.get('client/actions/skills/affectedProperty');\n        // @TODO - BETA - Target affected property could be passed on the target object.\n        if(!affectedProperty){\n            Logger.error('Affected property configuration is missing');\n            return false;\n        }\n        //Logger.debug('Run Battle - Object:', this.targetObject?.uid, this.targetObject.stats[affectedProperty]);\n        if(0 >= this.targetObject.stats[affectedProperty]){\n            // Logger.debug('Target object affected property is zero.');\n            await this.battleEnded(playerSchema, roomScene);\n            return false;\n        }\n        // @TODO - BETA - Make PvP available by configuration.\n        // @NOTE: run battle method is for when the player attacks any target. PVE can be started in different ways,\n        // depending on how the current enemy-object was implemented, for example the PVE can start when the player just\n        // collides with the enemy (instead of attack it) an aggressive enemy could start the battle automatically.\n        let attackResult = await super.runBattle(playerSchema, target, roomScene);\n        await this.events.emit('reldens.runBattlePveAfter', {playerSchema, target, roomScene, attackResult});\n        if(!attackResult){\n            // @NOTE: the attack result can be false because different reasons, for example it could be a physical\n            // attack for which matter we won't start the battle until the physical body hits the target.\n            return false;\n        }\n        if(!sc.hasOwn(target.stats, affectedProperty)){\n            Logger.error('Affected property is not present on target stats.', Object.keys(target.stats));\n            return false;\n        }\n        let affectedPropertyTargetValue = Number(sc.get(target.stats, affectedProperty, 0));\n        if(0 < affectedPropertyTargetValue){\n            return await this.startBattleWith(playerSchema, roomScene);\n        }\n        // physical attacks or effects will run the battleEnded, normal attacks or effects will hit this case:\n        return await this.battleEnded(playerSchema, roomScene);\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {RoomScene} room\n     * @returns {Promise<boolean>}\n     */\n    async startBattleWith(playerSchema, room)\n    {\n        //Logger.debug('Starts PvE', playerSchema?.player_id, this.targetObject?.uid);\n        if(!this.targetObject){\n            // @NOTE: this will be the expected case when the player was killed in between different NPCs attacks.\n            // Logger.debug('Target Object reference removed.');\n            return false;\n        }\n        let affectedProperty = room.config.get('client/actions/skills/affectedProperty');\n        // Logger.debug('Start Battle - Object:', this.targetObject?.uid, this.targetObject.stats[affectedProperty]);\n        if(0 >= this.targetObject.stats[affectedProperty]){\n            // Logger.debug('Target object affected property is zero.');\n            return false;\n        }\n        if(0 === (this.targetObject.actionsKeys?.length ?? 0)){\n            Logger.warning('Target Object does not have any actions assigned.');\n            this.leaveBattle(playerSchema);\n            return false;\n        }\n        let targetObjectWorld = this.targetObject.objectBody?.world;\n        let objectWorldKey = targetObjectWorld?.worldKey;\n        let playerWorld = playerSchema?.physicalBody?.world;\n        let playerWorldKey = playerWorld?.worldKey;\n        if(!objectWorldKey || !playerWorldKey || objectWorldKey !== playerWorldKey){\n            if(playerWorldKey){\n                Logger.debug('World keys check failed:', playerWorld.sceneName, {objectWorldKey, playerWorldKey});\n            }\n            // playerWorldKey will be null while the player is dead because the removeBody\n            // Logger.debug('Leaving battle, world keys check failed.', playerSchema.player_id);\n            this.leaveBattle(playerSchema);\n            return false;\n        }\n        if(\n            !room?.roomWorld\n            || !room?.state\n            || !playerSchema\n            || !room.playerBySessionIdFromState(playerSchema.sessionId)\n        ){\n            //Logger.debug('Room or player missing references.');\n            // @NOTE: leaveBattle is used for when the player can't be reached anymore or disconnected.\n            this.leaveBattle(playerSchema);\n            return false;\n        }\n        if(!playerSchema.stats){\n            Logger.debug('Player not ready yet to be attacked.');\n            this.leaveBattle(playerSchema);\n            return false;\n        }\n        // if target (npc) is already in battle with another player then ignore the current attack:\n        let inBattleWithPlayersIds = Object.keys(this.inBattleWithPlayers);\n        let inBattleWithCurrentPlayer = this.inBattleWithPlayers[playerSchema.player_id];\n        if(!this.chaseMultiple && 1 <= inBattleWithPlayersIds.length && !inBattleWithCurrentPlayer){\n            Logger.debug('Object already in battle with player \"'+playerSchema.player_id+'\".');\n            return false;\n        }\n        this.inBattleWithPlayers[playerSchema.player_id] = true;\n        let objectAction = this.pickRandomActionFromObject();\n        objectAction.room = room;\n        objectAction.currentBattle = this;\n        if(!objectAction.validate()){\n            // @NOTE: none logs here because it will create a (useless) log entry everytime an NPC tries to attack.\n            // expected when for example the action is out of range or has a skill delay, then we restart the battle:\n            return this.chasePlayer(playerSchema, room, objectAction);\n        }\n        let ownerPos = {x: this.targetObject.state.x, y: this.targetObject.state.y};\n        let targetPos = {x: playerSchema.state.x, y: playerSchema.state.y};\n        let inRange = objectAction.isInRange(ownerPos, targetPos);\n        if(inRange){\n            this.isBattleEndProcessing = false;\n            return await this.attackInRange(objectAction, playerSchema, room);\n        }\n        return this.chasePlayer(playerSchema, room, objectAction);\n    }\n\n    /**\n     * @returns {Object}\n     */\n    pickRandomActionFromObject()\n    {\n        let objActionIdx = Math.floor(Math.random() * this.targetObject.actionsKeys.length);\n        let objectActionKey = this.targetObject.actionsKeys[objActionIdx];\n        return this.targetObject.actions[objectActionKey];\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {RoomScene} room\n     * @param {Object} objectAction\n     * @returns {boolean|Promise<void>}\n     */\n    chasePlayer(playerSchema, room, objectAction)\n    {\n        let chaseResult = this.targetObject.chaseBody(playerSchema.physicalBody);\n        if(chaseResult && 0 < chaseResult.length){\n            return this.startBattleWithDelay(playerSchema, room, objectAction);\n        }\n        Logger.debug('Leave battle, chase result failed.');\n        return this.leaveBattle(playerSchema);\n    }\n\n    /**\n     * @param {Object} objectAction\n     * @param {Player} playerSchema\n     * @param {RoomScene} room\n     * @returns {Promise<boolean|Promise<void>>}\n     */\n    async attackInRange(objectAction, playerSchema, room)\n    {\n        if(this.targetObject.objectBody){\n            // reset the pathfinder in case the object was moving:\n            this.targetObject.objectBody.resetAuto();\n            this.targetObject.objectBody.velocity = [0, 0];\n        }\n        // execute and apply the attack:\n        await objectAction.execute(playerSchema);\n        Logger.debug('Executed action \"'+objectAction.key+'\" on player \"'+playerSchema.player_id+'\".');\n        let targetClient = room.getClientById(playerSchema.sessionId);\n        if(!targetClient){\n            Logger.debug('Leave battle, missing target client.');\n            return this.leaveBattle(playerSchema);\n        }\n        let targetObjectId = this.targetObject?.id;\n        if(!targetObjectId){\n            Logger.debug('Leave battle, missing target object ID.');\n            return this.leaveBattle(playerSchema);\n        }\n        let update = await this.updateTargetClient(targetClient, playerSchema, targetObjectId, room)\n            .catch((error) => {\n                Logger.error('Leave battle, update target client catch error.', error);\n                return this.leaveBattle(playerSchema);\n            });\n        if(update){\n            return await this.startBattleWithDelay(playerSchema, room, objectAction);\n        }\n        Logger.debug('Leave battle, target client update failed.');\n        return this.leaveBattle(playerSchema);\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {RoomScene} room\n     * @param {Object} objectAction\n     * @returns {Promise<void>}\n     */\n    async startBattleWithDelay(playerSchema, room, objectAction)\n    {\n        if(0 < objectAction.skillDelay){\n            setTimeout(async () => {\n                if(!this.targetObject){\n                    return false;\n                }\n                await this.startBattleWith(playerSchema, room);\n            }, objectAction.skillDelay);\n            return;\n        }\n        await this.startBattleWith(playerSchema, room);\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @returns {boolean}\n     */\n    leaveBattle(playerSchema)\n    {\n        Logger.debug('Leaving battle.', {player: playerSchema?.player_id, object: this.targetObject?.uid});\n        if(playerSchema?.player_id){\n            this.removeInBattlePlayer(playerSchema);\n        }\n        return this.moveObjectToOriginPoints();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    moveObjectToOriginPoints()\n    {\n        if(!this.targetObject){\n            // expected on client disconnection:\n            // Logger.debug('Target Object reference not found.');\n            return false;\n        }\n        if(GameConst.STATUS.ACTIVE !== this.targetObject.objectBody.bodyState.inState){\n            return false;\n        }\n        Logger.debug('Move back to origin.', {\n            uid: this.uid,\n            object: this.targetObject.uid,\n            state: this.targetObject.objectBody.bodyState.inState,\n            column: this.targetObject.objectBody.originalCol,\n            row: this.targetObject.objectBody.originalRow\n        });\n        this.targetObject.objectBody.moveToOriginalPoint();\n        return true;\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {RoomScene} room\n     * @returns {Promise<boolean>}\n     */\n    async battleEnded(playerSchema, room)\n    {\n        if(this.isBattleEndProcessing){\n            Logger.debug('Battle end in progress.', this.uid);\n            return false;\n        }\n        this.isBattleEndProcessing = true;\n        // @TODO - BETA - Implement battle end in both PvE and PvP.\n        this.targetObject.objectBody.bodyState.inState = GameConst.STATUS.DEATH;\n        Logger.debug(\n            'Battle end, player ID \"'+playerSchema?.player_id+'\", target ID \"'+this.targetObject.uid+'\".',\n            this.uid\n        );\n        this.removeInBattlePlayer(playerSchema);\n        let actionData = new BattleEndAction(\n            this.targetObject.objectBody.position[0],\n            this.targetObject.objectBody.position[1],\n            this.targetObject.key,\n            this.lastAttackKey\n        );\n        room.broadcast('*', actionData);\n        if(sc.isObjectFunction(this.targetObject, 'respawn')){\n            await this.targetObject.respawn(room);\n        }\n        this.sendBattleEndedActionData(room, playerSchema, actionData);\n        let event = new BattleEndedEvent({playerSchema, pve: this, actionData, room});\n        await this.events.emit(this.targetObject.getBattleEndEvent(), event);\n        await this.events.emit('reldens.battleEnded', event);\n        return true;\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @param {Player} playerSchema\n     * @param {BattleEndAction} actionData\n     */\n    sendBattleEndedActionData(room, playerSchema, actionData)\n    {\n        let client = room.getClientById(playerSchema.sessionId);\n        if(!client){\n            Logger.info('Client not found by sessionId: '+ playerSchema.sessionId);\n            return;\n        }\n        client.send('*', actionData);\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @returns {boolean}\n     */\n    removeInBattlePlayer(playerSchema)\n    {\n        if(!playerSchema?.player_id){\n            return false;\n        }\n        if(this.inBattleWithPlayers[playerSchema.player_id]){\n            delete this.inBattleWithPlayers[playerSchema.player_id];\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.Pve = Pve;\n"
  },
  {
    "path": "lib/actions/server/pvp.js",
    "content": "/**\n *\n * Reldens - PvP\n *\n * Handles player versus player combat logic.\n *\n */\n\nconst { Battle } = require('./battle');\nconst { Logger } = require('@reldens/utils');\nconst { GameConst } = require('../../game/constants');\n\n/**\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass Pvp extends Battle\n{\n\n    /**\n     * @param {Player} playerSchema\n     * @param {Player} target\n     * @param {RoomScene} room\n     * @returns {Promise<boolean>}\n     */\n    async runBattle(playerSchema, target, room)\n    {\n        // @TODO - BETA - Implement battle end for PvP.\n        if(GameConst.STATUS.ACTIVE !== playerSchema.state.inState){\n            Logger.info('PvP inactive player.', playerSchema.state.inState);\n            return false;\n        }\n        if(GameConst.STATUS.ACTIVE !== target.state.inState){\n            Logger.info('PvP inactive target.', target.state.inState);\n            return false;\n        }\n        // @TODO - BETA - Make PvP available by configuration.\n        // can't fight with yourself:\n        if(playerSchema.sessionId === target.sessionId){\n            await this.executeAction(playerSchema, target);\n            return false;\n        }\n        // @NOTE: run battle method is for when the player attacks a target.\n        let inBattle = await super.runBattle(playerSchema, target, room);\n        if(!inBattle){\n            return false;\n        }\n        let targetClient = room.getClientById(target.sessionId);\n        if(targetClient){\n            await this.updateTargetClient(targetClient, target, playerSchema.sessionId, room, playerSchema);\n        }\n        return true;\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {Player} target\n     * @returns {Promise<boolean>}\n     */\n    async executeAction(playerSchema, target)\n    {\n        let currentAction = this.getCurrentAction(playerSchema);\n        if(!currentAction){\n            Logger.error('Actions not defined for this player. ID: '+playerSchema.player_id);\n            return false;\n        }\n        // @TODO - BETA - Move self target validation to skills npm package.\n        if(!currentAction.allowSelfTarget){\n            return false;\n        }\n        currentAction.currentBattle = this;\n        await currentAction.execute(target);\n        return false;\n    }\n\n}\n\nmodule.exports.Pvp = Pvp;\n"
  },
  {
    "path": "lib/actions/server/skills/type-attack.js",
    "content": "/**\n *\n * Reldens - TypeAttack\n *\n * Handles attack-type skills with room broadcast and battle initiation.\n *\n */\n\nconst { Attack } = require('@reldens/skills');\nconst { sc } = require('@reldens/utils');\n\nclass TypeAttack extends Attack\n{\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {any|false} */\n        this.room = false;\n        /** @type {any|false} */\n        this.currentBattle = false;\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async runSkillLogic()\n    {\n        if(this.room){\n            // @TODO - BETA - Replace all the defaults by constants.\n            let skillAction = this.key+'_atk';\n            this.room.broadcast('*', {\n                act: skillAction,\n                owner: this.owner.broadcastKey,\n                target: this.target.broadcastKey\n            });\n        }\n        await super.runSkillLogic();\n        if(\n            sc.hasOwn(this.owner, 'player_id')\n            && sc.hasOwn(this.target, 'objectBody')\n            && this.currentBattle\n            && 0 < this.getAffectedPropertyValue(this.target)\n        ){\n            await this.currentBattle.startBattleWith(this.owner, this.room);\n        }\n        return true;\n    }\n\n}\n\nmodule.exports = TypeAttack;\n"
  },
  {
    "path": "lib/actions/server/skills/type-effect.js",
    "content": "/**\n *\n * Reldens - TypeEffect\n *\n * Handles effect-type skills with room broadcast and battle initiation.\n *\n */\n\nconst { Effect } = require('@reldens/skills');\nconst { sc } = require('@reldens/utils');\n\nclass TypeEffect extends Effect\n{\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {any|false} */\n        this.room = false;\n        /** @type {any|false} */\n        this.currentBattle = false;\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async runSkillLogic()\n    {\n        if(this.room){\n            // @TODO - BETA - Replace all the defaults by constants.\n            let skillAction = this.key+'_eff';\n            this.room.broadcast('*', {\n                act: skillAction,\n                owner: this.owner.broadcastKey,\n                target: this.target.broadcastKey\n            });\n        }\n        await super.runSkillLogic();\n        if(sc.hasOwn(this.owner, 'player_id') && sc.hasOwn(this.target, 'objectBody') && this.currentBattle){\n            await this.currentBattle.startBattleWith(this.owner, this.room);\n        }\n        return true;\n    }\n\n}\n\nmodule.exports = TypeEffect;\n"
  },
  {
    "path": "lib/actions/server/skills/type-physical-attack.js",
    "content": "/**\n *\n * Reldens - TypePhysicalAttack\n *\n * Handles physical attack skills with collision detection, bullets, and PvE/PvP logic.\n *\n */\n\nconst { PhysicalAttack } = require('@reldens/skills');\nconst { sc } = require('@reldens/utils');\n\nclass TypePhysicalAttack extends PhysicalAttack\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {any|false} */\n        this.room = false;\n        /** @type {any|false} */\n        this.currentBattle = false;\n        /** @type {number} */\n        this.hitPriority = sc.get(props, 'hitPriority', 2);\n        /** @type {any|false} */\n        this.animDir = sc.get(props, 'animDir', false);\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean|void>}\n     */\n    async onHit(props)\n    {\n        // run bullets hit:\n        let bulletsCheck = this.executeBullets(props);\n        // if we have 0 bullets or both bodies are bullets, then we can skip the bullet hit check:\n        if(1 !== bulletsCheck.length){\n            // @TODO - BETA - Implement bullets bodies without collisions between each other.\n            return false;\n        }\n        let notTheBullet = 'body'+(bulletsCheck.shift().key === 'A' ? 'B' : 'A');\n        // get and validate the defender which could be a player or an object:\n        let validDefender = this.getValidDefender(props, notTheBullet);\n        if(!validDefender){\n            return false;\n        }\n        // run battle damage:\n        await super.executeOnHit(validDefender);\n        if(!validDefender?.state){\n            // Logger.info('Invalid defender, none State.', {key: validDefender?.key});\n            return false;\n        }\n        let hitKey = this.key+'_hit';\n        let hitMessage = {\n            act: hitKey,\n            x: validDefender.state.x,\n            y: validDefender.state.y,\n            owner: this.owner.broadcastKey,\n            target: validDefender.broadcastKey\n        };\n        this.room.broadcast('*', hitMessage);\n        if(sc.hasOwn(this.owner, 'player_id') && sc.hasOwn(validDefender, 'objectBody') && this.currentBattle){\n            return await this.startPvE(validDefender);\n        }\n        return await this.sendUpdateFromPvP(validDefender);\n    }\n\n    /**\n     * @param {Object} validDefender\n     * @returns {Promise<boolean|void>}\n     */\n    async sendUpdateFromPvP(validDefender)\n    {\n        // update the clients if pvp:\n        if(!sc.hasOwn(validDefender, 'player_id')){\n            return false;\n        }\n        let targetClient = this.room.getClientById(validDefender.broadcastKey);\n        if(!targetClient){\n            return false;\n        }\n        await this.currentBattle.updateTargetClient(\n            targetClient,\n            validDefender,\n            this.owner.sessionId,\n            this.room,\n            this.owner\n        );\n    }\n\n    /**\n     * @param {Object} validDefender\n     * @returns {Promise<any>}\n     */\n    async startPvE(validDefender)\n    {\n        if(0 < validDefender.stats[this.room.config.get('client/actions/skills/affectedProperty')]){\n            return await this.restartBattle(validDefender);\n        }\n        return await this.currentBattle.battleEnded(this.owner, this.room);\n    }\n\n    /**\n     * @param {Object} validDefender\n     * @returns {Promise<void>}\n     */\n    async restartBattle(validDefender)\n    {\n        if(!this.validateTargetOnHit && sc.hasOwn(validDefender, 'battle')){\n            if(!validDefender.battle){\n                return;\n            }\n            // if target validation is disabled then any target could start the battle (pve):\n            validDefender.battle.targetObject = validDefender;\n            await validDefender.battle.startBattleWith(this.owner, this.room);\n            return;\n        }\n        // if target validation is enabled, then we can only start the battle with the target:\n        await this.currentBattle.startBattleWith(this.owner, this.room);\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Array}\n     */\n    executeBullets(props)\n    {\n        let bulletsCheck = [];\n        // @TODO - BETA - Replace all the defaults by constants.\n        // both objects could be bullets, so remove them is needed and broadcast the hit:\n        if(props.bodyA.isBullet){\n            this.removeBullet(props.bodyA);\n            bulletsCheck.push({key: 'bodyA', obj: props.bodyA});\n        }\n        if(props.bodyB.isBullet){\n            this.removeBullet(props.bodyB);\n            bulletsCheck.push({key: 'bodyB', obj: props.bodyB});\n        }\n        return bulletsCheck;\n    }\n\n    /**\n     * @param {Object} props\n     * @param {string} defenderBodyKey\n     * @returns {Object}\n     */\n    getValidDefender(props, defenderBodyKey)\n    {\n        // we already validate if one of the bodies is a bullet so the other will be always a player or an object:\n        let playerId = sc.get(props[defenderBodyKey], 'playerId', null);\n        if(null !== playerId){\n            return this.room.playerBySessionIdFromState(playerId);\n        }\n        return props[defenderBodyKey].roomObject;\n    }\n\n    /**\n     * @param {Object} body\n     */\n    removeBullet(body)\n    {\n        if(body.world){\n            body.world.removeBodies.push(body);\n        }\n        this.room.state.removeBody(this.key+'_bullet_'+body.id);\n    }\n\n}\n\nmodule.exports = TypePhysicalAttack;\n"
  },
  {
    "path": "lib/actions/server/skills/type-physical-effect.js",
    "content": "/**\n *\n * Reldens - TypePhysicalEffect\n *\n * Handles physical effect skills with collision detection, bullets, and PvE/PvP logic.\n *\n */\n\nconst { PhysicalEffect } = require('@reldens/skills');\nconst { sc } = require('@reldens/utils');\n\nclass TypePhysicalEffect extends PhysicalEffect\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {any|false} */\n        this.room = false;\n        /** @type {any|false} */\n        this.currentBattle = false;\n        /** @type {number} */\n        this.hitPriority = sc.get(props, 'hitPriority', 2);\n        /** @type {any|false} */\n        this.animDir = sc.get(props, 'animDir', false);\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async onHit(props)\n    {\n        // run bullets hit:\n        let bulletsCheck = this.executeBullets(props);\n        let notTheBullet = bulletsCheck[0].key === 'bodyA' ? 'bodyB' : 'bodyA';\n        // none bullets or both bullets:\n        if(bulletsCheck.length !== 1){\n            // @TODO - BETA - Implement bullets bodies without collisions between each other.\n            return false;\n        }\n        // get and validate a defender which could be a player or an object:\n        let validDefender = this.getValidDefender(props, notTheBullet);\n        if(!validDefender){\n            return false;\n        }\n        // run battle damage:\n        await super.executeOnHit(validDefender);\n        let hitKey = this.key+'_hit';\n        this.room.broadcast('*', {\n            act: hitKey,\n            x: notTheBullet.position[0],\n            y: notTheBullet.position[1],\n            owner: this.owner.broadcastKey,\n            target: validDefender.broadcastKey\n        });\n        (sc.hasOwn(this.owner, 'player_id') && sc.hasOwn(validDefender, 'objectBody') && this.currentBattle)\n            ? await this.startPvE(validDefender)\n            : await this.sendUpdateFromPvP(validDefender);\n        return false;\n    }\n\n    /**\n     * @param {Object} validDefender\n     * @returns {Promise<boolean|void>}\n     */\n    async sendUpdateFromPvP(validDefender)\n    {\n        if(!sc.hasOwn(validDefender, 'player_id')){\n            return false;\n        }\n        let targetClient = this.room.getClientById(validDefender.broadcastKey);\n        if(!targetClient){\n            return false;\n        }\n        await this.currentBattle.updateTargetClient(\n            targetClient,\n            validDefender,\n            this.owner.sessionId,\n            this.room,\n            this.owner\n        );\n    }\n\n    /**\n     * @param {Object} validDefender\n     * @returns {Promise<any>}\n     */\n    async startPvE(validDefender)\n    {\n        if(0 < validDefender.stats[this.room.config.get('client/actions/skills/affectedProperty')]){\n            return await this.restartBattle(validDefender);\n        }\n        return await this.currentBattle.battleEnded(this.owner, this.room);\n    }\n\n    /**\n     * @param {Object} validDefender\n     * @returns {Promise<void>}\n     */\n    async restartBattle(validDefender)\n    {\n        if(!this.validateTargetOnHit && sc.hasOwn(validDefender, 'battle')){\n            if(!validDefender.battle){\n                return;\n            }\n            // if target validation is disabled, then any target could start the battle (pve):\n            validDefender.battle.targetObject = validDefender;\n            await validDefender.battle.startBattleWith(this.owner, this.room);\n            return;\n        }\n        // if target validation is enabled then we can only start the battle with the target:\n        await this.currentBattle.startBattleWith(this.owner, this.room);\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Array}\n     */\n    executeBullets(props)\n    {\n        let bulletsCheck = [];\n        // @TODO - BETA - Replace all the defaults by constants.\n        // both objects could be bullets, so remove them is needed and broadcast the hit:\n        if(props.bodyA.isBullet){\n            this.removeBullet(props.bodyA);\n            bulletsCheck.push({key: 'bodyA', obj: props.bodyA});\n        }\n        if(props.bodyB.isBullet){\n            this.removeBullet(props.bodyB);\n            bulletsCheck.push({key: 'bodyB', obj: props.bodyB});\n        }\n        return bulletsCheck;\n    }\n\n    /**\n     * @param {Object} props\n     * @param {string} defenderBodyKey\n     * @returns {Object}\n     */\n    getValidDefender(props, defenderBodyKey)\n    {\n        // we already validate if one of the bodies is a bullet, so the other will always be a player or an object:\n        return sc.hasOwn(props[defenderBodyKey], 'playerId') ?\n            this.room.playerBySessionIdFromState(props[defenderBodyKey].playerId) : props[defenderBodyKey].roomObject;\n    }\n\n    /**\n     * @param {Object} body\n     */\n    removeBullet(body)\n    {\n        body.world.removeBodies.push(body);\n        // @TODO - BETA - Refactor and extract Colyseus into a driver. Check is been used?\n        this.room.state.removeBody(this.key+'_bullet_'+body.id);\n    }\n\n}\n\nmodule.exports = TypePhysicalEffect;\n"
  },
  {
    "path": "lib/actions/server/skills/types.js",
    "content": "/**\n *\n * Reldens - Export Skills Types\n *\n */\n\nmodule.exports = {\n    TypeAttack: require('./type-attack'),\n    TypeEffect: require('./type-effect'),\n    TypePhysicalAttack: require('./type-physical-attack'),\n    TypePhysicalEffect: require('./type-physical-effect')\n};\n"
  },
  {
    "path": "lib/actions/server/skills-class-path-loader.js",
    "content": "/**\n *\n * Reldens - Skills - SkillsClassPathLoader\n *\n * Loads class path data with levels, skills, and their relationships.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n *\n * @typedef {Object} SkillsClassPathLoaderProps\n * @property {BaseDataServer} [dataServer]\n */\nclass SkillsClassPathLoader\n{\n\n    /**\n     * @param {SkillsClassPathLoaderProps} props\n     */\n    constructor(props)\n    {\n        /** @type {BaseDataServer|false} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n    }\n\n    /**\n     * @param {string} entityName\n     * @returns {any|false}\n     */\n    getEntity(entityName)\n    {\n        if(!entityName){\n            Logger.warning('Entity name is missing.');\n            return false;\n        }\n        if(!this.dataServer){\n            Logger.warning('Data server is missing.');\n            return false;\n        }\n        return this.dataServer.entityManager.get(entityName);\n    }\n\n    /**\n     * @returns {Promise<Array>}\n     */\n    async loadFullPathData()\n    {\n        let classPathModels = await this.loadClassPathsWithLevelsSet();\n        if(!sc.isArray(classPathModels) || 0 === classPathModels.length){\n            return [];\n        }\n        let classPathIds = classPathModels.map(classPath => classPath.id);\n        let levelLabelsMap = await this.loadLevelLabelsByClassPathIds(classPathIds);\n        let levelSkillsMap = await this.loadLevelSkillsByClassPathIds(classPathIds);\n        let skillIds = this.extractSkillIds(levelSkillsMap);\n        let skillsMap = await this.loadSkillsWithRelations(skillIds);\n        return this.mapClassPathData(classPathModels, levelLabelsMap, levelSkillsMap, skillsMap);\n    }\n\n    /**\n     * @returns {Promise<Array>}\n     */\n    async loadClassPathsWithLevelsSet()\n    {\n        return await this.getEntity('skillsClassPath').loadAllWithRelations([\n            'related_skills_levels_set.related_skills_levels.related_skills_levels_modifiers'\n        ]);\n    }\n\n    /**\n     * @param {Array<number>} classPathIds\n     * @returns {Promise<Object>}\n     */\n    async loadLevelLabelsByClassPathIds(classPathIds)\n    {\n        let levelLabels = await this.getEntity('skillsClassPathLevelLabels').loadWithRelations(\n            {class_path_id: {operator: 'IN', value: classPathIds}},\n            ['related_skills_levels']\n        );\n        return this.groupByClassPathId(levelLabels);\n    }\n\n    /**\n     * @param {Array<number>} classPathIds\n     * @returns {Promise<Object>}\n     */\n    async loadLevelSkillsByClassPathIds(classPathIds)\n    {\n        let levelSkills = await this.getEntity('skillsClassPathLevelSkills').loadWithRelations(\n            {class_path_id: {operator: 'IN', value: classPathIds}},\n            ['related_skills_levels']\n        );\n        return this.groupByClassPathId(levelSkills);\n    }\n\n    /**\n     * @param {Object} levelSkillsMap\n     * @returns {Array<number>}\n     */\n    extractSkillIds(levelSkillsMap)\n    {\n        let skillIds = [];\n        let classPathIds = Object.keys(levelSkillsMap);\n        for(let classPathId of classPathIds){\n            let levelSkills = levelSkillsMap[classPathId];\n            for(let levelSkill of levelSkills){\n                if(-1 === skillIds.indexOf(levelSkill.skill_id)){\n                    skillIds.push(levelSkill.skill_id);\n                }\n            }\n        }\n        return skillIds;\n    }\n\n    /**\n     * @param {Array<number>} skillIds\n     * @returns {Promise<Object>}\n     */\n    async loadSkillsWithRelations(skillIds)\n    {\n        if(0 === skillIds.length){\n            return {};\n        }\n        let skills = await this.getEntity('skillsSkill').loadWithRelations(\n            {id: {operator: 'IN', value: skillIds}},\n            [\n                'related_skills_skill_attack',\n                'related_skills_skill_physical_data',\n                'related_skills_skill_owner_conditions',\n                'related_skills_skill_owner_effects',\n                'related_skills_skill_target_effects'\n            ]\n        );\n        return this.indexById(skills);\n    }\n\n    /**\n     * @param {Array} items\n     * @returns {Object}\n     */\n    groupByClassPathId(items)\n    {\n        let result = {};\n        if(!sc.isArray(items)){\n            return result;\n        }\n        for(let item of items){\n            let classPathId = item.class_path_id;\n            if(!sc.hasOwn(result, classPathId)){\n                result[classPathId] = [];\n            }\n            result[classPathId].push(item);\n        }\n        return result;\n    }\n\n    /**\n     * @param {Array} items\n     * @returns {Object}\n     */\n    indexById(items)\n    {\n        let result = {};\n        if(!sc.isArray(items)){\n            return result;\n        }\n        for(let item of items){\n            result[item.id] = item;\n        }\n        return result;\n    }\n\n    /**\n     * @param {Array} classPathModels\n     * @param {Object} levelLabelsMap\n     * @param {Object} levelSkillsMap\n     * @param {Object} skillsMap\n     * @returns {Array}\n     */\n    mapClassPathData(classPathModels, levelLabelsMap, levelSkillsMap, skillsMap)\n    {\n        for(let classPath of classPathModels){\n            classPath.related_skills_class_path_level_labels = sc.get(levelLabelsMap, classPath.id, []);\n            let levelSkills = sc.get(levelSkillsMap, classPath.id, []);\n            this.attachSkillsToLevelSkills(levelSkills, skillsMap);\n            this.sortLevelSkillsBySkillKey(levelSkills);\n            classPath.related_skills_class_path_level_skills = levelSkills;\n        }\n        return classPathModels;\n    }\n\n    /**\n     * @param {Array} levelSkills\n     * @param {Object} skillsMap\n     */\n    attachSkillsToLevelSkills(levelSkills, skillsMap)\n    {\n        for(let levelSkill of levelSkills){\n            levelSkill.related_skills_skill = sc.get(skillsMap, levelSkill.skill_id, null);\n        }\n    }\n\n    /**\n     * @param {Array} levelSkills\n     */\n    sortLevelSkillsBySkillKey(levelSkills)\n    {\n        levelSkills.sort((a, b) => {\n            let keyA = sc.get(a, 'related_skills_skill.key', '');\n            let keyB = sc.get(b, 'related_skills_skill.key', '');\n            if(keyA < keyB){\n                return -1;\n            }\n            if(keyA > keyB){\n                return 1;\n            }\n            return 0;\n        });\n    }\n\n}\n\nmodule.exports.SkillsClassPathLoader = SkillsClassPathLoader;\n"
  },
  {
    "path": "lib/actions/server/skills-extra-data-mapper.js",
    "content": "/**\n *\n * Reldens - SkillsExtraDataMapper\n *\n * Maps skill data to extra data format for client synchronization.\n *\n */\n\nconst { ActionsConst } = require('../constants');\nconst { TypeDeterminer } = require('../../game/type-determiner');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/type-determiner').TypeDeterminer} TypeDeterminer\n */\nclass SkillsExtraDataMapper\n{\n\n    constructor()\n    {\n        /** @type {TypeDeterminer} */\n        this.typeDeterminer = new TypeDeterminer();\n    }\n\n    /**\n     * @param {Object} params\n     * @returns {Object}\n     */\n    extractSkillExtraData(params)\n    {\n        // @TODO - BETA - Refactor conditions.\n        let extraData = {};\n        let target = sc.get(params, 'target');\n        if(target){\n            if(this.typeDeterminer.isObject(target)){\n                extraData[ActionsConst.DATA_TARGET_TYPE] = ActionsConst.DATA_TYPE_VALUE_ENEMY;\n                extraData[ActionsConst.DATA_TARGET_KEY] = target.key;\n            }\n            if(this.typeDeterminer.isPlayer(target)){\n                extraData[ActionsConst.DATA_TARGET_TYPE] = ActionsConst.DATA_TYPE_VALUE_PLAYER;\n                extraData[ActionsConst.DATA_TARGET_KEY] = target.sessionId;\n            }\n        }\n        let skill = sc.get(params, 'skill');\n        if(skill){\n            if(this.typeDeterminer.isObject(skill.owner)){\n                extraData[ActionsConst.DATA_OWNER_TYPE] = ActionsConst.DATA_TYPE_VALUE_ENEMY;\n                extraData[ActionsConst.DATA_OWNER_KEY] = skill.owner.key;\n            }\n            if(this.typeDeterminer.isPlayer(skill.owner)){\n                extraData[ActionsConst.DATA_OWNER_TYPE] = ActionsConst.DATA_TYPE_VALUE_PLAYER;\n                extraData[ActionsConst.DATA_OWNER_KEY] = skill.owner.sessionId;\n            }\n            // @TODO - BETA - Check if we need to include any other skill data to be sent to the client.\n            if(0 < skill.skillDelay){\n                extraData[ActionsConst.EXTRA_DATA.SKILL_DELAY] = skill.skillDelay;\n            }\n        }\n        return extraData;\n    }\n\n}\n\nmodule.exports.SkillsExtraDataMapper = SkillsExtraDataMapper;\n"
  },
  {
    "path": "lib/actions/server/storage/class-path-generator.js",
    "content": "/**\n *\n * Reldens - Skills - ClassPathGenerator\n *\n * Generates class path data structures from database models.\n *\n */\n\nconst { ClassPath } = require('@reldens/skills');\nconst { LevelsGenerator } = require('./levels-generator');\nconst { sc } = require('@reldens/utils');\n\nclass ClassPathGenerator\n{\n\n    /**\n     * @param {Array} classPathModels\n     * @param {Object} classPathClasses\n     * @returns {Object}\n     */\n    static fromClassPathModels(classPathModels, classPathClasses)\n    {\n        if(!sc.isArray(classPathModels) || 0 === classPathModels.length){\n            return {};\n        }\n        let classPathsById = {};\n        let classPathsByKey = {};\n        let activeClassPathModels = classPathModels.filter(classPathModel => classPathModel.enabled);\n        for(let classPathModel of activeClassPathModels){\n            let classPathData = {class: sc.get(classPathClasses, classPathModel.key, ClassPath), data: classPathModel};\n            classPathModel.classPathLevels = LevelsGenerator.fromLevelsModels(\n                classPathModel.related_skills_levels_set.related_skills_levels\n            );\n            classPathModel.labelsByLevel = this.extractLabelsByLevels(\n                classPathModel.related_skills_class_path_level_labels\n            );\n            classPathsById[classPathModel.id] = classPathData;\n            classPathsByKey[classPathModel.key] = classPathData;\n        }\n        return {classPathModels: activeClassPathModels, classPathsById, classPathsByKey};\n    }\n\n    /**\n     * @param {Array} levelLabelsModel\n     * @returns {Object}\n     */\n    static extractLabelsByLevels(levelLabelsModel)\n    {\n        if(!sc.isArray(levelLabelsModel) || 0 === levelLabelsModel.length){\n            return {};\n        }\n        let labelsByLevel = {};\n        for(let labelData of levelLabelsModel){\n            labelsByLevel[labelData['related_skills_levels'].key] = labelData.label;\n        }\n        return labelsByLevel;\n    }\n\n}\n\nmodule.exports.ClassPathGenerator = ClassPathGenerator;\n"
  },
  {
    "path": "lib/actions/server/storage/conditions-generator.js",
    "content": "/**\n *\n * Reldens - Skills - ConditionsGenerator\n *\n * Generates condition instances from database models.\n *\n */\n\nconst { Condition } = require('@reldens/modifiers');\nconst { sc } = require('@reldens/utils');\n\nclass ConditionsGenerator\n{\n\n    /**\n     * @param {Array} conditionsModels\n     * @returns {Array}\n     */\n    static fromConditionsModels(conditionsModels)\n    {\n        if(!sc.isArray(conditionsModels) || 0 === conditionsModels.length){\n            return [];\n        }\n        let conditions = [];\n        for(let conditionModel of conditionsModels){\n            conditionModel['propertyKey'] = conditionModel['property_key'];\n            let condition = new Condition(conditionModel);\n            conditions.push(condition);\n        }\n        return conditions;\n    }\n\n}\n\nmodule.exports.ConditionsGenerator = ConditionsGenerator;\n"
  },
  {
    "path": "lib/actions/server/storage/levels-generator.js",
    "content": "/**\n *\n * Reldens - Skills - LevelsGenerator\n *\n * Generates level instances from database models.\n *\n */\n\nconst { Level } = require('@reldens/skills');\nconst { Modifier } = require('@reldens/modifiers');\nconst { sc } = require('@reldens/utils');\n\nclass LevelsGenerator\n{\n\n    /**\n     * @param {Array} levelsModels\n     * @returns {Object}\n     */\n    static fromLevelsModels(levelsModels)\n    {\n        let levels = {};\n        for(let levelData of levelsModels){\n            levelData.modifiers = this.extractModifiers(levelData['related_skills_levels_modifiers']);\n            let levelKey = Number(levelData['key']);\n            levelData.key = levelKey;\n            levels[levelKey] = new Level(levelData);\n        }\n        return levels;\n    }\n\n    /**\n     * @param {Array} modifiersModels\n     * @returns {Array}\n     */\n    static extractModifiers(modifiersModels)\n    {\n        if(!sc.isArray(modifiersModels) || 0 === modifiersModels.length){\n            return [];\n        }\n        let levelModifiers = [];\n        for(let modifierData of modifiersModels){\n            let modifier = new Modifier(modifierData);\n            levelModifiers.push(modifier);\n        }\n        return levelModifiers;\n    }\n\n}\n\nmodule.exports.LevelsGenerator = LevelsGenerator;\n"
  },
  {
    "path": "lib/actions/server/storage/modifiers-generator.js",
    "content": "/**\n *\n * Reldens - Skills - ModifiersGenerator\n *\n * Generates modifier instances from database models.\n *\n */\n\nconst { Modifier } = require('@reldens/modifiers');\nconst { sc } = require('@reldens/utils');\n\nclass ModifiersGenerator\n{\n\n    /**\n     * @param {Array} modifiersModels\n     * @returns {Array}\n     */\n    static fromModifiersModels(modifiersModels)\n    {\n        if(!sc.isArray(modifiersModels) || 0 === modifiersModels.length){\n            return [];\n        }\n        let modifiers = [];\n        for(let modifierModel of modifiersModels){\n            let modifier = new Modifier(modifierModel);\n            modifiers.push(modifier);\n        }\n        return modifiers;\n    }\n\n}\n\nmodule.exports.ModifiersGenerator = ModifiersGenerator;\n"
  },
  {
    "path": "lib/actions/server/storage/skills-generator.js",
    "content": "/**\n *\n * Reldens - Skills - SkillsGenerator\n *\n * Generates skill data structures and instances from database models.\n *\n */\n\nconst { ModifiersGenerator } = require('./modifiers-generator');\nconst { ConditionsGenerator } = require('./conditions-generator');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass SkillsGenerator\n{\n\n    /**\n     * @param {Array} skillsModels\n     * @param {Object} skillsClasses\n     * @param {EventsManager} events\n     * @returns {Object}\n     */\n    static dataFromSkillsModelsWithClasses(skillsModels, skillsClasses, events)\n    {\n        if(0 === skillsModels.length){\n            return {};\n        }\n        let skillsList = {};\n        for(let skillModel of skillsModels){\n            let skillClass = sc.hasOwn(skillsClasses, skillModel.type) ? skillsClasses[skillModel.type] : false;\n            if(!skillClass){\n                ErrorManager.error('Undefined skill type in skillsList:' + skillModel.type);\n            }\n            // force to use the same events manager instance used on the main package:\n            skillModel.events = events;\n            this.enrichWithAttackData(skillModel);\n            this.enrichWithPhysicalData(skillModel);\n            skillsList[skillModel.key] = {class: skillClass, data: skillModel};\n        }\n        return {skillsModels, skillsList};\n    }\n\n    /**\n     * @param {Array} levelSkillsModels\n     * @param {Object} owner\n     * @param {string} ownerIdProperty\n     * @param {Object} skillsClassesList\n     * @param {EventsManager} events\n     * @returns {Object}\n     */\n    static skillsByLevelsFromSkillsModels(levelSkillsModels, owner, ownerIdProperty, skillsClassesList, events)\n    {\n        if(!sc.isArray(levelSkillsModels) || 0 === levelSkillsModels.length){\n            return {};\n        }\n        let skillsByLevel = {};\n        for(let skillData of levelSkillsModels){\n            //Logger.debug('Skill data:', skillData);\n            let skillLevel = skillData['related_skills_levels'];\n            if (!skillLevel){\n                Logger.debug('Skill level is not defined.', skillLevel);\n                continue;\n            }\n            let levelKey = Number(skillLevel.key);\n            if(!sc.hasOwn(skillsByLevel, levelKey)){\n                skillsByLevel[levelKey] = {};\n            }\n            let skillModel = skillData.related_skills_skill;\n            skillModel.owner = owner;\n            skillModel.ownerIdProperty = ownerIdProperty;\n            skillModel.events = events;\n            this.enrichWithAttackData(skillModel);\n            this.enrichWithPhysicalData(skillModel);\n            skillModel.ownerConditions = ConditionsGenerator.fromConditionsModels(\n                skillModel['related_skills_skill_owner_conditions']\n            );\n            // @NOTE: skill effects are modifiers that will affect the skill owner or target.\n            skillModel.ownerEffects = ModifiersGenerator.fromModifiersModels(\n                skillModel['related_skills_skill_owner_effects']\n            );\n            skillModel.targetEffects = ModifiersGenerator.fromModifiersModels(\n                skillModel['related_skills_skill_target_effects']\n            );\n            skillsByLevel[levelKey][skillModel.key] = new skillsClassesList[skillModel.key]['class'](skillModel);\n        }\n        return skillsByLevel;\n    }\n\n    /**\n     * @param {Object} skillModel\n     */\n    static enrichWithPhysicalData(skillModel)\n    {\n        if(!sc.isTrue(skillModel, 'related_skills_skill_physical_data')){\n            return;\n        }\n        // @TODO - BETA - Make physical properties configurable.\n        let physicalProps = [\n            'magnitude',\n            'objectWidth',\n            'objectHeight',\n            'validateTargetOnHit'\n        ];\n        for(let i of physicalProps){\n            skillModel[i] = skillModel['related_skills_skill_physical_data'][i];\n        }\n    }\n\n    /**\n     * @param {Object} skillModel\n     */\n    static enrichWithAttackData(skillModel)\n    {\n        if(!sc.isTrue(skillModel, 'related_skills_skill_attack')){\n            return;\n        }\n        skillModel['attackProperties'] = skillModel['related_skills_skill_attack'].attackProperties?.split(',') || [];\n        skillModel['defenseProperties'] = skillModel['related_skills_skill_attack'].defenseProperties?.split(',') || [];\n        skillModel['aimProperties'] = skillModel['related_skills_skill_attack'].aimProperties?.split(',') || [];\n        skillModel['dodgeProperties'] = skillModel['related_skills_skill_attack'].dodgeProperties?.split(',') || [];\n        let attackProps = [\n            'affectedProperty',\n            'allowEffectBelowZero',\n            'hitDamage',\n            'applyDirectDamage',\n            'dodgeFullEnabled',\n            'dodgeOverAimSuccess',\n            'damageAffected',\n            'criticalAffected'\n        ];\n        for(let i of attackProps){\n            skillModel[i] = skillModel['related_skills_skill_attack'][i];\n        }\n    }\n}\n\nmodule.exports.SkillsGenerator = SkillsGenerator;\n"
  },
  {
    "path": "lib/actions/server/storage-observer.js",
    "content": "/**\n *\n * Reldens - Skills - StorageObserver\n *\n * Observes skill events and persists data changes to storage.\n *\n */\n\nconst { ModelsManager } = require('./models-manager');\nconst { SkillsEvents } = require('@reldens/skills');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n *\n * @typedef {Object} StorageObserverProps\n * @property {Object} classPath\n * @property {Object} [modelsManagerConfig]\n * @property {BaseDataServer} dataServer\n * @property {ModelsManager} [modelsManager]\n */\nclass StorageObserver\n{\n\n    /**\n     * @param {StorageObserverProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Object} */\n        this.classPath = props.classPath;\n        let modelsManagerConfig = sc.get(props, 'modelsManagerConfig', {});\n        if(this.classPath.events){\n            modelsManagerConfig['events'] = this.classPath.events;\n        }\n        /** @type {BaseDataServer|false} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        modelsManagerConfig['dataServer'] = this.dataServer;\n        /** @type {ModelsManager} */\n        this.modelsManager = sc.isTrue(props, 'modelsManager')\n            ? props.modelsManager\n            : new ModelsManager(modelsManagerConfig);\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    registerListeners()\n    {\n        if(!this.classPath){\n            Logger.error('Class Path data undefined for Storage Observer.');\n            return false;\n        }\n        if(!this.modelsManager){\n            Logger.error('ModelsManager undefined for Skills Storage Observer.');\n            return false;\n        }\n        let ownerEventKey = this.classPath.getOwnerEventKey();\n        this.classPath.listenEvent(\n            SkillsEvents.LEVEL_UP,\n            this.saveLevelUpData.bind(this),\n            this.classPath.getOwnerUniqueEventKey('levelUpStorage'),\n            ownerEventKey\n        );\n        this.classPath.listenEvent(\n            SkillsEvents.LEVEL_EXPERIENCE_ADDED,\n            this.updateExperience.bind(this),\n            this.classPath.getOwnerUniqueEventKey('expAddStorage'),\n            ownerEventKey\n        );\n        this.classPath.listenEvent(\n            SkillsEvents.SKILL_APPLY_OWNER_EFFECTS,\n            this.saveOwnerData.bind(this),\n            this.classPath.getOwnerUniqueEventKey('applyOwnerEffectsStorage'),\n            ownerEventKey\n        );\n        this.classPath.listenEvent(\n            SkillsEvents.SKILL_EFFECT_TARGET_MODIFIERS,\n            this.saveTargetData.bind(this),\n            this.classPath.getOwnerUniqueEventKey('applyTargetEffectsStorage'),\n            ownerEventKey\n        );\n    }\n\n    /**\n     * @param {Object} skill\n     * @returns {Promise<any>}\n     */\n    async saveTargetData(skill)\n    {\n        if(!sc.isFunction(skill?.target?.persistData)){\n            return false;\n        }\n        return await skill.target.persistData();\n    }\n\n    /**\n     * @param {Object} skill\n     * @returns {Promise<any>}\n     */\n    async saveOwnerData(skill)\n    {\n        return await skill.owner.persistData();\n    }\n\n    /**\n     * @param {Object} levelsSet\n     * @returns {Promise<any>}\n     */\n    async updateExperience(levelsSet)\n    {\n        return await this.modelsManager.updateExperience(levelsSet);\n    }\n\n    /**\n     * @param {Object} levelsSet\n     * @returns {Promise<any>}\n     */\n    async saveLevelUpData(levelsSet)\n    {\n        await this.modelsManager.updateLevel(levelsSet);\n        return await levelsSet.owner.persistData();\n    }\n}\n\nmodule.exports.StorageObserver = StorageObserver;\n"
  },
  {
    "path": "lib/admin/server/entities-config-override.js",
    "content": "/**\n *\n * Reldens - EntitiesConfigOverrides\n *\n * Configuration object that maps entity types to their parent menu categories in the admin panel.\n * Each menu object contains a parentItemLabel property that defines the navigation group.\n *\n */\n\n/**\n * @typedef {Object} MenuConfig\n * @property {string} parentItemLabel\n */\n\n/** @type {MenuConfig} */\nlet skillsMenu = {parentItemLabel: 'Skills'};\n/** @type {MenuConfig} */\nlet classPathMenu = {parentItemLabel: 'Classes & Levels'};\n/** @type {MenuConfig} */\nlet settingsMenu = {parentItemLabel: 'Settings'};\n/** @type {MenuConfig} */\nlet usersMenu = {parentItemLabel: 'Users'};\n/** @type {MenuConfig} */\nlet adsMenu = {parentItemLabel: 'Ads'};\n/** @type {MenuConfig} */\nlet audioMenu = {parentItemLabel: 'Audio'};\n/** @type {MenuConfig} */\nlet chatMenu = {parentItemLabel: 'Chat'};\n/** @type {MenuConfig} */\nlet featuresMenu = {parentItemLabel: 'Features'};\n/** @type {MenuConfig} */\nlet itemsMenu = {parentItemLabel: 'Items & Inventory'};\n/** @type {MenuConfig} */\nlet objectsMenu = {parentItemLabel: 'Game Objects'};\n/** @type {MenuConfig} */\nlet respawnMenu = {parentItemLabel: 'Respawn'};\n/** @type {MenuConfig} */\nlet rewardsMenu = {parentItemLabel: 'Rewards'};\n/** @type {MenuConfig} */\nlet roomsMenu = {parentItemLabel: 'Rooms'};\n/** @type {MenuConfig} */\nlet snippetsMenu = {parentItemLabel: 'Translations'};\n/** @type {MenuConfig} */\nlet clanMenu = {parentItemLabel: 'Clan'};\n\nmodule.exports.EntitiesConfigOverrides = {\n    adsBanner: adsMenu,\n    ads: adsMenu,\n    adsEventVideo: adsMenu,\n    adsPlayed: adsMenu,\n    adsProviders: adsMenu,\n    adsTypes: adsMenu,\n    audioCategories: audioMenu,\n    audio: audioMenu,\n    audioMarkers: audioMenu,\n    audioPlayerConfig: audioMenu,\n    chat: chatMenu,\n    chatMessageTypes: chatMenu,\n    clan: clanMenu,\n    clanLevels: clanMenu,\n    clanLevelsModifiers: clanMenu,\n    clanMembers: clanMenu,\n    config: settingsMenu,\n    configTypes: settingsMenu,\n    dropsAnimations: rewardsMenu,\n    features: featuresMenu,\n    itemsGroup: itemsMenu,\n    itemsInventory: itemsMenu,\n    itemsItem: itemsMenu,\n    itemsItemModifiers: itemsMenu,\n    itemsTypes: itemsMenu,\n    locale: snippetsMenu,\n    objectsAnimations: objectsMenu,\n    objectsAssets: objectsMenu,\n    objects: objectsMenu,\n    objectsItemsInventory: objectsMenu,\n    objectsItemsRequirements: objectsMenu,\n    objectsItemsRewards: objectsMenu,\n    objectsSkills: objectsMenu,\n    objectsStats: objectsMenu,\n    objectsTypes: objectsMenu,\n    operationTypes: settingsMenu,\n    players: usersMenu,\n    playersState: usersMenu,\n    playersStats: usersMenu,\n    respawn: respawnMenu,\n    rewards: rewardsMenu,\n    rewardsEvents: rewardsMenu,\n    rewardsEventsState: rewardsMenu,\n    rewardsModifiers: rewardsMenu,\n    roomsChangePoints: roomsMenu,\n    rooms: roomsMenu,\n    roomsReturnPoints: roomsMenu,\n    scoresDetail: usersMenu,\n    scores: usersMenu,\n    skillsClassLevelUpAnimations: classPathMenu,\n    skillsClassPath: classPathMenu,\n    skillsClassPathLevelLabels: classPathMenu,\n    skillsClassPathLevelSkills: classPathMenu,\n    skillsGroups: skillsMenu,\n    skillsLevels: classPathMenu,\n    skillsLevelsModifiersConditions: skillsMenu,\n    skillsLevelsModifiers: classPathMenu,\n    skillsLevelsSet: classPathMenu,\n    skillsOwnersClassPath: usersMenu,\n    skillsSkillAnimations: skillsMenu,\n    skillsSkillAttack: skillsMenu,\n    skillsSkill: skillsMenu,\n    skillsSkillGroupRelation: skillsMenu,\n    skillsSkillOwnerConditions: skillsMenu,\n    skillsSkillOwnerEffectsConditions: skillsMenu,\n    skillsSkillOwnerEffects: skillsMenu,\n    skillsSkillPhysicalData: skillsMenu,\n    skillsSkillTargetEffectsConditions: skillsMenu,\n    skillsSkillTargetEffects: skillsMenu,\n    skillsSkillType: skillsMenu,\n    snippets: snippetsMenu,\n    stats: usersMenu,\n    targetOptions: objectsMenu,\n    users: usersMenu,\n    usersLocale: usersMenu,\n    usersLogin: usersMenu\n};\n"
  },
  {
    "path": "lib/admin/server/plugin.js",
    "content": "/**\n *\n * Reldens - AdminPlugin\n *\n * Plugin that sets up the administration panel and related management features including\n * server shutdown, theme manager, maps wizard, objects importer, skills importer, and rooms management.\n *\n */\n\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { SetupServerProperties } = require('../../features/server/setup-server-properties');\nconst { CreateAdminSubscriber } = require('./subscribers/create-admin-subscriber');\nconst { MapsWizardSubscriber } = require('./subscribers/maps-wizard-subscriber');\nconst { ObjectsImporterSubscriber } = require('./subscribers/objects-importer-subscriber');\nconst { SkillsImporterSubscriber } = require('./subscribers/skills-importer-subscriber');\nconst { ShutdownSubscriber } = require('./subscribers/shutdown-subscriber');\nconst { ThemeManagerSubscriber } = require('./subscribers/theme-manager-subscriber');\nconst { RoomsEntitySubscriber } = require('./subscribers/rooms-entity-subscriber');\nconst { GeneratorsRoutesSubscriber } = require('./subscribers/generators-routes-subscriber');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../config/server/manager').ConfigManager} ConfigManager\n */\nclass AdminPlugin extends PluginInterface\n{\n\n    /**\n     * @param {SetupServerProperties} setupServerProperties\n     * @return {Promise<boolean>}\n     */\n    async setup(setupServerProperties)\n    {\n        if(!(setupServerProperties instanceof SetupServerProperties)){\n            Logger.error('The setupServerProperties param must be an instance of SetupServerProperties.');\n            return false;\n        }\n        if(!setupServerProperties.validate()){\n            return false;\n        }\n        setupServerProperties.assignProperties(this);\n        /** @type {CreateAdminSubscriber} */\n        this.createAdminSubscriber = new CreateAdminSubscriber();\n        /** @type {Object<string, Object>} */\n        this.subscribers = {};\n        this.listenEvents();\n        return true;\n    }\n\n    listenEvents()\n    {\n        if(!this.events){\n            return;\n        }\n        this.events.on('reldens.serverBeforeListen', async (event) => {\n            await this.createAdminSubscriber.activateAdmin(event);\n        });\n        this.events.on('reldens.beforeCreateAdminManager', async (event) => {\n            if(!event.serverManager?.dataServerConfig?.translations){\n                Logger.debug('Translations not available on beforeCreateAdminManage event.');\n                return;\n            }\n            sc.deepMergeProperties(event.serverManager.dataServerConfig.translations, {\n                messages: {\n                    loginWelcome: 'Administration Panel - Login',\n                    reldensTitle: 'Reldens - Administration Panel'\n                },\n                labels: {\n                    navigation: 'Reldens - Administration Panel',\n                    loginWelcome: 'Reldens',\n                    pages: 'Server Management',\n                    management: 'Management',\n                    themeManager: 'Theme Manager',\n                    mapsWizard: 'Maps Generation and Import',\n                    objectsImport: 'Objects Import',\n                    skillsImport: 'Skills Import',\n                    shuttingDown: 'Server is shutting down in:',\n                    submitShutdownLabel: 'Shutdown Server',\n                    submitCancelLabel: 'Cancel Server Shutdown'\n                }\n            });\n            this.extendAdminTemplates(event);\n        });\n        this.events.on('reldens.beforeSetupAdminManager', async (event) => {\n            let adminManager = event.serverManager.serverAdmin;\n            if(!adminManager){\n                Logger.error('The admin manager does not exist to setup the AdminPlugin on beforeSetupAdminManager.');\n                return false;\n            }\n            let themeManager = event.serverManager.themeManager;\n            this.subscribers.shutdown = new ShutdownSubscriber(\n                adminManager,\n                this.config,\n                event.serverManager.serverBroadcast.bind(event.serverManager)\n            );\n            this.subscribers.themeManager = new ThemeManagerSubscriber(\n                adminManager,\n                this.config,\n                themeManager\n            );\n            this.subscribers.mapsWizard = new MapsWizardSubscriber(adminManager, this.config, themeManager);\n            this.subscribers.objectsImporter = new ObjectsImporterSubscriber(adminManager, themeManager);\n            this.subscribers.skillsImporter = new SkillsImporterSubscriber(adminManager, themeManager);\n            this.subscribers.roomsEntity = new RoomsEntitySubscriber(adminManager, this.config);\n            this.subscribers.generatorsRoutes = new GeneratorsRoutesSubscriber(\n                adminManager,\n                themeManager.projectGenerateDataPath,\n                themeManager.projectGeneratedDataPath\n            );\n        });\n    }\n\n    extendAdminTemplates(event)\n    {\n        if(!event?.serverManager?.themeManager?.adminTemplatesList?.fields?.edit){\n            return;\n        }\n        let themeManager = event.serverManager.themeManager;\n        themeManager.adminTemplatesList.fields.edit['tileset-file-item'] = 'tileset-file-item.html';\n        themeManager.adminTemplatesList.fields.edit['tileset-alert-wrapper'] = 'tileset-alert-wrapper.html';\n        let templatesPath = FileHandler.joinPaths(themeManager.projectAdminTemplatesPath, 'fields', 'edit');\n        themeManager.adminTemplates.fields.edit['tileset-file-item'] = FileHandler.joinPaths(\n            templatesPath,\n            'tileset-file-item.html'\n        );\n        themeManager.adminTemplates.fields.edit['tileset-alert-wrapper'] = FileHandler.joinPaths(\n            templatesPath,\n            'tileset-alert-wrapper.html'\n        );\n    }\n}\n\nmodule.exports.AdminPlugin = AdminPlugin;\n"
  },
  {
    "path": "lib/admin/server/room-map-tilesets-validator.js",
    "content": "/**\n *\n * Reldens - RoomMapTilesetsValidator\n *\n * Validates room map tilesets and optionally overrides scene_images with map file as source of truth.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\nconst { FileHandler } = require('@reldens/server-utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n */\nclass RoomMapTilesetsValidator\n{\n\n    /**\n     * @param {BaseDataServer} dataServer\n     * @param {ConfigManager} config\n     */\n    constructor(dataServer, config)\n    {\n        this.dataServer = dataServer;\n        this.config = config;\n        this.roomsRepository = dataServer.getEntity('rooms');\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<boolean>}\n     */\n    async validate(event)\n    {\n        let overrideEnabled = this.config.getWithoutLogs('server/rooms/maps/overrideSceneImagesWithMapFile', true);\n        if(!overrideEnabled){\n            return false;\n        }\n        let driverResource = sc.get(event, 'driverResource', false);\n        if(!driverResource || 'rooms' !== driverResource.entityKey){\n            return false;\n        }\n        let entityData = sc.get(event, 'entityData', false);\n        if(!entityData){\n            return false;\n        }\n        let mapFilename = sc.get(entityData, 'map_filename', '');\n        if(!mapFilename){\n            return false;\n        }\n        let options = sc.get(driverResource, 'options', {});\n        let uploadProperties = sc.get(options, 'properties', {});\n        let mapProperty = sc.get(uploadProperties, 'map_filename', false);\n        let sceneImagesProperty = sc.get(uploadProperties, 'scene_images', false);\n        if(!mapProperty || !sceneImagesProperty){\n            return false;\n        }\n        let mapBucket = sc.get(mapProperty, 'bucket', '');\n        let sceneImagesBucket = sc.get(sceneImagesProperty, 'bucket', '');\n        if(!mapBucket || !sceneImagesBucket){\n            return false;\n        }\n        let mapData = this.readMapFile(mapBucket, mapFilename, entityData.id);\n        if(!mapData){\n            return false;\n        }\n        let tilesetImages = this.extractTilesetImages(mapData);\n        if(0 === tilesetImages.length){\n            return false;\n        }\n        let currentSceneImages = sc.get(entityData, 'scene_images', '');\n        let currentSceneImagesArray = currentSceneImages ? currentSceneImages.split(',') : [];\n        if(this.arraysAreEqual(tilesetImages, currentSceneImagesArray)){\n            return false;\n        }\n        let allImagesExist = this.validateImagesExist(tilesetImages, sceneImagesBucket, entityData.id, mapFilename);\n        if(!allImagesExist){\n            Logger.error('Cannot override scene_images: some tileset images do not exist.', {\n                roomId: entityData.id,\n                mapFilename,\n                tilesetImages\n            });\n            return false;\n        }\n        return await this.overrideSceneImages(entityData.id, tilesetImages);\n    }\n\n    /**\n     * @param {string} mapBucket\n     * @param {string} mapFilename\n     * @param {number} roomId\n     * @returns {Object|boolean}\n     */\n    readMapFile(mapBucket, mapFilename, roomId)\n    {\n        let mapFilePath = FileHandler.joinPaths(mapBucket, mapFilename);\n        if(!FileHandler.exists(mapFilePath)){\n            Logger.warning('Map file not found after room save.', {mapFilePath, roomId});\n            return false;\n        }\n        let mapContents = FileHandler.readFile(mapFilePath);\n        if(!mapContents){\n            Logger.warning('Could not read map file contents.', {mapFilePath, roomId});\n            return false;\n        }\n        try {\n            return JSON.parse(mapContents);\n        } catch (error) {\n            Logger.warning('Invalid JSON in map file.', {mapFilePath, roomId, error: error.message});\n            return false;\n        }\n    }\n\n    /**\n     * @param {Object} mapData\n     * @returns {Array<string>}\n     */\n    extractTilesetImages(mapData)\n    {\n        let tilesets = sc.get(mapData, 'tilesets', []);\n        if(!sc.isArray(tilesets) || 0 === tilesets.length){\n            return [];\n        }\n        let images = [];\n        for(let tileset of tilesets){\n            let tilesetImage = sc.get(tileset, 'image', '');\n            if(!tilesetImage){\n                continue;\n            }\n            let imageFileName = tilesetImage.split('/').pop();\n            if(-1 === images.indexOf(imageFileName)){\n                images.push(imageFileName);\n            }\n        }\n        return images;\n    }\n\n    /**\n     * @param {Array<string>} tilesetImages\n     * @param {string} sceneImagesBucket\n     * @param {number} roomId\n     * @param {string} mapFilename\n     * @returns {boolean}\n     */\n    validateImagesExist(tilesetImages, sceneImagesBucket, roomId, mapFilename)\n    {\n        for(let imageFileName of tilesetImages){\n            let imageFilePath = FileHandler.joinPaths(sceneImagesBucket, imageFileName);\n            if(!FileHandler.exists(imageFilePath)){\n                Logger.warning('Tileset image not found in scene_images folder.', {\n                    imageFileName,\n                    imageFilePath,\n                    roomId,\n                    mapFilename\n                });\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {Array<string>} array1\n     * @param {Array<string>} array2\n     * @returns {boolean}\n     */\n    arraysAreEqual(array1, array2)\n    {\n        if(array1.length !== array2.length){\n            return false;\n        }\n        let sorted1 = [...array1].sort();\n        let sorted2 = [...array2].sort();\n        for(let i = 0; i < sorted1.length; i++){\n            if(sorted1[i] !== sorted2[i]){\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {number} roomId\n     * @param {Array<string>} tilesetImages\n     * @returns {Promise<boolean>}\n     */\n    async overrideSceneImages(roomId, tilesetImages)\n    {\n        let sceneImagesValue = tilesetImages.join(',');\n        let updateResult = await this.roomsRepository.updateById(roomId, {scene_images: sceneImagesValue});\n        if(!updateResult){\n            Logger.error('Failed to override scene_images with map file tilesets.', {roomId, tilesetImages});\n            return false;\n        }\n        Logger.info('Overrode scene_images with map file tilesets.', {roomId, tilesetImages, sceneImagesValue});\n        return true;\n    }\n\n    /**\n     * @param {Object} entityData - The loaded entity data\n     * @param {Object} driverResource - Driver resource with properties config\n     * @returns {Array<string>|boolean}\n     */\n    extractTilesetImagesFromEntity(entityData, driverResource)\n    {\n        if(!entityData){\n            return false;\n        }\n        let mapFilename = sc.get(entityData, 'map_filename', '');\n        if(!mapFilename){\n            return false;\n        }\n        let mapBucket = sc.get(driverResource?.options?.properties?.map_filename, 'bucket', '');\n        if(!mapBucket){\n            return false;\n        }\n        let mapData = this.readMapFile(mapBucket, mapFilename, entityData.id);\n        if(!mapData){\n            return false;\n        }\n        return this.extractTilesetImages(mapData);\n    }\n\n}\n\nmodule.exports.RoomMapTilesetsValidator = RoomMapTilesetsValidator;\n"
  },
  {
    "path": "lib/admin/server/rooms-file-upload-renderer.js",
    "content": "/**\n *\n * Reldens - RoomsFileUploadRenderer\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\nclass RoomsFileUploadRenderer\n{\n\n    async renderFileUploadField(eventData)\n    {\n        let propertyKey = eventData.propertyKey;\n        if('scene_images' !== propertyKey){\n            return;\n        }\n        let protectedFiles = sc.get(eventData.renderedEditProperties, 'tilesetImages', []);\n        if(0 === protectedFiles.length){\n            return;\n        }\n        if(!sc.get(eventData.renderedEditProperties, 'overrideSceneImagesEnabled', false)){\n            return;\n        }\n        let editTemplates = eventData?.adminFilesContents?.fields?.edit;\n        let fileItemTemplate = sc.get(editTemplates, 'tileset-file-item', false);\n        if(!fileItemTemplate){\n            return;\n        }\n        let alertWrapperTemplate = sc.get(editTemplates, 'tileset-alert-wrapper', false);\n        if(!alertWrapperTemplate){\n            return;\n        }\n        let filesArray = sc.get(eventData.templateData, 'filesArray', []);\n        let renderedFileItems = [];\n        for(let file of filesArray){\n            let filename = file.filename || file;\n            renderedFileItems.push(await eventData.adminContentsRender(fileItemTemplate, {\n                fieldName: propertyKey,\n                filename,\n                isProtected: -1 !== protectedFiles.indexOf(filename)\n            }));\n        }\n        eventData.templateData.renderedFiles = await eventData.adminContentsRender(\n            alertWrapperTemplate,\n            {renderedFileItems: renderedFileItems.join('')}\n        );\n        eventData.templateData.renderedAlert = '';\n    }\n\n}\n\nmodule.exports.RoomsFileUploadRenderer = RoomsFileUploadRenderer;\n"
  },
  {
    "path": "lib/admin/server/subscribers/create-admin-subscriber.js",
    "content": "/**\n *\n * Reldens - CreateAdminSubscriber\n *\n * Subscriber that handles the creation and initialization of the admin panel.\n * Configures entities, templates, authentication, and branding for the administration interface.\n *\n */\n\nconst { AdminManager } = require('@reldens/cms/lib/admin-manager');\nconst { AdminManagerValidator } = require('@reldens/cms/lib/admin-manager-validator');\nconst { AdminEntitiesGenerator } = require('@reldens/cms/lib/admin-entities-generator');\nconst { AdminTemplatesLoader } = require('@reldens/cms/lib/admin-templates-loader');\nconst { AdminDistHelper } = require('@reldens/cms/lib/admin-dist-helper');\nconst { DefaultTranslations } = require('@reldens/cms/lib/admin-manager/default-translations');\nconst { MimeTypes } = require('../../../game/mime-types');\nconst { GameConst } = require('../../../game/constants');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, EnvVar, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../game/server/manager').ServerManager} ServerManager\n * @typedef {import('../../../game/server/theme-manager').ThemeManager} ThemeManager\n * @typedef {import('../../../config/server/manager').ConfigManager} ConfigManager\n */\nclass CreateAdminSubscriber\n{\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<boolean|void>}\n     */\n    async activateAdmin(event)\n    {\n        let serverManager = sc.get(event, 'serverManager', false);\n        if(!this.validate(serverManager)){\n            return false;\n        }\n        let entitiesGenerator = new AdminEntitiesGenerator();\n        serverManager.events.emit('reldens.beforeCreateAdminManager', {serverManager});\n        let dataServerConfig = serverManager.dataServerConfig;\n        let dataServer = serverManager.dataServer;\n        let themeManager = serverManager.themeManager;\n        let adminConfig = {\n            events: serverManager.events,\n            dataServer,\n            authenticationCallback: serverManager.loginManager.roleAuthenticationCallback.bind(\n                serverManager.loginManager\n            ),\n            app: serverManager.app,\n            appServerFactory: serverManager.appServerFactory,\n            entities: entitiesGenerator.generate(dataServerConfig.loadedEntities, dataServer.entityManager.entities),\n            validator: new AdminManagerValidator(),\n            autoSyncDistCallback: AdminDistHelper.copyBucketFilesToDist,\n            updateAdminAssetsDistOnActivation: themeManager.copyAdminAssetsToDist.bind(themeManager),\n            renderCallback: themeManager.templateEngine.render.bind(themeManager.templateEngine),\n            secret: EnvVar.nonEmptyString(process.env, 'RELDENS_ADMIN_SECRET', ''),\n            rootPath: EnvVar.nonEmptyString(process.env, 'RELDENS_ADMIN_ROUTE_PATH', '/reldens-admin'),\n            translations: Object.assign({}, DefaultTranslations, dataServerConfig?.translations || {}),\n            adminFilesContents: await AdminTemplatesLoader.fetchAdminFilesContents(themeManager.adminTemplates),\n            mimeTypes: MimeTypes,\n            allowedExtensions: {\n                audio: ['.aac', '.mid', '.midi', '.mp3', '.ogg', '.oga', '.opus', '.wav', '.weba', '.3g2'],\n                image: ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp'],\n                text: ['.json', '.jsonld', '.txt']\n            },\n            ...sc.deepMergeProperties(\n                this.fetchConfigurations(serverManager.configManager),\n                await this.fetchFilesContents(themeManager)\n            )\n        };\n        serverManager.serverAdmin = new AdminManager(adminConfig);\n        serverManager.events.emit('reldens.beforeSetupAdminManager', {serverManager});\n        await serverManager.serverAdmin.setupAdmin();\n        serverManager.events.emit('reldens.afterCreateAdminManager', {serverManager});\n    }\n\n    /**\n     * @param {ServerManager|false} serverManager\n     * @returns {boolean}\n     */\n    validate(serverManager)\n    {\n        if(!serverManager){\n            Logger.error('ServerManager not found in CreateAdminSubscriber.');\n            return false;\n        }\n        if(!serverManager.events){\n            Logger.error('EventsManager not found in CreateAdminSubscriber.');\n            return false;\n        }\n        if(!serverManager.themeManager){\n            Logger.error('ThemeManager not found in CreateAdminSubscriber.');\n            return false;\n        }\n        if(!serverManager.configManager){\n            Logger.error('ConfigManager not found in CreateAdminSubscriber.');\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @param {ConfigManager} config\n     * @returns {Object}\n     */\n    fetchConfigurations(config)\n    {\n        let path = 'server/admin/';\n        return {\n            adminRoleId: config.get(path+'roleId', 1),\n            stylesFilePath: config.getWithoutLogs(path+'stylesPath', '/css/'+GameConst.STRUCTURE.ADMIN_CSS_FILE),\n            scriptsFilePath: config.getWithoutLogs(path+'scriptsPath', '/'+GameConst.STRUCTURE.ADMIN_JS_FILE),\n            branding: {\n                companyName: config.getWithoutLogs(path+'companyName', 'Reldens - Administration Panel'),\n                logo: config.getWithoutLogs(path+'logoPath', '/assets/web/reldens-your-logo-mage.png'),\n                favicon: config.getWithoutLogs(path+'faviconPath', '/assets/web/favicon.ico'),\n                copyRight: config.getWithoutLogs(path+'copyRight', '')\n            }\n        };\n    }\n\n    /**\n     * @param {ThemeManager} themeManager\n     * @returns {Promise<Object>}\n     */\n    async fetchFilesContents(themeManager)\n    {\n        return {\n            branding: {\n                copyRight: await FileHandler.fetchFileContents(\n                    FileHandler.joinPaths(\n                        themeManager.projectAdminTemplatesPath,\n                        themeManager.adminTemplatesList.defaultCopyRight\n                    )\n                )\n            }\n        }\n    }\n\n}\n\nmodule.exports.CreateAdminSubscriber = CreateAdminSubscriber;\n"
  },
  {
    "path": "lib/admin/server/subscribers/generators-routes-subscriber.js",
    "content": "/**\n *\n * Reldens - GeneratorsRoutesSubscriber\n *\n * Subscriber that sets up static file routes in the admin panel for generated and source data.\n * Provides authenticated access to the generate-data and generated directories.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/cms/lib/admin-manager').AdminManager} AdminManager\n */\nclass GeneratorsRoutesSubscriber\n{\n\n    /**\n     * @param {AdminManager} adminManager\n     * @param {string} projectGenerateDataPath\n     * @param {string} projectGeneratedDataPath\n     */\n    constructor(adminManager, projectGenerateDataPath, projectGeneratedDataPath)\n    {\n        /** @type {EventsManager} */\n        this.events = adminManager.events;\n        /** @type {Function} */\n        this.isAuthenticated = adminManager.router.isAuthenticated.bind(adminManager.router);\n        /** @type {string} */\n        this.projectGenerateDataPath = projectGenerateDataPath;\n        /** @type {string} */\n        this.projectGeneratedDataPath = projectGeneratedDataPath;\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager not found on GeneratorsRoutesSubscriber.');\n            return false;\n        }\n        this.events.on('reldens.setupAdminManagers', async (event) => {\n            this.setupRoutes(event.adminManager);\n        });\n    }\n\n    /**\n     * @param {AdminManager} adminManager\n     * @returns {boolean|void}\n     */\n    setupRoutes(adminManager)\n    {\n        if(!adminManager.router.adminRouter){\n            Logger.error('AdminRouter is not available in GeneratorsRoutesSubscriber.setupRoutes.');\n            return false;\n        }\n        adminManager.router.adminRouter.use(\n            '/generate-data',\n            this.isAuthenticated.bind(this),\n            adminManager.applicationFramework.static(this.projectGenerateDataPath)\n        );\n        adminManager.router.adminRouter.use(\n            '/generated',\n            this.isAuthenticated.bind(this),\n            adminManager.applicationFramework.static(this.projectGeneratedDataPath)\n        );\n        Logger.info(\n            'Included administration panel static routes.',\n            this.projectGenerateDataPath,\n            this.projectGeneratedDataPath\n        );\n    }\n\n}\n\nmodule.exports.GeneratorsRoutesSubscriber = GeneratorsRoutesSubscriber;\n"
  },
  {
    "path": "lib/admin/server/subscribers/maps-wizard-subscriber.js",
    "content": "/**\n *\n * Reldens - MapsWizardSubscriber\n *\n * Subscriber that handles map generation and import functionality in the admin panel.\n * Supports multiple map generation strategies and batch import with associations.\n *\n */\n\nconst { MapsImporter } = require('../../../import/server/maps-importer');\nconst { AllowedFileTypes } = require('../../../game/allowed-file-types');\nconst {\n    RandomMapGenerator,\n    LayerElementsObjectLoader,\n    LayerElementsCompositeLoader,\n    MultipleByLoaderGenerator,\n    MultipleWithAssociationsByLoaderGenerator\n} = require('@reldens/tile-map-generator');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/cms/lib/admin-manager').AdminManager} AdminManager\n * @typedef {import('../../../config/server/manager').ConfigManager} ConfigManager\n * @typedef {import('../../../game/server/theme-manager').ThemeManager} ThemeManager\n * @typedef {import('express').Request} ExpressRequest\n * @typedef {import('express').Response} ExpressResponse\n */\nclass MapsWizardSubscriber\n{\n\n    /**\n     * @param {AdminManager} adminManager\n     * @param {ConfigManager} configManager\n     * @param {ThemeManager} themeManager\n     */\n    constructor(adminManager, configManager, themeManager)\n    {\n        /** @type {string} */\n        this.mapsWizardPath = '/maps-wizard';\n        /** @type {string} */\n        this.rootPath = '';\n        /** @type {ThemeManager} */\n        this.themeManager = themeManager;\n        /** @type {EventsManager} */\n        this.events = adminManager.events;\n        /** @type {MapsImporter} */\n        this.mapsImporter = new MapsImporter({configManager, dataServer: adminManager.dataServer, themeManager});\n        /** @type {Array<Object>} */\n        this.fields = [{name: 'generatorImages'}, {name: 'generatorJsonFiles'}];\n        /** @type {Object<string, string>} */\n        this.buckets = {\n            generatorImages: this.themeManager.projectGenerateDataPath,\n            generatorJsonFiles: this.themeManager.projectGenerateDataPath\n        };\n        /** @type {Object<string, string>} */\n        this.allowedFileTypes = {\n            generatorImages: AllowedFileTypes.IMAGE,\n            generatorJsonFiles: AllowedFileTypes.TEXT\n        };\n        /** @type {Function} */\n        this.uploader = adminManager.uploaderFactory.createUploader(this.fields, this.buckets, this.allowedFileTypes);\n        /** @type {Function} */\n        this.render = adminManager.contentsBuilder.render.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.renderRoute = adminManager.contentsBuilder.renderRoute.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.isAuthenticated = adminManager.router.isAuthenticated.bind(adminManager.router);\n        /** @type {Object<string, Function>} */\n        this.mapsWizardHandlers = {\n            'elements-object-loader': LayerElementsObjectLoader,\n            'elements-composite-loader': LayerElementsCompositeLoader,\n            'multiple-by-loader': MultipleByLoaderGenerator,\n            'multiple-with-association-by-loader': MultipleWithAssociationsByLoaderGenerator\n        };\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager not found on MapsWizardSubscriber.');\n            return false;\n        }\n        this.events.on('reldens.setupAdminManagers', async (event) => {\n            this.setupRoutes(event.adminManager);\n        });\n        this.events.on('reldens.eventBuildSideBarBefore', async (event) => {\n            if(!event.navigationContents['Wizards']){\n                event.navigationContents['Wizards'] = {};\n            }\n            let translatedLabel = event.adminManager.translations.labels['mapsWizard'];\n            event.navigationContents['Wizards'][translatedLabel] = await event.adminManager.contentsBuilder.render(\n                event.adminManager.adminFilesContents.sideBarItem,\n                {name: translatedLabel, path: event.adminManager.rootPath+this.mapsWizardPath}\n            );\n        });\n        this.events.on('reldens.buildAdminContentsAfter', async (event) => {\n            let pageContent = await this.render(\n                event.adminManager.adminFilesContents.mapsWizard,\n                {actionPath: event.adminManager.rootPath+this.mapsWizardPath}\n            );\n            event.adminManager.contentsBuilder.adminContents.mapsWizard = await this.renderRoute(\n                pageContent,\n                event.adminManager.contentsBuilder.adminContents.sideBar\n            );\n        });\n    }\n\n    /**\n     * @param {AdminManager} adminManager\n     */\n    setupRoutes(adminManager)\n    {\n        if('' === this.rootPath){\n            this.rootPath = adminManager.rootPath;\n        }\n        adminManager.router.adminRouter.get(this.mapsWizardPath, this.isAuthenticated, async (req, res) => {\n            return res.send(await this.render(adminManager.contentsBuilder.adminContents.mapsWizard));\n        });\n        adminManager.router.adminRouter.post(\n            this.mapsWizardPath,\n            this.isAuthenticated,\n            this.uploader,\n            async (req, res) => {\n                if('generate' === req?.body?.mainAction){\n                    return await this.generateMaps(req, res, adminManager);\n                }\n                if('import' === req?.body?.mainAction){\n                    return res.redirect(await this.importSelectedMaps(req));\n                }\n            }\n        );\n    }\n\n    /**\n     * Processes map generation request using the selected handler strategy.\n     * Supports multiple generation methods, including element loaders and multimap generation.\n     * @param {ExpressRequest} req\n     * @param {ExpressResponse} res\n     * @param {AdminManager} adminManager\n     * @returns {Promise<void>}\n     */\n    async generateMaps(req, res, adminManager)\n    {\n        let selectedHandler = req?.body?.mapsWizardAction;\n        if(!selectedHandler){\n            return this.mapsWizardRedirect(res, 'mapsWizardMissingActionError');\n        }\n        let generatorData = req?.body?.generatorData;\n        if(!generatorData){\n            return this.mapsWizardRedirect(res, 'mapsWizardMissingDataError');\n        }\n        let mapData = sc.toJson(generatorData);\n        if(!mapData){\n            return this.mapsWizardRedirect(res, 'mapsWizardWrongJsonDataError');\n        }\n        let handler = this.mapsWizardHandlers[selectedHandler];\n        if(!handler){\n            return this.mapsWizardRedirect(res, 'mapsWizardMissingHandlerError');\n        }\n        let mainGenerator = false;\n        let generatorWithData = false;\n        let generatedMap = false;\n        let handlerParams = {mapData, rootFolder: this.themeManager.projectGenerateDataPath};\n        try {\n            if('elements-object-loader' === selectedHandler){\n                mainGenerator = new handler(handlerParams);\n                await mainGenerator.load();\n                let generator = new RandomMapGenerator(mainGenerator.mapData);\n                generatedMap = await generator.generate();\n                generatorWithData = generator;\n            }\n            if('elements-composite-loader' === selectedHandler){\n                mainGenerator = new handler(handlerParams);\n                await mainGenerator.load();\n                let generator = new RandomMapGenerator();\n                await generator.fromElementsProvider(mainGenerator.mapData);\n                generatedMap = await generator.generate();\n                generatorWithData = generator;\n            }\n            if('multiple-by-loader' === selectedHandler){\n                mainGenerator = new MultipleByLoaderGenerator({loaderData: handlerParams});\n                await mainGenerator.generate();\n                generatorWithData = mainGenerator;\n            }\n            if('multiple-with-association-by-loader' === selectedHandler){\n                mainGenerator = new MultipleWithAssociationsByLoaderGenerator({loaderData: handlerParams});\n                await mainGenerator.generate();\n                generatorWithData = mainGenerator;\n            }\n        } catch (error) {\n            Logger.error('Maps generator error.', selectedHandler, generatorData, error);\n            return this.mapsWizardRedirect(res, 'mapsWizardGeneratorError');\n        }\n        if(!generatorWithData){\n            Logger.error('Maps not generated, incompatible selected handler.', selectedHandler, generatorData);\n            return this.mapsWizardRedirect(res, 'mapsWizardSelectedHandlerError');\n        }\n        let mapsData = {\n            maps: [],\n            actionPath: this.rootPath+this.mapsWizardPath,\n            generatedMapsHandler: selectedHandler,\n            importAssociationsForChangePoints: Number(mapData.importAssociationsForChangePoints || 0),\n            importAssociationsRecursively: Number(mapData.importAssociationsRecursively || 0),\n            verifyTilesetImage: Number(mapData.verifyTilesetImage || 1),\n            automaticallyExtrudeMaps: Number(mapData.automaticallyExtrudeMaps || 1),\n            handlerParams: generatorData\n        };\n        if(generatedMap){\n            let tileWidth = generatedMap.tilewidth;\n            let tileHeight = generatedMap.tileheight;\n            let mapFileName = generatorWithData.mapFileName;\n            if(-1 === mapFileName.indexOf('json')){\n                mapFileName = mapFileName+'.json';\n            }\n            mapsData.maps.push({\n                key: generatorWithData.mapName,\n                mapWidth: generatedMap.width * tileWidth,\n                mapHeight: generatedMap.height * tileHeight,\n                tileWidth,\n                tileHeight,\n                mapImage: this.rootPath+'/generated/'+generatorWithData.tileSheetName,\n                mapJson: this.rootPath+'/generated/'+mapFileName\n            });\n        }\n        if(generatorWithData.generators && generatorWithData.generatedMaps){\n            for(let i of Object.keys(generatorWithData.generators)){\n                let generator = generatorWithData.generators[i];\n                let generatedMap = generatorWithData.generatedMaps[generator.mapName];\n                let tileWidth = generatedMap.tilewidth;\n                let tileHeight = generatedMap.tileheight;\n                let mapFileName = generator.mapFileName;\n                if(-1 === mapFileName.indexOf('json')){\n                    mapFileName = mapFileName+'.json';\n                }\n                let associatedMap = sc.get(mainGenerator.associatedMaps, i, {});\n                let subMaps = this.mapSubMapsData(\n                    sc.get(associatedMap, 'generatedSubMaps'),\n                    sc.get(associatedMap, 'generators'),\n                    tileWidth,\n                    tileHeight\n                );\n                mapsData.maps.push({\n                    key: generator.mapName,\n                    mapWidth: generatedMap.width * tileWidth,\n                    mapHeight: generatedMap.height * tileHeight,\n                    tileWidth,\n                    tileHeight,\n                    mapImage: this.rootPath+'/generated/'+generator.tileSheetName,\n                    mapJson: this.rootPath+'/generated/'+mapFileName,\n                    hasSubMaps: 0 < subMaps.length,\n                    subMaps\n                });\n            }\n        }\n        if(0 === mapsData.maps.length){\n            return this.mapsWizardRedirect(res, 'mapsWizardMapsNotGeneratedError');\n        }\n        return this.mapsWizardMapsSelection(res, mapsData, adminManager);\n    }\n\n    /**\n     * @param {Object} generatedSubMaps\n     * @param {Object} generators\n     * @param {number} tileWidth\n     * @param {number} tileHeight\n     * @returns {Array<Object>}\n     */\n    mapSubMapsData(generatedSubMaps, generators, tileWidth, tileHeight)\n    {\n        if(!generatedSubMaps){\n            return [];\n        }\n        let subMapsData = [];\n        for(let i of Object.keys(generatedSubMaps)) {\n            let subMapData = generatedSubMaps[i];\n            let generator = generators[i];\n            let mapFileName = generator.mapFileName;\n            if(-1 === mapFileName.indexOf('json')){\n                mapFileName = mapFileName+'.json';\n            }\n            subMapsData.push({\n                key: generator.mapName,\n                mapWidth: subMapData.width * tileWidth,\n                mapHeight: subMapData.height * tileHeight,\n                tileWidth,\n                tileHeight,\n                mapImage: this.rootPath + '/generated/' + generator.tileSheetName,\n                mapJson: this.rootPath + '/generated/' + mapFileName\n            });\n        }\n        return subMapsData;\n    }\n\n    /**\n     * @param {ExpressResponse} res\n     * @param {string} result\n     * @returns {void}\n     */\n    mapsWizardRedirect(res, result)\n    {\n        return res.redirect(this.rootPath + this.mapsWizardPath + '?result='+result);\n    }\n\n    /**\n     * @param {ExpressResponse} res\n     * @param {Object} data\n     * @param {AdminManager} adminManager\n     * @returns {Promise<void>}\n     */\n    async mapsWizardMapsSelection(res, data, adminManager)\n    {\n        let renderedView = await this.render(adminManager.adminFilesContents.mapsWizardMapsSelection, data);\n        return res.send(await this.renderRoute(renderedView, adminManager.contentsBuilder.adminContents.sideBar));\n    }\n\n    /**\n     * @param {ExpressRequest} req\n     * @returns {Promise<string>}\n     */\n    async importSelectedMaps(req)\n    {\n        let generatedMapData = this.mapGeneratedMapsDataForImport(req.body);\n        if(!generatedMapData){\n            return this.rootPath+this.mapsWizardPath+'?result=mapsWizardImportDataError';\n        }\n        let importResult = await this.mapsImporter.import(generatedMapData);\n        if(!importResult){\n            let errorCode = this.mapsImporter.errorCode || 'mapsWizardImportError';\n            return this.rootPath+this.mapsWizardPath+'?result='+errorCode;\n        }\n        return this.rootPath+this.mapsWizardPath+'?result=success';\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {Object|false}\n     */\n    mapGeneratedMapsDataForImport(data)\n    {\n        let selectedMaps = sc.get(data, 'selectedMaps', false);\n        if(!selectedMaps){\n            return false;\n        }\n        let importAssociations = 'multiple-with-association-by-loader' === data.generatedMapsHandler;\n        let mappedData = {\n            importAssociationsForChangePoints: importAssociations,\n            importAssociationsRecursively: importAssociations,\n            automaticallyExtrudeMaps: data.automaticallyExtrudeMaps,\n            verifyTilesetImage: data.verifyTilesetImage,\n            handlerParams: sc.toJson(data.handlerParams),\n            relativeGeneratedDataPath: 'generate-data/generated',\n            maps: {}\n        };\n        for(let mapKey of selectedMaps){\n            mappedData.maps[data['map-title-'+mapKey]] = mapKey;\n        }\n        return mappedData;\n    }\n\n}\n\nmodule.exports.MapsWizardSubscriber = MapsWizardSubscriber;\n"
  },
  {
    "path": "lib/admin/server/subscribers/objects-importer-subscriber.js",
    "content": "/**\n *\n * Reldens - ObjectsImporterSubscriber\n *\n * Subscriber that handles objects import functionality in the admin panel.\n * Allows importing game objects data from JSON files or direct form input.\n *\n */\n\nconst { ObjectsImporter } = require('../../../import/server/objects-importer');\nconst { AllowedFileTypes } = require('../../../game/allowed-file-types');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/cms/lib/admin-manager').AdminManager} AdminManager\n * @typedef {import('../../../game/server/theme-manager').ThemeManager} ThemeManager\n * @typedef {import('express').Request} ExpressRequest\n */\nclass ObjectsImporterSubscriber\n{\n\n    /**\n     * @param {AdminManager} adminManager\n     * @param {ThemeManager} themeManager\n     */\n    constructor(adminManager, themeManager)\n    {\n        /** @type {string} */\n        this.objectsImportPath = '/objects-import';\n        /** @type {string} */\n        this.rootPath = '';\n        /** @type {ThemeManager} */\n        this.themeManager = themeManager;\n        /** @type {EventsManager} */\n        this.events = adminManager.events;\n        /** @type {Function} */\n        this.render = adminManager.contentsBuilder.render.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.renderRoute = adminManager.contentsBuilder.renderRoute.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.isAuthenticated = adminManager.router.isAuthenticated.bind(adminManager.router);\n        /** @type {Array<Object>} */\n        this.fields = [{name: 'generatorJsonFiles'}];\n        /** @type {Object<string, string>} */\n        this.buckets = {generatorJsonFiles: this.themeManager.projectGeneratedDataPath};\n        /** @type {Object<string, string>} */\n        this.allowedFileTypes = {generatorJsonFiles: AllowedFileTypes.TEXT};\n        /** @type {Function} */\n        this.uploader = adminManager.uploaderFactory.createUploader(this.fields, this.buckets, this.allowedFileTypes);\n        /** @type {ObjectsImporter} */\n        this.objectsImporter = new ObjectsImporter(adminManager);\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager not found on ObjectsImporterSubscriber.');\n            return false;\n        }\n        this.events.on('reldens.setupAdminManagers', async (event) => {\n            this.setupRoutes(event.adminManager);\n        });\n        this.events.on('reldens.eventBuildSideBarBefore', async (event) => {\n            if(!event.navigationContents['Wizards']){\n                event.navigationContents['Wizards'] = {};\n            }\n            let translatedLabel = event.adminManager.translations.labels['objectsImport'];\n            event.navigationContents['Wizards'][translatedLabel] = await event.adminManager.contentsBuilder.render(\n                event.adminManager.adminFilesContents.sideBarItem,\n                {name: translatedLabel, path: event.adminManager.rootPath+this.objectsImportPath}\n            );\n        });\n        this.events.on('reldens.buildAdminContentsAfter', async (event) => {\n            let pageContent = await this.render(\n                event.adminManager.adminFilesContents.objectsImport,\n                {actionPath: event.adminManager.rootPath+this.objectsImportPath}\n            );\n            event.adminManager.contentsBuilder.adminContents.objectsImport = await this.renderRoute(\n                pageContent,\n                event.adminManager.contentsBuilder.adminContents.sideBar\n            );\n        });\n    }\n\n    /**\n     * @param {AdminManager} adminManager\n     */\n    setupRoutes(adminManager)\n    {\n        if('' === this.rootPath){\n            this.rootPath = adminManager.rootPath;\n        }\n        adminManager.router.adminRouter.get(this.objectsImportPath, this.isAuthenticated, async (req, res) => {\n            return res.send(await this.render(adminManager.contentsBuilder.adminContents.objectsImport));\n        });\n        adminManager.router.adminRouter.post(\n            this.objectsImportPath,\n            this.isAuthenticated,\n            this.uploader,\n            async (req, res) => {\n                return res.redirect(await this.importObjects(req));\n            }\n        );\n    }\n\n    /**\n     * @param {ExpressRequest} req\n     * @returns {Promise<string>}\n     */\n    async importObjects(req)\n    {\n        let generateObjectsData = sc.toJson(req?.body?.generatorData);\n        if(!generateObjectsData){\n            let fileName = req.files?.generatorJsonFiles?.shift()?.originalname;\n            if(!fileName){\n                return this.rootPath+this.objectsImportPath+'?result=objectsImportMissingDataError';\n            }\n            generateObjectsData = sc.toJson(await FileHandler.fetchFileContents(\n                FileHandler.joinPaths(this.themeManager.projectGeneratedDataPath, fileName)\n            ));\n            if(!generateObjectsData){\n                return this.rootPath+this.objectsImportPath+'?result=objectsImportDataError';\n            }\n        }\n        let importResult = await this.objectsImporter.import(generateObjectsData);\n        if(!importResult){\n            let errorCode = this.objectsImporter.errorCode || 'objectsImportError';\n            return this.rootPath+this.objectsImportPath+'?result='+errorCode;\n        }\n        return this.rootPath+this.objectsImportPath+'?result=success';\n    }\n}\n\nmodule.exports.ObjectsImporterSubscriber = ObjectsImporterSubscriber;\n"
  },
  {
    "path": "lib/admin/server/subscribers/rooms-entity-subscriber.js",
    "content": "/**\n *\n * Reldens - RoomsEntitySubscriber\n *\n * Subscriber that handles room-specific admin panel operations including setting default rooms\n * and creating room transition links via change points and return points.\n *\n */\n\nconst { RoomMapTilesetsValidator } = require('../room-map-tilesets-validator');\nconst { RoomsFileUploadRenderer } = require('../rooms-file-upload-renderer');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/cms/lib/admin-manager').AdminManager} AdminManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('express').Router} ExpressRouter\n * @typedef {import('express').Request} ExpressRequest\n * @typedef {import('express').Response} ExpressResponse\n */\nclass RoomsEntitySubscriber\n{\n\n    /**\n     * @param {AdminManager} adminManager\n     * @param {ConfigManager} config\n     */\n    constructor(adminManager, config)\n    {\n        /** @type {BaseDataServer} */\n        this.dataServer = adminManager.dataServer;\n        /** @type {EventsManager} */\n        this.events = adminManager.events;\n        /** @type {ConfigManager} */\n        this.config = config;\n        /** @type {Function} */\n        this.isAuthenticated = adminManager.router.isAuthenticated.bind(adminManager.router);\n        /** @type {Function} */\n        this.generateViewRouteContent = adminManager.routerContents.generateViewRouteContent.bind(\n            adminManager.routerContents\n        );\n        this.setupRepositories();\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    setupRepositories()\n    {\n        if(!this.dataServer){\n            Logger.error('Data server is not defined for RoomsEntitySubscriber.');\n            return false;\n        }\n        /** @type {Object} */\n        this.configRepository = this.dataServer.getEntity('config');\n        /** @type {Object} */\n        this.roomsRepository = this.dataServer.getEntity('rooms');\n        /** @type {Object} */\n        this.roomsChangePointsRepository = this.dataServer.getEntity('roomsChangePoints');\n        /** @type {Object} */\n        this.roomsReturnPointsRepository = this.dataServer.getEntity('roomsReturnPoints');\n        /** @type {RoomMapTilesetsValidator} */\n        this.roomMapTilesetsValidator = new RoomMapTilesetsValidator(this.dataServer, this.config);\n        /** @type {RoomsFileUploadRenderer} */\n        this.fileUploadRenderer = new RoomsFileUploadRenderer();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager is not defined for RoomsEntitySubscriber.');\n            return false;\n        }\n        this.events.on('adminEntityExtraData', async (event) => {\n            if('rooms' !== event.entityId){\n                return;\n            }\n            event.entitySerializedData.extraData = await this.roomsEntityExtraData();\n        });\n        this.events.on('reldens.setupEntitiesRoutes', (event) => {\n            if('rooms' !== event.entityPath){\n                return;\n            }\n            this.setupRoomsSpecificRoutes(\n                event.adminManager.router.adminRouter,\n                event.adminManager.rootPath,\n                event.adminManager.viewPath,\n                event.entityRoute,\n                event.driverResource\n            );\n        });\n        this.events.on('reldens.adminAfterEntitySave', async (event) => {\n            await this.roomMapTilesetsValidator.validate(event);\n        });\n        this.events.on('reldens.adminEditPropertiesPopulation', (event) => {\n            if('rooms' !== event.entityId){\n                return;\n            }\n            this.populateEditFormTilesetImages(event);\n        });\n        this.events.on('reldens.adminBeforeFieldRender', async (event) => {\n            await this.fileUploadRenderer.renderFileUploadField(event);\n        });\n    }\n\n    /**\n     * @param {ExpressRouter} adminRouter\n     * @param {string} rootPath\n     * @param {string} viewPath\n     * @param {string} entityRoute\n     * @param {Object} driverResource\n     * @returns {boolean|void}\n     */\n    setupRoomsSpecificRoutes(adminRouter, rootPath, viewPath, entityRoute, driverResource)\n    {\n        if(!this.dataServer){\n            return false;\n        }\n        if(!adminRouter){\n            Logger.error('Admin Router is not defined for RoomsEntitySubscriber.');\n            return false;\n        }\n        adminRouter.post(entityRoute+viewPath, this.isAuthenticated, async (req, res) => {\n            let routeContents = await this.generateViewRouteContent(req, driverResource, 'rooms');\n            if('' === routeContents){\n                return res.redirect(rootPath+'/rooms?result=errorView');\n            }\n            let roomId = req.query.id;\n            if(!roomId){\n                Logger.warning('Missing entity ID on POST.', req.query);\n                return res.redirect(rootPath+'/rooms?result=errorId');\n            }\n            let setAsDefault = req.body.setAsDefault;\n            if('1' === setAsDefault){\n                let result = await this.configRepository.update(\n                    {path: 'players/initialState/room_id'},\n                    {value: roomId}\n                );\n                if(!result){\n                    return res.redirect(\n                        rootPath+'/rooms'+viewPath+'?id='+roomId+'&result=errorSaveDefault'\n                    );\n                }\n                return res.redirect(rootPath+'/rooms'+viewPath+'?id='+roomId+'&result=success');\n            }\n            let createRoomsLink = req.body.createRoomsLink;\n            if('1' === createRoomsLink){\n                let currentRoomChangePointTileIndex = req.body.currentRoomChangePointTileIndex;\n                if(!currentRoomChangePointTileIndex){\n                    return res.redirect(\n                        rootPath+'/rooms'+viewPath+'?id='+roomId+'&result=errorMissingTileIndex'\n                    );\n                }\n                let nextRoomId = req.body.nextRoomSelector;\n                if(!nextRoomId){\n                    return res.redirect(\n                        rootPath+'/rooms'+viewPath+'?id='+roomId+'&result=errorMissingNextRoom'\n                    );\n                }\n                let nextRoomPositionX = req.body.nextRoomPositionX;\n                if(!nextRoomPositionX){\n                    return res.redirect(\n                        rootPath+'/rooms'+viewPath+'?id='+roomId+'&result=errorMissingRoomX'\n                    );\n                }\n                let nextRoomPositionY = req.body.nextRoomPositionY;\n                if(!nextRoomPositionY){\n                    return res.redirect(\n                        rootPath+'/rooms'+viewPath+'?id='+roomId+'&result=errorMissingRoomY'\n                    );\n                }\n                let nextRoomDirection = sc.get(req.body, 'nextRoomDirection', 'down');\n                let nextRoomIsDefault = sc.get(req.body, 'nextRoomIsDefault', '0');\n                let changePointResult = await this.roomsChangePointsRepository.create({\n                    room_id: roomId,\n                    tile_index: currentRoomChangePointTileIndex,\n                    next_room_id: nextRoomId\n                });\n                if(!changePointResult){\n                    return res.redirect(\n                        rootPath+'/rooms'+viewPath+'?id='+roomId+'&result=errorSaveChangePoint'\n                    );\n                }\n                let returnPointResult = await this.roomsReturnPointsRepository.create({\n                    room_id: nextRoomId,\n                    direction: nextRoomDirection,\n                    x: nextRoomPositionX,\n                    y: nextRoomPositionY,\n                    is_default: '1' === nextRoomIsDefault,\n                    from_room_id: roomId\n                });\n                if(!returnPointResult){\n                    return res.redirect(\n                        rootPath+'/rooms'+viewPath+'?id='+roomId+'&result=errorSaveReturnPoint'\n                    );\n                }\n                return res.redirect(rootPath+'/rooms'+viewPath+'?id='+roomId+'&result=success');\n            }\n            return res.send(routeContents);\n        });\n    }\n\n    /**\n     * @returns {Promise<Object>}\n     */\n    async roomsEntityExtraData()\n    {\n        let loadedRooms = await this.roomsRepository?.loadAll() || [];\n        return {\n            roomsList: loadedRooms.map((room) => {\n                return {id: room.id, name: room.name, mapFile: room.map_filename, mapImages: room.scene_images};\n            })\n        };\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {boolean|void}\n     */\n    populateEditFormTilesetImages(event)\n    {\n        let overrideEnabled = this.config.getWithoutLogs('server/rooms/maps/overrideSceneImagesWithMapFile', true);\n        if(!overrideEnabled){\n            return false;\n        }\n        let entityData = sc.get(event, 'entityData', false);\n        if(!entityData){\n            return false;\n        }\n        let driverResource = sc.get(event, 'driverResource', false);\n        if(!driverResource){\n            return false;\n        }\n        let tilesetImages = this.roomMapTilesetsValidator.extractTilesetImagesFromEntity(entityData, driverResource);\n        if(!tilesetImages || 0 === tilesetImages.length){\n            return false;\n        }\n        let renderedEditProperties = sc.get(event, 'renderedEditProperties', false);\n        if(!renderedEditProperties){\n            return false;\n        }\n        renderedEditProperties.tilesetImages = tilesetImages;\n        renderedEditProperties.overrideSceneImagesEnabled = overrideEnabled;\n    }\n\n}\n\nmodule.exports.RoomsEntitySubscriber = RoomsEntitySubscriber;\n"
  },
  {
    "path": "lib/admin/server/subscribers/shutdown-subscriber.js",
    "content": "/**\n *\n * Reldens - ShutdownSubscriber\n *\n * Subscriber that provides server shutdown functionality through the admin panel.\n * Allows administrators to schedule server shutdown with countdown and cancellation support.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/cms/lib/admin-manager').AdminManager} AdminManager\n * @typedef {import('../../../config/server/manager').ConfigManager} ConfigManager\n */\nclass ShutdownSubscriber\n{\n\n    /**\n     * @param {AdminManager} adminManager\n     * @param {ConfigManager} configManager\n     * @param {Function} broadcastCallback\n     */\n    constructor(adminManager, configManager, broadcastCallback)\n    {\n        /** @type {string} */\n        this.managementPath = '/management';\n        /** @type {string} */\n        this.rootPath = '';\n        /** @type {Function} */\n        this.broadcastCallback = broadcastCallback;\n        /** @type {Object|null} */\n        this.translations = null;\n        /** @type {number} */\n        this.defaultShutdownTime = 180;\n        /** @type {number} */\n        this.shutdownTime = 0;\n        /** @type {number} */\n        this.shuttingDownIn = 0;\n        /** @type {NodeJS.Timeout|null} */\n        this.shutdownInterval = null;\n        /** @type {NodeJS.Timeout|null} */\n        this.shutdownTimeout = null;\n        /** @type {ConfigManager} */\n        this.config = configManager;\n        /** @type {EventsManager} */\n        this.events = adminManager.events;\n        /** @type {Function} */\n        this.render = adminManager.contentsBuilder.render.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.renderRoute = adminManager.contentsBuilder.renderRoute.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.isAuthenticated = adminManager.router.isAuthenticated.bind(adminManager.router);\n        this.listenEvents();\n        this.fetchConfigurations();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager not found on ShutdownSubscriber.');\n            return false;\n        }\n        this.events.on('reldens.setupAdminManagers', async (event) => {\n            this.setupRoutes(event.adminManager);\n        });\n        this.events.on('reldens.adminSideBarBeforeSubItems', async (event) => {\n            event.navigationContents['Server'] = {'Management': await this.render(\n                event.adminManager.adminFilesContents.sideBarItem,\n                {\n                    name: event.adminManager.translations.labels['management'],\n                    path: event.adminManager.rootPath+this.managementPath\n                }\n            )};\n        });\n        this.events.on('reldens.buildAdminContentsAfter', async (event) => {\n            let pageContent = await this.render(\n                event.adminManager.adminFilesContents.management,\n                {\n                    actionPath: event.adminManager.rootPath+this.managementPath,\n                    shutdownTime: this.config.getWithoutLogs('server/shutdownTime', this.defaultShutdownTime),\n                    shuttingDownLabel: '{{&shuttingDownLabel}}',\n                    shuttingDownTime: '{{&shuttingDownTime}}',\n                    submitLabel: '{{&submitLabel}}',\n                    submitType: '{{&submitType}}'\n                }\n            );\n            event.adminManager.contentsBuilder.adminContents.management = await this.renderRoute(\n                pageContent,\n                event.adminManager.contentsBuilder.adminContents.sideBar\n            );\n        });\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    fetchConfigurations()\n    {\n        if(!this.config){\n            return false;\n        }\n        /** @type {number} */\n        this.configuredShutdownTime = this.config.getWithoutLogs('server/shutdownTime', this.defaultShutdownTime);\n    }\n\n    /**\n     * @param {AdminManager} adminManager\n     * @returns {boolean|void}\n     */\n    setupRoutes(adminManager)\n    {\n        if('' === this.rootPath){\n            this.rootPath = adminManager.rootPath;\n        }\n        if(!this.broadcastCallback){\n            this.broadcastCallback = adminManager.broadcastCallback;\n        }\n        if(!this.translations){\n            this.translations = adminManager.translations;\n        }\n        if(!adminManager.router.adminRouter){\n            Logger.error('AdminRouter is not available in ShutdownSubscriber.setupRoutes.');\n            return false;\n        }\n        adminManager.router.adminRouter.get(this.managementPath, this.isAuthenticated, async (req, res) => {\n            let rendererContent = await this.render(\n                adminManager.contentsBuilder.adminContents.management,\n                this.getShuttingDownData()\n            );\n            return res.send(rendererContent);\n        });\n        adminManager.router.adminRouter.post(this.managementPath, this.isAuthenticated, async (req, res) => {\n            this.shutdownTime = req.body['shutdown-time'];\n            let redirectManagementPath = this.rootPath+this.managementPath;\n            if(!this.shutdownTime){\n                return res.redirect(redirectManagementPath+'?result=shutdownError');\n            }\n            if(0 < this.shuttingDownIn){\n                clearInterval(this.shutdownInterval);\n                clearTimeout(this.shutdownTimeout);\n                this.shuttingDownIn = 0;\n                return res.redirect(redirectManagementPath+'?result=success');\n            }\n            await this.broadcastShutdownMessage();\n            this.shutdownTimeout = setTimeout(\n                async () => {\n                    Logger.info('Server is shutting down by request on the administration panel.', sc.getTime());\n                    if(this.broadcastCallback && sc.isFunction(this.broadcastCallback)){\n                        await this.broadcastCallback({message: 'Server Offline.'});\n                    }\n                    throw new Error('Server shutdown by request on the administration panel.');\n                },\n                this.shutdownTime * 1000\n            );\n            this.shutdownInterval = setInterval(\n                async () => {\n                    this.shuttingDownIn--;\n                    Logger.info('Server is shutting down in '+this.shuttingDownIn+' seconds.');\n                    if(\n                        0 < this.shuttingDownIn\n                        && (this.shuttingDownIn <= 5 || Math.ceil(this.shutdownTime / 2) === this.shuttingDownIn)\n                    ){\n                        await this.broadcastShutdownMessage();\n                    }\n                    if(0 === this.shuttingDownIn){\n                        Logger.info('Server OFF at: '+ sc.getTime());\n                        clearInterval(this.shutdownInterval);\n                    }\n                },\n                1000\n            );\n            this.shuttingDownIn = this.shutdownTime;\n            return res.redirect(redirectManagementPath+'?result=success');\n        });\n    }\n\n    /**\n     * @returns {Object}\n     */\n    getShuttingDownData()\n    {\n        if(0 === this.shuttingDownIn){\n            return {\n                shuttingDownLabel: '',\n                shuttingDownTime: '',\n                submitLabel: this.translations.labels.submitShutdownLabel || 'Shutdown Server',\n                submitType: 'danger',\n                shutdownTime: this.configuredShutdownTime\n            };\n        }\n        return {\n            shuttingDownLabel: this.translations.labels.shuttingDown || '',\n            shuttingDownTime: this.shuttingDownIn || '',\n            submitLabel: this.translations.labels.submitCancelLabel || 'Cancel Server Shutdown',\n            submitType: 'warning',\n            shutdownTime: this.configuredShutdownTime\n        };\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async broadcastShutdownMessage()\n    {\n        let shuttingDownTime = 0 === this.shuttingDownIn ? this.shutdownTime : this.shuttingDownIn;\n        await this.broadcastSystemMessage('Server is shutting down in ' + shuttingDownTime + ' seconds.');\n    }\n\n    /**\n     * @param {string} message\n     * @returns {Promise<void>}\n     */\n    async broadcastSystemMessage(message)\n    {\n        if(!this.broadcastCallback || !sc.isFunction(this.broadcastCallback)){\n            Logger.warning('Broadcast callback was not configured in ShutdownSubscriber.', this.broadcastCallback);\n            return;\n        }\n        await this.broadcastCallback({message});\n    }\n\n}\n\nmodule.exports.ShutdownSubscriber = ShutdownSubscriber;\n"
  },
  {
    "path": "lib/admin/server/subscribers/skills-importer-subscriber.js",
    "content": "/**\n *\n * Reldens - SkillsImporterSubscriber\n *\n * Subscriber that handles skills import functionality in the admin panel.\n * Allows importing skills data from JSON files or direct form input.\n *\n */\n\nconst { SkillsImporter } = require('../../../import/server/skills-importer');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { AllowedFileTypes } = require('../../../game/allowed-file-types');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/cms/lib/admin-manager').AdminManager} AdminManager\n * @typedef {import('../../../game/server/theme-manager').ThemeManager} ThemeManager\n * @typedef {import('express').Request} ExpressRequest\n */\nclass SkillsImporterSubscriber\n{\n\n    /**\n     * @param {AdminManager} adminManager\n     * @param {ThemeManager} themeManager\n     */\n    constructor(adminManager, themeManager)\n    {\n        /** @type {string} */\n        this.skillsImportPath = '/skills-import';\n        /** @type {string} */\n        this.rootPath = '';\n        /** @type {ThemeManager} */\n        this.themeManager = themeManager;\n        /** @type {EventsManager} */\n        this.events = adminManager.events;\n        /** @type {Function} */\n        this.render = adminManager.contentsBuilder.render.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.renderRoute = adminManager.contentsBuilder.renderRoute.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.isAuthenticated = adminManager.router.isAuthenticated.bind(adminManager.router);\n        /** @type {Array<Object>} */\n        this.fields = [{name: 'generatorJsonFiles'}];\n        /** @type {Object<string, string>} */\n        this.buckets = {generatorJsonFiles: this.themeManager.projectGeneratedDataPath};\n        /** @type {Object<string, string>} */\n        this.allowedFileTypes = {generatorJsonFiles: AllowedFileTypes.TEXT};\n        /** @type {Function} */\n        this.uploader = adminManager.uploaderFactory.createUploader(this.fields, this.buckets, this.allowedFileTypes);\n        /** @type {SkillsImporter} */\n        this.skillsImporter = new SkillsImporter(adminManager);\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager not found on SkillsImporterSubscriber.');\n            return false;\n        }\n        this.events.on('reldens.setupAdminManagers', async (event) => {\n            this.setupRoutes(event.adminManager);\n        });\n        this.events.on('reldens.eventBuildSideBarBefore', async (event) => {\n            if(!event.navigationContents['Wizards']){\n                event.navigationContents['Wizards'] = {};\n            }\n            let translatedLabel = event.adminManager.translations.labels['skillsImport'];\n            event.navigationContents['Wizards'][translatedLabel] = await event.adminManager.contentsBuilder.render(\n                event.adminManager.adminFilesContents.sideBarItem,\n                {name: translatedLabel, path: event.adminManager.rootPath+this.skillsImportPath}\n            );\n        });\n        this.events.on('reldens.buildAdminContentsAfter', async (event) => {\n            let pageContent = await this.render(\n                event.adminManager.adminFilesContents.skillsImport,\n                {actionPath: event.adminManager.rootPath+this.skillsImportPath}\n            );\n            event.adminManager.contentsBuilder.adminContents.skillsImport = await this.renderRoute(\n                pageContent,\n                event.adminManager.contentsBuilder.adminContents.sideBar\n            );\n        });\n    }\n\n    /**\n     * @param {AdminManager} adminManager\n     */\n    setupRoutes(adminManager)\n    {\n        if('' === this.rootPath){\n            this.rootPath = adminManager.rootPath;\n        }\n        adminManager.router.adminRouter.get(this.skillsImportPath, this.isAuthenticated, async (req, res) => {\n            return res.send(await this.render(adminManager.contentsBuilder.adminContents.skillsImport));\n        });\n        adminManager.router.adminRouter.post(\n            this.skillsImportPath,\n            this.isAuthenticated,\n            this.uploader,\n            async (req, res) => {\n                return res.redirect(await this.importSkills(req));\n            }\n        );\n    }\n\n    /**\n     * @param {ExpressRequest} req\n     * @returns {Promise<string>}\n     */\n    async importSkills(req)\n    {\n        let generateSkillsData = sc.toJson(req?.body?.generatorData);\n        if(!generateSkillsData){\n            let fileName = req.files?.generatorJsonFiles?.shift()?.originalname;\n            if(!fileName){\n                return this.rootPath+this.skillsImportPath+'?result=skillsImportMissingDataError';\n            }\n            generateSkillsData = sc.toJson(await FileHandler.fetchFileContents(\n                FileHandler.joinPaths(this.themeManager.projectGeneratedDataPath, fileName)\n            ));\n            if(!generateSkillsData){\n                return this.rootPath+this.skillsImportPath+'?result=skillsImportDataError';\n            }\n        }\n        let importResult = await this.skillsImporter.import(generateSkillsData);\n        if(!importResult){\n            let errorCode = this.skillsImporter.errorCode || 'skillsImportError';\n            return this.rootPath+this.skillsImportPath+'?result='+errorCode;\n        }\n        return this.rootPath+this.skillsImportPath+'?result=success';\n    }\n}\n\nmodule.exports.SkillsImporterSubscriber = SkillsImporterSubscriber;\n"
  },
  {
    "path": "lib/admin/server/subscribers/theme-manager-subscriber.js",
    "content": "/**\n *\n * Reldens - ThemeManagerSubscriber\n *\n * Subscriber that provides theme management functionality through the admin panel.\n * Allows administrators to execute ThemeManager commands on selected themes.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\nconst { FileHandler } = require('@reldens/server-utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/cms/lib/admin-manager').AdminManager} AdminManager\n * @typedef {import('../../../config/server/manager').ConfigManager} ConfigManager\n * @typedef {import('../../../game/server/theme-manager').ThemeManager} ThemeManager\n */\n\nclass ThemeManagerSubscriber\n{\n\n    /**\n     * @param {AdminManager} adminManager\n     * @param {ConfigManager} configManager\n     * @param {ThemeManager} themeManager\n     */\n    constructor(adminManager, configManager, themeManager)\n    {\n        /** @type {string} */\n        this.themeManagerPath = '/theme-manager';\n        /** @type {string} */\n        this.managementPath = '/management';\n        /** @type {string} */\n        this.serverManagerLabel = 'Server Manager';\n        /** @type {number} */\n        this.defaultShutdownTime = 180;\n        /** @type {string} */\n        this.rootPath = '';\n        /** @type {ThemeManager} */\n        this.themeManager = themeManager;\n        /** @type {ConfigManager} */\n        this.config = configManager;\n        /** @type {Object|null} */\n        this.translations = null;\n        /** @type {EventsManager} */\n        this.events = adminManager.events;\n        /** @type {Function} */\n        this.render = adminManager.contentsBuilder.render.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.renderRoute = adminManager.contentsBuilder.renderRoute.bind(adminManager.contentsBuilder);\n        /** @type {Function} */\n        this.isAuthenticated = adminManager.router.isAuthenticated.bind(adminManager.router);\n        /** @type {Object} */\n        this.commands = this.getCommandsMetadata();\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {Object}\n     */\n    getCommandsMetadata()\n    {\n        return {\n            buildCss: {\n                category: 'build',\n                label: 'Build CSS',\n                async: true,\n                description: 'Compile SCSS to CSS using Parcel bundler',\n                details: 'Enabled by default. Set RELDENS_ALLOW_BUILD_CSS=0 to disable. Creates optimized CSS in dist/css/.'\n            },\n            buildClient: {\n                category: 'build',\n                label: 'Build Client',\n                async: true,\n                description: 'Bundle client JavaScript using Parcel',\n                details: 'Enabled by default. Set RELDENS_ALLOW_BUILD_CLIENT=0 to disable. Processes all .html files in theme folder.'\n            },\n            buildSkeleton: {\n                category: 'build',\n                label: 'Build Skeleton',\n                async: true,\n                description: 'Build both CSS and client',\n                details: 'Combined build operation for complete theme compilation.'\n            },\n            resetDist: {\n                category: 'clientDist',\n                label: 'Reset Dist',\n                async: false,\n                description: 'Remove and recreate dist folder',\n                details: 'Deletes dist/ completely and creates fresh empty structure.'\n            },\n            removeDist: {\n                category: 'clientDist',\n                label: 'Remove Dist',\n                async: false,\n                description: 'Delete dist folder',\n                details: 'Permanently removes dist/ folder.'\n            },\n            copyAssetsToDist: {\n                category: 'clientDist',\n                label: 'Copy Assets to Dist',\n                async: false,\n                description: 'Copy theme assets folder to dist/assets',\n                details: 'Copies images, audio, and other assets from theme to dist.'\n            },\n            copyDefaultAssets: {\n                category: 'clientDist',\n                label: 'Copy Default Assets',\n                async: false,\n                description: 'Copy default theme assets to dist',\n                details: 'Copies assets from default theme.'\n            },\n            copyDefaultTheme: {\n                category: 'copy',\n                label: 'Copy Default Theme',\n                async: false,\n                description: 'Copy default theme files to project theme',\n                details: 'Overwrites current theme with default theme files.'\n            },\n            copyPackage: {\n                category: 'copy',\n                label: 'Copy Plugins',\n                async: false,\n                description: 'Copy theme plugins folder',\n                details: 'Copies plugin files from default theme.'\n            },\n            copyAdmin: {\n                category: 'copy',\n                label: 'Copy Admin',\n                async: false,\n                description: 'Copy admin panel files',\n                details: 'Copies admin templates and assets.'\n            },\n            copyAdminFiles: {\n                category: 'clientDist',\n                label: 'Copy Admin Files to Dist',\n                async: false,\n                description: 'Copy admin JS/CSS to dist',\n                details: 'Copies functions.js and reldens-functions.js to dist/js/, admin.js to dist/, admin.css to dist/css/.'\n            },\n            copyNew: {\n                category: 'copy',\n                label: 'Copy New (All)',\n                async: false,\n                description: 'Copy all theme files',\n                details: 'Runs: copyDefaultAssets, copyDefaultTheme, copyPackage, copyAdmin.'\n            },\n            copyIndex: {\n                category: 'install',\n                label: 'Copy Index',\n                async: true,\n                description: 'Generate index.js from template',\n                details: 'Creates project index.js with theme configuration. Skips if index.js already exists.'\n            },\n            copyServerFiles: {\n                category: 'install',\n                label: 'Copy Server Files',\n                async: true,\n                description: 'Copy server configuration files',\n                details: 'Runs: copyEnvFile, copyKnexFile, copyGitignoreFile, copyIndex.'\n            },\n            installSkeleton: {\n                category: 'install',\n                label: 'Install Skeleton',\n                async: true,\n                description: 'Complete skeleton installation',\n                details: 'Runs: copyIndex, copyServerFiles, resetDist, fullRebuild.'\n            },\n            fullRebuild: {\n                category: 'install',\n                label: 'Full Rebuild',\n                async: true,\n                description: 'Complete rebuild of theme',\n                details: 'Runs: copyNew, buildSkeleton, copyAdminFiles. Takes 30-60 seconds.'\n            },\n        };\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager not found on ThemeManagerSubscriber.');\n            return false;\n        }\n        this.events.on('reldens.setupAdminManagers', async (event) => {\n            this.setupRoutes(event.adminManager);\n        });\n        this.events.on('reldens.adminSideBarBeforeSubItems', async (event) => {\n            event.navigationContents['Server'] = await this.render(\n                event.adminManager.adminFilesContents.sideBarItem,\n                {\n                    name: this.serverManagerLabel,\n                    path: event.adminManager.rootPath+this.managementPath\n                }\n            );\n        });\n        this.events.on('reldens.buildAdminContentsAfter', async (event) => {\n            let rootPath = event.adminManager.rootPath;\n            let managementBody = await this.render(\n                event.adminManager.adminFilesContents.management,\n                {\n                    actionPath: rootPath+this.managementPath,\n                    shutdownTime: this.config.getWithoutLogs(\n                        'server/shutdownTime',\n                        this.defaultShutdownTime\n                    ),\n                    shuttingDownLabel: '{{&shuttingDownLabel}}',\n                    shuttingDownTime: '{{&shuttingDownTime}}',\n                    submitLabel: '{{&submitLabel}}',\n                    submitType: '{{&submitType}}'\n                }\n            );\n            let themeBody = await this.render(\n                event.adminManager.adminFilesContents.themeManager,\n                this.getTemplateData(event.adminManager)\n            );\n            event.adminManager.contentsBuilder.adminContents.management = await this.renderRoute(\n                managementBody+themeBody,\n                event.adminManager.contentsBuilder.adminContents.sideBar\n            );\n        });\n    }\n\n    /**\n     * @param {AdminManager} adminManager\n     * @returns {boolean|void}\n     */\n    setupRoutes(adminManager)\n    {\n        if('' === this.rootPath){\n            this.rootPath = adminManager.rootPath;\n        }\n        if(!this.translations){\n            this.translations = adminManager.translations;\n        }\n        if(!adminManager.router.adminRouter){\n            Logger.error('AdminRouter is not available in ThemeManagerSubscriber.setupRoutes.');\n            return false;\n        }\n        adminManager.router.adminRouter.post(\n            this.themeManagerPath,\n            this.isAuthenticated,\n            async (req, res) => {\n                let selectedTheme = req.body['selected-theme'];\n                let command = req.body['command'];\n                let redirectPath = this.rootPath+this.managementPath;\n                if(!selectedTheme){\n                    return res.redirect(redirectPath+'?result=themeManagerMissingTheme');\n                }\n                if(!command || !this.commands[command]){\n                    return res.redirect(redirectPath+'?result=themeManagerMissingCommand');\n                }\n                try {\n                    await this.executeCommand(command, selectedTheme);\n                    return res.redirect(redirectPath+'?result=success');\n                } catch(error){\n                    Logger.error('Theme manager command failed', {command, theme: selectedTheme, error});\n                    return res.redirect(redirectPath+'?result=themeManagerExecutionError');\n                }\n            }\n        );\n    }\n\n    /**\n     * @param {string} commandName\n     * @param {string} themeName\n     * @returns {Promise<void>}\n     */\n    async executeCommand(commandName, themeName)\n    {\n        Logger.info('Executing theme manager command: '+commandName+' on theme: '+themeName);\n        this.themeManager.setupPaths({\n            projectRoot: this.themeManager.projectRoot,\n            projectThemeName: themeName\n        });\n        if(!sc.isFunction(this.themeManager[commandName])){\n            throw new Error('Invalid command: '+commandName);\n        }\n        await this.themeManager[commandName]();\n        Logger.info('Theme manager command completed: '+commandName);\n    }\n\n    /**\n     * @returns {Array}\n     */\n    getAvailableThemes()\n    {\n        try {\n            let themePath = this.themeManager.themePath;\n            let folders = FileHandler.fetchSubFoldersList(themePath);\n            let excludeFolders = ['admin', 'plugins'];\n            let themes = [];\n            for(let folder of folders){\n                if(excludeFolders.includes(folder)){\n                    continue;\n                }\n                themes.push({\n                    name: folder,\n                    selected: folder === this.themeManager.projectThemeName\n                });\n            }\n            return themes;\n        } catch(error){\n            Logger.error('Failed to get available themes', error);\n            return [{name: 'default', selected: true}];\n        }\n    }\n\n    /**\n     * @param {AdminManager} adminManager\n     * @returns {Object}\n     */\n    getTemplateData(adminManager)\n    {\n        let rootPath = adminManager ? adminManager.rootPath : this.rootPath;\n        let themes = this.getAvailableThemes();\n        let buildCommands = [];\n        let clientDistCommands = [];\n        let copyCommands = [];\n        let installCommands = [];\n        let commandDescriptions = {};\n        for(let commandName of Object.keys(this.commands)){\n            let meta = this.commands[commandName];\n            let commandData = {\n                name: commandName,\n                label: meta.label,\n                async: meta.async\n            };\n            commandDescriptions[commandName] = {\n                description: meta.description,\n                details: meta.details\n            };\n            if('build' === meta.category){\n                buildCommands.push(commandData);\n                continue;\n            }\n            if('clientDist' === meta.category){\n                clientDistCommands.push(commandData);\n                continue;\n            }\n            if('copy' === meta.category){\n                copyCommands.push(commandData);\n                continue;\n            }\n            if('install' === meta.category){\n                installCommands.push(commandData);\n            }\n        }\n        return {\n            actionPath: rootPath+this.themeManagerPath,\n            currentTheme: this.themeManager.projectThemeName,\n            themes,\n            buildCommands,\n            clientDistCommands,\n            copyCommands,\n            installCommands,\n            commandDescriptionsJson: JSON.stringify(commandDescriptions)\n        };\n    }\n\n}\n\nmodule.exports.ThemeManagerSubscriber = ThemeManagerSubscriber;\n"
  },
  {
    "path": "lib/admin/server/templates-list.js",
    "content": "/**\n *\n * Reldens - TemplatesList\n *\n * Mapping of template keys to their corresponding HTML file names for the admin panel.\n * Includes main page templates, layout components, and field rendering templates for view and edit modes.\n *\n */\n\nmodule.exports.TemplatesList = {\n    login: 'login.html',\n    dashboard: 'dashboard.html',\n    management: 'management.html',\n    themeManager: 'theme-manager.html',\n    mapsWizard: 'maps-wizard.html',\n    mapsWizardMapsSelection: 'maps-wizard-maps-selection.html',\n    objectsImport: 'objects-import.html',\n    skillsImport: 'skills-import.html',\n    list: 'list.html',\n    listContent: 'list-content.html',\n    view: 'view.html',\n    edit: 'edit.html',\n    layout: 'layout.html',\n    sideBar: 'sidebar.html',\n    sideBarHeader: 'sidebar-header.html',\n    sideBarItem: 'sidebar-item.html',\n    paginationLink: 'pagination-link.html',\n    defaultCopyRight: 'default-copyright.html',\n    fields: {\n        view: {\n            audio: 'audio.html',\n            audios: 'audios.html',\n            text: 'text.html',\n            textarea: 'textarea.html',\n            image: 'image.html',\n            images: 'images.html',\n            link: 'link.html',\n            links: 'links.html',\n            boolean: 'boolean.html'\n        },\n        edit: {\n            text: 'text.html',\n            textarea: 'textarea.html',\n            select: 'select.html',\n            checkbox: 'checkbox.html',\n            boolean: 'checkbox.html',\n            radio: 'radio.html',\n            button: 'button.html',\n            file: 'file.html'\n        }\n    },\n    sections: {\n        view: {\n            rooms: 'rooms.html'\n        }\n    }\n};\n"
  },
  {
    "path": "lib/ads/client/ads-provider.js",
    "content": "/**\n *\n * Reldens - AdsProvider\n *\n * Utility class for filtering and fetching active ads by provider ID and type.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\nclass AdsProvider\n{\n\n    /**\n     * @param {number} providerId\n     * @param {Array<string>} validAdsTypes\n     * @param {Object<string, Object>} availableAds\n     * @returns {Object<string, Object>}\n     */\n    static fetchActiveAdsByProviderId(providerId, validAdsTypes, availableAds)\n    {\n        if(!providerId){\n            return {};\n        }\n        let adsKeys = Object.keys(availableAds);\n        if(0 === adsKeys.length){\n            return {};\n        }\n        let adsCollection = {};\n        for(let i of adsKeys){\n            let ad = availableAds[i];\n            if(providerId !== ad.provider.id){\n                // Logger.info('Filtered ad by provider ID.', {expectedId: providerId, adProviderId: ad.provider.id});\n                continue;\n            }\n            if(!ad.enabled){\n                Logger.info('Ad not enabled.', ad);\n                continue;\n            }\n            if(-1 === validAdsTypes.indexOf(ad.type.key)){\n                Logger.info('Invalid ad type.', ad);\n                continue;\n            }\n            adsCollection[i] = ad;\n        }\n        Logger.info({providerId, activeProviderAds: adsCollection});\n        return adsCollection;\n    }\n\n}\n\nmodule.exports.AdsProvider = AdsProvider;\n"
  },
  {
    "path": "lib/ads/client/messages-listener.js",
    "content": "/**\n *\n * Reldens - MessagesListener\n *\n * Handles incoming messages from the server related to ads and updates the ads plugin state.\n *\n */\n\nconst { AdsConst } = require('../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Room} Room\n * @typedef {import('./plugin').AdsPlugin} AdsPlugin\n */\nclass MessagesListener\n{\n\n    /**\n     * @param {Room} room\n     * @param {AdsPlugin} adsPlugin\n     * @returns {Promise<void>}\n     */\n    static async listenMessages(room, adsPlugin)\n    {\n        room.onMessage('*', (message) => {\n            if(AdsConst.ACTIONS.ADS_PLAYED !== message.act){\n                return false;\n            }\n            adsPlugin.playedAds = {};\n            if(!message.playedAdsModels){\n                Logger.info('None played ads.', message);\n                return false;\n            }\n            for(let playedAd of message.playedAdsModels){\n                adsPlugin.playedAds[playedAd.ads_id] = playedAd;\n            }\n            return true;\n        });\n    }\n\n}\n\nmodule.exports.MessagesListener = MessagesListener;\n"
  },
  {
    "path": "lib/ads/client/plugin.js",
    "content": "/**\n *\n * Reldens - AdsPlugin\n *\n * Client-side ads plugin that manages ad providers, SDK initialization, and ad playback events.\n *\n*/\n\nconst { MessagesListener } = require('./messages-listener');\nconst { SdkHandler } = require('./sdk-handler');\nconst { ProvidersList } = require('./providers-list');\nconst Translations = require('./snippets/en_US');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst { AdsConst } = require('../constants');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('./sdk-handler').SdkHandler} SdkHandler\n *\n * @typedef {Object} AdsPluginProps\n * @property {GameManager} [gameManager] - The game manager instance\n * @property {EventsManager} [events] - The events manager instance\n */\nclass AdsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {AdsPluginProps} props\n     */\n    setup(props)\n    {\n        /** @type {GameManager|false} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in AdsPlugin.');\n        }\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in AdsPlugin.');\n        }\n        /** @type {Object|false} */\n        this.config = {};\n        /** @type {Object<string, Object>} */\n        this.activeProviders = {};\n        /** @type {Object<string, Object>|null} */\n        this.playedAds = null;\n        this.setConfig();\n        this.setSkdHandler();\n        this.fetchActiveProviders();\n        this.setTranslations();\n        this.listenEvents();\n    }\n\n    setConfig()\n    {\n        this.config = this.gameManager ? this.gameManager.config.get('client/ads/general', {}) : false;\n    }\n\n    setSkdHandler()\n    {\n        let gameDom = this.gameManager?.gameDom;\n        /** @type {SdkHandler|false} */\n        this.sdkHandler = gameDom ? new SdkHandler({gameDom, config: this.config}) : false;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    fetchActiveProviders()\n    {\n        let providers = sc.get(this.config, 'providers', {});\n        let providersKeys = Object.keys(providers);\n        if(0 === providersKeys.length){\n            //Logger.debug('None ads providers configured.', this.config);\n            return false;\n        }\n        for(let i of providersKeys){\n            let provider = providers[i];\n            if(!provider.enabled){\n                //Logger.debug({'Provider disabled': providers});\n                continue;\n            }\n            provider.classDefinition = sc.get(ProvidersList, i, false);\n            this.activeProviders[i] = provider;\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setTranslations()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations, AdsConst.MESSAGE.DATA_VALUES);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events || !this.gameManager || !this.sdkHandler){\n            Logger.error('Missing properties for AdsPlugin.');\n            return false;\n        }\n        this.events.on('reldens.beforeCreateEngine', async (initialGameData, gameManager) => {\n            if(!this.sdkHandler){\n                Logger.info('Undefined SDK Handler.');\n                return;\n            }\n            await this.sdkHandler.setupProvidersSdk(this.activeProviders, gameManager);\n        });\n        this.events.on('reldens.joinedRoom', async (room) => {\n            await MessagesListener.listenMessages(room, this);\n        });\n    }\n\n}\n\nmodule.exports.AdsPlugin = AdsPlugin;\n"
  },
  {
    "path": "lib/ads/client/providers/crazy-games/banners-handler.js",
    "content": "/**\n *\n * Reldens - BannersHandler\n *\n * Manages banner ad creation, placement, and lifecycle for the CrazyGames SDK.\n *\n */\n\nconst { Validator } = require('./validator');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('./validator').Validator} Validator\n */\n\n/**\n * @typedef {Object} BannersHandlerProps\n * @property {GameManager} [gameManager] - The game manager instance\n * @property {Object} [metaData] - Provider metadata configuration\n * @property {Object} [sdk] - The CrazyGames SDK instance\n * @property {Function} [hasAdblock] - Function to check for ad blocker\n * @property {Function} [isEnabled] - Function to check if SDK is enabled\n */\nclass BannersHandler\n{\n\n    /**\n     * @param {BannersHandlerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {GameManager|false} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        /** @type {Object} */\n        this.metaData = sc.get(props, 'metaData', {});\n        /** @type {Object} */\n        this.gameDom = this.gameManager?.gameDom;\n        /** @type {Object} */\n        this.events = this.gameManager?.events;\n        /** @type {Object|false} */\n        this.sdk = sc.get(props, 'sdk', false);\n        /** @type {Function|false} */\n        this.hasAdblock = sc.get(props, 'hasAdblock', false);\n        /** @type {Function|false} */\n        this.isEnabled = sc.get(props, 'isEnabled', false);\n        /** @type {Object<string, Object>} */\n        this.activeBanners = {};\n        /** @type {Validator} */\n        this.validator = new Validator();\n    }\n\n    /**\n     * @returns {Array<string>}\n     */\n    availableBanners()\n    {\n        return [\n            '728x90',\n            '300x250',\n            '320x50',\n            '468x60',\n            '320x100'\n        ];\n    }\n\n    /**\n     * @returns {Array<string>}\n     */\n    availableResponsiveBanners()\n    {\n        return [\n            '970x90',\n            '320x50',\n            '160x600',\n            '336x280',\n            '728x90',\n            '300x600',\n            '468x60',\n            '970x250',\n            '300x250',\n            '250x250',\n            '120x600'\n        ];\n    }\n\n    /**\n     * @param {string} size\n     * @returns {boolean}\n     */\n    validBannerSize(size)\n    {\n        return -1 !== this.availableBanners().indexOf(size);\n    }\n\n    /**\n     * @param {string} size\n     * @returns {boolean}\n     */\n    validResponsiveBannerSize(size)\n    {\n        return -1 !== this.availableResponsiveBanners().indexOf(size);\n    }\n\n    /**\n     * @param {Object} activeAd\n     * @returns {Promise<boolean>}\n     */\n    async activateAdBanner(activeAd)\n    {\n        if(!activeAd){\n            Logger.info('Missing activate ad.', activeAd);\n            return false;\n        }\n        if(!this.validator.validate(this)){\n            Logger.info('Invalid banner.');\n            return false;\n        }\n        let bannerData = activeAd.bannerData;\n        if(!bannerData){\n            Logger.info('No banner data.');\n            return false;\n        }\n        let isFullTimeBanner = sc.get(bannerData, 'fullTime', false);\n        let isResponsive = sc.get(bannerData, 'responsive', false);\n        if(isFullTimeBanner){\n            return await this.handleBannerType(isResponsive, activeAd);\n        }\n        let uiReferenceIds = sc.get(bannerData, 'uiReferenceIds', []);\n        if(0 === uiReferenceIds.length){\n            Logger.warning('Missing banner reference ID.');\n            return false;\n        }\n        this.events.on('reldens.openUI', async (event) => {\n            if(-1 !== uiReferenceIds.indexOf('ANY') || -1 !== uiReferenceIds.indexOf(event.openButton.id)){\n                let bannerLocalStorageKey = activeAd.id+'-'+event.openButton.id;\n                let createdAt = (new Date()).getTime();\n                let activeBanner = sc.get(this.activeBanners, bannerLocalStorageKey, false);\n                if(activeBanner && createdAt < ( // create time is bigger than the previous created banner + 60s?\n                    activeBanner.createdAt + this.metaData.sdkBannerRefreshTime\n                )){\n                    activeBanner.banner.classList.remove('hidden');\n                    return;\n                }\n                if(activeBanner){\n                    activeBanner.banner.remove();\n                }\n                let banner = await this.handleBannerType(isResponsive, activeAd, bannerLocalStorageKey);\n                this.activeBanners[bannerLocalStorageKey] = {createdAt, banner};\n            }\n        });\n        this.events.on('reldens.closeUI', async (event) => {\n            let bannerLocalStorageKey = activeAd.id+'-'+event.openButton.id;\n            let activeBanner = sc.get(this.activeBanners, bannerLocalStorageKey, false);\n            if(activeBanner){\n                activeBanner.banner.classList.add('hidden');\n            }\n        });\n    }\n\n    /**\n     * @param {boolean} isResponsive\n     * @param {Object} activeAd\n     * @param {string} [bannerLocalStorageKey]\n     * @returns {Promise<Object|false>}\n     */\n    async handleBannerType(isResponsive, activeAd, bannerLocalStorageKey)\n    {\n        if(isResponsive){\n            return this.createResponsiveBanner(activeAd, bannerLocalStorageKey);\n        }\n        return await this.createBanner(activeAd, bannerLocalStorageKey);\n    }\n\n    /**\n     * @param {Object} activeAd\n     * @param {string} [bannerLocalStorageKey]\n     * @returns {Promise<Object|false>}\n     */\n    async createBanner(activeAd, bannerLocalStorageKey)\n    {\n        if(!this.validator.validate(this) || !await this.validator.canBeActivated(this)){\n            return false;\n        }\n        if(!this.isEnabled()){\n            Logger.info('SDK not enabled.');\n            return false;\n        }\n        try {\n            let width = sc.get(activeAd.styles, 'width', '300');\n            let height = sc.get(activeAd.styles, 'height', '250');\n            if(!this.validBannerSize(width+'x'+height)){\n                Logger.info('CrazyGames - Invalid Banner size.');\n                return false;\n            }\n            let containerId = bannerLocalStorageKey || activeAd.id;\n            if(!containerId){\n                Logger.info('CrazyGames - Missing container ID.', activeAd, bannerLocalStorageKey);\n                return false;\n            }\n            let div = this.gameDom.createElement('div', 'banner-container-'+containerId);\n            this.gameDom.getElement('body')?.append(div);\n            if(await this.isEnabled()){\n                await this.sdk.banner.requestBanner({\n                    id: div.id,\n                    width: width,\n                    height: height,\n                });\n            }\n            let styles = this.mapStylesWithValues(Object.assign({width, height}, activeAd));\n            this.gameDom.setElementStyles(div, styles);\n            div.classList.add('ads-banner-container');\n            return div;\n        } catch (error) {\n            Logger.critical('CrazyGames - Error on banner request.', error);\n            return false;\n        }\n    }\n\n    /**\n     * @param {Object} activeAd\n     * @returns {Object<string, string|number>}\n     */\n    mapStylesWithValues(activeAd)\n    {\n        let styles = {\n            'z-index': 200000000,\n            width: sc.get(activeAd, 'width', 300),\n            height: sc.get(activeAd, 'height', 250),\n            position: '' === sc.get(activeAd.styles, 'position', '') ? activeAd.position : 'absolute'\n        };\n        let top = sc.get(activeAd.styles, 'top', null);\n        if(null !== top){\n            styles.top = top;\n        }\n        let bottom = sc.get(activeAd.styles, 'bottom', null);\n        if(null !== bottom){\n            styles.bottom = bottom;\n        }\n        let left = sc.get(activeAd.styles, 'left', null);\n        if(null !== left){\n            styles.left = left;\n        }\n        let right = sc.get(activeAd.styles, 'right', null);\n        if(null !== right){\n            styles.right = right;\n        }\n        return styles;\n    }\n\n    /**\n     * @param {Object} activeAd\n     * @param {string} [bannerLocalStorageKey]\n     * @returns {Promise<Object|false>}\n     */\n    async createResponsiveBanner(activeAd, bannerLocalStorageKey)\n    {\n        if(!this.validator.validate(this) || !await this.validator.canBeActivated(this)){\n            return false;\n        }\n        if(!this.isEnabled()){\n            Logger.info('SDK not enabled.');\n            return false;\n        }\n        /* @NOTE: according to CrazyGames SDK this should be null and provided on the SDK response.\n        let width = sc.get(activeAd, 'width', '300');\n        let height = sc.get(activeAd, 'height', '250');\n        if(!this.validResponsiveBannerSize(width+'x'+height)){\n            Logger.info('CrazyGames - Invalid Responsive Banner size.');\n            return false;\n        }\n        */\n        try {\n            let containerId = bannerLocalStorageKey || activeAd.id;\n            if(!containerId){\n                Logger.info('CrazyGames - Missing container ID.', activeAd, bannerLocalStorageKey);\n                return false;\n            }\n            let div = this.gameDom.createElement('div', 'responsive-banner-container-'+containerId);\n            let styles = this.mapStylesWithValues(activeAd);\n            delete styles['width'];\n            delete styles['height'];\n            this.gameDom.setElementStyles(div, styles);\n            this.gameDom.getElement('body').append(div);\n            if(await this.isEnabled()){\n                await this.sdk.banner.requestResponsiveBanner(div.id);\n            }\n            div.classList.add('ads-banner-container');\n            return div;\n        } catch (error) {\n            Logger.critical('CrazyGames - Error on banner request.', error);\n            return false;\n        }\n    }\n\n}\n\nmodule.exports.BannersHandler = BannersHandler;\n"
  },
  {
    "path": "lib/ads/client/providers/crazy-games/validator.js",
    "content": "/**\n *\n * Reldens - Validator\n *\n * Validates the required properties for ad activation in the CrazyGames SDK.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\nclass Validator\n{\n\n    /**\n     * @param {Object} props\n     * @returns {boolean}\n     */\n    validate(props)\n    {\n        if(!props.gameManager){\n            Logger.error('Missing Game Manager on Validator.', props);\n            return false;\n        }\n        if(!props.sdk){\n            Logger.error('Missing SDK on Validator.', props);\n            return false;\n        }\n        if(!props.hasAdblock || !sc.isFunction(props.hasAdblock)){\n            Logger.warning('Missing or invalid hasAdblock function on Validator.', props);\n        }\n        if(!props.isEnabled || !sc.isFunction(props.isEnabled)){\n            Logger.error('Missing or invalid isEnabled function on Validator.', props);\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async canBeActivated(props)\n    {\n        if(!sc.isFunction(props.hasAdblock) || await props.hasAdblock()){\n            Logger.info('AdBlocker detected.');\n            return false;\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.Validator = Validator;\n"
  },
  {
    "path": "lib/ads/client/providers/crazy-games/videos-handler.js",
    "content": "/**\n *\n * Reldens - VideosHandler\n *\n * Manages video ad playback and rewards for the CrazyGames SDK.\n *\n */\n\nconst { Validator } = require('./validator');\nconst { AdsConst } = require('../../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('./validator').Validator} Validator\n *\n * @typedef {Object} VideosHandlerProps\n * @property {GameManager} [gameManager] - The game manager instance\n * @property {Object} [sdk] - The CrazyGames SDK instance\n * @property {Function} [hasAdblock] - Function to check for ad blocker\n * @property {Function} [isEnabled] - Function to check if SDK is enabled\n */\nclass VideosHandler\n{\n\n    /**\n     * @param {VideosHandlerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {GameManager|false} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        /** @type {Object} */\n        this.gameDom = this.gameManager?.gameDom;\n        /** @type {Object} */\n        this.events = this.gameManager?.events;\n        /** @type {Object|false} */\n        this.sdk = sc.get(props, 'sdk', false);\n        /** @type {Function|false} */\n        this.hasAdblock = sc.get(props, 'hasAdblock', false);\n        /** @type {Function|false} */\n        this.isEnabled = sc.get(props, 'isEnabled', false);\n        /** @type {Validator} */\n        this.validator = new Validator();\n        /** @type {boolean} */\n        this.isPlayingAd = false;\n        this.setConfig();\n    }\n\n    setConfig()\n    {\n        /** @type {number} */\n        this.videoMinimumDuration = !this.gameManager\n            ? AdsConst.VIDEOS_MINIMUM_DURATION\n            : this.gameManager.config.getWithoutLogs(\n                'client/ads/general/providers/crazyGames/videoMinimumDuration',\n                AdsConst.VIDEOS_MINIMUM_DURATION\n            );\n        /** @type {number} */\n        this.awaitAdsTime = !this.gameManager\n            ? AdsConst.AWAIT_ADS_TIME\n            : this.gameManager.config.getWithoutLogs(\n                'client/ads/general/providers/crazyGames/awaitAdsTime',\n                AdsConst.AWAIT_ADS_TIME\n            );\n    }\n\n    /**\n     * @param {Object} activeAd\n     * @returns {Promise<boolean>}\n     */\n    async activateAdVideo(activeAd)\n    {\n        let eventKey = sc.get(activeAd, 'eventKey', false);\n        if(!eventKey){\n            Logger.warning('Missing event key.', activeAd);\n            return false;\n        }\n        this.events.on(eventKey, async (event) => {\n            if(this.isPlayingAd){\n                Logger.info('CrazyGames - Another ad is been played.');\n                return false;\n            }\n            if(!this.validator.validate(this) || !await this.validator.canBeActivated(this)){\n                Logger.error('CrazyGames - Ad can not be activated.');\n                return false;\n            }\n            if(!this.isEnabled()){\n                Logger.info('CrazyGames - SDK not enabled.');\n                return false;\n            }\n            return await this.tryRePlay(activeAd);\n        });\n    }\n\n    /**\n     * @param {Object} activeAd\n     * @returns {Promise<boolean>}\n     */\n    async tryRePlay(activeAd)\n    {\n        let adsPlugin = this.gameManager.getFeature('ads');\n        if(null === adsPlugin.playedAds){\n            setTimeout(\n                () => {\n                    this.tryRePlay(activeAd);\n                },\n                this.awaitAdsTime\n            );\n            return false;\n        }\n        let playedAd = sc.get(adsPlugin?.playedAds, activeAd.id, false);\n        if(playedAd && !activeAd.replay){\n            Logger.info('Ad already played', activeAd);\n            return false;\n        }\n        let adStarted = sc.get(activeAd, 'adStartedCallback', () => {\n            this.isPlayingAd = true;\n            Logger.info('CrazyGames - Ad-started callback.', (new Date()).getTime());\n            this.send({act: AdsConst.ACTIONS.AD_STARTED, ads_id: activeAd.id});\n        });\n        let adFinished = sc.get(activeAd, 'adFinishedCallback', async () => {\n            this.isPlayingAd = false;\n            Logger.info('CrazyGames - Ad-finished callback.', (new Date()).getTime());\n            this.send({act: AdsConst.ACTIONS.AD_ENDED, ads_id: activeAd.id});\n            await this.gameManager.audioManager.changeMuteState(false, false);\n        });\n        let adError = sc.get(activeAd, 'adErrorCallback', async (error) => {\n            this.isPlayingAd = false;\n            Logger.info('CrazyGames - Ad-error callback.', error, (new Date()).getTime());\n            this.send({act: AdsConst.ACTIONS.AD_ENDED, ads_id: activeAd.id, error});\n            await this.gameManager.audioManager.changeMuteState(false, false);\n        });\n        let rewardItemKey = sc.get(activeAd, 'rewardItemKey', false);\n        let adType = rewardItemKey ? 'rewarded' : 'midgame';\n        await this.gameManager.audioManager.changeMuteState(true, true);\n        await this.sdk.ad.requestAd(adType, {adStarted, adFinished, adError});\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {boolean}\n     */\n    send(props)\n    {\n        let roomEvents = this.gameManager?.activeRoomEvents;\n        if(!roomEvents){\n            Logger.warning('CrazyGames - RoomEvents undefined to send an Ad Video message.');\n            return false;\n        }\n        return roomEvents?.send(props);\n    }\n\n}\n\nmodule.exports.VideosHandler = VideosHandler;\n"
  },
  {
    "path": "lib/ads/client/providers/crazy-games.js",
    "content": "/**\n *\n * Reldens - CrazyGames\n *\n * SDK documentation: https://docs.crazygames.com/sdk/html5-v2/#request-banner\n *\n * Integrates the CrazyGames advertising SDK for banner and video ads.\n *\n */\n\nconst { BannersHandler } = require('./crazy-games/banners-handler');\nconst { VideosHandler } = require('./crazy-games/videos-handler');\nconst { AdsProvider } = require('../ads-provider');\nconst { AdsConst } = require('../../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('./crazy-games/banners-handler').BannersHandler} BannersHandler\n * @typedef {import('./crazy-games/videos-handler').VideosHandler} VideosHandler\n */\nclass CrazyGames\n{\n\n    /**\n     * @param {Object} providerModel\n     * @param {GameManager} gameManager\n     */\n    constructor(providerModel, gameManager)\n    {\n        /** @type {GameManager} */\n        this.gameManager = gameManager;\n        /** @type {Object} */\n        this.gameDom = gameManager?.gameDom;\n        /** @type {Object} */\n        this.events = gameManager?.events;\n        /** @type {Window} */\n        this.window = gameManager?.gameDom?.getWindow();\n        /** @type {Object} */\n        this.metaData = providerModel;\n        /** @type {Object} */\n        this.sdk = this.window?.CrazyGames?.SDK;\n        /** @type {number} */\n        this.retry = 0;\n        /** @type {string} */\n        this.environment = AdsConst.ENVIRONMENTS.DISABLED;\n        if(!this.metaData.sdkRetryTime){\n            this.metaData.sdkRetryTime = 500;\n        }\n        if(!this.metaData.sdkMaxRetries){\n            this.metaData.sdkMaxRetries = 10;\n        }\n        if(!this.metaData.sdkBannerRefreshTime){\n            this.metaData.sdkBannerRefreshTime = 60000;\n        }\n        /** @type {Object<string, Object>} */\n        this.activeAds = this.fetchActiveAds(providerModel);\n        let handlersProps = {\n            gameManager,\n            metaData: providerModel,\n            sdk: this.sdk,\n            hasAdblock: this.hasAdblock,\n            isEnabled: this.isEnabled\n        };\n        /** @type {BannersHandler} */\n        this.bannersHandler = new BannersHandler(handlersProps);\n        /** @type {VideosHandler} */\n        this.videosHandler = new VideosHandler(handlersProps);\n    }\n\n    /**\n     * @param {Object} providerModel\n     * @returns {Object<string, Object>}\n     */\n    fetchActiveAds(providerModel)\n    {\n        if(!this.gameManager?.config){\n            return {};\n        }\n        return AdsProvider.fetchActiveAdsByProviderId(\n            providerModel.id,\n            this.validAdsTypes(),\n            this.gameManager.config.get('client/ads/collection', {})\n        );\n    }\n\n    /**\n     * @returns {Array<string>}\n     */\n    validAdsTypes()\n    {\n        return [AdsConst.ADS_TYPES.BANNER, AdsConst.ADS_TYPES.EVENT_VIDEO];\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async activate()\n    {\n        if(!this.sdk){\n            if(this.retry === this.metaData.sdkMaxRetries){\n                Logger.critical('CrazyGames required object.');\n                return false;\n            }\n            if(this.retry < this.metaData.sdkMaxRetries){\n                setTimeout(() => {\n                    this.retry++;\n                    Logger.info('CrazyGames required object, retry #'+this.retry+'.');\n                    this.sdk = this.window?.CrazyGames?.SDK;\n                    if(this.sdk){\n                        Logger.info('CrazyGames object found.');\n                    }\n                    this.activate();\n                }, this.metaData.sdkRetryTime);\n            }\n            return false;\n        }\n        this.environment = await this.sdk.getEnvironment();\n        this.bannersHandler.sdk = this.sdk;\n        this.videosHandler.sdk = this.sdk;\n        if(await this.hasAdblock()){\n            return false;\n        }\n        await this.activateAds();\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async hasAdblock()\n    {\n        try {\n            let result = await this.sdk.ad.hasAdblock();\n            if(result){\n                Logger.critical('Adblock detected, please disable.');\n            }\n            return result;\n        } catch (error) {\n            Logger.info('SDK detected error.', error);\n        }\n        return false;\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async isEnabled()\n    {\n        return AdsConst.ENVIRONMENTS.DISABLED !== await this.sdk.getEnvironment();\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async activateAds()\n    {\n        let activeKeys = Object.keys(this.activeAds);\n        if(0 === activeKeys.length){\n            return false;\n        }\n        for(let i of activeKeys){\n            let activeAd = this.activeAds[i];\n            if(AdsConst.ADS_TYPES.BANNER === activeAd.type.key){\n                await this.bannersHandler.activateAdBanner(activeAd);\n            }\n            if(AdsConst.ADS_TYPES.EVENT_VIDEO === activeAd.type.key){\n                await this.videosHandler.activateAdVideo(activeAd);\n            }\n        }\n    }\n\n}\n\nmodule.exports.CrazyGames = CrazyGames;\n"
  },
  {
    "path": "lib/ads/client/providers/game-monetize.js",
    "content": "/**\n *\n * Reldens - GameMonetize\n *\n * SDK documentation: https://github.com/MonetizeGame/GameMonetize.com-SDK\n *\n * Integrates the GameMonetize advertising SDK for video ads with reward functionality.\n *\n */\n\nconst { AdsProvider } = require('../ads-provider');\nconst { AdsConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass GameMonetize\n{\n\n    /**\n     * @param {Object} providerModel\n     * @param {GameManager} gameManager\n     */\n    constructor(providerModel, gameManager)\n    {\n        /** @type {GameManager} */\n        this.gameManager = gameManager;\n        /** @type {Object} */\n        this.gameDom = gameManager?.gameDom;\n        /** @type {Object} */\n        this.events = gameManager?.events;\n        /** @type {Window} */\n        this.window = gameManager?.gameDom?.getWindow();\n        /** @type {Object} */\n        this.metaData = providerModel;\n        this.setSdkOptions();\n        /** @type {Object} */\n        this.sdk = this.window?.sdk;\n        /** @type {number} */\n        this.retry = 0;\n        /** @type {boolean} */\n        this.isPlayingAd = false;\n        /** @type {string} */\n        this.environment = AdsConst.ENVIRONMENTS.DISABLED;\n        if(!this.metaData.sdkRetryTime){\n            this.metaData.sdkRetryTime = 500;\n        }\n        if(!this.metaData.sdkMaxRetries){\n            this.metaData.sdkMaxRetries = 10;\n        }\n        /** @type {Object<string, Object>} */\n        this.activeAds = this.fetchActiveAds(providerModel);\n        /** @type {Object|false} */\n        this.activeAdBeenPlayed = false;\n        this.setConfig();\n    }\n\n    /**\n     * @param {Object} providerModel\n     * @returns {Object<string, Object>}\n     */\n    fetchActiveAds(providerModel)\n    {\n        if(!this.gameManager?.config){\n            return {};\n        }\n        return AdsProvider.fetchActiveAdsByProviderId(\n            providerModel.id,\n            this.validAdsTypes(),\n            this.gameManager.config.get('client/ads/collection', {})\n        );\n    }\n\n    /**\n     * @returns {Object<string, string>}\n     */\n    eventKeys()\n    {\n        return {\n            sdkAdStarted: 'CONTENT_PAUSE_REQUESTED',\n            sdkAdEnded: 'SDK_GAME_START',\n            sdkReady: 'SDK_READY',\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setSdkOptions()\n    {\n        if(!this.gameDom){\n            return false;\n        }\n        if(!this.metaData.gameId){\n            Logger.error('GameMonetize - Game ID undefined.');\n            return false;\n        }\n        this.gameDom.getWindow().SDK_OPTIONS = {\n            gameId: this.metaData.gameId,\n            onEvent: async (event) => {\n                Logger.info('GameMonetize - SDK event fired: '+event.name);\n                switch (event.name) {\n                    case this.eventKeys().sdkAdStarted:\n                        // pause game logic / mute audio:\n                        await this.adStartedCallback(event);\n                        break;\n                    case this.eventKeys().sdkAdEnded:\n                        // advertisement done, resume game logic and unmute audio:\n                        await this.adEndedCallback(event);\n                        break;\n                    case this.eventKeys().sdkReady:\n                        // when sdk is ready:\n                        await this.sdkReadyCallback(event);\n                        break;\n                }\n            }\n        };\n    }\n\n    setConfig()\n    {\n        this.videoMinimumDuration = !this.gameManager\n            ? AdsConst.VIDEOS_MINIMUM_DURATION\n            : this.gameManager.config.getWithoutLogs(\n                'client/ads/general/providers/gameMonetize/videoMinimumDuration',\n                AdsConst.VIDEOS_MINIMUM_DURATION\n            );\n        this.awaitAdsTime = !this.gameManager\n            ? AdsConst.AWAIT_ADS_TIME\n            : this.gameManager.config.getWithoutLogs(\n                'client/ads/general/providers/gameMonetize/awaitAdsTime',\n                AdsConst.AWAIT_ADS_TIME\n            );\n    }\n\n    /**\n     * @returns {Array<string>}\n     */\n    validAdsTypes()\n    {\n        return [AdsConst.ADS_TYPES.EVENT_VIDEO];\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<boolean>}\n     */\n    async adStartedCallback(event)\n    {\n        this.isPlayingAd = true;\n        await this.gameManager.audioManager.changeMuteState(true, true); // mute and lock audio\n        if(!this.activeAdBeenPlayed){\n            Logger.info('AdStartedCallback undefined activeAd.', event, this.activeAdBeenPlayed);\n            return false;\n        }\n        Logger.info('GameMonetize - Ad-started callback.', (new Date()).getTime());\n        this.send({act: AdsConst.ACTIONS.AD_STARTED, ads_id: this.activeAdBeenPlayed.id});\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<boolean>}\n     */\n    async adEndedCallback(event)\n    {\n        this.isPlayingAd = false;\n        await this.gameManager.audioManager.changeMuteState(false, false);\n        if(!this.activeAdBeenPlayed){\n            Logger.info('AdEndedCallback undefined activeAd.', event, this.activeAdBeenPlayed);\n            return false;\n        }\n        Logger.info('GameMonetize - Ad-finished callback.', (new Date()).getTime());\n        this.send({act: AdsConst.ACTIONS.AD_ENDED, ads_id: this.activeAdBeenPlayed.id});\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<void>}\n     */\n    async sdkReadyCallback(event)\n    {\n        this.sdk = this.window.sdk;\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async activate()\n    {\n        if(!this.sdk){\n            if(this.retry === this.metaData.sdkMaxRetries){\n                Logger.critical('GameMonetize required object.');\n                return false;\n            }\n            if(this.retry < this.metaData.sdkMaxRetries){\n                setTimeout(() => {\n                    this.retry++;\n                    Logger.info('GameMonetize required object, retry #'+this.retry+'.');\n                    this.sdk = this.window?.sdk;\n                    if(this.sdk){\n                        Logger.info('GameMonetize object found.');\n                    }\n                    this.activate();\n                }, this.metaData.sdkRetryTime);\n            }\n            return false;\n        }\n        await this.activateAds();\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async activateAds()\n    {\n        let activeKeys = Object.keys(this.activeAds);\n        if(0 === activeKeys.length){\n            Logger.info('None active ads.');\n            return false;\n        }\n        for(let i of activeKeys){\n            let activeAd = this.activeAds[i];\n            if(AdsConst.ADS_TYPES.EVENT_VIDEO !== activeAd.type.key){\n                continue;\n            }\n            let eventKey = sc.get(activeAd, 'eventKey', false);\n            if(!eventKey){\n                Logger.warning('Missing event key.', activeAd);\n                return false;\n            }\n            this.events.on(eventKey, async (event) => {\n                Logger.info('GameMonetize - Video event fired, playing ad.', event, activeAd);\n                if(this.isPlayingAd){\n                    Logger.info('GameMonetize - Ad is been played.');\n                    return false;\n                }\n                return await this.tryRePlay(activeAd);\n            });\n        }\n    }\n\n    /**\n     * @param {Object} activeAd\n     * @returns {Promise<boolean>}\n     */\n    async tryRePlay(activeAd)\n    {\n        let adsPlugin = this.gameManager.getFeature('ads');\n        if(null === adsPlugin.playedAds){\n            setTimeout(\n                () => {\n                    this.tryRePlay(activeAd);\n                },\n                this.awaitAdsTime\n            );\n            return false;\n        }\n        this.activeAdBeenPlayed = activeAd;\n        if(!sc.isObjectFunction(this.sdk, 'showBanner')){\n            Logger.critical('GameMonetize SDK not ready.');\n            return false;\n        }\n        await this.sdk.showBanner();\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {boolean}\n     */\n    send(props)\n    {\n        let roomEvents = this.gameManager?.activeRoomEvents;\n        if(!roomEvents){\n            Logger.warning('GameMonetize - RoomEvents undefined to send an Ad Video message.');\n            return false;\n        }\n        return roomEvents.send(props);\n    }\n\n}\n\nmodule.exports.GameMonetize = GameMonetize;\n"
  },
  {
    "path": "lib/ads/client/providers/google-ad-sense.js",
    "content": "/**\n *\n * Reldens - GoogleAdSense\n *\n * Documentation: https://support.google.com/adsense/answer/9183549?sjid=16298855257735669764-EU\n *\n * Placeholder for Google AdSense integration.\n *\n */\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass GoogleAdSense\n{\n\n    /**\n     * @param {Object} providerModel\n     * @param {GameManager} gameManager\n     */\n    constructor(providerModel, gameManager)\n    {\n        /** @type {GameManager} */\n        this.gameManager = gameManager;\n        /** @type {Object} */\n        this.gameDom = gameManager?.gameDom;\n        /** @type {Object} */\n        this.events = gameManager?.events;\n        /** @type {Window} */\n        this.window = gameManager?.gameDom?.getWindow();\n        /** @type {Object} */\n        this.metaData = providerModel;\n    }\n\n}\n\nmodule.exports.GoogleAdSense = GoogleAdSense;\n"
  },
  {
    "path": "lib/ads/client/providers-list.js",
    "content": "/**\n *\n * Reldens - ProvidersList\n *\n */\n\nconst { CrazyGames } = require('./providers/crazy-games');\nconst { GameMonetize } = require('./providers/game-monetize');\nconst { GoogleAdSense } = require('./providers/google-ad-sense');\n\nmodule.exports.ProvidersList = {\n    crazyGames: CrazyGames,\n    gameMonetize: GameMonetize,\n    googleAdSense: GoogleAdSense\n};\n"
  },
  {
    "path": "lib/ads/client/sdk-handler.js",
    "content": "/**\n *\n * Reldens - SdkHandler\n *\n * Handles the initialization and setup of third-party advertising SDKs.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n *\n * @typedef {Object} SdkHandlerProps\n * @property {Object} [gameDom] - The game DOM wrapper instance\n * @property {Object} [config] - Configuration object for the SDK\n */\nclass SdkHandler\n{\n\n    /**\n     * @param {SdkHandlerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Object|false} */\n        this.gameDom = sc.get(props, 'gameDom', false);\n    }\n\n    /**\n     * @param {Object<string, Object>} providers\n     * @param {GameManager} gameManager\n     * @returns {Promise<boolean>}\n     */\n    async setupProvidersSdk(providers, gameManager)\n    {\n        if(!this.gameDom){\n            Logger.error('Undefined GameDOM on SdkHandler.');\n            return false;\n        }\n        if(!sc.isObject(providers)){\n            //Logger.debug('Providers not available.');\n            return false;\n        }\n        let keys = Object.keys(providers);\n        if(0 === keys.length){\n            //Logger.debug('Providers not found.');\n            return false;\n        }\n        for(let i of keys){\n            let provider = providers[i];\n            await this.appendSdk(provider);\n            await this.activateSdkInstance(provider, gameManager);\n            Logger.info('Activated Ads SDK: '+provider.key, provider);\n        }\n    }\n\n    /**\n     * @param {Object} provider\n     * @returns {Promise<boolean>}\n     */\n    async appendSdk(provider)\n    {\n        let sdkUrl = sc.get(provider, 'sdkUrl', '');\n        if('' === sdkUrl){\n            //Logger.debug('Provider does not have an SDK URL.', provider);\n            return false;\n        }\n        let body = this.gameDom.getElement('body');\n        let sdkSource = this.gameDom.createElement('script');\n        sdkSource.src = sdkUrl;\n        body.append(sdkSource);\n        return true;\n    }\n\n    /**\n     * @param {Object} provider\n     * @param {GameManager} gameManager\n     * @returns {Promise<void>}\n     */\n    async activateSdkInstance(provider, gameManager)\n    {\n        if(provider.classDefinition){\n            provider.service = new provider.classDefinition(provider, gameManager, provider.activeAds);\n        }\n        if(sc.isFunction(provider.service?.activate)){\n            await provider.service.activate();\n        }\n    }\n\n}\n\nmodule.exports.SdkHandler = SdkHandler;\n"
  },
  {
    "path": "lib/ads/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    ads: {}\n}\n"
  },
  {
    "path": "lib/ads/constants.js",
    "content": "/**\n *\n * Reldens - AdsConst\n *\n */\n\nmodule.exports.AdsConst = {\n    ENVIRONMENTS: {\n        DISABLED: 'disabled'\n    },\n    ADS_TYPES: {\n        EVENT_VIDEO: 'eventVideo',\n        BANNER: 'banner'\n    },\n    ACTIONS: {\n        ADS_PLAYED: 'adsP',\n        AD_STARTED: 'adS',\n        AD_ENDED: 'adE',\n    },\n    MESSAGE: {\n        DATA_VALUES: {\n            NAMESPACE: 'ads'\n        }\n    },\n    AWAIT_ADS_TIME: 1000,\n    VIDEOS_MINIMUM_DURATION: 3000\n};\n"
  },
  {
    "path": "lib/ads/server/ads-start-handler.js",
    "content": "/**\n *\n * Reldens - AdsStartHandler\n *\n * Initializes and loads ad configuration data from the database for client and server use.\n *\n */\n\nconst { BaseAd } = require('./ads-type/base-ad');\nconst { Banner } = require('./ads-type/banner');\nconst { EventVideo } = require('./ads-type/event-video');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n *\n * @typedef {Object} AdsStartHandlerProps\n * @property {EventsManager} [events] - The events manager instance\n * @property {BaseDataServer} [dataServer] - The data server instance\n * @property {Object} [configProcessor] - The configuration processor instance\n */\n\nclass AdsStartHandler\n{\n\n    /**\n     * @param {AdsStartHandlerProps} props\n     * @returns {Promise<void>}\n     */\n    async initialize(props)\n    {\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in AdsStartHandler.');\n        }\n        /** @type {BaseDataServer|false} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in AdsStartHandler.');\n        }\n        /** @type {Object|false} */\n        this.configProcessor = sc.get(props, 'configProcessor', false);\n        if(!this.configProcessor){\n            Logger.error('configProcessor undefined in AdsStartHandler.');\n        }\n        await this.loadData();\n        await this.enrichAds();\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async loadData()\n    {\n        sc.deepMergeProperties(this.configProcessor, {\n            configList: {\n                client: {\n                    ads: {\n                        general: {\n                            types: await this.mapTypes(),\n                            providers: await this.mapProviders(),\n                        },\n                        collection: {}\n                    }\n                },\n                server: {\n                    ads: {\n                        modelsCollection: await this.dataServer.getEntity('ads').loadAllWithRelations([\n                            'related_ads_providers',\n                            'related_ads_types',\n                            'related_ads_event_video',\n                            'related_ads_banner'\n                        ]) || [],\n                        collection: {}\n                    }\n                }\n            }\n        });\n    }\n\n    /**\n     * @returns {Promise<Object<string, Object>>}\n     */\n    async mapProviders()\n    {\n        let providersModels = await this.dataServer.getEntity('adsProviders').loadAll() || [];\n        if(!providersModels || 0 === providersModels.length){\n            return {};\n        }\n        let providers = {};\n        for(let provider of providersModels){\n            providers[provider.key] = provider;\n        }\n        return providers;\n    }\n\n    /**\n     * @returns {Promise<Object<string, Object>>}\n     */\n    async mapTypes()\n    {\n        let typesModels = await this.dataServer.getEntity('adsTypes').loadAll() || [];\n        if(!typesModels || 0 === typesModels.length){\n            return {};\n        }\n        let adTypes = {};\n        for(let adType of typesModels){\n            adTypes[adType.key] = adType;\n        }\n        return adTypes;\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async enrichAds()\n    {\n        for(let ad of this.configProcessor.configList.server.ads.modelsCollection){\n            let adInstance = this.instanceByType(ad);\n            this.configProcessor.configList.server.ads.collection[ad.id] = adInstance;\n            this.configProcessor.configList.client.ads.collection[ad.id] = adInstance.clientData();\n        }\n    }\n\n    /**\n     * @param {Object} ad\n     * @returns {BaseAd|Banner|EventVideo}\n     */\n    instanceByType(ad)\n    {\n        if(ad.related_ads_event_video){\n            return EventVideo.fromModel(ad);\n        }\n        if(ad.related_ads_banner){\n            return Banner.fromModel(ad);\n        }\n        return BaseAd.fromModel(ad);\n    }\n\n}\n\nmodule.exports.AdsStartHandler = AdsStartHandler;\n"
  },
  {
    "path": "lib/ads/server/ads-type/banner.js",
    "content": "/**\n *\n * Reldens - Banner\n *\n * Banner ad type with full-time and UI-triggered display modes.\n *\n * - FullTimeBanner:\n * This banner will be displayed from the login page.\n * If it is closed, the game will reload the page.\n * It will be re-generated every X time.\n *\n * - OpenUiBanner:\n * This banner will be displayed every time the specified UI (all or a single one) is opened and automatically closed\n * when the UI is closed.\n *\n */\n\nconst { BaseAd } = require('./base-ad');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass Banner extends BaseAd\n{\n\n    /**\n     * @param {Object} adsModel\n     * @returns {Banner}\n     */\n    static fromModel(adsModel)\n    {\n        return new this(adsModel);\n    }\n\n    /**\n     * @param {Object} adsModel\n     */\n    constructor(adsModel)\n    {\n        super(adsModel);\n        return this.setBannerDataFromModel(adsModel);\n    }\n\n    /**\n     * @param {Object} adsModel\n     * @returns {boolean}\n     */\n    setBannerDataFromModel(adsModel)\n    {\n        let adsBanner = sc.get(adsModel, 'related_ads_banner');\n        if(!adsBanner){\n            Logger.warning('Parent banner not provided on AdsModel for Banner.', adsModel);\n            return false;\n        }\n        this.bannerData = sc.parseJson(adsBanner.banner_data);\n        // @TODO - BETA - Add item rewards on banner click X times validated on server side.\n    }\n\n    /**\n     * @returns {Object}\n     */\n    clientData()\n    {\n        let data = super.clientData();\n        data.bannerData = this.bannerData;\n        return data;\n    }\n\n}\n\nmodule.exports.Banner = Banner;\n"
  },
  {
    "path": "lib/ads/server/ads-type/base-ad.js",
    "content": "/**\n *\n * Reldens - BaseAd\n *\n * Base class for all ad types containing common properties and client data generation.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\nclass BaseAd\n{\n\n    /**\n     * @param {Object} adsModel\n     * @returns {BaseAd}\n     */\n    static fromModel(adsModel)\n    {\n        return new this(adsModel);\n    }\n\n    /**\n     * @param {Object} adsModel\n     */\n    constructor(adsModel)\n    {\n        this.setData(adsModel);\n    }\n\n    /**\n     * @param {Object} adsModel\n     * @returns {boolean}\n     */\n    setData(adsModel)\n    {\n        if(!adsModel){\n            Logger.warning('AdsModel not provided on BaseAd.');\n            return false;\n        }\n        Object.assign(this, {\n            id: adsModel.id,\n            key: adsModel.key,\n            providerId: adsModel.provider_id,\n            typeId: adsModel.type_id,\n            width: adsModel.width,\n            height: adsModel.height,\n            position: adsModel.position,\n            top: adsModel.top,\n            bottom: adsModel.bottom,\n            left: adsModel.left,\n            right: adsModel.right,\n            enabled: adsModel.enabled,\n            replay: Boolean(adsModel.replay),\n            provider: adsModel?.related_ads_providers || null,\n            type: adsModel?.related_ads_types || null\n        });\n    }\n\n    /**\n     * @returns {Object}\n     */\n    clientData()\n    {\n        return {\n            id: this.id,\n            key: this.key,\n            type: {\n                id: this.typeId,\n                key: this.type?.key\n            },\n            provider: {\n                id: this.providerId,\n                key: this.provider?.key\n            },\n            styles: {\n                width: this.width,\n                height: this.height,\n                position: this.position,\n                top: this.top,\n                bottom: this.bottom,\n                left: this.left,\n                right: this.right,\n            },\n            enabled: this.enabled,\n            replay: this.replay\n        };\n    }\n\n}\n\nmodule.exports.BaseAd = BaseAd;\n"
  },
  {
    "path": "lib/ads/server/ads-type/event-video.js",
    "content": "/**\n *\n * Reldens - EventVideo\n *\n * Video ad type triggered by game events with an optional reward system.\n *\n * This video will be visible every time the specified \"reldens\" event is fired (experimental).\n *\n * - ItemVideoReward:\n * This video will be visible as per request when a specific item is available on an NPC.\n * After seeing the ad, you will get the specified item as a reward.\n *\n * - SceneChangeVideo:\n * This video will be visible every time you enter on the specified scene.\n *\n */\n\nconst { BaseAd } = require('./base-ad');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass EventVideo extends BaseAd\n{\n\n    /**\n     * @param {Object} adsModel\n     * @returns {EventVideo}\n     */\n    static fromModel(adsModel)\n    {\n        return new this(adsModel);\n    }\n\n    /**\n     * @param {Object} adsModel\n     */\n    constructor(adsModel)\n    {\n        super(adsModel);\n        return this.setVideoDataFromModel(adsModel);\n    }\n\n    /**\n     * @param {Object} adsModel\n     * @returns {boolean}\n     */\n    setVideoDataFromModel(adsModel)\n    {\n        let adsVideo = sc.get(adsModel, 'related_ads_event_video');\n        if(!adsVideo){\n            Logger.warning('Parent video not provided on AdsModel for EventVideo.', adsModel);\n            return false;\n        }\n        this.eventKey = adsVideo.event_key;\n        this.eventData = sc.parseJson(adsVideo.event_data);\n        this.rewardItemKey = sc.get(this.eventData, 'rewardItemKey');\n        this.rewardItemQty = sc.get(this.eventData, 'rewardItemQty');\n    }\n\n    /**\n     * @returns {Object}\n     */\n    clientData()\n    {\n        let data = super.clientData();\n        data.eventKey = this.eventKey;\n        return data;\n    }\n\n}\n\nmodule.exports.EventVideo = EventVideo;\n"
  },
  {
    "path": "lib/ads/server/entities/ads-entity-override.js",
    "content": "/**\n *\n * Reldens - AdsEntityOverride\n *\n * Customizes the ads entity properties for the admin panel display.\n *\n */\n\nconst { AdsEntity } = require('../../../../generated-entities/entities/ads-entity');\nconst { sc } = require('@reldens/utils');\n\nclass AdsEntityOverride extends AdsEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties = sc.removeFromArray(config.listProperties, [\n            'top',\n            'bottom',\n            'left',\n            'right'\n        ]);\n        config.navigationPosition = 1200;\n        return config;\n    }\n\n}\n\nmodule.exports.AdsEntityOverride = AdsEntityOverride;\n"
  },
  {
    "path": "lib/ads/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { AdsEntityOverride} = require('./entities/ads-entity-override');\n\nmodule.exports.entitiesConfig = {\n    ads: AdsEntityOverride,\n};\n"
  },
  {
    "path": "lib/ads/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        ads: 'Ads',\n        ads_types: 'Types',\n        ads_providers: 'Providers',\n        ads_banner: 'Banners',\n        ads_event_video: 'Videos',\n        ads_played: 'Played'\n    }\n};\n"
  },
  {
    "path": "lib/ads/server/event-handlers/create-player-ads-handler.js",
    "content": "/**\n *\n * Reldens - CreatePlayerAdsHandler\n *\n * Handles player creation events to load and send played ads data to the client.\n *\n */\n\nconst { AdsConst } = require('../../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../plugin').AdsPlugin} AdsPlugin\n */\nclass CreatePlayerAdsHandler\n{\n\n    /**\n     * @param {AdsPlugin} adsPlugin\n     */\n    constructor(adsPlugin)\n    {\n        /** @type {Object} */\n        this.adsPlayedRepository = adsPlugin.dataServer.getEntity('adsPlayed');\n        /** @type {Object<number, Array<Object>>} */\n        this.adsByPlayerId = {};\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @param {Object} client\n     * @returns {Promise<boolean>}\n     */\n    async enrichPlayedWithPlayedAds(playerSchema, client)\n    {\n        if(!this.adsPlayedRepository){\n            Logger.error('Missing adsPlayedRepository in \"CreatePlayerAdsHandler\".');\n            return false;\n        }\n        if(!this.adsByPlayerId[playerSchema.player_id]){\n            this.adsByPlayerId[playerSchema.player_id] = await this.adsPlayedRepository.loadByWithRelations(\n                'player_id',\n                playerSchema.player_id,\n                ['related_players']\n            );\n        }\n        if(!this.adsByPlayerId[playerSchema.player_id] || 0 === this.adsByPlayerId[playerSchema.player_id].length){\n            return false;\n        }\n        playerSchema.setCustom('playedAds', this.adsByPlayerId[playerSchema.player_id]);\n        await client.send('*', {\n            act: AdsConst.ACTIONS.ADS_PLAYED,\n            playedAdsModels: this.adsByPlayerId[playerSchema.player_id]\n        });\n    }\n\n}\n\nmodule.exports.CreatePlayerAdsHandler = CreatePlayerAdsHandler;\n"
  },
  {
    "path": "lib/ads/server/message-actions.js",
    "content": "/**\n *\n * Reldens - AdsMessageActions\n *\n * Handles ad-related message actions including ad start/end events and reward distribution.\n *\n */\n\nconst { GiveRewardAction } = require('../../rewards/server/actions/give-reward-action');\nconst { AdsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('./plugin').AdsPlugin} AdsPlugin\n * @typedef {import('../../rewards/server/actions/give-reward-action').GiveRewardAction} GiveRewardAction\n *\n * @typedef {Object} AdsMessageActionsProps\n * @property {BaseDataServer} [dataServer] - The data server instance\n * @property {AdsPlugin} [adsPlugin] - The ads plugin instance\n */\n\nclass AdsMessageActions\n{\n\n    /**\n     * @param {AdsMessageActionsProps} props\n     */\n    constructor(props)\n    {\n        /** @type {BaseDataServer|false} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in AdsMessageActions.');\n        }\n        /** @type {AdsPlugin|false} */\n        this.adsPlugin = sc.get(props, 'adsPlugin', false);\n        if(!this.dataServer){\n            Logger.error('AdsPlugin undefined in AdsMessageActions.');\n        }\n        /** @type {GiveRewardAction} */\n        this.giveRewardAction = new GiveRewardAction();\n        this.setRepository();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setRepository()\n    {\n        if(!this.dataServer){\n            return false;\n        }\n        /** @type {Object} */\n        this.adsPlayedRepository = this.dataServer.getEntity('adsPlayed');\n    }\n\n    /**\n     * @param {number} playerId\n     * @param {number} adId\n     * @returns {Promise<Object|false>}\n     */\n    async loadPlayedAd(playerId, adId)\n    {\n        if(!this.adsPlayedRepository){\n            return false;\n        }\n        return await this.adsPlayedRepository.loadOne({player_id: playerId, ads_id: adId});\n    }\n\n    /**\n     * @param {number} playerId\n     * @param {number} adId\n     * @param {string|null} [startedAt]\n     * @param {string|null} [endedAt]\n     * @returns {Promise<Object|false>}\n     */\n    async upsertPlayedAd(playerId, adId, startedAt = null, endedAt = null)\n    {\n        let newAdData = {\n            player_id: playerId,\n            ads_id: adId\n        };\n        if(null !== startedAt){\n            newAdData['started_at'] = startedAt;\n        }\n        if(null !== endedAt){\n            newAdData['ended_at'] = endedAt;\n        }\n        try {\n            let playedAdModel = await this.loadPlayedAd(playerId, adId);\n            if(!playedAdModel){\n                return this.adsPlayedRepository.create(newAdData);\n            }\n            return this.adsPlayedRepository.updateById(playedAdModel.id, newAdData);\n        } catch (error) {\n            Logger.error(error.message);\n            return false;\n        }\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {Promise<Object|false>}\n     */\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        if(!this.dataServer || !this.adsPlugin){\n            return false;\n        }\n        await this.adStart(data, room, playerSchema);\n        await this.adEnded(data, room, playerSchema);\n        return {client, data, room, playerSchema};\n    }\n\n    /**\n     * @param {Object} data\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {Promise<Object|false>}\n     */\n    async adStart(data, room, playerSchema)\n    {\n        if(data.act !== AdsConst.ACTIONS.AD_STARTED){\n            return false;\n        }\n        room.deactivatePlayer(playerSchema, room, GameConst.STATUS.DISABLED);\n        let saveResult = await this.upsertPlayedAd(playerSchema.player_id, data.ads_id, sc.getCurrentDate(), null);\n        if(!saveResult){\n            Logger.critical('Ad started save error.', data, playerSchema.player_id);\n        }\n        return saveResult;\n    }\n\n    /**\n     * @param {Object} data\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async adEnded(data, room, playerSchema)\n    {\n        if(data.act !== AdsConst.ACTIONS.AD_ENDED){\n            return false;\n        }\n        room.activatePlayer(playerSchema, GameConst.STATUS.ACTIVE);\n        let saveResult = await this.upsertPlayedAd(playerSchema.player_id, data.ads_id, null, sc.getCurrentDate());\n        if(!saveResult){\n            Logger.critical('Ad ended save error.', data, playerSchema.player_id);\n        }\n        let playedAdModel = await this.loadPlayedAd(playerSchema.player_id, data.ads_id);\n        let playedAd = sc.get(room.config.get('server/ads/collection'), data.ads_id, false);\n        if(!playedAd.rewardItemKey){\n            Logger.info('Reward item not specified.');\n            return false;\n        }\n        let playedTime = (new Date(playedAdModel.ended_at)).getTime() - (new Date(playedAdModel.startedAt)).getTime();\n        let minimumDuration = room.config.getWithoutLogs(\n            'client/ads/general/providers/'+playedAd.provider.key+'/videoMinimumDuration',\n            AdsConst.VIDEOS_MINIMUM_DURATION\n        );\n        if(playedTime < minimumDuration){\n            Logger.info('Invalid reward duration.', playerSchema.player_id, playedAd.id);\n            setTimeout(async () => {\n                return await this.giveRewardItem(playerSchema, playedAd);\n            }, (minimumDuration -  playedTime));\n            return true;\n        }\n        return await this.giveRewardItem(playerSchema, playedAd);\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @param {Object} playedAd\n     * @returns {Promise<Object>}\n     */\n    async giveRewardItem(playerSchema, playedAd)\n    {\n        return this.giveRewardAction.execute(playerSchema, playedAd.rewardItemKey, playedAd.rewardItemQty);\n    }\n\n}\n\nmodule.exports.AdsMessageActions = AdsMessageActions;\n"
  },
  {
    "path": "lib/ads/server/plugin.js",
    "content": "/**\n *\n * Reldens - Ads Server Plugin\n *\n * Server-side ads plugin that manages ad configuration, player ad tracking, and reward distribution.\n *\n */\n\nconst { AdsStartHandler } = require('./ads-start-handler');\nconst { AdsMessageActions } = require('./message-actions');\nconst { CreatePlayerAdsHandler } = require('./event-handlers/create-player-ads-handler');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('./ads-start-handler').AdsStartHandler} AdsStartHandler\n * @typedef {import('./event-handlers/create-player-ads-handler').CreatePlayerAdsHandler} CreatePlayerAdsHandler\n *\n * @typedef {Object} AdsPluginProps\n * @property {EventsManager} [events] - The events manager instance\n * @property {BaseDataServer} [dataServer] - The data server instance\n */\nclass AdsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {AdsPluginProps} props\n     */\n    setup(props)\n    {\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in AdsPlugin.');\n        }\n        /** @type {BaseDataServer|false} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in AdsPlugin.');\n        }\n        /** @type {AdsStartHandler} */\n        this.adsStartHandler = new AdsStartHandler();\n        /** @type {CreatePlayerAdsHandler} */\n        this.createPlayerAdsHandler = new CreatePlayerAdsHandler(this);\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events || !this.dataServer){\n            return false;\n        }\n        this.events.on('reldens.serverConfigFeaturesReady', async (props) => {\n            await this.adsStartHandler.initialize({\n                events: this.events,\n                dataServer: this.dataServer,\n                configProcessor: props.configProcessor\n            });\n        });\n        this.events.on('reldens.roomsMessageActionsGlobal', (roomMessageActions) => {\n            roomMessageActions.ads = new AdsMessageActions({dataServer: this.dataServer, adsPlugin: this});\n        });\n        this.events.on('reldens.createPlayerAfter', async (client, userModel, playerSchema) => {\n            await this.createPlayerAdsHandler.enrichPlayedWithPlayedAds(playerSchema, client);\n        });\n    }\n}\n\nmodule.exports.AdsPlugin = AdsPlugin;\n"
  },
  {
    "path": "lib/audio/client/audio-ui.js",
    "content": "/**\n *\n * Reldens - AudioUi\n *\n * Manages the audio settings user interface in the game.\n *\n */\n\nconst { SceneAudioPlayer } = require('./scene-audio-player');\nconst { AudioUpdate } = require('./audio-update');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('phaser').Scene} PhaserScene\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('./manager').AudioManager} AudioManager\n * @typedef {import('./scene-audio-player').SceneAudioPlayer} SceneAudioPlayer\n */\nclass AudioUi\n{\n\n    /**\n     * @param {PhaserScene} uiScene\n     */\n    constructor(uiScene)\n    {\n        /** @type {PhaserScene} */\n        this.uiScene = uiScene;\n        /** @type {GameManager} */\n        this.gameManager = this.uiScene.gameManager;\n        /** @type {AudioManager} */\n        this.audioManager = this.gameManager.audioManager;\n        /** @type {SceneAudioPlayer} */\n        this.sceneAudioPlayer = SceneAudioPlayer;\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    createUi()\n    {\n        if(!this.audioManager.categories){\n            return;\n        }\n        let audioSettingsTemplate = this.uiScene.cache.html.get('audio');\n        let audioCategoryTemplate = this.uiScene.cache.html.get('audio-category');\n        let audioSettingsContent = this.prepareAudioSettingsContent(audioCategoryTemplate, audioSettingsTemplate);\n        this.gameManager.gameDom.appendToElement('#settings-dynamic', audioSettingsContent);\n        let audioSettingInputs = this.gameManager.gameDom.getElements('.audio-setting');\n        if(0 === audioSettingInputs.length){\n            return false;\n        }\n        for(let settingInput of audioSettingInputs){\n            settingInput.addEventListener('click', async (event) => {\n                await this.audioManager.setAudio(event.target.dataset.categoryKey, settingInput.checked);\n                this.gameManager.activeRoomEvents.send(new AudioUpdate(settingInput.value, settingInput.checked));\n                this.sceneAudioPlayer.playSceneAudio(this.audioManager, this.gameManager.getActiveScene());\n            });\n        }\n    }\n\n    /**\n     * @param {string} audioCategoryTemplate\n     * @param {string} audioSettingsTemplate\n     * @returns {string}\n     */\n    prepareAudioSettingsContent(audioCategoryTemplate, audioSettingsTemplate)\n    {\n        let categoriesRows = this.prepareCategoriesRows(audioCategoryTemplate);\n        return this.gameManager.gameEngine.parseTemplate(\n            audioSettingsTemplate,\n            {\n                audioCategories: categoriesRows,\n                settingsTitle: this.gameManager.services.translator.t('audio.settingsTitle')\n            }\n        );\n    }\n\n    /**\n     * @param {string} audioCategoryTemplate\n     * @returns {string}\n     */\n    prepareCategoriesRows(audioCategoryTemplate)\n    {\n        let categoriesRows = '';\n        let audioCategoriesKeys = Object.keys(this.audioManager.categories);\n        for(let i of audioCategoriesKeys){\n            let audioCategory = this.audioManager.categories[i];\n            let audioEnabled = sc.get(this.audioManager.playerConfig, audioCategory.id, audioCategory.enabled);\n            categoriesRows = categoriesRows + this.gameManager.gameEngine.parseTemplate(audioCategoryTemplate, {\n                categoryId: audioCategory.id,\n                categoryLabel: audioCategory.category_label,\n                categoryKey: audioCategory.category_key,\n                categoryChecked: audioEnabled ? ' checked=\"checked\"' : ''\n            });\n        }\n        return categoriesRows;\n    }\n\n}\n\nmodule.exports.AudioUi = AudioUi;\n"
  },
  {
    "path": "lib/audio/client/audio-update.js",
    "content": "/**\n *\n * Reldens - AudioUpdate\n *\n * Represents an audio update message to be sent to the server.\n *\n */\n\nconst { AudioConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\n\nclass AudioUpdate\n{\n\n    /**\n     * @param {string} updateType - The audio category key to update\n     * @param {boolean} updateValue - Whether the audio category should be enabled or disabled\n     */\n    constructor(updateType, updateValue)\n    {\n        this[GameConst.ACTION_KEY] = AudioConst.AUDIO_UPDATE;\n        this[AudioConst.MESSAGE.DATA.UPDATE_TYPE] = updateType;\n        this[AudioConst.MESSAGE.DATA.UPDATE_VALUE] = updateValue;\n    }\n\n}\n\nmodule.exports.AudioUpdate = AudioUpdate;\n"
  },
  {
    "path": "lib/audio/client/manager.js",
    "content": "/**\n *\n * Reldens - Audio Manager\n *\n * Manages audio playback, categories, and player audio configuration on the client.\n *\n */\n\nconst { AudioConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManagerSingleton} EventsManagerSingleton\n * @typedef {import('phaser').Scene} PhaserScene\n */\n\n/**\n * @typedef {Object} AudioManagerProps\n * @property {EventsManagerSingleton} [events]\n * @property {Object<string, Object>} [globalAudios]\n * @property {Object<string, Object>} [roomsAudios]\n * @property {Object<string, Object>} [categories]\n * @property {Object<string, number>} [playerConfig]\n * @property {Object} [currentPlayerData]\n */\nclass AudioManager\n{\n\n    /**\n     * @param {AudioManagerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManagerSingleton|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in AudioManager.');\n        }\n        /** @type {Object<string, Object>} */\n        this.globalAudios = sc.get(props, 'globalAudios', {});\n        /** @type {Object<string, Object>} */\n        this.roomsAudios = sc.get(props, 'roomsAudios', {});\n        /** @type {Object<string, Object>} */\n        this.categories = sc.get(props, 'categories', {});\n        /** @type {Object<string, number>} */\n        this.playerConfig = sc.get(props, 'playerConfig', {});\n        /** @type {Object} */\n        this.currentPlayerData = sc.get(props, 'currentPlayerData', {});\n        /** @type {Object<string, Object>} */\n        this.playing = {};\n        /** @type {boolean} */\n        this.currentMuteState = false;\n        /** @type {Object<string, boolean>} */\n        this.changedMutedState = {};\n        /** @type {boolean} */\n        this.lockedMuteState = false;\n        /** @type {Object} */\n        this.defaultAudioConfig = {\n            mute: false,\n            volume: 1,\n            rate: 1,\n            detune: 0,\n            seek: 0,\n            loop: true,\n            delay: 0\n        };\n    }\n\n    /**\n     * @param {string} audioKey\n     * @param {boolean} enabled\n     * @returns {Promise<boolean>}\n     */\n    async setAudio(audioKey, enabled)\n    {\n        if(this.lockedMuteState){\n            Logger.info('Locked mute state to set audio.');\n            return false;\n        }\n        await this.events.emit('reldens.setAudio', {\n            audioManager: this,\n            categoryKey: audioKey,\n            enabled\n        });\n        let category = this.categories[audioKey];\n        this.playerConfig[category.id] = enabled ? 1 : 0;\n        if(!sc.hasOwn(this.playing, audioKey)){\n            return true;\n        }\n        let playOrStop = enabled ? 'play' : 'stop';\n        let playingElement = this.playing[audioKey];\n        if(category.single_audio && sc.isObjectFunction(playingElement, playOrStop)){\n            // if is single track we will stop or play the last audio:\n            return this.setAudioForSingleEntity(playingElement, playOrStop, audioKey, enabled);\n        }\n        return this.setAudioForElementChildren(playingElement, category, enabled);\n    }\n\n\n    /**\n     * @param {Object} playingElement\n     * @param {string} playOrStop\n     * @param {string} audioKey\n     * @param {boolean} enabled\n     * @returns {boolean}\n     */\n    setAudioForSingleEntity(playingElement, playOrStop, audioKey, enabled)\n    {\n        if(!playingElement){\n            Logger.error('Missing playingElement.', {audioKey, playingElement});\n            return false;\n        }\n        if(!playingElement.currentConfig){\n            // Logger.error('Possible null WebAudioSound as playingElement.', {audioKey, playingElement});\n            return false;\n        }\n        if(!sc.isObjectFunction(playingElement, playOrStop)){\n            Logger.error('Missing playOrStop method in playingElement.', {audioKey, playOrStop, playingElement});\n            return false;\n        }\n        try {\n            playingElement[playOrStop]();\n            playingElement.mute = !enabled;\n        } catch (error) {\n            Logger.error('PlayingElement error.', {audioKey, playOrStop, playingElement, error});\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} playingElement\n     * @param {Object} category\n     * @param {boolean} enabled\n     * @returns {boolean}\n     */\n    setAudioForElementChildren(playingElement, category, enabled)\n    {\n        // if is multi-track, we will only stop all the audios but replay them only when the events require it:\n        if(category.single_audio){\n            return false;\n        }\n        let audioKeys = Object.keys(playingElement);\n        if(0 === audioKeys.length){\n            return false;\n        }\n        for(let i of audioKeys){\n            this.setAudioForSingleEntity(playingElement[i], 'stop', i, enabled);\n        }\n        return true;\n    }\n\n    /**\n     * @param {PhaserScene} onScene\n     * @param {Object} audio\n     * @returns {Object|boolean}\n     */\n    generateAudio(onScene, audio)\n    {\n        let soundConfig = Object.assign({}, this.defaultAudioConfig, (audio.config || {}));\n        if(!sc.hasOwn(onScene.cache.audio.entries.entries, audio.audio_key)){\n            Logger.error('Audio file does not exists. Key: '+audio.audio_key, onScene.cache.audio.entries.entries);\n            return false;\n        }\n        let audioInstance = onScene.sound.add(audio.audio_key, soundConfig);\n        //Logger.debug('Generate audio:', audio, soundConfig);\n        if(audio.related_audio_markers && 0 < audio.related_audio_markers.length){\n            for(let marker of audio.related_audio_markers){\n                let markerConfig = Object.assign({}, soundConfig, (marker.config || {}), {\n                    name: marker.marker_key,\n                    start: marker.start,\n                    duration: marker.duration,\n                });\n                audioInstance.addMarker(markerConfig);\n            }\n        }\n        return {data: audio, audioInstance};\n    }\n\n    /**\n     * @param {string} audioKey\n     * @param {string} sceneKey\n     * @returns {Object|boolean}\n     */\n    findAudio(audioKey, sceneKey)\n    {\n        return this.findRoomAudio(audioKey, sceneKey) || this.findGlobalAudio(audioKey);\n    }\n\n    /**\n     * @param {string} audioKey\n     * @param {string} sceneKey\n     * @returns {Object|boolean}\n     */\n    findRoomAudio(audioKey, sceneKey)\n    {\n        if(!sc.hasOwn(this.roomsAudios, sceneKey)){\n            this.roomsAudios[sceneKey] = {};\n        }\n        return this.findAudioInObjectKey(audioKey, this.roomsAudios[sceneKey]);\n    }\n\n    /**\n     * @param {string} audioKey\n     * @returns {Object|boolean}\n     */\n    findGlobalAudio(audioKey)\n    {\n        return this.findAudioInObjectKey(audioKey, this.globalAudios);\n    }\n\n    /**\n     * @param {string} audioKey\n     * @param {Object} audiosObject\n     * @returns {Object|boolean}\n     */\n    findAudioInObjectKey(audioKey, audiosObject)\n    {\n        if(sc.hasOwn(audiosObject, audioKey)){\n            return {audio: audiosObject[audioKey], marker: false};\n        }\n        let objectKeys = Object.keys(audiosObject);\n        if(0 === objectKeys.length){\n            return false;\n        }\n        for(let i of objectKeys){\n            let audio = audiosObject[i];\n            if(sc.hasOwn(audio.audioInstance.markers, audioKey)){\n                return {audio, marker: audioKey};\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @param {Array<Object>} categories\n     */\n    addCategories(categories)\n    {\n        for(let category of categories){\n            if(!sc.hasOwn(this.categories, category.category_key)){\n                this.categories[category.category_key] = category;\n            }\n            if(!sc.hasOwn(this.playing, category.category_key)){\n                this.playing[category.category_key] = {};\n            }\n        }\n    }\n\n    /**\n     * @param {Object} audios\n     * @param {PhaserScene} currentScene\n     * @returns {Promise<boolean>}\n     */\n    async loadGlobalAudios(audios, currentScene)\n    {\n        let audioKeys = Object.keys(audios);\n        if(0 === audioKeys.length){\n            return false;\n        }\n        await this.loadByKeys(audioKeys, audios, currentScene, 'globalAudios');\n    }\n\n    /**\n     * @param {Object} audios\n     * @param {PhaserScene} currentScene\n     * @returns {Promise<boolean>}\n     */\n    async loadAudiosInScene(audios, currentScene)\n    {\n        let audioKeys = Object.keys(audios);\n        if(0 === audioKeys.length){\n            return false;\n        }\n        if(!sc.hasOwn(this.roomsAudios, currentScene.key)){\n            this.roomsAudios[currentScene.key] = {};\n        }\n        await this.loadByKeys(audioKeys, audios, currentScene, 'roomsAudios');\n    }\n\n    /**\n     * @param {Array<string>} audioKeys\n     * @param {Object} audios\n     * @param {PhaserScene} currentScene\n     * @param {string} storageKey\n     * @returns {Promise<void>}\n     */\n    async loadByKeys(audioKeys, audios, currentScene, storageKey)\n    {\n        let newAudiosCounter = 0;\n        for(let i of audioKeys){\n            let audio = audios[i];\n            this.removeSceneAudioByAudioKey(currentScene, audio.audio_key);\n            let filesArr = await this.prepareFiles(audio);\n            if(0 === filesArr.length){\n                continue;\n            }\n            let audioLoader = currentScene.load.audio(audio.audio_key, filesArr);\n            audioLoader.on('filecomplete', async (completedFileKey) => {\n                if(completedFileKey !== audio.audio_key){\n                    return false;\n                }\n                let generateAudio = this.generateAudio(currentScene, audio);\n                if(false === generateAudio){\n                    Logger.error('AudioLoader can not generate the audio.', {\n                        'Audio key:': audio.audio_key,\n                        'Storage key:': storageKey,\n                    });\n                    return false;\n                }\n                storageKey === 'roomsAudios'\n                    ? this.roomsAudios[currentScene.key][audio.audio_key] = generateAudio\n                    : this.globalAudios[audio.audio_key] = generateAudio;\n                newAudiosCounter++;\n                await this.fireAudioEvents(audios, currentScene, audio, newAudiosCounter);\n            });\n            audioLoader.start();\n        }\n    }\n\n    /**\n     * @param {string} url\n     * @returns {Promise<boolean>}\n     */\n    async existsFileByXMLHttpRequest(url)\n    {\n        try {\n            let response = await fetch(url, { method: 'HEAD' });\n            return response.status !== 404;\n        } catch (error) {\n            Logger.error('Error fetching:', error);\n            return false;\n        }\n    }\n\n    /**\n     * @param {Object} audio\n     * @returns {Promise<Array<string>>}\n     */\n    async prepareFiles(audio)\n    {\n        let filesName = audio.files_name.split(',');\n        let filesArr = [];\n        for(let fileName of filesName){\n            let audioPath = AudioConst.AUDIO_BUCKET + '/' + fileName;\n            let testPath = await this.existsFileByXMLHttpRequest(audioPath);\n            if(false === testPath){\n                continue;\n            }\n            filesArr.push(audioPath);\n        }\n        return filesArr;\n    }\n\n    /**\n     * @param {Object} audios\n     * @param {PhaserScene} currentScene\n     * @param {Object} audio\n     * @param {number} newAudiosCounter\n     * @returns {Promise<void>}\n     */\n    async fireAudioEvents(audios, currentScene, audio, newAudiosCounter)\n    {\n        await currentScene.gameManager.events.emit('reldens.audioLoaded', this, audios, currentScene, audio);\n        if(newAudiosCounter === audios.length){\n            await currentScene.gameManager.events.emit('reldens.allAudiosLoaded', this, audios, currentScene, audio);\n        }\n    }\n\n    /**\n     * @param {Array<Object>} audios\n     * @param {PhaserScene} currentScene\n     * @returns {boolean}\n     */\n    removeAudiosFromScene(audios, currentScene)\n    {\n        if(0 === audios.length || !currentScene){\n            return false;\n        }\n        for(let audio of audios){\n            this.removeSceneAudioByAudioKey(currentScene, audio.audio_key);\n        }\n        return true;\n    }\n\n    /**\n     * @param {PhaserScene} scene\n     * @param {string} audioKey\n     */\n    removeSceneAudioByAudioKey(scene, audioKey)\n    {\n        scene.sound.removeByKey(audioKey);\n        if(sc.hasOwn(scene.cache.audio.entries.entries, audioKey)){\n            delete scene.cache.audio.entries.entries[audioKey];\n        }\n        if(sc.hasOwn(this.roomsAudios[scene.key], audioKey)){\n            delete this.roomsAudios[scene.key][audioKey];\n        }\n        if(sc.hasOwn(this.globalAudios, audioKey)){\n            delete this.globalAudios[audioKey];\n        }\n    }\n\n    /**\n     * @param {Object} defaultAudioConfig\n     */\n    updateDefaultConfig(defaultAudioConfig)\n    {\n        if(sc.isObject(defaultAudioConfig)){\n            Object.assign(this.defaultAudioConfig, defaultAudioConfig);\n        }\n    }\n\n    /**\n     * @param {Object} message\n     * @param {Object} room\n     * @param {Object} gameManager\n     * @returns {Promise<void>}\n     */\n    async processUpdateData(message, room, gameManager)\n    {\n        if(message.playerConfig){\n            this.playerConfig = message.playerConfig;\n        }\n        if(message.categories){\n            this.addCategories(message.categories);\n            await this.events.emit('reldens.audioManagerUpdateCategoriesLoaded', this, room, gameManager, message);\n        }\n        let audios = sc.get(message, 'audios', {});\n        if(0 < Object.keys(audios).length){\n            let currentScene = gameManager.gameEngine.scene.getScene(room.name);\n            await this.loadAudiosInScene(audios, currentScene);\n            await this.events.emit('reldens.audioManagerUpdateAudiosLoaded', this, room, gameManager, message);\n        }\n    }\n\n    /**\n     * @param {Object} message\n     * @param {Object} room\n     * @param {Object} gameManager\n     * @returns {Promise<boolean>}\n     */\n    async processDeleteData(message, room, gameManager)\n    {\n        if(0 === message.audios.length){\n            return false;\n        }\n        let currentScene = gameManager.gameEngine.scene.getScene(room.name);\n        this.removeAudiosFromScene(message.audios, currentScene);\n        await this.events.emit('reldens.audioManagerDeleteAudios', this, room, gameManager, message);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    destroySceneAudios()\n    {\n        let playingKeys = Object.keys(this.playing);\n        if(0 === playingKeys.length){\n            return false;\n        }\n        for(let i of playingKeys){\n            let playingAudioCategory = this.playing[i];\n            let categoryData = this.categories[i];\n            // @TODO - BETA - Check and refactor if possible to use scene delete by key.\n            if(categoryData.single_audio && sc.isObjectFunction(playingAudioCategory, 'stop')){\n                playingAudioCategory.stop();\n                delete this.playing[i];\n                continue;\n            }\n            let playingCategoryKeys = Object.keys(playingAudioCategory);\n            if(!categoryData.single_audio && 0 === playingCategoryKeys.length){\n                continue;\n            }\n            for(let a of playingCategoryKeys){\n                let playingAudio = playingAudioCategory[a];\n                if(sc.isObjectFunction(playingAudio, 'stop')){\n                    playingAudio.stop();\n                    delete playingAudio[i];\n                }\n            }\n        }\n    }\n\n    /**\n     * @param {boolean} newMuteState\n     * @param {boolean} newMuteLockState\n     * @returns {Promise<boolean>}\n     */\n    async changeMuteState(newMuteState, newMuteLockState)\n    {\n        if(false === newMuteLockState){\n            this.lockedMuteState = false;\n        }\n        this.currentMuteState = newMuteState;\n        if(this.lockedMuteState && false !== newMuteLockState){\n            Logger.info('Locked mute state from changes.');\n            return false;\n        }\n        return newMuteState ? await this.muteCategories(newMuteLockState) : await this.restoreMute(newMuteLockState);\n    }\n\n    /**\n     * @param {boolean} newMuteLockState\n     * @returns {Promise<boolean>}\n     */\n    async muteCategories(newMuteLockState)\n    {\n        let categoriesKeys = Object.keys(this.categories);\n        if(0 < categoriesKeys.length){\n            Logger.info('Mute categories not found.');\n            return false;\n        }\n        for(let i of categoriesKeys){\n            this.changedMutedState[i] = this.currentMuteState;\n            await this.setAudio(i, false);\n        }\n        this.setMuteLock(newMuteLockState);\n        return true;\n    }\n\n    /**\n     * @param {boolean} newMuteLockState\n     * @returns {Promise<boolean>}\n     */\n    async restoreMute(newMuteLockState)\n    {\n        let changedKeys = Object.keys(this.changedMutedState);\n        if(0 === changedKeys.length){\n            this.setMuteLock(newMuteLockState);\n            return false;\n        }\n        for(let i of changedKeys){\n            await this.setAudio(i, true);\n        }\n        this.setMuteLock(newMuteLockState);\n        this.changedMutedState = {};\n        return true;\n    }\n\n    /**\n     * @param {boolean} newMuteLockState\n     */\n    setMuteLock(newMuteLockState)\n    {\n        if(false === newMuteLockState){\n            this.lockedMuteState = false;\n        }\n        if(true === newMuteLockState){\n            this.lockedMuteState = true;\n        }\n    }\n\n}\n\nmodule.exports.AudioManager = AudioManager;\n"
  },
  {
    "path": "lib/audio/client/messages-listener.js",
    "content": "/**\n *\n * Reldens - MessagesListener.\n *\n * Manages audio-related messages from the server and queues them until the scene is ready.\n *\n */\n\nconst { AudioConst } = require('../constants');\n\n/**\n * @typedef {import('colyseus.js').Room} ColyseusRoom\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass MessagesListener\n{\n\n    constructor()\n    {\n        /** @type {Array<Object>} */\n        this.queueMessages = [];\n        /** @type {boolean} */\n        this.sceneReady = false;\n    }\n\n    /**\n     * @param {ColyseusRoom} room\n     * @param {GameManager} gameManager\n     */\n    listenMessages(room, gameManager)\n    {\n        room.onMessage('*', async (message) => {\n            await this.processMessage(message, room, gameManager);\n        });\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async processQueue()\n    {\n        this.sceneReady = true;\n        if(0 === this.queueMessages.length){\n            return false;\n        }\n        let messagesToProcess = [...this.queueMessages];\n        this.queueMessages = [];\n        for(let messageData of messagesToProcess){\n            let { message, room, gameManager } = messageData;\n            await this.processMessage(message, room, gameManager);\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} message\n     * @param {ColyseusRoom} room\n     * @param {GameManager} gameManager\n     * @returns {Promise<void>}\n     */\n    async processMessage(message, room, gameManager)\n    {\n        if(false === this.sceneReady){\n            this.queueMessages.push({message, room, gameManager});\n            return;\n        }\n        if(message.act === AudioConst.AUDIO_UPDATE){\n            await gameManager.audioManager.processUpdateData(message, room, gameManager);\n        }\n        if(message.act === AudioConst.AUDIO_DELETE){\n            await gameManager.audioManager.processDeleteData(message, room, gameManager);\n        }\n    }\n\n}\n\nmodule.exports.MessagesListener = MessagesListener;\n"
  },
  {
    "path": "lib/audio/client/plugin.js",
    "content": "/**\n *\n * Reldens - Audio Client Plugin\n *\n * Initializes and manages the audio system on the client side.\n *\n */\n\nconst { AudioManager } = require('./manager');\nconst { SceneAudioPlayer } = require('./scene-audio-player');\nconst { MessagesListener } = require('./messages-listener');\nconst { AudioUi } = require('./audio-ui');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst Translations = require('./snippets/en_US');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { AudioConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManagerSingleton} EventsManagerSingleton\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass AudioPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @param {EventsManagerSingleton} [props.events]\n     * @param {GameManager} [props.gameManager]\n     */\n    setup(props)\n    {\n        /** @type {EventsManagerSingleton|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in AudioPlugin.');\n        }\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in AudioPlugin.');\n        }\n        this.setTranslations();\n        /** @type {MessagesListener} */\n        this.messagesListener = new MessagesListener();\n        /** @type {typeof SceneAudioPlayer} */\n        this.sceneAudioPlayer = SceneAudioPlayer;\n        /** @type {Object} */\n        this.initialAudiosData = {};\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setTranslations()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations, AudioConst.MESSAGE.DATA_VALUES);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        // @TODO - BETA - Extract all listeners handlers in external services.\n        if(!this.events){\n            return false;\n        }\n        this.events.on('reldens.joinedRoom', (room, gameManager) => {\n            this.initializeAudioManager(gameManager);\n            this.messagesListener.listenMessages(room, gameManager);\n        });\n        this.events.on('reldens.preloadUiScene', async (preloadScene) => {\n            preloadScene.load.html('audio', '/assets/html/ui-audio.html');\n            preloadScene.load.html('audio-category', '/assets/html/ui-audio-category-row.html');\n        });\n        this.events.on('reldens.createUiScene', (preloadScene) => {\n            this.uiManager = new AudioUi(preloadScene);\n        });\n        this.events.on('reldens.afterSceneDynamicCreate', async (sceneDynamic) => {\n            let audioManager = sceneDynamic.gameManager.audioManager;\n            if(!audioManager){\n                Logger.warning('Audio manager undefined in AudioPlugin.');\n                return false;\n            }\n            let globalAudios = sc.get(this.initialAudiosData, 'globalAudios', {});\n            await audioManager.loadGlobalAudios(globalAudios, sceneDynamic);\n            await this.messagesListener.processQueue();\n            if(this.uiManager){\n                let audioSettingInputs = sceneDynamic.gameManager.gameDom.getElements('.audio-setting');\n                if(0 === audioSettingInputs.length){\n                    this.uiManager.createUi();\n                }\n            }\n            this.sceneAudioPlayer.associateSceneAnimationsAudios(audioManager, sceneDynamic);\n            sceneDynamic.cameras.main.on('camerafadeincomplete', () => {\n                this.sceneAudioPlayer.playSceneAudio(audioManager, sceneDynamic);\n            });\n        });\n        this.events.on('reldens.changeSceneDestroyPrevious', (sceneDynamic) => {\n            sceneDynamic.gameManager.audioManager.destroySceneAudios();\n        });\n        this.events.on('reldens.allAudiosLoaded', (audioManager, audios, currentScene) => {\n            this.sceneAudioPlayer.playSceneAudio(audioManager, currentScene, true);\n        });\n    }\n\n    /**\n     * @param {GameManager} gameManager\n     */\n    initializeAudioManager(gameManager)\n    {\n        if(gameManager.audioManager){\n            return;\n        }\n        if(!gameManager.initialGameData.player){\n            Logger.warning('Missing initialGameData.player', gameManager.initialGameData);\n        }\n        gameManager.audioManager = new AudioManager({\n            events: this.events,\n            currentPlayerData: gameManager.initialGameData.player\n        });\n        gameManager.audioManager.updateDefaultConfig(\n            gameManager.config.getWithoutLogs('client/general/audio/defaultAudioConfig')\n        );\n        this.initialAudiosData = sc.get(gameManager.initialGameData, 'audio', {});\n    }\n}\n\nmodule.exports.AudioPlugin = AudioPlugin;\n"
  },
  {
    "path": "lib/audio/client/scene-audio-player.js",
    "content": "/**\n *\n * Reldens - SceneAudioPlayer.\n *\n * Handles audio playback for scenes and sprite animations in the game.\n *\n */\n\nconst { AudioConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./manager').AudioManager} AudioManager\n * @typedef {import('phaser').Scene} PhaserScene\n * @typedef {import('phaser').GameObjects.Sprite} PhaserSprite\n */\nclass SceneAudioPlayer\n{\n\n    /**\n     * @param {AudioManager} audioManager\n     * @param {PhaserScene} sceneDynamic\n     * @param {boolean} [forcePlay]\n     * @returns {Object|boolean}\n     */\n    playSceneAudio(audioManager, sceneDynamic, forcePlay)\n    {\n        let sceneAudio = sceneDynamic['associatedAudio'];\n        if(\n            forcePlay !== true\n            && (sceneAudio === false || (sceneAudio && sceneAudio.audio.audioInstance.isPlaying))\n        ){\n            return false;\n        }\n        sceneDynamic['associatedAudio'] = audioManager.findAudio(sceneDynamic.key, sceneDynamic.key);\n        if(sceneDynamic['associatedAudio']){\n            this.playSpriteAudio(sceneDynamic['associatedAudio'], sceneDynamic, false, audioManager);\n            return sceneDynamic['associatedAudio'];\n        }\n        return false;\n    }\n\n    /**\n     * @param {AudioManager} audioManager\n     * @param {PhaserScene} sceneDynamic\n     */\n    associateSceneAnimationsAudios(audioManager, sceneDynamic)\n    {\n        sceneDynamic.cameras.main.on('camerafadeincomplete', () => {\n            if(sceneDynamic.children.list.length <= 0){\n                return false;\n            }\n            for(let sprite of sceneDynamic.children.list){\n                if(sprite.type !== 'Sprite'){\n                    continue;\n                }\n                sprite.on('animationstart', (event) => {\n                    let animationKey = AudioConst.AUDIO_ANIMATION_KEY_START+event.key;\n                    let associatedAudio = this.attachAudioToSprite(sprite, animationKey, audioManager, sceneDynamic);\n                    //Logger.debug('Animation start audio:', animationKey, associatedAudio);\n                    if(false !== associatedAudio){\n                        this.playSpriteAudio(associatedAudio, sceneDynamic, sprite, audioManager);\n                    }\n                });\n                sprite.on('animationupdate', (event) => {\n                    let animationKey = AudioConst.AUDIO_ANIMATION_KEY_UPDATE+event.key;\n                    let associatedAudio = this.attachAudioToSprite(sprite, animationKey, audioManager, sceneDynamic);\n                    //Logger.debug('Animation update audio:', animationKey, associatedAudio);\n                    if(false !== associatedAudio){\n                        this.playSpriteAudio(associatedAudio, sceneDynamic, sprite, audioManager);\n                    }\n                });\n                sprite.on('animationcomplete', (event) => {\n                    let animationKey = AudioConst.AUDIO_ANIMATION_KEY_COMPLETE+event.key;\n                    let associatedAudio = this.attachAudioToSprite(sprite, animationKey, audioManager, sceneDynamic);\n                    //Logger.debug('Animation complete audio:', animationKey, associatedAudio);\n                    if(false !== associatedAudio){\n                        this.playSpriteAudio(associatedAudio, sceneDynamic, sprite, audioManager);\n                    }\n                });\n                sprite.on('animationrepeat', (event) => {\n                    let animationKey = AudioConst.AUDIO_ANIMATION_KEY_REPEAT+event.key;\n                    let associatedAudio = this.attachAudioToSprite(sprite, animationKey, audioManager, sceneDynamic);\n                    //Logger.debug('Animation repeat audio:', animationKey, associatedAudio);\n                    if(false !== associatedAudio){\n                        this.playSpriteAudio(associatedAudio, sceneDynamic, sprite, audioManager);\n                    }\n                });\n                sprite.on('animationstop', (event) => {\n                    let animationKey = AudioConst.AUDIO_ANIMATION_KEY_STOP+event.key;\n                    let associatedAudio = this.attachAudioToSprite(sprite, animationKey, audioManager, sceneDynamic);\n                    //Logger.debug('Animation stop audio:', animationKey, associatedAudio);\n                    if(false !== associatedAudio){\n                        this.playSpriteAudio(associatedAudio, sceneDynamic, sprite, audioManager);\n                    }\n                });\n            }\n        });\n    }\n\n    /**\n     * @param {PhaserSprite} sprite\n     * @param {string} animationAudioKey\n     * @param {AudioManager} audioManager\n     * @param {PhaserScene} sceneDynamic\n     * @returns {Object|boolean}\n     */\n    attachAudioToSprite(sprite, animationAudioKey, audioManager, sceneDynamic)\n    {\n        if(sc.hasOwn(sprite.associatedAudio, animationAudioKey)){\n            return sprite.associatedAudio[animationAudioKey];\n        }\n        if(!sc.hasOwn(sprite, 'associatedAudio')){\n            sprite.associatedAudio = {};\n        }\n        if(!sc.hasOwn(sprite.associatedAudio, animationAudioKey)){\n            sprite.associatedAudio[animationAudioKey] = audioManager.findAudio(animationAudioKey, sceneDynamic.key);\n        }\n        return sprite.associatedAudio[animationAudioKey];\n    }\n\n    /**\n     * @param {Object} associatedAudio\n     * @param {PhaserScene} sceneDynamic\n     * @param {PhaserSprite|boolean} sprite\n     * @param {AudioManager} audioManager\n     * @returns {boolean}\n     */\n    playSpriteAudio(associatedAudio, sceneDynamic, sprite, audioManager)\n    {\n        let currentPlayerId = Number(audioManager.currentPlayerData.id);\n        let spritePlayerId = Number(sc.get(sprite, 'player_id'));\n        //Logger.debug('Play sprite audio.', associatedAudio, sceneDynamic.key, sprite, currentPlayerId);\n        let isCurrentPlayerSprite = this.isCurrentPlayerSprite(spritePlayerId, currentPlayerId);\n        if(associatedAudio.audio.data.config?.onlyCurrentPlayer && !isCurrentPlayerSprite){\n            //Logger.debug('Play sprite audio avoided for current player.', associatedAudio, sceneKey);\n            return false;\n        }\n        let currentPlayer = sceneDynamic.player;\n        if(isCurrentPlayerSprite && currentPlayer && (currentPlayer.isDisabled() || currentPlayer.isDeath())){\n            //Logger.debug('Play sprite audio avoided for current dead player.', associatedAudio, sceneKey);\n            return false;\n        }\n        // @NOTE:\n        // - We need the status update from the actual category in the audio manager the category associated with the\n        // audio here is just the storage reference.\n        // - We need to check the category enabled every time the audio can be reproduced because the user can turn\n        // the category on/off at any time.\n        if(!associatedAudio || !associatedAudio.audio || !associatedAudio.audio.data){\n            Logger.error('Missing associated audio data.', associatedAudio);\n            return false;\n        }\n        let audioCategoryKey = associatedAudio.audio.data.related_audio_categories.category_key;\n        let audioCategory = sc.get(audioManager.categories, audioCategoryKey, false);\n        let audioEnabled = sc.get(audioManager.playerConfig, audioCategory.id, audioCategory.enabled);\n        if(!audioCategory || !audioEnabled){\n            return false;\n        }\n        let audioInstance = associatedAudio.audio.audioInstance;\n        // first stop previous if is single category audio:\n        if(audioCategory.single_audio){\n            if(sc.isObjectFunction(audioManager.playing[audioCategory.category_key], 'stop')){\n                audioManager.playing[audioCategory.category_key].stop();\n            }\n        }\n        // save the new instance in the proper place and play:\n        // - if is single category then just in the playing property with that category key:\n        if(audioCategory.single_audio){\n            audioManager.playing[audioCategory.category_key] = audioInstance;\n            if(this.isMutedState(audioManager, audioCategory.category_key, audioInstance)){\n                return false;\n            }\n            audioInstance.mute = false;\n            audioInstance.play();\n            return true;\n        }\n        // - if is not single category:\n        if(!audioCategory.single_audio){\n            // - if it does not have a marker, we save the audio instance under the tree category_key > audio_key:\n            if(!associatedAudio.marker){\n                audioManager.playing[audioCategory.category_key][associatedAudio.audio.data.audio_key] = audioInstance;\n                if(this.isMutedState(audioManager, audioCategory.category_key, audioInstance)){\n                    return false;\n                }\n                // and play the audio:\n                audioInstance.mute = false;\n                audioInstance.play();\n                return true;\n            }\n            // - if it has a marker, we save the audio instance under the tree category_key > marker_key:\n            if(associatedAudio.marker){\n                audioManager.playing[audioCategory.category_key][associatedAudio.marker] = audioInstance;\n                if(this.isMutedState(audioManager, audioCategory.category_key, audioInstance)){\n                    return false;\n                }\n                // and play the audio passing the marker:\n                audioInstance.mute = false;\n                audioInstance.play(associatedAudio.marker);\n                return true;\n            }\n        }\n    }\n\n    /**\n     * @param {number} spritePlayerId\n     * @param {number} currentPlayerId\n     * @returns {boolean}\n     */\n    isCurrentPlayerSprite(spritePlayerId, currentPlayerId)\n    {\n        return spritePlayerId && spritePlayerId === currentPlayerId;\n    }\n\n    /**\n     * @param {AudioManager} audioManager\n     * @param {string} mutedKey\n     * @param {Object} audioInstance\n     * @returns {boolean}\n     */\n    isMutedState(audioManager, mutedKey, audioInstance)\n    {\n        if(false === audioManager.currentMuteState){\n            return false;\n        }\n        Logger.info('AudioManager in muted state to play audio.', {mutedKey, audioInstance});\n        audioManager.changedMutedState[mutedKey] = audioManager.currentMuteState;\n        return true;\n    }\n\n}\n\nmodule.exports.SceneAudioPlayer = new SceneAudioPlayer();\n"
  },
  {
    "path": "lib/audio/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    audio: {\n        settingsTitle: 'Audio Settings'\n    }\n}\n"
  },
  {
    "path": "lib/audio/constants.js",
    "content": "/**\n *\n * Reldens - AudioConst\n *\n */\n\nmodule.exports.AudioConst = {\n    AUDIO_UPDATE: 'ap',\n    AUDIO_DELETE: 'ad',\n    AUDIO_ANIMATION_KEY_START: 'i_',\n    AUDIO_ANIMATION_KEY_UPDATE: 'u_',\n    AUDIO_ANIMATION_KEY_COMPLETE: 'c_',\n    AUDIO_ANIMATION_KEY_REPEAT: 'r_',\n    AUDIO_ANIMATION_KEY_STOP: 's_',\n    AUDIO_BUCKET: '/assets/audio',\n    MESSAGE: {\n        DATA: {\n            UPDATE_TYPE: 'ck',\n            UPDATE_VALUE: 'uv'\n        },\n        DATA_VALUES: {\n            NAMESPACE: 'audio'\n        }\n    }\n};\n"
  },
  {
    "path": "lib/audio/server/audio-hot-plug-callbacks.js",
    "content": "/**\n *\n * Reldens - AudioHotPlugCallbacks\n *\n * Provides callback methods for hot-plugging audio files in the admin panel.\n *\n */\n\nconst { AdminDistHelper } = require('@reldens/cms/lib/admin-dist-helper');\nconst { sc } = require('@reldens/utils');\n\nclass AudioHotPlugCallbacks\n{\n\n    /**\n     * @param {Object} projectConfig\n     * @param {string} bucket\n     * @param {string} distFolder\n     * @returns {function|boolean}\n     */\n    static beforeDeleteCallback(projectConfig, bucket, distFolder)\n    {\n        if(false === projectConfig.isHotPlugEnabled){\n            return false;\n        }\n        return async (model, id, resource) => {\n            await this.removeAudio(distFolder, bucket, model, projectConfig, id, resource, true);\n        };\n    }\n\n    /**\n     * @param {Object} projectConfig\n     * @param {string} bucket\n     * @param {string} distFolder\n     * @returns {function|boolean}\n     */\n    static beforeUpdateCallback(projectConfig, bucket, distFolder)\n    {\n        if(false === projectConfig.isHotPlugEnabled){\n            return false;\n        }\n        return async (model, id, preparedParams, params) => {\n            let isEnabled = Boolean(sc.get(params, 'enabled', true));\n            if(isEnabled && preparedParams.files_name !== model.files_name){\n                await AdminDistHelper.copyBucketFilesToDist(bucket, params.files_name, distFolder);\n            }\n        };\n    }\n\n    /**\n     * @param {Object} projectConfig\n     * @param {string} bucket\n     * @param {string} distFolder\n     * @returns {function|boolean}\n     */\n    static afterUpdateCallback(projectConfig, bucket, distFolder)\n    {\n        if(false === projectConfig.isHotPlugEnabled){\n            return false;\n        }\n        return async (model, id, preparedParams, params, originalParams, resource) => {\n            if(1 < Object.keys(params).length && params === preparedParams){\n                return false;\n            }\n            false === Boolean(model.enabled)\n                ? await this.removeAudio(distFolder, bucket, model, projectConfig, id, resource)\n                : await this.updateAudio(params, bucket, model, distFolder, projectConfig, preparedParams, resource);\n        };\n    }\n\n    /**\n     * @param {Object} params\n     * @param {string} bucket\n     * @param {Object} model\n     * @param {string} distFolder\n     * @param {Object} projectConfig\n     * @param {Object} preparedParams\n     * @param {Object} resource\n     * @returns {Promise<void>}\n     */\n    static async updateAudio(params, bucket, model, distFolder, projectConfig, preparedParams, resource)\n    {\n        let dataServer = projectConfig.serverManager.dataServer;\n        let fullAudioData = await dataServer.getEntity('audio').loadByIdWithRelations(model.id);\n        projectConfig.serverManager.audioManager.hotPlugAudio({\n            newAudioModel: fullAudioData,\n            preparedParams,\n            params,\n            resource\n        });\n    }\n\n    /**\n     * @param {string} distFolder\n     * @param {string} bucket\n     * @param {Object} model\n     * @param {Object} projectConfig\n     * @param {number} id\n     * @param {Object} resource\n     * @param {boolean} [removeFiles]\n     * @returns {Promise<void>}\n     */\n    static async removeAudio(distFolder, bucket, model, projectConfig, id, resource, removeFiles = false)\n    {\n        if(true === removeFiles){\n            await AdminDistHelper.removeBucketAndDistFiles(distFolder, bucket, model.files_name);\n        }\n        projectConfig.serverManager.audioManager.hotUnplugAudio({\n            newAudioModel: model,\n            id: Number(id),\n            resource\n        });\n    }\n\n}\n\nmodule.exports.AudioHotPlugCallbacks = AudioHotPlugCallbacks;\n"
  },
  {
    "path": "lib/audio/server/entities/audio-entity-override.js",
    "content": "/**\n *\n * Reldens - AudioEntityOverride\n *\n * Extends the audio entity with custom property configurations and hot-plug callbacks for the admin panel.\n *\n */\n\nconst { AudioEntity } = require('../../../../generated-entities/entities/audio-entity');\nconst { AudioHotPlugCallbacks } = require('../audio-hot-plug-callbacks');\nconst { AllowedFileTypes } = require('../../../game/allowed-file-types');\nconst { AudioConst } = require('../../constants');\nconst { FileHandler } = require('@reldens/server-utils');\n\nclass AudioEntityOverride extends AudioEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @param {Object} projectConfig\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps, projectConfig)\n    {\n        let config = super.propertiesConfig(extraProps);\n        let bucket = FileHandler.joinPaths(projectConfig.bucketFullPath, 'assets', 'audio');\n        let bucketPath = '/assets/audio/';\n        let distFolder = FileHandler.joinPaths(projectConfig.distPath, 'assets', 'audio');\n        config.properties.files_name = {\n            isRequired: true,\n            isArray: ',',\n            isUpload: true,\n            allowedTypes: AllowedFileTypes.AUDIO,\n            bucket,\n            bucketPath,\n            distFolder\n        };\n        config.listProperties.splice(config.listProperties.indexOf('config'), 1);\n        config.navigationPosition = 1100;\n        config.bucketPath = AudioConst.AUDIO_BUCKET+'/';\n        config.bucket = bucket;\n        config.callbacks = {\n            // @NOTE: we use the update callback because that's when the file_name is updated with the upload plugin.\n            beforeUpdate: AudioHotPlugCallbacks.beforeUpdateCallback(projectConfig, bucket, distFolder),\n            afterUpdate: AudioHotPlugCallbacks.afterUpdateCallback(projectConfig, bucket, distFolder),\n            beforeDelete: AudioHotPlugCallbacks.beforeDeleteCallback(projectConfig, bucket, distFolder)\n        };\n        return config;\n    }\n\n}\n\nmodule.exports.AudioEntityOverride = AudioEntityOverride;\n"
  },
  {
    "path": "lib/audio/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Registered Entities\n *\n */\n\nconst { AudioEntityOverride } = require('./entities/audio-entity-override');\n\nmodule.exports.entitiesConfig = {\n    audio: AudioEntityOverride\n};\n"
  },
  {
    "path": "lib/audio/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        audio: 'Audios',\n        audio_categories: 'Categories',\n        audio_markers: 'Markers',\n        audio_player_config: 'Players Configuration'\n    }\n};\n"
  },
  {
    "path": "lib/audio/server/manager.js",
    "content": "/**\n *\n * Reldens - AudioManager\n *\n * Manages audio data, categories, and player configurations on the server side.\n *\n */\n\nconst { AudioConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} ColyseusClient\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n *\n * @typedef {Object} AudioManagerProps\n * @property {Object} roomsManager\n * @property {Object} dataServer\n */\nclass AudioManager\n{\n\n    /**\n     * @param {AudioManagerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Object<string, Object>} */\n        this.categories = {};\n        /** @type {Object<string, Object>} */\n        this.globalAudios = {};\n        /** @type {Object<string, Object>} */\n        this.roomsAudios = {};\n        /** @type {Object} */\n        this.roomsManager = props.roomsManager;\n        /** @type {Object} */\n        this.dataServer = props.dataServer;\n        this.setRepositories();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setRepositories()\n    {\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in AudioManager.');\n            return false;\n        }\n        this.audioRepository = this.dataServer.getEntity('audio');\n        this.audioPlayerConfigRepository = this.dataServer.getEntity('audioPlayerConfig');\n        this.audioCategoriesRepository = this.dataServer.getEntity('audioCategories');\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async loadAudioCategories()\n    {\n        // @TODO - BETA - Include config fields in audio categories table.\n        this.categories = await this.audioCategoriesRepository.loadBy('enabled', 1);\n    }\n\n    /**\n     * @returns {Promise<Object>}\n     */\n    async loadGlobalAudios()\n    {\n        if(0 === Object.keys(this.globalAudios).length){\n            let loadedGlobalAudios = await this.audioRepository.loadWithRelations(\n                {room_id: null, enabled: 1},\n                ['related_audio_categories', 'related_audio_markers']\n            );\n            this.globalAudios = sc.convertObjectsArrayToObjectByKeys(\n                this.convertAudiosConfigJsonToObjects(loadedGlobalAudios),\n                'audio_key'\n            );\n        }\n        return this.globalAudios;\n    }\n\n    /**\n     * @param {Array<Object>} loadedGlobalAudios\n     * @returns {Array<Object>}\n     */\n    convertAudiosConfigJsonToObjects(loadedGlobalAudios)\n    {\n        for(let audio of loadedGlobalAudios){\n            if(audio.config){\n                let convertedData = sc.toJson(audio.config);\n                if(convertedData){\n                    audio.config = convertedData;\n                }\n            }\n            if(audio.related_audio_markers){\n                for(let marker of audio.related_audio_markers){\n                    if(marker.config){\n                        let convertedData = sc.toJson(marker.config);\n                        if(convertedData){\n                            marker.config = convertedData;\n                        }\n                    }\n                }\n            }\n        }\n        return loadedGlobalAudios;\n    }\n\n    /**\n     * @param {number} roomId\n     * @returns {Promise<Object>}\n     */\n    async loadRoomAudios(roomId)\n    {\n        if(!sc.hasOwn(this.roomsAudios, roomId)){\n            let loadedRoomAudios = await this.audioRepository.loadWithRelations(\n                {room_id: roomId, enabled: 1},\n                ['related_rooms', 'related_audio_categories', 'related_audio_markers']\n            );\n            this.roomsAudios[roomId] = sc.convertObjectsArrayToObjectByKeys(\n                this.convertAudiosConfigJsonToObjects(loadedRoomAudios),\n                'audio_key'\n            );\n        }\n        return this.roomsAudios[roomId];\n    }\n\n    /**\n     * @param {number} playerId\n     * @returns {Promise<Object>}\n     */\n    async loadAudioPlayerConfig(playerId)\n    {\n        // @TODO - BETA - Improve login performance, avoid query by getting config from existent player schema.\n        let configModels = await this.audioPlayerConfigRepository.loadBy('player_id', playerId);\n        if(0 === configModels.length){\n            return {};\n        }\n        let playerConfig = {};\n        for(let config of configModels) {\n            playerConfig[config['category_id']] = config['enabled'];\n        }\n        return playerConfig;\n    }\n\n    /**\n     * @param {ColyseusClient} client\n     * @param {Object} message\n     * @param {RoomScene} room\n     * @returns {Promise<boolean|Object>}\n     */\n    async executeMessageActions(client, message, room)\n    {\n        if(message.act !== AudioConst.AUDIO_UPDATE){\n            return false;\n        }\n        let currentPlayer = room.playerBySessionIdFromState(client.sessionId);\n        let audioCategory = await this.audioCategoriesRepository.loadOneBy(\n            'category_key',\n            message[AudioConst.MESSAGE.DATA.UPDATE_TYPE]\n        );\n        if(!currentPlayer || !currentPlayer.player_id || !audioCategory){\n            return false;\n        }\n        let filters = {\n            player_id: currentPlayer.player_id,\n            category_id: audioCategory.id\n        };\n        let playerConfig = await this.audioPlayerConfigRepository.loadOne(filters);\n        let updatePatch = {enabled: (message[AudioConst.MESSAGE.DATA.UPDATE_VALUE] ? 1 : 0)};\n        if(playerConfig){\n            return await this.audioPlayerConfigRepository.update(filters, updatePatch);\n        }\n        return await this.audioPlayerConfigRepository.create(Object.assign(updatePatch, filters));\n    }\n\n    /**\n     * @param {Object} options\n     * @returns {boolean}\n     */\n    hotPlugAudio(options)\n    {\n        if(options?.newAudioModel?.room_id){\n            return this.hotPlugGlobalAudio(options?.newAudioModel);\n        }\n        return this.hotPlugRoomAudio(options?.newAudioModel);\n    }\n\n    /**\n     * @param {Object} newAudioModel\n     * @returns {boolean}\n     */\n    hotPlugRoomAudio(newAudioModel)\n    {\n        let roomId = newAudioModel.room_id;\n        if(!sc.hasOwn(this.roomsAudios, roomId)){\n            this.roomsAudios[roomId] = {};\n        }\n        this.roomsAudios[roomId][newAudioModel.id] = newAudioModel;\n        let roomInstance = this.findRoom(roomId, this.roomsManager.createdInstances);\n        if(!roomInstance){\n            // @NOTE: since the room could not be created yet (because none is connected), we don't need to broadcast\n            // the new audio, it will be loaded automatically when the room is created.\n            return true;\n        }\n        roomInstance.broadcast('*', {act: AudioConst.AUDIO_UPDATE, roomId, audios: [newAudioModel]});\n    }\n\n    /**\n     * @param {Object} newAudioModel\n     * @returns {boolean}\n     */\n    hotPlugGlobalAudio(newAudioModel)\n    {\n        this.globalAudios[newAudioModel.id] = newAudioModel;\n        let createdRooms = Object.keys(this.roomsManager.createdInstances);\n        if(0 === createdRooms.length){\n            return false;\n        }\n        for(let i of createdRooms){\n            let roomInstance = this.roomsManager.createdInstances[i];\n            let broadcastData = {\n                act: AudioConst.AUDIO_UPDATE,\n                roomId: i,\n                audios: {}\n            };\n            broadcastData['audios'][newAudioModel.id] = newAudioModel;\n            roomInstance.broadcast('*', broadcastData);\n        }\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {boolean}\n     */\n    hotUnplugAudio(props)\n    {\n        let {newAudioModel, id} = props;\n        if(newAudioModel.room_id){\n            return this.hotUnplugRoomAudio(newAudioModel, id);\n        }\n        return this.hotUnplugGlobalAudio(newAudioModel, id);\n    }\n\n    /**\n     * @param {Object} newAudioModel\n     * @param {number} id\n     * @returns {boolean}\n     */\n    hotUnplugRoomAudio(newAudioModel, id)\n    {\n        let roomAudiosList = sc.get(this.roomsAudios, newAudioModel.room_id, false);\n        if(false !== roomAudiosList && sc.hasOwn(roomAudiosList, id)){\n            delete this.roomsAudios[newAudioModel.room_id][id];\n        }\n        let roomInstance = this.findRoom(newAudioModel.room_id, this.roomsManager.createdInstances);\n        if(!roomInstance){\n            return true;\n        }\n        let data = {\n            act: AudioConst.AUDIO_DELETE,\n            roomId: newAudioModel.room_id,\n            audios: {}\n        };\n        data['audios'][newAudioModel.id] = newAudioModel;\n        roomInstance.broadcast('*', data);\n    }\n\n    /**\n     * @param {Object} newAudioModel\n     * @param {number} id\n     * @returns {boolean}\n     */\n    hotUnplugGlobalAudio(newAudioModel, id)\n    {\n        delete this.globalAudios[id];\n        let createdRooms = Object.keys(this.roomsManager.createdInstances);\n        if(0 === createdRooms.length){\n            return false;\n        }\n        for(let i of createdRooms){\n            let roomInstance = this.roomsManager.createdInstances[i];\n            let broadcastData = {\n                act: AudioConst.AUDIO_DELETE,\n                roomId: i,\n                audios: {}\n            };\n            broadcastData['audios'][newAudioModel.id] = newAudioModel;\n            roomInstance.broadcast('*', broadcastData);\n        }\n    }\n\n    /**\n     * @param {number} roomId\n     * @param {Object} [instancesList]\n     * @returns {Object|boolean}\n     */\n    findRoom(roomId, instancesList = {})\n    {\n        let roomInstances = Object.keys(instancesList);\n        if(0 === roomInstances.length){\n            return false;\n        }\n        for(let i of roomInstances){\n            let room = instancesList[i];\n            if(!room.roomData){\n                continue;\n            }\n            if(room.roomData.roomId === roomId){\n                return room;\n            }\n        }\n        return false;\n    }\n\n}\n\nmodule.exports.AudioManager = AudioManager;\n"
  },
  {
    "path": "lib/audio/server/plugin.js",
    "content": "/**\n *\n * Reldens - Audio Server Plugin\n *\n * Initializes and manages the audio system on the server side.\n *\n */\n\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { AudioManager } = require('./manager');\nconst { AudioConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManagerSingleton} EventsManagerSingleton\n */\nclass AudioPlugin extends PluginInterface\n{\n\n    constructor()\n    {\n        super();\n        /** @type {AudioManager|boolean} */\n        this.audioManager = false;\n    }\n\n    /**\n     * @param {Object} props\n     * @param {EventsManagerSingleton} [props.events]\n     * @param {Object} [props.dataServer]\n     */\n    setup(props)\n    {\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in AudioPlugin.');\n        }\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in AudioPlugin.');\n        }\n        this.events.on('reldens.serverBeforeDefineRooms', async (props) => {\n            this.audioManager = new AudioManager({\n                roomsManager: props.serverManager.roomsManager,\n                dataServer: this.dataServer\n            });\n            await this.audioManager.loadAudioCategories();\n            await this.audioManager.loadGlobalAudios();\n            props.serverManager.audioManager = this.audioManager;\n        });\n        this.events.on('reldens.defineRoomsInGameServerDone', async (roomsManager) => {\n            let definedRoomsNames = Object.keys(roomsManager.definedRooms);\n            if(definedRoomsNames.length){\n                for(let roomName of definedRoomsNames){\n                    let definedRoomData = roomsManager.definedRooms[roomName];\n                    if(!definedRoomData.roomProps.roomData || !definedRoomData.roomProps.roomData.roomId){\n                        continue;\n                    }\n                    await this.audioManager.loadRoomAudios(definedRoomData.roomProps.roomData.roomId);\n                }\n            }\n        });\n        this.events.on('reldens.beforeSuperInitialGameData', (superInitialGameData) => {\n            superInitialGameData.audio = {globalAudios: this.audioManager.globalAudios};\n        });\n        this.events.on('reldens.createPlayerAfter', async (client, userModel, currentPlayer, roomScene) => {\n            let playerConfig = await this.audioManager.loadAudioPlayerConfig(currentPlayer.player_id);\n            let data = {\n                act: AudioConst.AUDIO_UPDATE,\n                roomId: roomScene.roomData.roomId,\n                audios: this.audioManager.roomsAudios[roomScene.roomData.roomId],\n                categories: this.audioManager.categories,\n                playerConfig: playerConfig\n            };\n            client.send('*', data);\n        });\n        this.events.on('reldens.roomsMessageActionsGlobal', (roomMessageActions) => {\n            roomMessageActions.audio = this.audioManager;\n        });\n    }\n\n}\n\nmodule.exports.AudioPlugin = AudioPlugin;\n"
  },
  {
    "path": "lib/bundlers/drivers/parcel-config.json",
    "content": "{\n    \"bundler\": \"@parcel/bundler-default\",\n    \"transformers\": {\n        \"types:*.{ts,tsx}\": [\"@parcel/transformer-typescript-types\"],\n        \"bundle-text:*\": [\"...\", \"@parcel/transformer-inline-string\"],\n        \"data-url:*\": [\"...\", \"@parcel/transformer-inline-string\"],\n        \"worklet:*.{js,mjs,jsm,jsx,es6,cjs,ts,tsx}\": [\n            \"@parcel/transformer-worklet\",\n            \"...\"\n        ],\n        \"*.{js,mjs,jsm,jsx,es6,cjs,ts,tsx}\": [\n            \"@parcel/transformer-babel\",\n            \"@parcel/transformer-js\",\n            \"@parcel/transformer-react-refresh-wrap\"\n        ],\n        \"*.{json,json5}\": [\"@parcel/transformer-json\"],\n        \"*.jsonld\": [\"@parcel/transformer-jsonld\"],\n        \"*.webmanifest\": [\"@parcel/transformer-webmanifest\"],\n        \"webmanifest:*.{json,webmanifest}\": [\"@parcel/transformer-webmanifest\"],\n        \"*.{yaml,yml}\": [\"@parcel/transformer-yaml\"],\n        \"*.{gql,graphql}\": [\"@parcel/transformer-graphql\"],\n        \"*.{sass,scss}\": [\"@parcel/transformer-sass\"],\n        \"*.less\": [\"@parcel/transformer-less\"],\n        \"*.{css,pcss}\": [\"@parcel/transformer-postcss\", \"@parcel/transformer-css\"],\n        \"*.sss\": [\"@parcel/transformer-sugarss\"],\n        \"*.{htm,html,xhtml}\": [\n            \"@parcel/transformer-posthtml\",\n            \"@parcel/transformer-html\"\n        ],\n        \"*.pug\": [\"@parcel/transformer-pug\"],\n        \"*.coffee\": [\"@parcel/transformer-coffeescript\"],\n        \"*.vue\": [\"@parcel/transformer-vue\"],\n        \"template:*.vue\": [\"@parcel/transformer-vue\"],\n        \"script:*.vue\": [\"@parcel/transformer-vue\"],\n        \"style:*.vue\": [\"@parcel/transformer-vue\"],\n        \"custom:*.vue\": [\"@parcel/transformer-vue\"],\n        \"*.{png,jpg,jpeg,webp,gif,tiff,avif,heic,heif}\": [\n            \"@parcel/transformer-image\"\n        ],\n        \"*.svg\": [\"@parcel/transformer-svg\"],\n        \"*.{xml,rss,atom}\": [\"@parcel/transformer-xml\"],\n        \"url:*\": [\"...\", \"@parcel/transformer-raw\"]\n    },\n    \"namers\": [\"@parcel/namer-default\"],\n    \"runtimes\": [\n        \"@parcel/runtime-rsc\",\n        \"@parcel/runtime-js\",\n        \"@parcel/runtime-browser-hmr\",\n        \"@parcel/runtime-service-worker\"\n    ],\n    \"optimizers\": {\n        \"data-url:*\": [\"...\", \"@parcel/optimizer-data-url\"],\n        \"*.css\": [\"@parcel/optimizer-css\"],\n        \"*.{html,xhtml}\": [\"@parcel/optimizer-htmlnano\"],\n        \"*.{js,mjs,cjs}\": [\"@parcel/optimizer-swc\"],\n        \"*.{jpg,jpeg,png}\": [\"@parcel/optimizer-image\"]\n    },\n    \"packagers\": {\n        \"*.{html,xhtml}\": \"@parcel/packager-html\",\n        \"*.css\": \"@parcel/packager-css\",\n        \"*.{js,mjs,cjs}\": \"@parcel/packager-js\",\n        \"*.svg\": \"@parcel/packager-svg\",\n        \"*.{xml,rss,atom}\": \"@parcel/packager-xml\",\n        \"*.ts\": \"@parcel/packager-ts\",\n        \"*.wasm\": \"@parcel/packager-wasm\",\n        \"*.{jsonld,svg,webmanifest}\": \"@parcel/packager-raw-url\",\n        \"*\": \"@parcel/packager-raw\"\n    },\n    \"compressors\": {\n        \"*\": [\"@parcel/compressor-raw\"]\n    },\n    \"resolvers\": [\"@parcel/resolver-default\"]\n}\n"
  },
  {
    "path": "lib/chat/cleaner.js",
    "content": "/**\n *\n * Reldens - Cleaner\n *\n * Handles chat message cleaning and validation.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\nclass Cleaner\n{\n\n    /**\n     * @param {string} message\n     * @param {number} characterLimit\n     * @returns {string}\n     */\n    cleanMessage(message, characterLimit)\n    {\n        // @TODO - BETA - Implement any clean feature here.\n        return sc.cleanMessage(message, characterLimit);\n    }\n\n}\n\nmodule.exports.Cleaner = new Cleaner();\n"
  },
  {
    "path": "lib/chat/client/chat-tabs.js",
    "content": "/**\n *\n * Reldens - ChatTabs\n *\n * Manages chat tabs creation and activation for different message types.\n *\n */\n\nconst { ChatConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('phaser').Scene} PhaserScene\n */\nclass ChatTabs\n{\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {PhaserScene} uiScene\n     */\n    constructor(gameManager, uiScene)\n    {\n        /** @type {GameManager} */\n        this.gameManager = gameManager;\n        /** @type {PhaserScene} */\n        this.uiScene = uiScene;\n        /** @type {boolean} */\n        this.showTabs = this.gameManager.config.get('client/ui/chat/showTabs');\n        /** @type {string|boolean} */\n        this.containerTemplate = false;\n        /** @type {string|boolean} */\n        this.headerTemplate = false;\n        /** @type {string|boolean} */\n        this.contentTemplate = false;\n        this.createTabs();\n        this.activateTabs();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    createTabs()\n    {\n        if(!this.isReady()){\n            return false;\n        }\n        let chatTypes = sc.get(this.gameManager.initialGameData, 'chatTypes', []);\n        if(0 === chatTypes.length){\n            Logger.info('Chat types empty.');\n            return false;\n        }\n        let chatContentsElement = this.gameManager.gameDom.getElement(ChatConst.SELECTORS.CONTENTS);\n        if(!chatContentsElement){\n            Logger.info('Chat contents element not found.');\n            return false;\n        }\n        if(!this.fetchTemplates()){\n            return false;\n        }\n        let tabsHeaders = '';\n        let tabsContents = '';\n        let i = 0;\n        for(let chatType of chatTypes){\n            if(!chatType.show_tab){\n                continue;\n            }\n            let tabKey = chatType.key;\n            let tabId = chatType.id;\n            let headerClone = Object.assign({}, {headerTemplate: this.headerTemplate});\n            tabsHeaders += this.gameManager.gameEngine.parseTemplate(\n                headerClone.headerTemplate,\n                {\n                \ttabId,\n                \ttabLabel: this.gameManager.services.translator.t(\n                        ChatConst.SNIPPETS.PREFIX+ChatConst.SNIPPETS.TAB_PREFIX+tabKey\n                    ),\n                    className: 0 === i ? ' active' : ''\n\t            }\n            );\n            let contentClone = Object.assign({}, {contentTemplate: this.contentTemplate});\n            tabsContents += this.gameManager.gameEngine.parseTemplate(\n                contentClone.contentTemplate,\n                {\n                    tabId,\n                    tabKey,\n                    className: 0 === i ? ' active' : ''\n                }\n            );\n            i++;\n        }\n        let tabs = this.gameManager.gameEngine.parseTemplate(this.containerTemplate, {tabsHeaders, tabsContents});\n        this.gameManager.gameDom.updateContent(ChatConst.SELECTORS.CONTENTS, tabs);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    fetchTemplates()\n    {\n        this.containerTemplate = this.uiScene.cache.html.get('chatTabsContainer');\n        if(!this.containerTemplate){\n            Logger.info('Chat containerTemplate not found.');\n            return false;\n        }\n        this.headerTemplate = this.uiScene.cache.html.get('chatTabLabel');\n        if(!this.headerTemplate){\n            Logger.info('Chat headerTemplate not found.');\n            return false;\n        }\n        this.contentTemplate = this.uiScene.cache.html.get('chatTabContent');\n        if(!this.contentTemplate){\n            Logger.info('Chat contentTemplate not found.');\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isReady()\n    {\n        if(!this.gameManager){\n            Logger.error('ChatTabs, missing game manager.');\n        }\n        if(!this.uiScene){\n            Logger.error('ChatTabs, missing UI Scene.');\n        }\n        return !(!this.showTabs || !this.gameManager || !this.uiScene);\n    }\n\n    activateTabs()\n    {\n        let labels = this.gameManager.gameDom.getElements('.tab-label');\n        for(let label of labels){\n            label.addEventListener('click', (event) => {\n                let previousLabel = this.gameManager.gameDom.getElement('.tab-label.active');\n                previousLabel?.classList.remove('active');\n                event.target.classList.add('active');\n                let previousContent = this.gameManager.gameDom.getElement('.tab-content.active');\n                previousContent?.classList.remove('active');\n                let activate = this.gameManager.gameDom.getElement('.tab-content-'+event.target.dataset.tabId);\n                if(!activate){\n                    Logger.warning('Tab content was not found.', event);\n                    return false;\n                }\n                activate.classList.add('active');\n                activate.parentNode.scrollTop = activate.scrollHeight;\n            });\n        }\n    }\n\n}\n\nmodule.exports.ChatTabs = ChatTabs;\n"
  },
  {
    "path": "lib/chat/client/chat-ui.js",
    "content": "/**\n *\n * Reldens - ChatUi\n *\n * Manages the chat user interface including message display, tabs, and overhead chat.\n *\n */\n\nconst { Input } = require('phaser');\nconst { SpriteTextFactory } = require('../../game/client/engine/sprite-text-factory');\nconst { ChatTabs } = require('./chat-tabs');\nconst { ChatConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('phaser').Scene} PhaserScene\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('../../game/client/game-dom').GameDom} GameDom\n * @typedef {import('phaser').GameObjects.Sprite} PhaserSprite\n */\nclass ChatUi\n{\n\n    /**\n     * @param {PhaserScene} uiScene\n     */\n    constructor(uiScene)\n    {\n        /** @type {PhaserScene} */\n        this.uiScene = uiScene;\n        /** @type {GameManager} */\n        this.gameManager = this.uiScene?.gameManager;\n        /** @type {GameDom} */\n        this.gameDom = this.uiScene?.gameManager?.gameDom;\n        this.setChatTypes();\n        this.setChatConfiguration();\n        /** @type {Object} */\n        this.uiChat = {};\n        /** @type {Array<Object>} */\n        this.messagesQueu = [];\n        /** @type {HTMLElement|boolean} */\n        this.chatInput = false;\n        /** @type {HTMLElement|boolean} */\n        this.chatSendButton = false;\n        /** @type {HTMLElement|boolean} */\n        this.chatCloseButton = false;\n        /** @type {HTMLElement|boolean} */\n        this.chatOpenButton = false;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setChatConfiguration()\n    {\n        if(!this.gameManager || !this.gameManager.config){\n            return false;\n        }\n        this.uiConfig = this.gameManager.config.get('client/ui/chat');\n        this.overheadChat = sc.get(this.uiConfig, 'overheadChat', {});\n        this.overHeadChatEnabled = sc.get(this.overheadChat, 'enabled', false);\n        this.overheadText = sc.get(this.uiConfig, 'overheadText', {});\n        this.isDefaultOpen = sc.get(this.uiConfig, 'defaultOpen', false);\n        this.isTyping = sc.get(this.overheadChat, 'isTyping', false);\n        this.showTabs = sc.get(this.uiConfig, 'showTabs', false);\n        this.closeChatBoxAfterSend = sc.get(this.closeChatBoxAfterSend, 'isTyping', false);\n        this.messagesConfig = this.gameManager.config.get('client/chat/messages');\n        this.characterLimit = sc.get(this.messagesConfig, 'characterLimit', 0);\n        this.characterLimitOverhead = sc.get(this.messagesConfig, 'characterLimitOverhead', 0);\n        this.appendErrorTypeOnActiveTab = sc.get(this.messagesConfig, 'appendErrorTypeOnActiveTab', true);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setChatTypes()\n    {\n        if(!this.gameManager){\n            Logger.warning('Missing GameManager on ChatUI.');\n            return false;\n        }\n        if(!this.gameDom){\n            Logger.warning('Missing GameDom on ChatUI.');\n            return false;\n        }\n        if(!this.gameManager.initialGameData){\n            Logger.warning('Missing \"initialGameData\" on ChatUI.');\n            return false;\n        }\n        this.chatTypes = sc.get(this.gameManager.initialGameData, 'chatTypes', []);\n        if(0 === this.chatTypes.length){\n            return false;\n        }\n        this.chatTypesById = {};\n        for(let chatType of this.chatTypes){\n            this.chatTypesById[chatType.id] = chatType;\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    createUi()\n    {\n        if(!this.uiScene){\n            Logger.warning('Missing UI Scene on ChatUI.');\n            return false;\n        }\n        // @TODO - BETA - Replace by UserInterface.\n        let {uiX, uiY} = this.uiScene.getUiConfig('chat');\n        this.uiChat = this.uiScene.add.dom(uiX, uiY).createFromCache('chat');\n        this.uiScene.elementsUi['chat'] = this.uiChat;\n        this.chatInput = this.uiChat.getChildByProperty('id', ChatConst.CHAT_INPUT);\n        if(!this.chatInput){\n            Logger.info('Missing chat input on ChatUI.');\n            return false;\n        }\n        this.setupKeyPressBehaviors();\n        this.chatInput.addEventListener('onfocusout', () => {\n            this.hideIsTyping();\n        });\n        this.setupSendButton();\n        this.setupOpenCloseButtons();\n        if(this.overHeadChatEnabled){\n            this.setupOverheadChatEvents();\n        }\n        if(this.isDefaultOpen){\n            this.showChatBox();\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    createTabs()\n    {\n        if(!this.showTabs){\n            return false;\n        }\n        this.tabs = new ChatTabs(this.gameManager, this.uiScene);\n        return true;\n    }\n\n    setupOverheadChatEvents()\n    {\n        this.gameManager.events.on('reldens.runPlayerAnimation', (playerEngine, playerId, playerState, playerSprite) => {\n            this.updateOverheadTextPosition(playerSprite);\n        });\n    }\n\n    setupOpenCloseButtons()\n    {\n        this.chatOpenButton = this.uiChat.getChildByProperty('id', ChatConst.CHAT_OPEN_BUTTON);\n        this.chatOpenButton?.addEventListener('click', () => {\n            this.showChatBox();\n            this.gameManager.events.emit(\n                'reldens.openUI',\n                {\n                    ui: this,\n                    openButton: this.chatOpenButton,\n                    dialogBox: this.uiChat,\n                    dialogContainer: this.uiChat.getChildByProperty('id', ChatConst.CHAT_UI),\n                    uiScene: this.uiScene\n                }\n            );\n        });\n        this.chatCloseButton = this.uiChat.getChildByProperty('id', ChatConst.CHAT_CLOSE_BUTTON);\n        this.chatCloseButton?.addEventListener('click', () => {\n            this.hideChatBox();\n            this.gameManager.events.emit(\n                'reldens.closeUI',\n                {\n                    ui: this,\n                    closeButton: this.chatCloseButton,\n                    openButton: this.chatOpenButton,\n                    dialogBox: this.uiChat,\n                    dialogContainer: this.uiChat.getChildByProperty('id', ChatConst.CHAT_UI),\n                    uiScene: this.uiScene\n                }\n            );\n        });\n    }\n\n    setupSendButton()\n    {\n        this.chatSendButton = this.uiChat.getChildByProperty('id', ChatConst.CHAT_SEND_BUTTON);\n        this.chatSendButton?.addEventListener('click', (event) => {\n            event.preventDefault();\n            this.sendChatMessage(this.chatInput, this.gameManager.activeRoomEvents);\n            this.chatInput.focus();\n        });\n    }\n\n    setupKeyPressBehaviors()\n    {\n        this.uiScene.input.keyboard.on('keyup-ENTER', () => {\n            if(!this.isFocussedOnChatInput()){\n                this.showChatBox();\n                this.chatInput.focus();\n            }\n        });\n        this.uiScene.input.keyboard.on('keyup-ESC', () => {\n            if(this.isFocussedOnChatInput()){\n                this.hideChatBox();\n                this.chatInput.blur();\n            }\n        });\n        this.chatInput.addEventListener('keyup', (event) => {\n            if(event.keyCode === Input.Keyboard.KeyCodes.ENTER){\n                event.preventDefault();\n                this.sendChatMessage();\n                return;\n            }\n            this.showIsTyping();\n        });\n    }\n\n    /**\n     * @param {PhaserSprite} playerSprite\n     * @param {string} message\n     * @returns {boolean}\n     */\n    showOverheadChat(playerSprite, message)\n    {\n        if(!this.overHeadChatEnabled){\n            return false;\n        }\n        if(playerSprite['overheadTextSprite']){\n            this.destroyTextSprite(playerSprite);\n        }\n        message = this.applyTextLimit(message, this.characterLimitOverhead);\n        playerSprite['overheadTextSprite'] = SpriteTextFactory.attachTextToSprite(\n            playerSprite,\n            message,\n            this.overheadText,\n            sc.get(this.overheadText, 'topOff', 0),\n            'overheadTextSprite',\n            this.gameManager.getActiveScene()\n        );\n        let timeOut = sc.get(this.overheadText, 'timeOut', false);\n        if(timeOut){\n            setTimeout(() => {\n                this.destroyTextSprite(playerSprite);\n            }, timeOut);\n        }\n    }\n\n    /**\n     * @param {PhaserSprite} playerSprite\n     * @returns {boolean}\n     */\n    updateOverheadTextPosition(playerSprite)\n    {\n        if(!playerSprite['overheadTextSprite']){\n            return false;\n        }\n        let relativePosition = SpriteTextFactory.getTextPosition(\n            playerSprite,\n            playerSprite.playerName,\n            this.overheadText,\n            sc.get(this.overheadText, 'topOff', 0)\n        );\n        playerSprite['overheadTextSprite'].x = relativePosition.x;\n        playerSprite['overheadTextSprite'].y = relativePosition.y;\n    }\n\n    /**\n     * @param {PhaserSprite} playerSprite\n     * @returns {boolean}\n     */\n    destroyTextSprite(playerSprite)\n    {\n        if(!playerSprite['overheadTextSprite']){\n            return false;\n        }\n        playerSprite['overheadTextSprite'].destroy();\n        delete playerSprite['overheadTextSprite'];\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    showIsTyping()\n    {\n        if(!this.overHeadChatEnabled || !this.isTyping){\n            return false;\n        }\n        if(!this.isFocussedOnChatInput()){\n            return false;\n        }\n        this.showOverheadChat(\n            this.gameManager.getCurrentPlayerAnimation(),\n            this.gameManager.config.getWithoutLogs(\n                'client/ui/chat/waitingContent',\n                this.t(ChatConst.SNIPPETS.WAITING)\n            )\n        );\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    hideIsTyping()\n    {\n        if(!this.isTyping){\n            return false;\n        }\n        this.destroyTextSprite(this.gameManager.getCurrentPlayerAnimation());\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isFocussedOnChatInput()\n    {\n        return this.gameManager.gameDom.activeElement() === this.chatInput;\n    }\n\n    showChatBox()\n    {\n        let box = this.uiChat.getChildByProperty('id', ChatConst.CHAT_UI);\n        box.classList.remove('hidden');\n        this.uiChat.setDepth(4);\n        this.chatOpenButton?.classList.add('hidden');\n        let readPanel = this.gameDom.getElement(ChatConst.SELECTORS.CHAT_MESSAGES);\n        if(readPanel){\n            readPanel.parentNode.scrollTop = readPanel.scrollHeight;\n        }\n        this.hideNotificationsBalloon();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    hideChatBox()\n    {\n        let box = this.uiChat.getChildByProperty('id', ChatConst.CHAT_UI);\n        if(!box){\n            Logger.info('Chat UI box not found.');\n            return false;\n        }\n        box.classList.add('hidden');\n        this.uiChat.setDepth(1);\n        this.chatOpenButton?.classList.remove('hidden');\n    }\n\n    showNotificationBalloon()\n    {\n        this.getActiveBalloon()?.classList.remove('hidden');\n    }\n\n    hideNotificationsBalloon()\n    {\n        this.getActiveBalloon()?.classList.add('hidden');\n    }\n\n    /**\n     * @returns {HTMLElement|boolean}\n     */\n    getActiveBalloon()\n    {\n        if(!sc.get(this.uiConfig, 'notificationBalloon')){\n            return false;\n        }\n        let chatBalloon = this.uiChat.getChildByProperty('id', ChatConst.CHAT_BALLOON);\n        if(!chatBalloon){\n            return false;\n        }\n        return chatBalloon;\n    }\n\n    /**\n     * @param {Array<Object>} messages\n     * @returns {boolean}\n     */\n    processMessagesQueue(messages)\n    {\n        if(0 === messages.length){\n            return false;\n        }\n        for(let message of messages){\n            this.attachNewMessage(message);\n        }\n    }\n\n    /**\n     * @param {Object} message\n     */\n    attachNewMessage(message)\n    {\n        if(!this.gameManager.gameEngine.uiScene.cache){\n            // expected while uiScene is being created:\n            // Logger.info('Missing uiScene cache on chat message.', message);\n            return;\n        }\n        let messageTemplate = this.gameManager.gameEngine.uiScene.cache.html.get('chatMessage');\n        let messageString = this.translateMessage(message);\n        let output = this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n            from: this.translateFrom(message),\n            color: ChatConst.TYPE_COLOR[message[ChatConst.TYPES.KEY]],\n            message: messageString\n        });\n        let defaultType = this.showTabs ? ChatConst.TYPES.MESSAGE : '';\n        let messageType = sc.get(message, ChatConst.TYPES.KEY, defaultType);\n        let chatType = sc.get(this.chatTypesById, messageType, false);\n        let appendToTab = '' !== messageType && chatType?.show_tab\n            ? this.gameManager.gameDom.getElement(ChatConst.SELECTORS.TAB_CONTENT_PREFIX+messageType)\n            : false;\n        if(appendToTab){\n            this.appendWithScroll(appendToTab, output);\n        }\n        let alsoShowInTab = chatType.also_show_in_type\n            ? this.gameManager.gameDom.getElement(ChatConst.SELECTORS.TAB_CONTENT_PREFIX+chatType.also_show_in_type)\n            : false;\n        if(alsoShowInTab && alsoShowInTab !== appendToTab){\n            this.appendWithScroll(alsoShowInTab, output);\n        }\n        let appendToMain = '' === messageType\n            ? this.gameManager.gameDom.getElement(ChatConst.SELECTORS.CHAT_MESSAGES)\n            : false;\n        if(appendToMain){\n            this.appendWithScroll(appendToMain, output);\n        }\n        if(this.appendErrorTypeOnActiveTab && ChatConst.TYPES.ERROR === messageType){\n            let activeTab = this.gameManager.gameDom.getElement(ChatConst.SELECTORS.TAB_CONTENT_ACTIVE);\n            if(\n                activeTab\n                && activeTab !== appendToTab\n                && activeTab !== alsoShowInTab\n            ){\n                this.appendWithScroll(activeTab, output);\n            }\n        }\n        if(!appendToTab && !alsoShowInTab && !appendToMain){\n            if(null === appendToTab){\n                Logger.warning('Element not found for selector: .tab-content-'+messageType);\n            }\n            if(null === alsoShowInTab){\n                Logger.warning('Element not found for selector: .tab-content-'+chatType.also_show_in_type);\n            }\n            Logger.warning('Chat message not attached to any tab or main panel.', {\n                message,\n                defaultType,\n                messageType,\n                chatType,\n                appendToMain,\n                appendToTab\n            });\n            return;\n        }\n        if(message[ChatConst.MESSAGE.FROM] && this.isValidMessageType(message[ChatConst.TYPES.KEY])){\n            let playerSprite = this.fetchPlayerByName(message[ChatConst.MESSAGE.FROM]);\n            if(playerSprite){\n                this.showOverheadChat(playerSprite, messageString);\n            }\n        }\n        if(!this.uiChat.getChildByProperty('id', ChatConst.CHAT_UI).classList.contains('hidden')){\n            return;\n        }\n        this.showNotificationBalloon();\n    }\n\n    /**\n     * @param {HTMLElement} appendTo\n     * @param {string} output\n     */\n    appendWithScroll(appendTo, output)\n    {\n        appendTo.innerHTML += output;\n        appendTo.parentNode.scrollTop = appendTo.scrollHeight;\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {string}\n     */\n    translateFrom(message)\n    {\n        let messageType = message[ChatConst.TYPES.KEY];\n        let from = message[ChatConst.MESSAGE.FROM] || ChatConst.TYPES.SYSTEM;\n        if(!this.isValidSnippetFromType(messageType)){\n            return from;\n        }\n        return this.t(ChatConst.SNIPPETS.PREFIX + ChatConst.TYPES.KEY + messageType);\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {string}\n     */\n    translateMessage(message)\n    {\n        let messageType = message[ChatConst.TYPES.KEY];\n        if(!this.isValidSnippetType(messageType)){\n            return message[ChatConst.MESSAGE.KEY];\n        }\n        let messageData = message[ChatConst.MESSAGE.DATA.KEY];\n        if(!messageData){\n            return this.t(message[ChatConst.MESSAGE.KEY]);\n        }\n        if(messageData[ChatConst.MESSAGE.DATA.MODIFIERS]){\n            let translatedConcat = '';\n            let targetLabel = messageData[ChatConst.MESSAGE.DATA.TARGET_LABEL];\n            let propertyKeys = Object.keys(messageData[ChatConst.MESSAGE.DATA.MODIFIERS]);\n            for(let propertyKey of propertyKeys){\n                let propertyLabel = this.t(propertyKey);\n                let propertyValue = messageData[ChatConst.MESSAGE.DATA.MODIFIERS][propertyKey];\n                translatedConcat += this.t(message[ChatConst.MESSAGE.KEY], {propertyValue, propertyLabel, targetLabel});\n            }\n            return translatedConcat;\n        }\n        return this.t(message[ChatConst.MESSAGE.KEY], messageData);\n    }\n\n    /**\n     * @param {string} snippetKey\n     * @param {Object} [params]\n     * @param {boolean} [activeLocale]\n     * @returns {string}\n     */\n    t(snippetKey, params = {}, activeLocale = false)\n    {\n        return this.gameManager.services.translator.t(snippetKey, params, activeLocale);\n    }\n\n    /**\n     * @param {number} messageType\n     * @returns {boolean}\n     */\n    isValidMessageType(messageType)\n    {\n        return -1 === this.validMessageTypes().indexOf(messageType);\n    }\n\n    /**\n     * @returns {Array<number>}\n     */\n    validMessageTypes()\n    {\n        return [Object.values(ChatConst.TYPES)];\n    }\n\n    /**\n     * @param {number} messageType\n     * @returns {boolean}\n     */\n    isValidSnippetType(messageType)\n    {\n        let validTypes = this.snippetsMessageTypes();\n        let typesKeys = Object.keys(validTypes);\n        for(let typeKey of typesKeys){\n            let type = validTypes[typeKey];\n            if(type === messageType){\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @returns {Object}\n     */\n    snippetsMessageTypes()\n    {\n        let types = Object.assign({}, ChatConst.TYPES);\n        delete types[ChatConst.TYPES.MESSAGE];\n        delete types[ChatConst.TYPES.PRIVATE];\n        delete types[ChatConst.TYPES.GLOBAL];\n        delete types[ChatConst.TYPES.TEAMS];\n        return types;\n    }\n\n    /**\n     * @param {number} from\n     * @returns {boolean}\n     */\n    isValidSnippetFromType(from)\n    {\n        return -1 !== [ChatConst.TYPES.SYSTEM, ChatConst.TYPES.ERROR].indexOf(from);\n    }\n\n    /**\n     * @param {string} playerName\n     * @returns {PhaserSprite|boolean}\n     */\n    fetchPlayerByName(playerName)\n    {\n        let players = this.gameManager.getCurrentPlayer().players;\n        let keys = Object.keys(players);\n        if(1 >= keys.length){\n            return false;\n        }\n        for(let i of keys){\n            let player = players[i];\n            if(player.playerName === playerName){\n                return player;\n            }\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    sendChatMessage()\n    {\n        // validate if there is anything to send:\n        if(!this.isValidMessage()){\n            return false;\n        }\n        // check if is a global chat (must begin with #) and if the global chat room is ready:\n        let messageAllowedText = this.applyTextLimit(this.chatInput.value, this.characterLimit);\n        let message = {act: ChatConst.CHAT_ACTION, m: messageAllowedText};\n        this.gameManager.events.emitSync('reldens.chatMessageObjectCreated', this, message);\n        // both global or private messages use the global chat room:\n        this.useGlobalRoom()\n            ? this.useGlobalRoomForMessage(message)\n            : this.gameManager.activeRoomEvents.send(message);\n        // for last empty the input once the message was sent:\n        this.chatInput.value = '';\n        if(this.closeChatBoxAfterSend){\n            this.hideChatBox();\n        }\n    }\n\n    /**\n     * @param {string} text\n     * @param {number} limit\n     * @returns {string}\n     */\n    applyTextLimit(text, limit)\n    {\n        // this is also validated on the server:\n        return 0 < limit && limit < text.length ? text.substring(0, limit) : text;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    useGlobalRoom()\n    {\n        return 0 === this.chatInput.value.indexOf('#') || 0 === this.chatInput.value.indexOf('@');\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isValidMessage()\n    {\n        // this is also validated on the server:\n        return this.chatInput.value && 0 < this.chatInput.value.replace('#', '').replace('@', '').trim().length;\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {boolean}\n     */\n    useGlobalRoomForMessage(message)\n    {\n        // if is global check the global chat room:\n        let globalChat = sc.get(this.gameManager.joinedRooms, ChatConst.CHAT_GLOBAL, false);\n        if(!globalChat){\n            Logger.error('Global chat room not found.');\n            return false;\n        }\n        if(0 === this.chatInput.value.indexOf('@')){\n            this.sendPrivateMessage(message, globalChat);\n            return;\n        }\n        this.globalSend(globalChat, message);\n    }\n\n    /**\n     * @param {Object} message\n     * @param {Object} globalChat\n     * @returns {boolean}\n     */\n    sendPrivateMessage(message, globalChat)\n    {\n        let playerName = this.chatInput.value.substring(1, this.chatInput.value.indexOf(' '));\n        if('@' === playerName){\n            return false;\n        }\n        message.t = playerName;\n        this.globalSend(globalChat, message);\n    }\n\n    /**\n     * @param {Object} globalChat\n     * @param {Object} message\n     */\n    globalSend(globalChat, message)\n    {\n        try {\n            globalChat.send('*', message);\n        } catch (error) {\n            Logger.critical(error);\n            this.gameDom.alertReload(this.gameManager.services.translator.t('game.errors.connectionLost'));\n        }\n    }\n\n}\n\nmodule.exports.ChatUi = ChatUi;\n"
  },
  {
    "path": "lib/chat/client/messages-listener.js",
    "content": "/**\n *\n * Reldens - MessagesListener\n *\n * Listens for chat messages from the server and queues or displays them.\n *\n */\n\nconst { ChatConst } = require('../constants');\n\n/**\n * @typedef {import('colyseus.js').Room} ColyseusRoom\n */\nclass MessagesListener\n{\n\n    /**\n     * @param {ColyseusRoom} room\n     * @param {Object} chatPack\n     * @returns {Promise<void>}\n     */\n    static async listenMessages(room, chatPack)\n    {\n        room.onMessage('*', (message) => {\n            if(ChatConst.CHAT_ACTION !== message.act){\n                return;\n            }\n            if(!chatPack.uiManager){\n                chatPack.messagesQueu.push(message);\n                return;\n            }\n            chatPack.uiManager.attachNewMessage(message);\n        });\n    }\n\n}\n\nmodule.exports.MessagesListener = MessagesListener;\n"
  },
  {
    "path": "lib/chat/client/plugin.js",
    "content": "/**\n *\n * Reldens - Chat Client Plugin\n *\n * Initializes and manages the chat system on the client side.\n *\n */\n\nconst { ChatUi } = require('./chat-ui');\nconst { MessagesListener } = require('./messages-listener');\nconst { TemplatesHandler } = require('./templates-handler');\nconst Translations = require('./snippets/en_US');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { ChatConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManagerSingleton} EventsManagerSingleton\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass ChatPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @param {GameManager} [props.gameManager]\n     * @param {EventsManagerSingleton} [props.events]\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in ActionsPlugin.');\n        }\n        /** @type {EventsManagerSingleton|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in ChatPlugin.');\n        }\n        /** @type {Array<Object>} */\n        this.messagesQueu = [];\n        /** @type {ChatUi|boolean} */\n        this.uiManager = false;\n        /** @type {Array<string>} */\n        this.joinRooms = [ChatConst.CHAT_GLOBAL];\n        this.setTranslations();\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setTranslations()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations, ChatConst.MESSAGE.DATA_VALUES);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        // chat messages are global for all rooms, so we use the generic event for every joined room:\n        this.events.on('reldens.joinedRoom', async (room) => {\n            await MessagesListener.listenMessages(room, this);\n        });\n        this.events.on('reldens.preloadUiScene', (preloadScene) => {\n            TemplatesHandler.preloadTemplates(preloadScene, this.gameManager.config.get('client/ui/chat/showTabs'));\n        });\n        this.events.on('reldens.createUiScene', (uiScene) => {\n            this.uiManager = new ChatUi(uiScene);\n            this.uiManager.createUi();\n            this.uiManager.createTabs();\n            this.uiManager.processMessagesQueue(this.messagesQueu);\n        });\n    }\n\n}\n\nmodule.exports.ChatPlugin = ChatPlugin;\n"
  },
  {
    "path": "lib/chat/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    chat: {\n        ctk3: 'System',\n        ctk10: 'System',\n        npcDamage: '%damage damage on %targetLabel',\n        dodgedSkill: '%targetLabel dodged %skill',\n        modifiersApply: '%propertyValue %propertyLabel on %targetLabel',\n        joinedRoom: '%playerName has joined %roomName',\n        leftRoom: '%playerName has left',\n        playerNotFound: 'Player \"%playerName\" not found',\n        globalMessagesNotAllowed: 'Global messages not allowed',\n        globalMessagePermissionDenied: 'Global message permission denied',\n        guestInvalidChangePoint: 'The room is not available for guest users.',\n        player: {\n            damage: '%damage damage on %targetLabel',\n            dodgedSkill: '%targetLabel dodged %skill'\n        },\n        tabs: {\n            message: 'General',\n            joined: 'Joined',\n            system: 'System',\n            private: 'Private',\n            damage: 'Damage',\n            reward: 'Rewards',\n            skill: 'Skills',\n            teams: 'Teams',\n            global: 'Global',\n            error: 'Error'\n        }\n    }\n}\n"
  },
  {
    "path": "lib/chat/client/templates-handler.js",
    "content": "/**\n *\n * Reldens - TemplatesHandler\n *\n * Preloads chat HTML templates into the Phaser scene cache.\n *\n */\n\n/**\n * @typedef {import('phaser').Scene} PhaserScene\n */\nclass TemplatesHandler\n{\n\n    /**\n     * @param {PhaserScene} preloadScene\n     * @param {boolean} showTabs\n     */\n    static preloadTemplates(preloadScene, showTabs)\n    {\n        // @TODO - BETA - Replace by loader replacing snake name file name by camel case for the template key.\n        let chatTemplatePath = '/assets/features/chat/templates/';\n        // @TODO - BETA - Move the preload HTML as part of the engine driver.\n        preloadScene.load.html('chat', chatTemplatePath+'ui-chat.html');\n        preloadScene.load.html('chatMessage', chatTemplatePath+'message.html');\n        if(showTabs){\n            preloadScene.load.html('chatTabsContainer', chatTemplatePath+'tabs-container.html');\n            preloadScene.load.html('chatTabLabel', chatTemplatePath+'tab-label.html');\n            preloadScene.load.html('chatTabContent', chatTemplatePath+'tab-content.html');\n        }\n    }\n\n}\n\nmodule.exports.TemplatesHandler = TemplatesHandler;\n"
  },
  {
    "path": "lib/chat/constants.js",
    "content": "/**\n *\n * Reldens - chat/constants\n *\n */\n\nlet snippetsPrefix = 'chat.';\nlet playerPrefix = 'player.';\nlet tabsPrefix = 'tabs.';\n\nlet types = {\n    KEY: 'ctk',\n    MESSAGE: 1,\n    JOINED: 2,\n    SYSTEM: 3,\n    PRIVATE: 4,\n    DAMAGE: 5,\n    REWARD: 6,\n    SKILL: 7,\n    TEAMS: 8,\n    GLOBAL: 9,\n    ERROR: 10\n};\n\nmodule.exports.ChatConst = {\n    ROOM_TYPE_CHAT: 'chat',\n    CHAT_ACTION: 'c',\n    TYPES: types,\n    CHAT_FROM: 'f',\n    CHAT_TO: 't',\n    CHAT_UI: 'chat-ui',\n    CHAT_FORM: 'chat-form',\n    CHAT_INPUT: 'chat-input',\n    CHAT_SEND_BUTTON: 'chat-send',\n    CHAT_CLOSE_BUTTON: 'chat-close',\n    CHAT_OPEN_BUTTON: 'chat-open',\n    CHAT_BALLOON: 'notification-balloon',\n    CHAT_GLOBAL: 'chat',\n    MESSAGE: {\n        KEY: 'm',\n        FROM: 'f',\n        TO: 't',\n        DATA: {\n            KEY: 'md',\n            SNIPPET: 'sp',\n            PLAYER_NAME: 'pn',\n            ROOM_NAME: 'rn',\n            DAMAGE: 'd',\n            TARGET_LABEL: 'tL',\n            SKILL_LABEL: 'sk',\n            MODIFIERS: 'mfs',\n        },\n        DATA_VALUES: {\n            NAMESPACE: 'chat',\n            pn: 'playerName',\n            rn:  'roomName',\n            d: 'damage',\n            tL: 'targetLabel',\n            sk: 'skillLabel',\n            mfs: 'modifiers'\n        }\n    },\n    SNIPPETS: {\n        PREFIX: snippetsPrefix,\n        PLAYER_PREFIX: playerPrefix,\n        TAB_PREFIX: tabsPrefix,\n        NPC_DAMAGE: snippetsPrefix+'npcDamage',\n        NPC_DODGED_SKILL: snippetsPrefix+'dodgedSkill',\n        MODIFIERS_APPLY: snippetsPrefix+'modifiersApply',\n        JOINED_ROOM: snippetsPrefix+'joinedRoom',\n        LEFT_ROOM: snippetsPrefix+'leftRoom',\n        PRIVATE_MESSAGE_PLAYER_NOT_FOUND: snippetsPrefix+'playerNotFound',\n        GLOBAL_MESSAGE_NOT_ALLOWED: snippetsPrefix+'globalMessageNotAllowed',\n        GLOBAL_MESSAGE_PERMISSION_DENIED: snippetsPrefix+'globalMessagePermissionDenied',\n        PLAYER:{\n            DAMAGE: snippetsPrefix+playerPrefix+'damage',\n            DODGED_SKILL: snippetsPrefix+playerPrefix+'dodgedSkill'\n        },\n        GUEST_INVALID_CHANGE_POINT: snippetsPrefix+'guestInvalidChangePoint',\n        WAITING: '...'\n    },\n    SELECTORS: {\n        CONTENTS: '#chat-contents',\n        CHAT_MESSAGES: '#chat-messages',\n        TAB_CONTENT_PREFIX: '.tab-content-',\n        TAB_CONTENT_ACTIVE: '.tab-content.active'\n    },\n    TYPE_COLOR: {\n        [types.MESSAGE]: '#ffffff',\n        [types.PRIVATE]: '#f39c12',\n        [types.PRIVATE+'.to']: '#00afff',\n        [types.GLOBAL]: '#ffff00',\n        [types.SYSTEM]: '#2ecc71',\n        [types.ERROR]: '#ff0000',\n        [types.DAMAGE]: '#ff0000',\n        [types.SYSTEM+'.modifiers']: '#0feeff',\n        [types.REWARD]: '#2ecc71',\n        [types.TEAMS]: '#2ecc71',\n    }\n};\n"
  },
  {
    "path": "lib/chat/message-factory.js",
    "content": "/**\n *\n * Reldens - MessageFactory\n *\n * Creates standardized chat message objects for client-server communication.\n *\n */\n\nconst { GameConst } = require('../game/constants');\nconst { ChatConst } = require('./constants');\nconst { Logger } = require('@reldens/utils');\n\nclass MessageFactory\n{\n\n    /**\n     * @param {number} type\n     * @param {string} message\n     * @param {Object} [messageData]\n     * @param {string} [from]\n     * @param {string} [to]\n     * @returns {Object|boolean}\n     */\n    static create(type, message, messageData = {}, from, to)\n    {\n        if(!type){\n            Logger.error('Missing \"type\" on MessageFactory.', {type, message});\n            return false;\n        }\n        if(!message){\n            Logger.error('Missing \"message\" on MessageFactory.', {type, message});\n            return false;\n        }\n        let messageSendModel = {\n            [GameConst.ACTION_KEY]: ChatConst.CHAT_ACTION,\n            [ChatConst.TYPES.KEY]: type,\n            [ChatConst.MESSAGE.KEY]: message,\n        };\n        if(from){\n            messageSendModel[ChatConst.MESSAGE.FROM] = from;\n        }\n        if(to){\n            messageSendModel[ChatConst.MESSAGE.TO] = to;\n        }\n        if(0 < Object.keys(messageData).length){\n            messageSendModel[ChatConst.MESSAGE.DATA.KEY] = messageData;\n        }\n        return messageSendModel;\n    }\n\n    /**\n     * @param {string} message\n     * @param {Object} [messageData]\n     * @returns {string}\n     */\n    static withDataToJson(message, messageData = {})\n    {\n        return JSON.stringify(Object.assign({[ChatConst.MESSAGE.KEY]: message.toString()}, messageData));\n    }\n\n}\n\nmodule.exports.MessageFactory = MessageFactory;\n"
  },
  {
    "path": "lib/chat/server/entities/chat-entity-override.js",
    "content": "/**\n *\n * Reldens - ChatEntityOverride\n *\n * Extends the chat entity with custom property aliases for the admin panel.\n *\n */\n\nconst { ChatEntity } = require('../../../../generated-entities/entities/chat-entity');\n\nclass ChatEntityOverride extends ChatEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config = this.updateProperty(config, 'player_id', 'alias', 'chat_player_id');\n        config = this.updateProperty(config, 'room_id', 'alias', 'chat_room');\n        config = this.updateProperty(config, 'private_player_id', 'alias', 'chat_private_player_id');\n        config = this.updateProperty(config, 'message_type', 'alias', 'chat_type');\n        config.navigationPosition = 1000;\n        config.sort = {direction: 'desc', sortBy: 'id'};\n        return config;\n    }\n\n    /**\n     * @param {Object} config\n     * @param {string} propertyName\n     * @param {string} propertyField\n     * @param {string} propertyValue\n     * @returns {Object}\n     */\n    static updateProperty(config, propertyName, propertyField, propertyValue)\n    {\n        config.properties[propertyName][propertyField] = propertyValue;\n        return config;\n    }\n\n}\n\nmodule.exports.ChatEntityOverride = ChatEntityOverride;\n"
  },
  {
    "path": "lib/chat/server/entities/chat-message-types-entity-override.js",
    "content": "/**\n *\n * Reldens - ChatMessageTypesEntityOverride\n *\n * Extends the chat message types entity with custom property aliases for the admin panel.\n *\n */\n\nconst { ChatMessageTypesEntity } = require('../../../../generated-entities/entities/chat-message-types-entity');\n\nclass ChatMessageTypesEntityOverride extends ChatMessageTypesEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.properties['also_show_in_type']['alias'] = 'chat_message_type_id';\n       return config;\n    }\n\n}\n\nmodule.exports.ChatMessageTypesEntityOverride = ChatMessageTypesEntityOverride;\n"
  },
  {
    "path": "lib/chat/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { ChatEntityOverride } = require('./entities/chat-entity-override');\nconst { ChatMessageTypesEntityOverride } = require('./entities/chat-message-types-entity-override');\n\nmodule.exports.entitiesConfig = {\n    chat: ChatEntityOverride,\n    chatMessageTypes: ChatMessageTypesEntityOverride\n};\n"
  },
  {
    "path": "lib/chat/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        chat: 'Chat',\n        chatMessageTypes: 'Messages Types'\n    }\n};\n"
  },
  {
    "path": "lib/chat/server/event-listener/guest-invalid-change-point.js",
    "content": "/**\n *\n * Reldens - GuestInvalidChangePoint\n *\n * Sends chat error messages when guest users attempt invalid room changes.\n *\n */\n\nconst { MessageFactory } = require('../../message-factory');\nconst { ChatConst } = require('../../constants');\nconst { Logger } = require('@reldens/utils');\n\nclass GuestInvalidChangePoint\n{\n\n    /**\n     * @param {Object} event\n     * @param {Object} chatManager\n     * @returns {Promise<void>}\n     */\n    async sendMessage(event, chatManager)\n    {\n        let message = ChatConst.SNIPPETS.GUEST_INVALID_CHANGE_POINT;\n        let messageObject = MessageFactory.create(ChatConst.TYPES.ERROR, message, {});\n        event.contactClient.send('*', messageObject);\n        await chatManager.saveMessage(\n            MessageFactory.withDataToJson(message, {}),\n            event.playerSchema.player_id,\n            event.playerSchema.state.room_id,\n            false,\n            ChatConst.TYPES.ERROR\n        ).catch((error) => {\n            Logger.error('Save chat message error on player damage callback.', error);\n        });\n    }\n\n}\n\nmodule.exports.GuestInvalidChangePoint = GuestInvalidChangePoint;\n"
  },
  {
    "path": "lib/chat/server/event-listener/npc-skills.js",
    "content": "/**\n *\n * Reldens - NpcSkills\n *\n * Listens for NPC skill events and sends chat messages for damage, modifiers, and dodges.\n *\n */\n\nconst { NpcDamageCallback } = require('../messages/npc-damage-callback');\nconst { NpcModifiersCallback } = require('../messages/npc-modifiers-callback');\nconst { NpcDodgeCallback } = require('../messages/npc-dodge-callback');\nconst { SkillsEvents, SkillConst } = require('@reldens/skills');\nconst { sc } = require('@reldens/utils');\n\nclass NpcSkills\n{\n\n    /**\n     * @param {Object} props\n     * @param {Object} chatConfig\n     * @param {Object} chatManager\n     */\n    static listenEvents(props, chatConfig, chatManager)\n    {\n        let skillsByType = this.fetchSkillsByType(props, chatConfig);\n        let attackSkill = sc.get(skillsByType, SkillConst.SKILL.TYPE.ATTACK, null);\n        let effectSkill = sc.get(skillsByType, SkillConst.SKILL.TYPE.EFFECT, null);\n        this.listenDamageEvent(attackSkill, chatConfig, chatManager);\n        this.listenModifiersEvent(effectSkill, chatConfig, chatManager);\n        this.listenAfterRunLogicEvent((attackSkill || effectSkill), chatConfig, chatManager);\n    }\n\n    /**\n     * @param {Object} attackSkill\n     * @param {Object} chatConfig\n     * @param {Object} chatManager\n     */\n    static listenDamageEvent(attackSkill, chatConfig, chatManager)\n    {\n        if(!chatConfig.damageMessages || null === attackSkill){\n            return;\n        }\n        attackSkill.listenEvent(\n            SkillsEvents.SKILL_ATTACK_APPLY_DAMAGE,\n            async (skill, target, damage) => {\n                if(!damage){\n                    return;\n                }\n                await NpcDamageCallback.sendMessage({skill, target, damage, chatManager});\n            },\n            attackSkill.getOwnerUniqueEventKey('skillAttackApplyDamageChat'),\n            // @NOTE: objects ownerIdProperty is their uid and that's used as master key for the object event listeners.\n            attackSkill.owner[attackSkill.ownerIdProperty]\n        );\n    }\n\n    /**\n     * @param {Object} effectSkill\n     * @param {Object} chatConfig\n     * @param {Object} chatManager\n     */\n    static listenModifiersEvent(effectSkill, chatConfig, chatManager)\n    {\n        if(!chatConfig.effectMessages || null === effectSkill){\n            return;\n        }\n        effectSkill.listenEvent(\n            SkillsEvents.SKILL_EFFECT_TARGET_MODIFIERS,\n            async (skill) => {\n                await NpcModifiersCallback.sendMessage({skill, chatManager});\n            },\n            effectSkill.getOwnerUniqueEventKey('skillApplyModifiersChat'),\n            // @NOTE: objects ownerIdProperty is their uid and that's used as master key for the object event listeners.\n            effectSkill.owner[effectSkill.ownerIdProperty]\n        );\n    }\n\n    /**\n     * @param {Object} skillForLogic\n     * @param {Object} chatConfig\n     * @param {Object} chatManager\n     */\n    static listenAfterRunLogicEvent(skillForLogic, chatConfig, chatManager)\n    {\n        if(!chatConfig.dodgeMessages || null === skillForLogic){\n            return;\n        }\n        skillForLogic.listenEvent(\n            SkillsEvents.SKILL_AFTER_RUN_LOGIC,\n            async (skill) => {\n                if(SkillConst.SKILL_STATES.DODGED !== skill.lastState){\n                    return;\n                }\n                await NpcDodgeCallback.sendMessage({skill, chatManager});\n            },\n            skillForLogic.getOwnerUniqueEventKey('skillDodgeChat'),\n            // @NOTE: objects ownerIdProperty is their uid and that's used as master key for the object event listeners.\n            skillForLogic.owner[skillForLogic.ownerIdProperty]\n        );\n    }\n\n    /**\n     * @param {Object} props\n     * @param {Object} chatConfig\n     * @returns {Object}\n     */\n    static fetchSkillsByType(props, chatConfig)\n    {\n        let skillInstancesList = props.enemyObject?.actions || {};\n        let keys = Object.keys(skillInstancesList);\n        if(0 === keys.length){\n            return {};\n        }\n        let skillsByType = {};\n        for(let i of keys){\n            let skill = skillInstancesList[i];\n            if(sc.hasOwn(skillsByType, skill.type)){\n                continue;\n            }\n            if(SkillConst.SKILL.TYPE.ATTACK === skill.type || SkillConst.SKILL.TYPE.ATTACK === skill.parentType){\n                skillsByType[SkillConst.SKILL.TYPE.ATTACK] = skill;\n            }\n            if(SkillConst.SKILL.TYPE.EFFECT === skill.type || SkillConst.SKILL.TYPE.EFFECT === skill.parentType){\n                skillsByType[SkillConst.SKILL.TYPE.EFFECT] = skill;\n            }\n            let totalValidTypes = sc.get(chatConfig, 'totalValidTypes', 2);\n            if(totalValidTypes === Object.keys(skillsByType).length){\n                break;\n            }\n        }\n        return skillsByType;\n    }\n\n}\n\nmodule.exports.NpcSkills = NpcSkills;\n"
  },
  {
    "path": "lib/chat/server/event-listener/player-skills.js",
    "content": "/**\n *\n * Reldens - PlayerSkills\n *\n * Listens for player skill events and sends chat messages for damage, modifiers, and dodges.\n *\n */\n\nconst { PlayerDamageCallback } = require('../messages/player-damage-callback');\nconst { PlayerModifiersCallback } = require('../messages/player-modifiers-callback');\nconst { PlayerDodgeCallback } = require('../messages/player-dodge-callback');\nconst { SkillsEvents, SkillConst } = require('@reldens/skills');\n\nclass PlayerSkills\n{\n\n    /**\n     * @param {Object} classPath\n     * @param {Object} chatConfig\n     * @param {Object} chatManager\n     */\n    static listenEvents(classPath, chatConfig, chatManager)\n    {\n        this.listenDamageEvent(chatConfig, classPath, chatManager);\n        this.listenModifiersEvent(chatConfig, classPath, chatManager);\n        this.listenAfterRunLogicEvent(chatConfig, classPath, chatManager);\n    }\n\n    /**\n     * @param {Object} chatConfig\n     * @param {Object} classPath\n     * @param {Object} chatManager\n     */\n    static listenDamageEvent(chatConfig, classPath, chatManager)\n    {\n        if(!chatConfig.damageMessages){\n            return;\n        }\n        classPath.listenEvent(\n            SkillsEvents.SKILL_ATTACK_APPLY_DAMAGE,\n            async (skill, target, damage) => {\n                if(!damage){\n                    return;\n                }\n                await PlayerDamageCallback.sendMessage({\n                    skill,\n                    target,\n                    damage,\n                    client: classPath.owner.skillsServer.client.client,\n                    chatManager: chatManager\n                });\n            },\n            classPath.getOwnerUniqueEventKey('skillAttackApplyDamageChat'),\n            classPath.getOwnerEventKey()\n        );\n    }\n\n    /**\n     * @param {Object} chatConfig\n     * @param {Object} classPath\n     * @param {Object} chatManager\n     */\n    static listenModifiersEvent(chatConfig, classPath, chatManager)\n    {\n        if(!chatConfig.effectMessages){\n            return;\n        }\n        classPath.listenEvent(\n            SkillsEvents.SKILL_EFFECT_TARGET_MODIFIERS,\n            async (skill) => {\n                await PlayerModifiersCallback.sendMessage({\n                    skill,\n                    client: classPath.owner.skillsServer.client.client,\n                    chatManager: chatManager\n                });\n            },\n            classPath.getOwnerUniqueEventKey('skillApplyModifiersChat'),\n            classPath.getOwnerEventKey()\n        );\n    }\n\n    /**\n     * @param {Object} chatConfig\n     * @param {Object} classPath\n     * @param {Object} chatManager\n     */\n    static listenAfterRunLogicEvent(chatConfig, classPath, chatManager)\n    {\n        if(!chatConfig.dodgeMessages){\n            return;\n        }\n        classPath.listenEvent(\n            SkillsEvents.SKILL_AFTER_RUN_LOGIC,\n            async (skill) => {\n                if(SkillConst.SKILL_STATES.DODGED !== skill.lastState){\n                    return;\n                }\n                await PlayerDodgeCallback.sendMessage({\n                    skill,\n                    client: classPath.owner.skillsServer.client.client,\n                    chatManager: chatManager\n                });\n            },\n            classPath.getOwnerUniqueEventKey('skillDodgeChat'),\n            classPath.getOwnerEventKey()\n        );\n    }\n\n}\n\nmodule.exports.PlayerSkills = PlayerSkills;\n"
  },
  {
    "path": "lib/chat/server/manager.js",
    "content": "/**\n *\n * Reldens - ChatManager\n *\n * Manages chat message persistence and database operations.\n *\n */\n\nconst { ChatConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass ChatManager\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {Object|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        /** @type {Object} */\n        this.chatRepository = this.dataServer?.getEntity('chat');\n    }\n\n    /**\n     * @param {string} message\n     * @param {number} playerId\n     * @param {number} roomId\n     * @param {Object} clientToPlayerSchema\n     * @param {number} messageType\n     * @returns {Promise<boolean>}\n     */\n    async saveMessage(message, playerId, roomId, clientToPlayerSchema, messageType)\n    {\n        if(!this.dataServer){\n            Logger.error('Data Server undefined in ChatManager.');\n        }\n        let entryData = {\n            player_id: playerId,\n            message: message,\n            message_time: sc.getCurrentDate(),\n            message_type: messageType || ChatConst.TYPES.MESSAGE\n        };\n        if(roomId){\n            entryData.room_id = roomId;\n        }\n        if(clientToPlayerSchema && sc.hasOwn(clientToPlayerSchema, 'id')){\n            entryData.private_player_id = clientToPlayerSchema.state.player_id;\n        }\n        try {\n            let insertResult = await this.chatRepository.create(entryData);\n            if(!insertResult){\n                Logger.critical('Chat message insert error.', entryData);\n                return false;\n            }\n        } catch (error) {\n            Logger.critical('Chat message save error.', entryData, error.message);\n            return false;\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.ChatManager = ChatManager;\n"
  },
  {
    "path": "lib/chat/server/message-actions.js",
    "content": "/**\n *\n * Reldens - ChatMessageActions\n *\n * Handles chat message actions including broadcasting and saving messages.\n *\n */\n\nconst { ChatManager } = require('./manager');\nconst { MessageFactory } = require('../message-factory');\nconst { MessagesGuard } = require('./messages-guard');\nconst { Cleaner } = require('../cleaner');\nconst { ChatConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} ColyseusClient\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass ChatMessageActions\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        let dataServer = sc.get(props, 'dataServer', false);\n        if(!dataServer){\n            Logger.error('DataServer undefined in ChatMessageActions.');\n        }\n        /** @type {ChatManager} */\n        this.chatManager = new ChatManager({dataServer});\n    }\n\n    /**\n     * @param {ColyseusClient} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {Object} playerSchema\n     * @returns {Promise<void>}\n     */\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        await this.chatAction(data, room, playerSchema);\n        await this.clientJoinAction(data, room, playerSchema);\n    }\n\n    /**\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async clientJoinAction(data, room, playerSchema)\n    {\n        if(!data || !room || !playerSchema){\n            return false;\n        }\n        if(data.act !== GameConst.CLIENT_JOINED || !room.config.get('server/chat/messages/broadcast_join')){\n            return false;\n        }\n        let message = ChatConst.SNIPPETS.JOINED_ROOM;\n        let messageData = {\n            [ChatConst.MESSAGE.DATA.PLAYER_NAME]: playerSchema.playerName,\n            [ChatConst.MESSAGE.DATA.ROOM_NAME]: room.roomName,\n        };\n        let messageObject = MessageFactory.create(\n            ChatConst.TYPES.SYSTEM,\n            message,\n            messageData\n        );\n        room.broadcast('*', messageObject);\n        let playerId = playerSchema.player_id;\n        let roomId = playerSchema.state.room_id;\n        let saveResult = await this.chatManager.saveMessage(\n            MessageFactory.withDataToJson(message, messageData),\n            playerId,\n            roomId,\n            false,\n            ChatConst.TYPES.JOINED\n        );\n        if(!saveResult){\n            Logger.critical('Joined room chat save error.', messageObject, playerId, roomId);\n        }\n    }\n\n    /**\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async chatAction(data, room, playerSchema)\n    {\n        if(!data || !room || !playerSchema){\n            return false;\n        }\n        if(!MessagesGuard.validate(data)){\n            return false;\n        }\n        let message = Cleaner.cleanMessage(\n            data[ChatConst.MESSAGE.KEY],\n            room.config.get('client/chat/messages/characterLimit')\n        );\n        let messageData = MessageFactory.create(ChatConst.TYPES.MESSAGE, message, {}, playerSchema.playerName);\n        room.broadcast('*', messageData);\n        let playerId = playerSchema.player_id;\n        let roomId = playerSchema.state.room_id;\n        let saveResult = await this.chatManager.saveMessage(message, playerId, roomId, false, ChatConst.TYPES.MESSAGE);\n        if(!saveResult){\n            Logger.critical('Chat save error.', messageData, playerId, roomId);\n        }\n    }\n}\n\nmodule.exports.ChatMessageActions = ChatMessageActions;\n"
  },
  {
    "path": "lib/chat/server/messages/message-data-mapper.js",
    "content": "/**\n *\n * Reldens - MessageDataMapper\n *\n * Maps skill data into a chat message format with modifiers information.\n *\n */\n\nconst { ChatConst } = require('../../constants');\nconst { sc } = require('@reldens/utils');\n\nclass MessageDataMapper\n{\n\n    /**\n     * @param {Object} skill\n     * @returns {Object|boolean}\n     */\n    static mapMessageWithData(skill)\n    {\n        let lastAppliedModifiers = sc.get(skill, 'lastAppliedModifiers', {});\n        let appliedModifiersKeys = Object.keys(lastAppliedModifiers);\n        if(0 === appliedModifiersKeys.length){\n            return false;\n        }\n        let isObjectTarget = sc.hasOwn(skill.target, 'key');\n        let targetLabel = isObjectTarget ? skill.target.title : skill.target.playerName;\n        let message = ChatConst.SNIPPETS.MODIFIERS_APPLY;\n        let messageData = {\n            [ChatConst.MESSAGE.DATA.TARGET_LABEL]: targetLabel,\n            [ChatConst.MESSAGE.DATA.MODIFIERS]: {}\n        };\n        for(let i of appliedModifiersKeys){\n            let value = lastAppliedModifiers[i];\n            let property = i.split('/').pop();\n            messageData[ChatConst.MESSAGE.DATA.MODIFIERS][property] = value;\n        }\n        return {message, messageData};\n    }\n\n}\n\nmodule.exports.MessageDataMapper = MessageDataMapper;\n"
  },
  {
    "path": "lib/chat/server/messages/npc-damage-callback.js",
    "content": "/**\n *\n * Reldens - NpcDamageCallback\n *\n * Sends chat messages when NPCs deal damage to players or other targets.\n *\n */\n\nconst { MessageFactory } = require('../../message-factory');\nconst { Validator } = require('./validator');\nconst { ChatConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass NpcDamageCallback\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<void>}\n     */\n    static async sendMessage(props)\n    {\n        if(!Validator.validateMessage(props, ['skill', 'chatManager', 'damage', 'target'])){\n            Logger.error('Invalid message on NpcDamageCallback.', props);\n            return false;\n        }\n        let {skill, target, damage, chatManager} = props;\n        let client = target?.skillsServer?.client?.client || null;\n        if(!client){\n            Logger.error('Client not defined on NpcDamageCallback.', target);\n            return false;\n        }\n        let isObjectTarget = sc.hasOwn(target, 'key');\n        let targetLabel = isObjectTarget ? target.title : target.playerName;\n        let isObjectOwner = sc.hasOwn(skill.owner, 'key');\n        let from = isObjectOwner ? skill.owner.title : skill.owner.playerName;\n        let message = ChatConst.SNIPPETS.NPC_DAMAGE;\n        let messageData = {\n            [ChatConst.MESSAGE.DATA.TARGET_LABEL]: targetLabel,\n            [ChatConst.MESSAGE.DATA.DAMAGE]: damage,\n        };\n        let messageObject = MessageFactory.create(ChatConst.TYPES.DAMAGE, message, messageData, from);\n        client.send(messageObject);\n        let playerId = target?.player_id || null;\n        let roomId = skill.owner?.room_id || null;\n        let saveResult = await chatManager.saveMessage(\n            MessageFactory.withDataToJson(message, messageData),\n            playerId,\n            roomId,\n            false,\n            ChatConst.TYPES.DAMAGE\n        );\n        if(!saveResult){\n            Logger.error('Save chat message error on NPC damage callback.', messageObject, playerId, roomId);\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.NpcDamageCallback = NpcDamageCallback;\n"
  },
  {
    "path": "lib/chat/server/messages/npc-dodge-callback.js",
    "content": "/**\n *\n * Reldens - NpcDodgeCallback\n *\n * Sends chat messages when NPC skills are dodged by targets.\n *\n */\n\nconst { MessageFactory } = require('../../message-factory');\nconst { Validator } = require('./validator');\nconst { ChatConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass NpcDodgeCallback\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<void>}\n     */\n    static async sendMessage(props)\n    {\n        if(!Validator.validateMessage(props, ['skill', 'chatManager'])){\n            Logger.error('Invalid message on NpcDodgeCallback.', props);\n            return false;\n        }\n        let {skill, chatManager} = props;\n        let client = skill.target?.skillsServer?.client?.client || null;\n        if(!client){\n            Logger.error('Client not defined on NpcDodgeCallback.', skill);\n            return false;\n        }\n        let isObjectTarget = sc.hasOwn(skill.target, 'key');\n        let targetLabel = isObjectTarget ? skill.target.title : skill.target.playerName;\n        let isObjectOwner = sc.hasOwn(skill.owner, 'key');\n        let from = isObjectOwner ? skill.owner.title : skill.owner.playerName;\n        let message = ChatConst.SNIPPETS.NPC_DODGED_SKILL;\n        let messageData = {\n            [ChatConst.MESSAGE.DATA.TARGET_LABEL]: targetLabel,\n            [ChatConst.MESSAGE.DATA.SKILL_LABEL]: skill.label,\n        };\n        let messageObject = MessageFactory.create(ChatConst.TYPES.SKILL, message, messageData, from);\n        client.send(messageObject);\n        let playerId = skill.target?.player_id || null;\n        let roomId = skill.owner?.room_id || null;\n        let saveResult = await chatManager.saveMessage(\n            MessageFactory.withDataToJson(message, messageData),\n            playerId,\n            roomId,\n            false,\n            ChatConst.TYPES.SKILL\n        );\n        if(!saveResult){\n            Logger.error('Save chat message error on npc dodge callback.', messageObject, playerId, roomId);\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.NpcDodgeCallback = NpcDodgeCallback;\n"
  },
  {
    "path": "lib/chat/server/messages/npc-modifiers-callback.js",
    "content": "/**\n *\n * Reldens - NpcModifiersCallback\n *\n * Sends chat messages when NPC skills apply modifiers to targets.\n *\n */\n\nconst { MessageFactory } = require('../../message-factory');\nconst { MessageDataMapper } = require('./message-data-mapper');\nconst { Validator } = require('./validator');\nconst { ChatConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass NpcModifiersCallback\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<void>}\n     */\n    static async sendMessage(props)\n    {\n        if(!Validator.validateMessage(props, ['skill', 'chatManager'])){\n            Logger.error('Invalid message on NpcModifiersCallback.', props);\n            return false;\n        }\n        let {skill, chatManager} = props;\n        let client = skill.target?.skillsServer?.client?.client || null;\n        if(!client){\n            Logger.info('Client not defined on NpcModifiersCallback.', skill);\n            return false;\n        }\n        let messageWithData = MessageDataMapper.mapMessageWithData(skill);\n        if(!messageWithData){\n            return false;\n        }\n        let {message, messageData} = messageWithData;\n        let isObjectOwner = sc.hasOwn(skill.owner, 'key');\n        let from = isObjectOwner ? skill.owner.title : skill.owner.playerName;\n        let messageObject = MessageFactory.create(ChatConst.TYPES.SKILL, message, messageData, from);\n        client.send(messageObject);\n        let playerId = skill.target?.player_id || null;\n        let roomId = skill.owner?.room_id || null;\n        let saveResult = await chatManager.saveMessage(\n            MessageFactory.withDataToJson(message, messageData),\n            playerId,\n            roomId,\n            false,\n            ChatConst.TYPES.SKILL\n        );\n        if(!saveResult){\n            Logger.error('Save chat message error on modifiers callback.', messageObject, playerId, roomId);\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.NpcModifiersCallback = NpcModifiersCallback;\n"
  },
  {
    "path": "lib/chat/server/messages/player-damage-callback.js",
    "content": "/**\n *\n * Reldens - PlayerDamageCallback\n *\n * Sends chat messages when players deal damage to targets.\n *\n */\n\nconst { MessageFactory } = require('../../message-factory');\nconst { Validator } = require('./validator');\nconst { ChatConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass PlayerDamageCallback\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<void>}\n     */\n    static async sendMessage(props)\n    {\n        if(!Validator.validateMessage(props, ['skill', 'client', 'chatManager', 'damage', 'target'])){\n            Logger.error('Invalid message on PlayerDamageCallback.', props);\n            return false;\n        }\n        let {skill, target, damage, client, chatManager} = props;\n        if(!client){\n            Logger.info('Client not defined on PlayerDamageCallback.', skill);\n            return false;\n        }\n        let isObjectTarget = sc.hasOwn(target, 'key');\n        let targetLabel = isObjectTarget ? target.title : target.playerName;\n        let message = ChatConst.SNIPPETS.PLAYER.DAMAGE;\n        let messageData = {\n            [ChatConst.MESSAGE.DATA.TARGET_LABEL]: targetLabel,\n            [ChatConst.MESSAGE.DATA.DAMAGE]: damage,\n        };\n        let messageObject = MessageFactory.create(ChatConst.TYPES.DAMAGE, message, messageData, skill.owner.playerName);\n        client.send(messageObject);\n        let targetClient = skill.target?.skillsServer?.client?.client || null;\n        if(!isObjectTarget && targetClient && targetClient !== client){\n            targetClient.send(messageObject);\n        }\n        let playerId = skill.owner?.player_id || null;\n        let roomId = skill.owner?.state?.room_id || null;\n        let saveResult = await chatManager.saveMessage(\n            MessageFactory.withDataToJson(message, messageData),\n            playerId,\n            roomId,\n            false,\n            ChatConst.TYPES.DAMAGE\n        );\n        if(!saveResult){\n            Logger.error('Save chat message error on player damage callback.', messageObject, playerId, roomId);\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.PlayerDamageCallback = PlayerDamageCallback;\n"
  },
  {
    "path": "lib/chat/server/messages/player-dodge-callback.js",
    "content": "/**\n *\n * Reldens - PlayerDodgeCallback\n *\n * Sends chat messages when player skills are dodged by targets.\n *\n */\n\nconst { MessageFactory } = require('../../message-factory');\nconst { Validator } = require('./validator');\nconst { ChatConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass PlayerDodgeCallback\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<void>}\n     */\n    static async sendMessage(props)\n    {\n        if(!Validator.validateMessage(props, ['skill', 'client', 'chatManager'])){\n            Logger.error('Invalid message on PlayerDodgeCallback.', props);\n            return false;\n        }\n        let {skill, client, chatManager} = props;\n        if(!client){\n            Logger.info('Client not defined on PlayerDamageCallback.', skill);\n            return false;\n        }\n        let isObjectTarget = sc.hasOwn(skill.target, 'key');\n        let targetLabel = isObjectTarget ? skill.target.title : skill.target.playerName;\n        let message = ChatConst.SNIPPETS.PLAYER.DODGED_SKILL;\n        let messageData = {\n            [ChatConst.MESSAGE.DATA.TARGET_LABEL]: targetLabel,\n            [ChatConst.MESSAGE.DATA.SKILL_LABEL]: skill.label,\n        };\n        let messageObject = MessageFactory.create(ChatConst.TYPES.SKILL, message, messageData, skill.owner.playerName);\n        client.send(messageObject);\n        let targetClient = skill.target?.skillsServer?.client?.client || null;\n        if(!isObjectTarget && targetClient && targetClient !== client){\n            targetClient.send(messageObject);\n        }\n        let playerId = skill.owner?.player_id || null;\n        let roomId = skill.owner?.state?.room_id || null;\n        let saveResult = await chatManager.saveMessage(\n            MessageFactory.withDataToJson(message, messageData),\n            playerId,\n            roomId,\n            false,\n            ChatConst.TYPES.SKILL\n        );\n        if(!saveResult){\n            Logger.error('Save chat message error on player dodge callback.', messageObject, playerId, roomId);\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.PlayerDodgeCallback = PlayerDodgeCallback;\n"
  },
  {
    "path": "lib/chat/server/messages/player-modifiers-callback.js",
    "content": "/**\n *\n * Reldens - PlayerModifiersCallback\n *\n * Sends chat messages when player skills apply modifiers to targets.\n *\n */\n\nconst { MessageFactory } = require('../../message-factory');\nconst { MessageDataMapper } = require('./message-data-mapper');\nconst { Validator } = require('./validator');\nconst { ChatConst } = require('../../constants');\nconst { Logger, sc} = require('@reldens/utils');\n\nclass PlayerModifiersCallback\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<void>}\n     */\n    static async sendMessage(props)\n    {\n        if(!Validator.validateMessage(props, ['skill', 'client', 'chatManager'])){\n            Logger.error('Invalid message on PlayerModifiersCallback.', props);\n            return false;\n        }\n        let {skill, client, chatManager} = props;\n        if(!client){\n            Logger.info('Client not defined on PlayerModifiersCallback.', skill);\n            return false;\n        }\n        let messageWithData = MessageDataMapper.mapMessageWithData(skill);\n        if(!messageWithData){\n            return false;\n        }\n        let {message, messageData} = messageWithData;\n        let messageObject = MessageFactory.create(ChatConst.TYPES.SKILL, message, messageData, skill.owner.playerName);\n        client.send(messageObject);\n        let targetClient = skill.target?.skillsServer?.client?.client || null;\n        let isObjectTarget = sc.hasOwn(skill.target, 'key');\n        if(!isObjectTarget && targetClient && targetClient !== client){\n            targetClient.send(messageObject);\n        }\n        let playerId = skill.owner.player_id;\n        let roomId = skill.owner.state.room_id;\n        let saveResult = await chatManager.saveMessage(\n            MessageFactory.withDataToJson(message, messageData),\n            playerId,\n            roomId,\n            false,\n            ChatConst.TYPES.SKILL\n        );\n        if(!saveResult){\n            Logger.error('Save chat message error on modifiers callback.', messageObject, playerId, roomId);\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.PlayerModifiersCallback = PlayerModifiersCallback;\n"
  },
  {
    "path": "lib/chat/server/messages/validator.js",
    "content": "/**\n *\n * Reldens - Validator\n *\n * Validates chat message objects have required properties.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\nclass Validator\n{\n\n    /**\n     * @param {Object} message\n     * @param {Array<string>} props\n     * @returns {boolean}\n     */\n    static validateMessage(message, props)\n    {\n        if(!message){\n            Logger.critical('Invalid message');\n            return false;\n        }\n        for(let prop of props){\n            if(!message[prop]){\n                Logger.critical('Missing message property: '+prop);\n                return false;\n            }\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.Validator = Validator;\n"
  },
  {
    "path": "lib/chat/server/messages-guard.js",
    "content": "/**\n *\n * Reldens - MessagesGuard\n *\n * Validates chat messages before processing them.\n *\n */\n\nconst { GameConst } = require('../../game/constants');\nconst { ChatConst } = require('../constants');\nconst { sc } = require('@reldens/utils');\n\nclass MessagesGuard\n{\n\n    /**\n     * @param {Object} message\n     * @returns {boolean}\n     */\n    static validate(message)\n    {\n        if(ChatConst.CHAT_ACTION !== sc.get(message, GameConst.ACTION_KEY, '')){\n            return false;\n        }\n        return 0 !== sc.get(message, ChatConst.MESSAGE.KEY, '').trim().replace('#', '').replace('@', '').length;\n    }\n\n}\n\nmodule.exports.MessagesGuard = MessagesGuard;\n"
  },
  {
    "path": "lib/chat/server/plugin.js",
    "content": "/**\n *\n * Reldens - ChatPlugin\n *\n * Initializes and manages the chat system on the server side including rooms and event listeners.\n *\n */\n\nconst { RoomChat } = require('./room-chat');\nconst { ChatMessageActions } = require('./message-actions');\nconst { ChatManager } = require('./manager');\nconst { PlayerSkills } = require('./event-listener/player-skills');\nconst { NpcSkills } = require('./event-listener/npc-skills');\nconst { GuestInvalidChangePoint } = require('./event-listener/guest-invalid-change-point');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManagerSingleton} EventsManagerSingleton\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n */\nclass ChatPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @param {EventsManagerSingleton} [props.events]\n     * @param {BaseDataServer} [props.dataServer]\n     */\n    async setup(props)\n    {\n        /** @type {EventsManagerSingleton|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in ChatPlugin.');\n        }\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in ChatPlugin.');\n        }\n        /** @type {Object|boolean} */\n        this.chatConfig = false;\n        /** @type {ChatManager} */\n        this.chatManager = new ChatManager({dataServer: this.dataServer});\n        /** @type {Array<string>} */\n        this.rooms = ['chat'];\n        /** @type {GuestInvalidChangePoint} */\n        this.guestEventsListener = new GuestInvalidChangePoint();\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        this.events.on('reldens.beforeSuperInitialGameData', async (superInitialGameData) => {\n            superInitialGameData.chatTypes = await this.dataServer.getEntity('chatMessageTypes').loadAll();\n        });\n        this.events.on('reldens.roomsDefinition', (roomsList) => {\n            // here we are adding the chat room to be defined in the game server:\n            roomsList.push({roomName: 'chat', room: RoomChat});\n        });\n        this.events.on('reldens.serverConfigFeaturesReady', (props) => {\n            this.chatConfig = props.configProcessor.get('client/ui/chat');\n        });\n        // when the client sent a message to any room it will be checked by all the global messages defined:\n        this.events.on('reldens.roomsMessageActionsGlobal', (roomMessageActions) => {\n            roomMessageActions.chat = new ChatMessageActions({dataServer: this.dataServer});\n        });\n        this.events.on('reldens.actionsPrepareEventsListeners', async (actionsPack, classPath) => {\n            PlayerSkills.listenEvents(classPath, this.chatConfig, this.chatManager);\n        });\n        this.events.on('reldens.setupActions', async (props) => {\n            NpcSkills.listenEvents(props, this.chatConfig, this.chatManager);\n        });\n        this.events.on('reldens.guestInvalidChangePoint', async (event) => {\n            await this.guestEventsListener.sendMessage(event, this.chatManager);\n        });\n    }\n}\n\nmodule.exports.ChatPlugin = ChatPlugin;\n"
  },
  {
    "path": "lib/chat/server/room-chat.js",
    "content": "/**\n *\n * Reldens - RoomChat\n *\n * Handles the global chat room for private and global messages.\n *\n */\n\nconst { RoomLogin } = require('../../rooms/server/login');\nconst { ChatManager } = require('./manager');\nconst { MessageFactory } = require('../message-factory');\nconst { Cleaner } = require('../cleaner');\nconst { ChatConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} ColyseusClient\n */\nclass RoomChat extends RoomLogin\n{\n\n    /**\n     * @param {Object} props\n     */\n    onCreate(props)\n    {\n        super.onCreate(props);\n        Logger.info('Created RoomChat: '+this.roomName+' ('+this.roomId+').');\n        this.roomType = ChatConst.ROOM_TYPE_CHAT;\n        let dataServer = sc.get(this, 'dataServer', false);\n        if(!dataServer){\n            Logger.error('DataServer undefined in RoomChat.');\n        }\n        this.chatManager = new ChatManager({dataServer: this.dataServer});\n        delete props.roomsManager.creatingInstances[this.roomName];\n    }\n\n    /**\n     * @param {ColyseusClient} client\n     * @param {Object} props\n     * @param {Object} userModel\n     */\n    onJoin(client, props, userModel)\n    {\n        this.loginManager.activePlayers.add(userModel, client, this);\n    }\n\n    /**\n     * @param {ColyseusClient} client\n     * @param {Object} data\n     * @returns {Promise<void>}\n     */\n    async handleReceivedMessage(client, data)\n    {\n        if(data[GameConst.ACTION_KEY] !== ChatConst.CHAT_ACTION){\n            return;\n        }\n        let text = Cleaner.cleanMessage(\n            data[ChatConst.MESSAGE.KEY],\n            this.config.get('client/chat/messages/characterLimit')\n        );\n        if(\n            0 === text.replace('#', '').trim().length\n            // do not count the player name on private messages:\n            || (-1 !== text.indexOf('@') && 0 === text.substring(text.indexOf(' ')).trim().length)\n        ){\n            // do nothing if text is shorter than 3 characters (including @ and #):\n            return;\n        }\n        let activePlayer = this.activePlayerBySessionId(client.sessionId, this.roomId);\n        if(!activePlayer){\n            Logger.warning('Current Active Player not found: '+client.sessionId);\n            return;\n        }\n        if(0 === text.indexOf('@')){\n            return await this.sendPrivateMessage(client, data[ChatConst.CHAT_TO], text, activePlayer);\n        }\n        if(0 === text.indexOf('#')){\n            return await this.sendGlobalMessage(client, text, activePlayer);\n        }\n    }\n\n    /**\n     * @param {ColyseusClient} client\n     * @param {string} toPlayer\n     * @param {string} text\n     * @param {Object} activePlayer\n     * @returns {Promise<void|boolean>}\n     */\n    async sendPrivateMessage(client, toPlayer, text, activePlayer)\n    {\n        if(!toPlayer){\n            Logger.info('Missing player recipient.');\n            return false;\n        }\n        let activePlayerTo = this.activePlayerByPlayerName(toPlayer, this.roomId);\n        if(!activePlayerTo){\n            let message = ChatConst.SNIPPETS.PRIVATE_MESSAGE_PLAYER_NOT_FOUND;\n            let messageData = {\n                [ChatConst.MESSAGE.DATA.PLAYER_NAME]: toPlayer\n            };\n            let messageObject = MessageFactory.create(\n                ChatConst.TYPES.ERROR,\n                message,\n                messageData\n            );\n            client.send('*', messageObject);\n            let saveResult = await this.chatManager.saveMessage(\n                MessageFactory.withDataToJson(message, messageData),\n                activePlayer.playerId,\n                activePlayer?.playerData?.state?.room_id,\n                activePlayerTo?.playerData,\n                ChatConst.TYPES.ERROR\n            );\n            if(!saveResult){\n                Logger.critical('Private failed chat save error.', messageObject);\n            }\n            return;\n        }\n        let messageObject = MessageFactory.create(\n            ChatConst.TYPES.PRIVATE,\n            text.substring(text.indexOf(' ')),\n            {},\n            activePlayer.playerName\n        );\n        client.send('*', messageObject);\n        activePlayerTo?.client.send('*', messageObject);\n        let saveResult = await this.chatManager.saveMessage(\n            messageObject[ChatConst.MESSAGE.KEY],\n            activePlayer.playerId,\n            activePlayer?.playerData?.state?.room_id,\n            activePlayerTo?.playerData,\n            ChatConst.TYPES.PRIVATE\n        );\n        if(!saveResult){\n            Logger.critical('Private chat save error.', messageObject);\n        }\n    }\n\n    /**\n     * @param {ColyseusClient} client\n     * @param {string} text\n     * @param {Object} activePlayer\n     * @returns {Promise<void>}\n     */\n    async sendGlobalMessage(client, text, activePlayer)\n    {\n        if(!this.config.get('server/chat/messages/global_enabled')){\n            return client.send('*', MessageFactory.create(\n                ChatConst.TYPES.ERROR,\n                ChatConst.SNIPPETS.GLOBAL_MESSAGE_NOT_ALLOWED\n            ));\n        }\n        let globalAllowedRoles = this.config.get('server/chat/messages/global_allowed_roles').split(',').map(Number);\n        if(-1 === globalAllowedRoles.indexOf(activePlayer.roleId)){\n            return client.send('*', MessageFactory.create(\n                ChatConst.TYPES.ERROR,\n                ChatConst.SNIPPETS.GLOBAL_MESSAGE_PERMISSION_DENIED,\n            ));\n        }\n        let messageObject = MessageFactory.create(\n            ChatConst.TYPES.GLOBAL,\n            text.substring(1),\n            {},\n            activePlayer.playerName\n        );\n        this.broadcast('*', messageObject);\n        let saveResult = await this.chatManager.saveMessage(\n            messageObject[ChatConst.MESSAGE.KEY],\n            activePlayer.playerId,\n            activePlayer?.playerData?.state?.room_id,\n            false,\n            ChatConst.TYPES.GLOBAL\n        );\n        if(!saveResult){\n            Logger.critical('Global chat save error.', messageObject);\n        }\n    }\n\n    /**\n     * @param {ColyseusClient} client\n     * @param {boolean} consented\n     * @returns {Promise<void>}\n     */\n    async onLeave(client, consented)\n    {\n        this.broadcastLeaveMessage(client.sessionId);\n        this.loginManager.activePlayers.removeByRoomAndSessionId(client.sessionId, this.roomId);\n    }\n\n    /**\n     * @param {string} sessionId\n     * @returns {boolean}\n     */\n    broadcastLeaveMessage(sessionId)\n    {\n        let activePlayer = this.activePlayerBySessionId(sessionId, this.roomId);\n        if(!activePlayer){\n            return false;\n        }\n        if(!this.config.getWithoutLogs('server/chat/messages/broadcast_leave', false)){\n            return false;\n        }\n        let message = ChatConst.SNIPPETS.LEFT_ROOM;\n        let messageData = {\n            [ChatConst.MESSAGE.DATA.PLAYER_NAME]: activePlayer.playerName\n        };\n        let messageObject = MessageFactory.create(\n            ChatConst.TYPES.SYSTEM,\n            message,\n            messageData\n        );\n        this.broadcast('*', messageObject);\n    }\n}\n\nmodule.exports.RoomChat = RoomChat;\n"
  },
  {
    "path": "lib/config/client/config-manager.js",
    "content": "/**\n *\n * Reldens - ConfigManager\n *\n * Client-side configuration manager extending ConfigProcessor.\n *\n */\n\nconst { ConfigProcessor } = require('../processor');\n\nclass ConfigManager extends ConfigProcessor\n{\n\n    constructor()\n    {\n        super();\n        /** @type {Object} */\n        this.client = {\n            customClasses: {\n                message: {\n                    listeners: {}\n                }\n            },\n            message: {\n                listeners: {}\n            }\n        };\n    }\n\n}\n\nmodule.exports.ConfigManager = ConfigManager;\n"
  },
  {
    "path": "lib/config/constants.js",
    "content": "/**\n *\n * Reldens - ConfigConst\n *\n */\n\nmodule.exports.ConfigConst = {\n    CONFIG_TYPE_TEXT: 1,\n    CONFIG_TYPE_FLOAT: 2,\n    CONFIG_TYPE_BOOLEAN: 3,\n    CONFIG_TYPE_JSON: 4,\n    CONFIG_TYPE_COMMA_SEPARATED: 5\n};\n"
  },
  {
    "path": "lib/config/processor.js",
    "content": "/**\n *\n * Reldens - ConfigProcessor\n *\n * Base configuration processor with path-based config retrieval.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\nclass ConfigProcessor\n{\n\n    constructor()\n    {\n        /** @type {boolean} */\n        this.avoidLog = false;\n    }\n\n    /**\n     * @param {string} path\n     * @param {any} [defaultValue]\n     * @returns {any}\n     */\n    get(path, defaultValue)\n    {\n        let defaultReturn = 'undefined' !== typeof defaultValue ? defaultValue : false;\n        let pathArray = path.split('/');\n        if(2 > pathArray.length){\n            if(!this.avoidLog){\n                Logger.error('Path level is too low:', path);\n            }\n            return defaultReturn;\n        }\n        let levelCheck = (this[pathArray[0]] || {});\n        for(let i = 1; i < pathArray.length; i++){\n            if(!sc.hasOwn(levelCheck, pathArray[i])){\n                if(!this.avoidLog){\n                    Logger.error('Configuration level '+i+' > \"'+pathArray[i]+'\" not defined: '+path);\n                }\n                levelCheck = defaultReturn;\n                break;\n            }\n            levelCheck = levelCheck[pathArray[i]];\n        }\n        return levelCheck;\n    }\n\n    /**\n     * @param {string} path\n     * @param {any} [defaultValue]\n     * @returns {any}\n     */\n    getWithoutLogs(path, defaultValue = false)\n    {\n        this.avoidLog = true;\n        let result = this.get(path, defaultValue);\n        this.avoidLog = false;\n        return result;\n    }\n\n}\n\nmodule.exports.ConfigProcessor = ConfigProcessor;\n"
  },
  {
    "path": "lib/config/server/entities/config-entity-override.js",
    "content": "/**\n *\n * Reldens - ConfigEntityOverride\n *\n * Extends config entity with custom navigation position and sorting for admin panel.\n *\n */\n\nconst { ConfigEntity } = require('../../../../generated-entities/entities/config-entity');\n\nclass ConfigEntityOverride extends ConfigEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 2000;\n        config.sort = {sortBy: 'path'};\n        return config;\n    }\n\n}\n\nmodule.exports.ConfigEntityOverride = ConfigEntityOverride;\n"
  },
  {
    "path": "lib/config/server/entities/config-types-entity-override.js",
    "content": "/**\n *\n * Reldens - ConfigTypesEntityOverride\n *\n * Extends config types entity with custom navigation position for admin panel.\n *\n */\n\nconst { ConfigTypesEntity } = require('../../../../generated-entities/entities/config-types-entity');\n\nclass ConfigTypesEntityOverride extends ConfigTypesEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 2010;\n        return config;\n    }\n\n}\n\nmodule.exports.ConfigTypesEntityOverride = ConfigTypesEntityOverride;\n"
  },
  {
    "path": "lib/config/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { ConfigEntityOverride } = require('./entities/config-entity-override');\nconst { ConfigTypesEntityOverride } = require('./entities/config-types-entity-override');\n\nmodule.exports.entitiesConfig = {\n    config: ConfigEntityOverride,\n    configTypes: ConfigTypesEntityOverride,\n};\n"
  },
  {
    "path": "lib/config/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        settings: 'Settings',\n        config: 'Config',\n        config_types: 'Config Types'\n    }\n};\n"
  },
  {
    "path": "lib/config/server/manager.js",
    "content": "/**\n *\n * Reldens - ConfigManager\n *\n * Manages configurations from a database and includes default values from config files.\n * Loads server and client configurations, processes them by type, and makes them available\n * throughout the application.\n *\n */\n\nconst { ConfigProcessor } = require('../processor');\nconst { ConfigConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\nconst PackageData = require('../../../package.json');\n\n/**\n * @typedef {Object} ConfigManagerProps\n * @property {EventsManager} [events] - Events manager instance from @reldens/utils\n * @property {BaseDataServer} [dataServer] - Data server instance from @reldens/storage\n * @property {Object<string, Function>} [customClasses] - Custom class overrides map\n */\nclass ConfigManager extends ConfigProcessor\n{\n\n    /**\n     * @param {ConfigManagerProps} props\n     */\n    constructor(props)\n    {\n        super();\n        /** @type {EventsManager|false} - Events manager for pub/sub */\n        this.events = sc.get(props, 'events', false);\n        /** @type {BaseDataServer|false} - Data server for database access */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        /** @type {{server: Object<string, any>, client: Object<string, any>}} - Configuration storage */\n        this.configList = {\n            server: {},\n            client: {}\n        };\n        this.configList.server.customClasses = sc.get(props, 'customClasses', {});\n    }\n\n    /**\n     * @returns {Promise<boolean|void>}\n     */\n    async loadConfigurations()\n    {\n        if(!this.events){\n            Logger.error('EventsManager undefined in ConfigManager.');\n            return false;\n        }\n        if(!this.dataServer){\n            Logger.error('Data Server undefined in ConfigManager.');\n            return false;\n        }\n        this.configList.client.gameEngine = {version: PackageData.version};\n        await this.events.emit('reldens.beforeLoadConfigurations', {configManager: this});\n        let configCollection = await this.dataServer.getEntity('config').loadAll();\n        for(let config of configCollection){\n            // create an object for each scope:\n            if(!sc.hasOwn(this.configList, config.scope)){\n                this.configList[config.scope] = {};\n            }\n            let pathSplit = config.path.split('/');\n            // path must have at least 2 parts:\n            if(2 > pathSplit.length){\n                Logger.error('Invalid configuration:', config);\n                continue;\n            }\n            let parsedValue = await this.getParsedValue(config);\n            this.loopObjectAndAssignProperty(this.configList[config.scope], pathSplit, parsedValue);\n        }\n        Object.assign(this, this.configList);\n    }\n\n    /**\n     * @param {Object} configList\n     * @param {Array<string>} pathSplit\n     * @param {any} parsedValue\n     * @returns {void}\n     */\n    loopObjectAndAssignProperty(configList, pathSplit, parsedValue)\n    {\n        let idx = pathSplit[0];\n        if(!sc.hasOwn(configList, idx)){\n            configList[idx] = 1 < pathSplit.length ? {} : parsedValue;\n        }\n        if(1 < pathSplit.length){\n            this.loopObjectAndAssignProperty(configList[idx], pathSplit.slice(1, pathSplit.length), parsedValue);\n        }\n    }\n\n    /**\n     * Since everything coming from the database is a string then we parse the config type to return the value in the\n     * proper type.\n     *\n     * @param {Object} config\n     * @returns {Promise<any>}\n     */\n    async getParsedValue(config)\n    {\n        await this.events.emit('reldens.beforeGetParsedValue', {configManager: this, config: config});\n        if(config.type === ConfigConst.CONFIG_TYPE_TEXT){\n            return config.value.toString();\n        }\n        if(config.type === ConfigConst.CONFIG_TYPE_BOOLEAN){\n            return !(config.value === 'false' || config.value === '0');\n        }\n        if(config.type === ConfigConst.CONFIG_TYPE_FLOAT){\n            return parseFloat(config.value);\n        }\n        if(config.type === ConfigConst.CONFIG_TYPE_JSON){\n            try {\n                return sc.toJson(config.value);\n            } catch (e) {\n                Logger.error('Invalid JSON on configuration:', config);\n            }\n        }\n        if(config.type === ConfigConst.CONFIG_TYPE_COMMA_SEPARATED){\n            return config.value.split(',');\n        }\n        return config.value;\n    }\n\n}\n\nmodule.exports.ConfigManager = ConfigManager;\n"
  },
  {
    "path": "lib/features/client/config-client.js",
    "content": "/**\n *\n * Reldens - Client Core Features\n *\n * All the core features plugins will be available here.\n * Later we can control if the feature is enabled/disabled using the configuration in the storage.\n * Core features will be available as part of the current Reldens version.\n *\n */\n\nconst { ChatPlugin } = require('../../chat/client/plugin');\nconst { ObjectsPlugin } = require('../../objects/client/plugin');\nconst { InventoryPlugin } = require('../../inventory/client/plugin');\nconst { ActionsPlugin } = require('../../actions/client/plugin');\nconst { UsersPlugin } = require('../../users/client/plugin');\nconst { AudioPlugin } = require('../../audio/client/plugin');\nconst { RoomsPlugin } = require('../../rooms/client/plugin');\nconst { PredictionPlugin } = require('../../prediction/client/plugin');\nconst { TeamsPlugin } = require('../../teams/client/plugin');\nconst { SnippetsPlugin } = require('../../snippets/client/plugin');\nconst { AdsPlugin } = require('../../ads/client/plugin');\nconst { WorldPlugin } = require('../../world/client/plugin');\nconst { ScoresPlugin } = require('../../scores/client/plugin');\nconst { RewardsPlugin } = require('../../rewards/client/plugin');\n\nmodule.exports.ClientCoreFeatures = {\n    chat: ChatPlugin,\n    objects: ObjectsPlugin,\n    inventory: InventoryPlugin,\n    actions: ActionsPlugin,\n    users: UsersPlugin,\n    audio: AudioPlugin,\n    rooms: RoomsPlugin,\n    prediction: PredictionPlugin,\n    teams: TeamsPlugin,\n    snippets: SnippetsPlugin,\n    ads: AdsPlugin,\n    world: WorldPlugin,\n    scores: ScoresPlugin,\n    rewards: RewardsPlugin\n};\n"
  },
  {
    "path": "lib/features/client/manager.js",
    "content": "/**\n *\n * Reldens - FeaturesManager\n *\n * This class will handle features activation on the client depending on the configuration received from the server.\n *\n */\n\nconst { ClientCoreFeatures } = require('./config-client');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../game/client/game-manager').GameManager} GameManager\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass FeaturesManager\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {Object} */\n        this.featuresList = {};\n    }\n\n    /**\n     * @param {Object} featuresCodeList\n     * @returns {Promise<Object|boolean>}\n     */\n    async loadFeatures(featuresCodeList)\n    {\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in FeaturesManager.');\n            return false;\n        }\n        if(!this.events){\n            Logger.error('EventsManager undefined in FeaturesManager.');\n            return false;\n        }\n        await this.events.emit('reldens.loadFeatures', this, featuresCodeList);\n        let featuresKeys = Object.keys(featuresCodeList);\n        if(0 === featuresKeys.length){\n            return this.featuresList;\n        }\n        for(let i of featuresKeys){\n            let featureCode = featuresCodeList[i];\n            if(!sc.hasOwn(ClientCoreFeatures, featureCode)){\n                continue;\n            }\n            this.featuresList[featureCode] = new ClientCoreFeatures[featureCode]();\n            if('function' === typeof this.featuresList[featureCode].setup){\n                await this.featuresList[featureCode].setup({gameManager: this.gameManager, events: this.events});\n            }\n            await this.events.emit('reldens.loadFeature_'+featureCode, this.featuresList[featureCode], this);\n        }\n        return this.featuresList;\n    }\n\n}\n\nmodule.exports.FeaturesManager = FeaturesManager;\n"
  },
  {
    "path": "lib/features/plugin-interface.js",
    "content": "/**\n *\n * Reldens - Plugin Interface\n *\n * Base interface for client and server feature plugins.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\nclass PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @param {Array<string>} [props.requiredProperties]\n     * @param {Object} [props.events]\n     * @param {Object} [props.dataServer]\n     * @param {Object} [props.config]\n     * @param {Object} [props.featuresManager]\n     * @param {Object} [props.themeManager]\n     * @returns {Promise<boolean>}\n     */\n    async setup(props)\n    {\n        Logger.error('Setup plugin not implemented.', props);\n        return false;\n    }\n\n}\n\nmodule.exports.PluginInterface = PluginInterface;\n"
  },
  {
    "path": "lib/features/server/config-server.js",
    "content": "/**\n *\n * Reldens - Server Core Features\n *\n * All the core features plugins will be available here.\n * Later we can control if the feature is enabled/disabled using the configuration in the storage.\n * Core features will be available as part of the current Reldens version.\n *\n */\n\nconst { ActionsPlugin } = require('../../actions/server/plugin');\nconst { ChatPlugin } = require('../../chat/server/plugin');\nconst { RespawnPlugin } = require('../../respawn/server/plugin');\nconst { InventoryPlugin } = require('../../inventory/server/plugin');\nconst { FirebasePlugin } = require('../../firebase/server/plugin');\nconst { UsersPlugin } = require('../../users/server/plugin');\nconst { AudioPlugin } = require('../../audio/server/plugin');\nconst { RoomsPlugin } = require('../../rooms/server/plugin');\nconst { AdminPlugin } = require('../../admin/server/plugin');\nconst { TeamsPlugin } = require('../../teams/server/plugin');\nconst { RewardsPlugin } = require('../../rewards/server/plugin');\nconst { SnippetsPlugin } = require('../../snippets/server/plugin');\nconst { ObjectsPlugin } = require('../../objects/server/plugin');\nconst { AdsPlugin } = require('../../ads/server/plugin');\nconst { ScoresPlugin } = require('../../scores/server/plugin');\n\nmodule.exports.ServerCoreFeatures = {\n    chat: ChatPlugin,\n    respawn: RespawnPlugin,\n    inventory: InventoryPlugin,\n    firebase: FirebasePlugin,\n    actions: ActionsPlugin,\n    users: UsersPlugin,\n    audio: AudioPlugin,\n    rooms: RoomsPlugin,\n    admin: AdminPlugin,\n    teams: TeamsPlugin,\n    rewards: RewardsPlugin,\n    snippets: SnippetsPlugin,\n    objects: ObjectsPlugin,\n    ads: AdsPlugin,\n    scores: ScoresPlugin\n};\n"
  },
  {
    "path": "lib/features/server/entities/features-entity-override.js",
    "content": "/**\n *\n * Reldens - FeaturesEntityOverride\n *\n * Extend features entity with customized list properties for admin panel.\n *\n */\n\nconst { FeaturesEntity } = require('../../../../generated-entities/entities/features-entity');\n\nclass FeaturesEntityOverride extends FeaturesEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 1400;\n        config.listProperties.splice(config.listProperties.indexOf('code'), 1);\n        return config;\n    }\n\n}\n\nmodule.exports.FeaturesEntityOverride = FeaturesEntityOverride;\n"
  },
  {
    "path": "lib/features/server/entities/features-entity.js",
    "content": "/**\n *\n * Reldens - FeaturesEntity\n *\n * Entity configuration for features table defining admin panel properties.\n *\n */\n\nconst { EntityProperties } = require('../../../game/server/entity-properties');\n\nclass FeaturesEntity extends EntityProperties\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let titleProperty = 'title';\n        let properties = {\n            id: {},\n            code: {\n                isRequired: true\n            },\n            [titleProperty]: {\n                isRequired: true\n            },\n            is_enabled: {\n                type: 'boolean',\n                isRequired: true\n            }\n        };\n\n        let showProperties = Object.keys(properties);\n        let listProperties = [...showProperties];\n        let editProperties = [...showProperties];\n        listProperties.splice(listProperties.indexOf('code'), 1);\n        editProperties.splice(editProperties.indexOf('id'), 1);\n\n        return {\n            showProperties,\n            editProperties,\n            listProperties,\n            filterProperties: listProperties,\n            properties,\n            titleProperty,\n            ...extraProps,\n            navigationPosition: 1400\n        };\n    }\n\n}\n\nmodule.exports.FeaturesEntity = FeaturesEntity;\n"
  },
  {
    "path": "lib/features/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { FeaturesEntityOverride } = require('./entities/features-entity-override');\n\nmodule.exports.entitiesConfig = {\n    features: FeaturesEntityOverride\n};\n"
  },
  {
    "path": "lib/features/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        features: 'Features'\n    }\n};\n"
  },
  {
    "path": "lib/features/server/manager.js",
    "content": "/**\n *\n * Reldens - FeaturesManager\n *\n * Server-side features manager that loads enabled features from database.\n *\n */\n\nconst { SetupServerProperties } = require('./setup-server-properties');\nconst { ServerCoreFeatures } = require('./config-server');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('../game/server/theme-manager').ThemeManager} ThemeManager\n */\nclass FeaturesManager\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {Object} */\n        this.availableFeatures = ServerCoreFeatures;\n        /** @type {Object} */\n        this.featuresList = {};\n        /** @type {Array<string>} */\n        this.featuresCodeList = [];\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        /** @type {ThemeManager|boolean} */\n        this.themeManager = sc.get(props, 'themeManager', false);\n        /** @type {ConfigManager} */\n        this.config = sc.get(props, 'config', {});\n    }\n\n    /**\n     * @returns {Promise<Array<string>|boolean>}\n     */\n    async loadFeatures()\n    {\n        if(!this.events){\n            Logger.error('EventsManager undefined in FeaturesManager.');\n            return false;\n        }\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in FeaturesManager.');\n            return false;\n        }\n        let featuresCollection = await this.dataServer.getEntity('features').loadBy('is_enabled', 1);\n        let setupServerProperties = new SetupServerProperties({\n            events: this.events,\n            dataServer: this.dataServer,\n            config: this.config,\n            themeManager: this.themeManager,\n            featuresManager: this\n        });\n        if(!setupServerProperties.validate()){\n            return false;\n        }\n        for(let featureEntity of featuresCollection){\n            this.featuresCodeList.push(featureEntity.code);\n            // @NOTE: featuresCodeList this will be sent to the client, so we need the complete list from the database\n            // to load the features for the client side later.\n            if(\n                // only include enabled and available features on the server side config:\n                sc.hasOwn(this.availableFeatures, featureEntity.code)\n                && sc.hasOwn(featureEntity, 'is_enabled')\n                && featureEntity.is_enabled\n            ){\n                // get feature package server for server side:\n                let featurePackage = this.availableFeatures[featureEntity.code];\n                // set package on entity:\n                featureEntity.package = new featurePackage();\n                if('function' === typeof featureEntity.package.setup){\n                    await featureEntity.package.setup(setupServerProperties);\n                }\n                // for last add the feature entity to the list:\n                this.featuresList[featureEntity.code] = featureEntity;\n                Logger.info('Enabled feature: ' + featureEntity.code);\n            }\n        }\n        this.events.emit('reldens.featuresManagerLoadFeaturesAfter', {featuresManager: this, featuresCollection});\n        // return the features code list:\n        return this.featuresCodeList;\n    }\n\n}\n\nmodule.exports.FeaturesManager = FeaturesManager;\n"
  },
  {
    "path": "lib/features/server/setup-server-properties.js",
    "content": "/**\n *\n * Reldens - SetupServerProperties\n *\n * Properties container for server feature plugin setup.\n *\n */\n\nconst { PropertiesHandler } = require('../../game/properties-handler');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('./manager').FeaturesManager} FeaturesManager\n * @typedef {import('../../game/server/theme-manager').ThemeManager} ThemeManager\n */\nclass SetupServerProperties extends PropertiesHandler\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super();\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        /** @type {ConfigManager} */\n        this.config = sc.get(props, 'config', {});\n        /** @type {FeaturesManager|boolean} */\n        this.featuresManager = sc.get(props, 'featuresManager', false);\n        /** @type {ThemeManager|boolean} */\n        this.themeManager = sc.get(props, 'themeManager', false);\n        /** @type {Array<string>} */\n        this.requiredProperties = Object.keys(this);\n    }\n\n}\n\nmodule.exports.SetupServerProperties = SetupServerProperties\n"
  },
  {
    "path": "lib/firebase/client/connector.js",
    "content": "/**\n *\n * Reldens - FirebaseConnector\n *\n * Handles Firebase authentication integration on the client-side. Manages authentication providers\n * (Google, Facebook, GitHub), configures Firebase SDK, handles sign-in flows with popup authentication,\n * and coordinates with the game's login system. Integrates with GameManager and GameDom for UI updates.\n *\n */\n\nconst FirebaseApp = require('firebase/compat/app').default;\nconst FirebaseAnalytics = require('firebase/compat/analytics');\nconst FirebaseAuth = require('firebase/compat/auth');\nconst { ErrorsBlockHandler } = require('../../game/client/handlers/errors-block-handler');\nconst { GameConst } = require('../../game/constants');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('../../game/client/game-dom').GameDom} GameDom\n * @typedef {import('firebase/compat/app').default} FirebaseAppModule\n *\n * @typedef {Object} FirebaseProvider\n * @property {string} label\n * @property {Object} authMethod\n */\nclass FirebaseConnector\n{\n\n    /**\n     * @param {GameManager} gameManager\n     */\n    constructor(gameManager)\n    {\n        if(!gameManager){\n            ErrorManager.error('FirebaseConnector - Missing game manager.');\n        }\n        /** @type {GameManager} */\n        this.gameManager = gameManager;\n        /** @type {GameDom} */\n        this.gameDom = this.gameManager.gameDom;\n        /** @type {typeof FirebaseAnalytics} */\n        this.analytics = FirebaseAnalytics;\n        /** @type {typeof FirebaseApp} */\n        this.app = FirebaseApp;\n        /** @type {typeof FirebaseAuth} */\n        this.auth = FirebaseAuth;\n        /** @type {Object|false} */\n        this.initializedApp = false;\n        /** @type {boolean} */\n        this.isActive = false;\n        /** @type {string} */\n        this.containerId = '#firebase-auth-container';\n        /** @type {Object<string, FirebaseProvider>} */\n        this.activeProviders = {};\n        /** @type {Object<string, FirebaseProvider>} */\n        this.defaultProviders = {};\n        this.gameManager.events.on('reldens.beforeJoinGame', (props) => {\n            if(props.formData['formId'] === 'firebase-login'){\n                props.gameManager.userData.isFirebaseLogin = true;\n            }\n        });\n    }\n\n    /**\n     * @returns {Object<string, FirebaseProvider>}\n     */\n    fetchDefaultProviders()\n    {\n        return {\n            google: {\n                label: 'Sign in with Google',\n                authMethod: new this.app.auth.GoogleAuthProvider()\n            },\n            facebook: {\n                label: 'Sign in with Facebook',\n                authMethod: new this.app.auth.FacebookAuthProvider()\n            },\n            github: {\n                label: 'Sign in with GitHub',\n                authMethod: new this.app.auth.GithubAuthProvider()\n            }\n        };\n    }\n\n    startFirebase()\n    {\n        let firebaseUrl = this.gameManager.appServerUrl+GameConst.ROUTE_PATHS.FIREBASE;\n        this.gameDom.getJSON(firebaseUrl, (err, response) => {\n            if(!response.enabled){\n                return false;\n            }\n            let firebaseConfig = response.firebaseConfig;\n            this.initAuth(firebaseConfig);\n            // logout on refresh:\n            this.gameDom.getWindow().addEventListener('beforeunload', () => {\n                if(this.isActive){\n                    this.initializedApp.firebase.auth().signOut();\n                }\n            });\n            // check the current auth state:\n            this.initializedApp.firebase.auth().onAuthStateChanged((user) => {\n                if(user){\n                    this.setActiveUser(user);\n                    return false;\n                }\n                this.setupAuthButtons(response.providersKeys);\n                return false;\n            });\n            let firebaseLogin = this.gameDom.getElement('#firebase-login');\n            if(firebaseLogin){\n                this.activateLoginBehavior(firebaseLogin);\n            }\n        });\n    }\n\n    /**\n     * @param {HTMLFormElement} firebaseLogin\n     */\n    activateLoginBehavior(firebaseLogin)\n    {\n        firebaseLogin.addEventListener('submit', (e) => {\n            e.preventDefault();\n            if(!firebaseLogin.checkValidity()){\n                return false;\n            }\n            this.gameDom.getElement('.firebase-row-container').classList.remove('hidden');\n        });\n        let firebaseUser = this.gameDom.getElement('#firebase-username');\n        if(!firebaseUser){\n            return false;\n        }\n        this.gameDom.getElement('.firebase-row-container').classList.remove('hidden');\n        firebaseUser.addEventListener('change', () => {\n            ErrorsBlockHandler.reset(firebaseLogin);\n        });\n        firebaseUser.addEventListener('focus', () => {\n            ErrorsBlockHandler.reset(firebaseLogin);\n        });\n    }\n\n    /**\n     * @param {Array<string>} providersKeys\n     */\n    setupAuthButtons(providersKeys)\n    {\n        this.isActive = false;\n        let container = this.gameDom.getElement(this.containerId);\n        if(!container){\n            return false;\n        }\n        container.innerHTML = '';\n        if(0 === providersKeys.length){\n            return false;\n        }\n        this.defaultProviders = this.fetchDefaultProviders();\n        for(let providerKey of providersKeys){\n            let provider = sc.get(this.activeProviders, providerKey, false);\n            if(!provider){\n                provider = this.defaultProviders[providerKey];\n            }\n            if(!provider){\n                return false;\n            }\n            let authButton = this.createAuthButton(providerKey, provider.label);\n            authButton.addEventListener('click', () => {\n                this.signInWithProvider(provider.authMethod);\n            });\n            container.appendChild(authButton);\n        }\n    }\n\n    /**\n     * @param {string} provider\n     * @param {string} text\n     * @returns {HTMLButtonElement}\n     */\n    createAuthButton(provider, text)\n    {\n        let button = document.createElement('button');\n        button.type = 'button';\n        button.className = 'firebase-auth-btn firebase-' + provider + '-btn';\n        button.innerHTML = text;\n        return button;\n    }\n\n    /**\n     * @param {Object} providerAuthMethod\n     */\n    signInWithProvider(providerAuthMethod)\n    {\n        if(!providerAuthMethod){\n            return false;\n        }\n        this.initializedApp.firebase.auth().signInWithPopup(providerAuthMethod).catch((error) => {\n            Logger.error('Firebase authentication error:', error);\n            let errorContainer = this.gameDom.getElement('#firebase-login .response-error');\n            if(errorContainer){\n                errorContainer.textContent = 'Authentication error.';\n            }\n        });\n    }\n\n    /**\n     * @param {Object} user\n     */\n    setActiveUser(user)\n    {\n        this.isActive = true;\n        let usernameInput = this.gameDom.getElement('#firebase-username');\n        if(!usernameInput || '' === usernameInput.value.trim()){\n            let errorContainer = this.gameDom.getElement('#firebase-login .response-error');\n            if(errorContainer){\n                errorContainer.textContent = 'Please enter a username.';\n            }\n            return false;\n        }\n        let formData = {\n            formId: 'firebase-login',\n            email: user.email,\n            username: usernameInput.value,\n            password: user.uid\n        };\n        this.gameManager.startGame(formData, true);\n    }\n\n    /**\n     * @param {Object} firebaseConfig\n     */\n    initAuth(firebaseConfig)\n    {\n        if(!firebaseConfig){\n            Logger.error('Missing firebase configuration.');\n            return false;\n        }\n        this.firebaseConfig = firebaseConfig;\n        this.initializedApp = this.app.initializeApp(this.firebaseConfig);\n        if(sc.hasOwn(this.firebaseConfig, 'measurementId')){\n            this.initializedApp.firebase.analytics();\n        }\n    }\n\n}\n\nmodule.exports.FirebaseConnector = FirebaseConnector;\n"
  },
  {
    "path": "lib/firebase/server/plugin.js",
    "content": "/**\n *\n * Reldens - Firebase Server Plugin\n *\n * Server-side plugin that integrates Firebase authentication with Reldens. Loads Firebase configuration\n * from the config manager or environment variables, exposes a configuration endpoint for the client,\n * and manages authentication provider settings (Google, Facebook, GitHub).\n *\n */\n\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('express').Application} ExpressApplication\n *\n * @typedef {Object} FirebasePluginProps\n * @property {EventsManager} events\n * @property {ConfigManager} config\n */\nclass FirebasePlugin extends PluginInterface\n{\n\n    /**\n     * @param {FirebasePluginProps} props\n     * @returns {Promise<void>}\n     */\n    async setup(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        this.listenEvents();\n        this.mapConfiguration();\n    }\n\n    listenEvents() {\n        if (!this.events) {\n            Logger.error('EventsManager undefined in FirebasePlugin.');\n            return false;\n        }\n        this.events.on('reldens.serverBeforeListen', (props) => {\n            this.declareFirebaseConfigRequestHandler(props.serverManager.app);\n        });\n    }\n\n    mapConfiguration()\n    {\n        if(!this.config){\n            Logger.error('Config undefined in FirebasePlugin.');\n            return false;\n        }\n        let env = process.env;\n        let config = 'server/firebase/';\n        /** @type {string} */\n        this.firebaseConfigRoute = this.config.getWithoutLogs(config+'configRoute', GameConst.ROUTE_PATHS.FIREBASE);\n        /** @type {boolean} */\n        this.isEnabled = this.config.getWithoutLogs(config+'enabled', 1 === Number(env.RELDENS_FIREBASE_ENABLE || 0));\n        /** @type {Array<string>} */\n        this.providersKeys = this.config.getWithoutLogs(config+'providers', ['google', 'facebook', 'github']);\n        /** @type {Object<string, string>} */\n        this.firebaseMappedConfig = {\n            apiKey: this.config.getWithoutLogs(config+'apiKey', env.RELDENS_FIREBASE_API_KEY),\n            authDomain: this.config.getWithoutLogs(config+'authDomain', env.RELDENS_FIREBASE_AUTH_DOMAIN),\n            databaseURL: this.config.getWithoutLogs(config+'databaseURL', env.RELDENS_FIREBASE_DATABASE_URL),\n            projectId: this.config.getWithoutLogs(config+'projectId', env.RELDENS_FIREBASE_PROJECT_ID),\n            storageBucket: this.config.getWithoutLogs(config+'storageBucket', env.RELDENS_FIREBASE_STORAGE_BUCKET),\n            messagingSenderId: this.config.getWithoutLogs(\n                config+'messagingSenderId',\n                env.RELDENS_FIREBASE_MESSAGING_SENDER_ID\n            ),\n            appId: this.config.getWithoutLogs(config+'appId', env.RELDENS_FIREBASE_APP_ID)\n        };\n        let measurementId = this.config.getWithoutLogs(config+'measurementId', env.RELDENS_FIREBASE_MEASUREMENTID);\n        if (measurementId) {\n            this.firebaseMappedConfig['measurementId'] = measurementId;\n        }\n    }\n\n    /**\n     * @param {ExpressApplication} app\n     */\n    declareFirebaseConfigRequestHandler(app)\n    {\n        app.get(this.firebaseConfigRoute, (req, res) => {\n            res.json(this.firebaseConfig());\n        });\n    }\n\n    /**\n     * @returns {Object}\n     */\n    firebaseConfig()\n    {\n        if(!this.isEnabled){\n            return {enabled: false};\n        }\n        return {\n            enabled: true,\n            firebaseConfig: this.firebaseMappedConfig,\n            providersKeys: this.providersKeys\n        };\n    }\n}\n\nmodule.exports.FirebasePlugin = FirebasePlugin;\n"
  },
  {
    "path": "lib/game/allowed-file-types.js",
    "content": "/**\n *\n * Reldens - AllowedFileTypes\n *\n * Constants object defining the allowed file type categories for file upload validation and MIME type\n * detection. Used by FileHandler and other utilities to categorize and validate file types (audio files,\n * image files, text files) during uploads, asset processing, and file operations.\n *\n */\n\nmodule.exports.AllowedFileTypes = {\n    AUDIO: 'audio',\n    IMAGE: 'image',\n    TEXT: 'text'\n};\n"
  },
  {
    "path": "lib/game/client/animations-defaults-merger.js",
    "content": "/**\n *\n * Reldens - AnimationsDefaultsMerger\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} RoomData\n * @property {Object.<string, Object>} objectsAnimationsData\n * @property {Object.<string, Object>} [animationsDefaults]\n * @property {Object.<string, Object>} [preloadAssets]\n * @property {Object.<string, Object>} [preloadAssetsDefaults]\n */\nclass AnimationsDefaultsMerger\n{\n\n    /**\n     * @param {RoomData} roomData\n     * @returns {RoomData}\n     */\n    static mergeDefaults(roomData)\n    {\n        if(!sc.hasOwn(roomData, 'animationsDefaults')){\n            return roomData;\n        }\n        if(!sc.hasOwn(roomData, 'objectsAnimationsData')){\n            return roomData;\n        }\n        let animationsDefaults = roomData.animationsDefaults;\n        let objectsAnimationsData = roomData.objectsAnimationsData;\n        let objectKeys = Object.keys(objectsAnimationsData);\n        for(let key of objectKeys){\n            let objectData = objectsAnimationsData[key];\n            if(!sc.hasOwn(objectData, 'asset_key')){\n                continue;\n            }\n            objectData.key = key;\n            let assetKey = objectData.asset_key;\n            if(!sc.hasOwn(animationsDefaults, assetKey)){\n                continue;\n            }\n            let defaults = animationsDefaults[assetKey];\n            objectsAnimationsData[key] = Object.assign({}, defaults, objectData);\n        }\n        delete roomData.animationsDefaults;\n        return roomData;\n    }\n\n}\n\nmodule.exports.AnimationsDefaultsMerger = AnimationsDefaultsMerger;\n"
  },
  {
    "path": "lib/game/client/communication/room-state-entities-manager.js",
    "content": "/**\n *\n * Reldens - RoomStateEntitiesManager\n *\n * Provides static methods for common room state entity patterns.\n * Simplifies entity lifecycle management with automatic property listening.\n * Browser-only code bundled by Parcel.\n *\n */\n\nconst { StateCallbacksManager } = require('./state-callbacks-manager');\n\nclass RoomStateEntitiesManager\n{\n\n    static onEntityAddWithProperties(room, collectionName, properties, onAddCallback, onPropertyChangeCallback)\n    {\n        let propertyCallbacks = {};\n        for(let prop of properties){\n            propertyCallbacks[prop] = (entity, key, value, previousValue) => {\n                if(onPropertyChangeCallback){\n                    onPropertyChangeCallback(entity, key, prop, value, previousValue);\n                }\n            };\n        }\n        return this.onEntityAddWithPropertyCallbacks(room, collectionName, propertyCallbacks, onAddCallback);\n    }\n\n    static onEntityAddWithPropertyCallbacks(room, collectionName, propertyCallbacks, onAddCallback)\n    {\n        let manager = this.createManager(room);\n        let wrappedState = manager.wrap(room.state);\n        manager.onAdd(wrappedState[collectionName], (entity, key) => {\n            if(onAddCallback){\n                onAddCallback(entity, key);\n            }\n            for(let prop of Object.keys(propertyCallbacks)){\n                let callback = propertyCallbacks[prop];\n                manager.listen(entity, prop, (value, previousValue) => {\n                    callback(entity, key, value, previousValue);\n                });\n            }\n        });\n        return manager;\n    }\n\n    static onEntityAdd(room, collectionName, callback)\n    {\n        return this._onCollectionEvent(room, collectionName, 'onAdd', callback);\n    }\n\n    static onEntityRemove(room, collectionName, callback)\n    {\n        return this._onCollectionEvent(room, collectionName, 'onRemove', callback);\n    }\n\n    static createManager(room)\n    {\n        return new StateCallbacksManager(room);\n    }\n\n    static _onCollectionEvent(room, collectionName, eventType, callback)\n    {\n        let manager = this.createManager(room);\n        let wrappedState = manager.wrap(room.state);\n        manager[eventType](wrappedState[collectionName], callback);\n        return manager;\n    }\n\n}\n\nmodule.exports.RoomStateEntitiesManager = RoomStateEntitiesManager;\n"
  },
  {
    "path": "lib/game/client/communication/state-callbacks-manager.js",
    "content": "/**\n *\n * Reldens - StateCallbacksManager\n *\n * Manages Colyseus 0.16 state callbacks with getStateCallbacks wrapper.\n * Provides a unified API for state callback handling. Centralizes all state\n * callback logic to minimize migration changes. Browser-only code bundled\n * by Parcel.\n *\n */\n\nconst { getStateCallbacks } = require('colyseus.js');\n\nclass StateCallbacksManager\n{\n\n    constructor(room)\n    {\n        this.room = room;\n        this.$ = getStateCallbacks(room);\n        this.cleanupFunctions = [];\n    }\n\n    wrap(schemaObject)\n    {\n        return this.$(schemaObject);\n    }\n\n    onAdd(collection, callback)\n    {\n        let cleanup = collection.onAdd(callback);\n        if(cleanup){\n            this.cleanupFunctions.push(cleanup);\n        }\n        return cleanup;\n    }\n\n    onRemove(collection, callback)\n    {\n        let cleanup = collection.onRemove(callback);\n        if(cleanup){\n            this.cleanupFunctions.push(cleanup);\n        }\n        return cleanup;\n    }\n\n    onChange(collection, callback)\n    {\n        let cleanup = collection.onChange(callback);\n        if(cleanup){\n            this.cleanupFunctions.push(cleanup);\n        }\n        return cleanup;\n    }\n\n    listen(entity, propertyName, callback)\n    {\n        let wrappedEntity = this.wrap(entity);\n        let cleanup = wrappedEntity.listen(propertyName, callback);\n        if(cleanup){\n            this.cleanupFunctions.push(cleanup);\n        }\n        return cleanup;\n    }\n\n    listenAll(entity, properties, callback)\n    {\n        for(let prop of properties){\n            this.listen(entity, prop, (value, previousValue) => {\n                callback(prop, value, previousValue);\n            });\n        }\n    }\n\n    dispose()\n    {\n        for(let cleanup of this.cleanupFunctions){\n            if('function' === typeof cleanup){\n                cleanup();\n            }\n        }\n        this.cleanupFunctions = [];\n    }\n}\n\nmodule.exports.StateCallbacksManager = StateCallbacksManager;\n"
  },
  {
    "path": "lib/game/client/engine/sprite-text-factory.js",
    "content": "/**\n *\n * Reldens - SpriteTextFactory\n *\n * Factory class for creating and attaching text labels to sprites in Phaser. Provides static methods\n * to position text relative to sprites (e.g., player names, labels) with configurable styling including\n * font, colors, shadows, and strokes.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('phaser').GameObjects.Sprite} Sprite\n * @typedef {import('phaser').Scene} Scene\n * @typedef {import('phaser').GameObjects.Text} Text\n */\nclass SpriteTextFactory\n{\n\n    /**\n     * @param {Sprite} sprite\n     * @param {string} text\n     * @param {Object} textConfig\n     * @param {number} topOff\n     * @param {string} textKeyWord\n     * @param {Scene} scene\n     * @returns {Text}\n     */\n    static attachTextToSprite(sprite, text, textConfig, topOff, textKeyWord, scene)\n    {\n        let relativeNamePosition = this.getTextPosition(sprite, text, textConfig, topOff);\n        let textSprite = scene.add.text(\n            relativeNamePosition.x,\n            relativeNamePosition.y,\n            text,\n            {\n                fontFamily: sc.get(textConfig, 'fontFamily', 'sans-serif'),\n                fontSize: sc.get(textConfig, 'fontSize', '12px')\n            }\n        );\n        textSprite.style.setFill(sc.get(textConfig, 'fill', '#ffffff'));\n        textSprite.style.setAlign(sc.get(textConfig, 'align', 'center'));\n        textSprite.style.setStroke(sc.get(textConfig, 'stroke', '#000000'), sc.get(textConfig, 'strokeThickness', 4));\n        textSprite.style.setShadow(\n            sc.get(textConfig, 'shadowX', 5),\n            sc.get(textConfig, 'shadowY', 5),\n            sc.get(textConfig, 'shadowColor', 'rgba(0,0,0,0.7)'),\n            sc.get(textConfig, 'shadowBlur', 5)\n        );\n        textSprite.setDepth(sc.get(textConfig, 'depth', 200000));\n        sprite[textKeyWord] = textSprite;\n        return textSprite;\n    }\n\n    /**\n     * @param {Sprite} sprite\n     * @param {string} text\n     * @param {Object} textConfig\n     * @param {number} [topOff]\n     * @returns {Object} Position object with x and y coordinates\n     */\n    static getTextPosition(sprite, text, textConfig, topOff = 0)\n    {\n        if(!sprite){\n            return {x: 0, y:0};\n        }\n        let height = sc.get(textConfig, 'height', 18);\n        let x = sprite.x - ((text.length * sc.get(textConfig, 'textLength', 4)));\n        let y = sprite.y - height - sprite.height + topOff;\n        return {x, y};\n    }\n\n}\n\nmodule.exports.SpriteTextFactory = SpriteTextFactory;\n"
  },
  {
    "path": "lib/game/client/fps-counter.js",
    "content": "/**\n *\n * Reldens - FPSCounter\n *\n * Client-side FPS (frames per second) counter utility for displaying game performance metrics.\n * Creates a DOM element showing real-time FPS, updated every 60 frames. Displays in a fixed\n * position overlay with configurable styling.\n *\n */\n\n/**\n * @typedef {import('./game-dom').GameDom} GameDom\n */\nclass FPSCounter\n{\n\n    /**\n     * @param {GameDom} gameDom\n     */\n    constructor(gameDom)\n    {\n        /** @type {number} */\n        this.lastFrameTime = performance.now();\n        /** @type {number} */\n        this.frameCount = 0;\n        /** @type {HTMLElement} */\n        this.fpsDisplay = gameDom.createElementWithStyles('div', 'fps-counter', {\n            padding: '0 20px',\n            background: '#000',\n            color: '#00ff00'\n        });\n        gameDom.getElement('.header').appendChild(this.fpsDisplay);\n    }\n\n    updateFPS()\n    {\n        let currentTime = performance.now();\n        let deltaTime = currentTime - this.lastFrameTime;\n        this.lastFrameTime = currentTime;\n        const fps = Math.round(1000 / deltaTime);\n        this.frameCount++;\n        if(0 === this.frameCount % 60){\n            this.fpsDisplay.textContent = 'FPS: ' + fps;\n        }\n        requestAnimationFrame(this.updateFPS.bind(this));\n    }\n\n    start()\n    {\n        this.updateFPS();\n    }\n\n}\n\nmodule.exports.FPSCounter = FPSCounter;\n"
  },
  {
    "path": "lib/game/client/game-client.js",
    "content": "/**\n *\n * Reldens - GameClient\n *\n * Manages Colyseus WebSocket client connections for multiplayer rooms. Handles multiserver\n * support, automatic connection to global game rooms and feature rooms, client instance creation\n * per room, and retry logic for room creation. Coordinates with ConfigManager for server URLs\n * and room assignments. Tracks joined rooms across multiple servers.\n *\n */\n\nconst { Client } = require('colyseus.js');\nconst { RoomsConst } = require('../../rooms/constants');\nconst { GameConst } = require('../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('colyseus.js').Room} Room\n * @typedef {import('colyseus.js').Client} Client\n * @typedef {import('../../config/client/manager').ConfigManager} ConfigManager\n * @typedef {object} JoinOptions\n * @property {string} selectedPlayer\n * @property {string} token\n */\nclass GameClient\n{\n\n    /**\n     * @param {string} serverUrl\n     * @param {ConfigManager} config\n     */\n    constructor(serverUrl, config)\n    {\n        /** @type {string} */\n        this.serverUrl = serverUrl;\n        /** @type {ConfigManager} */\n        this.config = config;\n        /** @type {boolean} */\n        this.autoConnectServerGameRoom = this.config.getWithoutLogs(\n            'client/rooms/autoConnectServerGameRoom',\n            true\n        );\n        /** @type {boolean} */\n        this.autoConnectServerFeatureRooms = this.config.getWithoutLogs(\n            'client/rooms/autoConnectServerFeatureRooms',\n            true\n        );\n        /** @type {Object<string, string>} */\n        this.roomsUrls = {};\n        /** @type {Object<string, Client>} */\n        this.roomClients = {};\n        /** @type {Object<string, Room>} */\n        this.gameRoomsByServer = {};\n        /** @type {Object<string, boolean>} */\n        this.featuresByServerFlag = {};\n        /** @type {Object<string, Object<string, Room>>} */\n        this.featuresRoomsByServer = {};\n        /** @type {string} */\n        this.lastErrorMessage = '';\n    }\n\n    /**\n     * @param {string} roomName\n     * @param {JoinOptions} options\n     * @returns {Promise<Room|boolean>}\n     */\n    async joinOrCreate(roomName, options)\n    {\n        this.lastErrorMessage = '';\n        try {\n            let client = this.roomClient(roomName);\n            if(!client){\n                Logger.error('Client not found for room name \"'+roomName+'\".');\n                return false;\n            }\n            let roomUrl = this.roomsUrls[roomName];\n            await this.connectToGlobalGameRoom(roomUrl, client, options);\n            await this.connectToGlobalFeaturesRooms(roomUrl, client, options);\n            return await client.joinOrCreate(roomName, options);\n        } catch (error) {\n            if(RoomsConst.ERRORS.CREATING_ROOM_AWAIT === error.message){\n                await new Promise(resolve => setTimeout(resolve, 500));\n                return await this.joinOrCreate(roomName, options);\n            }\n            this.lastErrorMessage = error.message;\n            // any connection errors will be handled in the higher level class\n            Logger.error('Joining room error: '+error.message);\n        }\n        return false;\n    }\n\n    /**\n     * @param {string} roomUrl\n     * @param {Client} client\n     * @param {JoinOptions} options\n     * @returns {Promise<void>}\n     */\n    async connectToGlobalGameRoom(roomUrl, client, options)\n    {\n        if(!this.autoConnectServerGameRoom){\n            return;\n        }\n        if('' === roomUrl || this.serverUrl === roomUrl){\n            Logger.debug('Avoid connect to global game room.', this.serverUrl, roomUrl);\n            return;\n        }\n        if(this.gameRoomsByServer[roomUrl]){\n            return;\n        }\n        Logger.debug('Registering GameRoom for server: '+roomUrl);\n        this.gameRoomsByServer[roomUrl] = await client.joinOrCreate(GameConst.ROOM_GAME, options);\n        // required to avoid unregistered messages warning:\n        this.gameRoomsByServer[roomUrl].onMessage('*', () => {});\n    }\n\n    /**\n     * @param {string} roomUrl\n     * @param {Client} client\n     * @param {JoinOptions} options\n     * @returns {Promise<void>}\n     */\n    async connectToGlobalFeaturesRooms(roomUrl, client, options)\n    {\n        if(!this.autoConnectServerFeatureRooms){\n            return;\n        }\n        if('' === roomUrl || this.serverUrl === roomUrl){\n            Logger.debug('Avoid connect to features rooms.', this.serverUrl, roomUrl);\n            return;\n        }\n        if(this.featuresByServerFlag[roomUrl]){\n            return;\n        }\n        Logger.debug('Registering features rooms for server: '+roomUrl);\n        this.featuresByServerFlag[roomUrl] = true;\n        let featuresRoomsNames = this.config.getWithoutLogs('client/rooms/featuresRoomsNames', []);\n        if(0 < featuresRoomsNames.length){\n            return;\n        }\n        this.featuresRoomsByServer[roomUrl] = {};\n        for(let featureRoomName of featuresRoomsNames){\n            this.featuresRoomsByServer[roomUrl][featureRoomName] = await client.joinOrCreate(featureRoomName, options);\n        }\n    }\n\n    /**\n     * @param {string} roomName\n     * @returns {Client}\n     */\n    roomClient(roomName)\n    {\n        if(!this.roomClients[roomName]){\n            this.roomsUrls[roomName] = this.config.getWithoutLogs('client/rooms/servers/'+roomName, this.serverUrl);\n            Logger.debug('Creating client with URL \"'+this.roomsUrls[roomName]+'\" for room \"'+roomName+'\".');\n            this.roomClients[roomName] = new Client(\n                this.roomsUrls[roomName]\n            );\n        }\n        return this.roomClients[roomName];\n    }\n\n}\n\nmodule.exports.GameClient = GameClient;\n"
  },
  {
    "path": "lib/game/client/game-dom.js",
    "content": "/**\n *\n * Reldens - GameDom\n *\n * Singleton utility class for DOM manipulation and element management. Provides helpers for\n * querying elements, creating elements with styles, updating content, appending HTML, removing\n * elements, and handling AJAX requests. Manages CSS style suffixes (px for positioning/sizing).\n * Exported as a singleton instance for shared use across the client application.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\nclass GameDom\n{\n\n    constructor()\n    {\n        /** @type {Object<string, string>} */\n        this.styleSuffix = {\n            width: 'px',\n            height: 'px',\n            top: 'px',\n            bottom: 'px',\n            left: 'px',\n            right: 'px'\n        };\n    }\n\n    /**\n     * @returns {Window}\n     */\n    getWindow()\n    {\n        return window;\n    }\n\n    /**\n     * @returns {Document}\n     */\n    getDocument()\n    {\n        return window.document;\n    }\n\n    /**\n     * @param {string} querySelector\n     * @param {HTMLElement|Document|boolean} [container]\n     * @returns {HTMLElement|null}\n     */\n    getElement(querySelector, container = false)\n    {\n        if(!querySelector){\n            return null;\n        }\n        return (container || document).querySelector(querySelector);\n    }\n\n    /**\n     * @param {string} querySelector\n     * @param {HTMLElement|Document} [container]\n     * @returns {NodeListOf<HTMLElement>|null}\n     */\n    getElements(querySelector, container)\n    {\n        if(!querySelector){\n            return null;\n        }\n        return (container || document).querySelectorAll(querySelector);\n    }\n\n    /**\n     * @param {string} querySelector\n     * @param {HTMLElement|Document|boolean} [container]\n     */\n    emptyElement(querySelector, container = false)\n    {\n        let element = this.getElement(querySelector, container);\n        if(element){\n            element.innerHTML = '';\n        }\n    }\n\n    /**\n     * @param {string} querySelector\n     * @param {string} newContent\n     * @returns {HTMLElement|boolean}\n     */\n    appendToElement(querySelector, newContent)\n    {\n        let element = this.getElement(querySelector);\n        if(!element || !newContent){\n            return false;\n        }\n        let template = document.createElement('template');\n        template.innerHTML = newContent;\n        for(let i=0; i < template.content.childNodes.length; i++){\n            element.appendChild(template.content.childNodes[i]);\n        }\n        return element;\n    }\n\n    /**\n     * @param {string} querySelector\n     * @param {string} newContent\n     * @returns {HTMLElement|boolean}\n     */\n    updateContent(querySelector, newContent)\n    {\n        let element = this.getElement(querySelector);\n        if(!element){\n            return false;\n        }\n        element.innerHTML = newContent;\n        return element;\n    }\n\n    /**\n     * @param {string} querySelector\n     */\n    removeElement(querySelector)\n    {\n        this.getElement(querySelector)?.remove();\n    }\n\n    /**\n     * @param {string} type\n     * @param {string} [id]\n     * @param {Array<string>} [classNamesList]\n     * @returns {HTMLElement}\n     */\n    createElement(type, id = '', classNamesList)\n    {\n        let element = document.createElement(type);\n        if('' !== id){\n            element.id = id;\n        }\n        if(sc.isArray(classNamesList)){\n            for(let className of classNamesList){\n                element.classList.add(className);\n            }\n        }\n        return element;\n    }\n\n    /**\n     * @param {HTMLElement} element\n     * @param {Object<string, string|number>} styles\n     * @returns {boolean}\n     */\n    setElementStyles(element, styles)\n    {\n        if(!element || !styles){\n            return false;\n        }\n        let stylesKeys = Object.keys(styles);\n        for(let i of stylesKeys){\n            let styleValue = styles[i];\n            let suffix = sc.get(this.styleSuffix, i, '');\n            if('' !== suffix){\n                styleValue += suffix;\n            }\n            element.style[i] = styleValue;\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} type\n     * @param {string} [id]\n     * @param {Object<string, string|number>} [styles]\n     * @returns {HTMLElement}\n     */\n    createElementWithStyles(type, id = '', styles = {})\n    {\n        let element = this.createElement(type, id);\n        this.setElementStyles(element, styles);\n        return element;\n    }\n\n    /**\n     * @returns {HTMLElement}\n     */\n    activeElement()\n    {\n        return document.activeElement;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    insideInput()\n    {\n        return 'input' === this.activeElement().tagName.toLowerCase();\n    }\n\n    /**\n     * @param {string} url\n     * @param {function(number|null, object): void} callback\n     */\n    getJSON(url, callback)\n    {\n        let xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n        xhr.responseType = 'json';\n        xhr.onload = () => {\n            let status = xhr.status;\n            200 === status ? callback(null, xhr.response) : callback(status);\n        };\n        xhr.send();\n    }\n\n    /**\n     * @param {string} message\n     * @returns {boolean}\n     */\n    alertReload(message)\n    {\n        alert(message);\n        this.getWindow().location.reload();\n        return false;\n    }\n\n}\n\nmodule.exports.GameDom = new GameDom();\n"
  },
  {
    "path": "lib/game/client/game-engine.js",
    "content": "/**\n *\n * Reldens - GameEngine\n *\n * Extends Phaser's Game class to provide the core game rendering engine for Reldens client.\n * Manages UI scenes, template rendering (Mustache), screen resizing, camera handling, target\n * selection (TAB key), FPS counter, and game size updates. Handles UI element positioning,\n * small map centering, and coordinates with GameManager for active scene management. Listens\n * to events for reconnection and scene creation.\n *\n */\n\nconst TemplateEngineRender = require('mustache');\nconst { Game, Input } = require('phaser');\nconst { FPSCounter } = require('./fps-counter');\nconst { GameConst } = require('../constants');\nconst { ObjectsConst } = require('../../objects/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./game-manager').GameManager} GameManager\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('phaser').Scene} Scene\n * @typedef {import('./scene-dynamic').SceneDynamic} SceneDynamic\n * @typedef {import('../../users/client/player').Player} Player\n * @typedef {object} GameEngineProps\n * @property {object} config\n * @property {EventsManager} events\n * @typedef {object} ScreenSizeData\n * @property {number} newWidth\n * @property {number} newHeight\n * @property {number} containerWidth\n * @property {number} containerHeight\n * @property {number} mapWidth\n * @property {number} mapHeight\n * @property {SceneDynamic} activeScene\n */\nclass GameEngine extends Game\n{\n\n    /**\n     * @param {GameEngineProps} props\n     */\n    constructor(props)\n    {\n        super(props.config);\n        Logger.debug('Game Engine configuration.', props.config);\n        /** @type {Scene|false} */\n        this.uiScene = false;\n        /** @type {object} */\n        this.TemplateEngine = TemplateEngineRender;\n        /** @type {EventsManager} */\n        this.eventsManager = props.events;\n        this.eventsManager.on('reldens.beforeReconnectGameClient', () => {\n            this.clearTarget();\n        });\n        this.eventsManager.on('reldens.beforeSceneDynamicCreate', (sceneDynamic) => {\n            this.setupTabTarget(sceneDynamic);\n        });\n        /** @type {FPSCounter|undefined} */\n        this.fpsCounter = undefined;\n    }\n\n    /**\n     * @param {string} template\n     * @param {object} view\n     * @param {object} [partials]\n     * @param {string[]} [tags]\n     * @returns {string}\n     */\n    parseTemplate(template, view, partials, tags)\n    {\n        return this.TemplateEngine.render(template, view, partials, tags);\n    }\n\n    /**\n     * @param {GameManager} manager\n     */\n    updateGameSize(manager)\n    {\n        let {newWidth, newHeight, mapWidth, mapHeight, activeScene} = this.getCurrentScreenSize(manager);\n        let player = activeScene.player;\n        if(player){\n            // automatically fix the camera position to the player:\n            activeScene.cameras.main.setLerp(player.cameraInterpolationX, player.cameraInterpolationY);\n        }\n        setTimeout(() => {\n            this.eventsManager.emit('reldens.updateGameSizeBefore', this, newWidth, newHeight);\n            if(manager.config.getWithoutLogs('client/ui/screen/updateGameSizeEnabled', false)) {\n                this.scale.setGameSize(newWidth, newHeight);\n            }\n            this.centerSmallMapsCamera(manager, activeScene, newWidth, mapWidth, newHeight, mapHeight);\n            for(let key of Object.keys(this.uiScene.elementsUi)){\n                let uiElement = this.uiScene.elementsUi[key];\n                let positionKey = sc.get(this.uiScene.userInterfaces[key], 'uiPositionKey', key);\n                let {uiX, uiY} = this.uiScene.getUiConfig(positionKey, newWidth, newHeight);\n                uiElement.x = uiX;\n                uiElement.y = uiY;\n            }\n            this.eventsManager.emit('reldens.updateGameSizeAfter', this, newWidth, newHeight);\n            if(player){\n                // restore camera movement:\n                activeScene.cameras.main.setLerp(player.cameraInterpolationX, player.cameraInterpolationY);\n            }\n        }, manager.config.getWithoutLogs('client/general/gameEngine/updateGameSizeTimeOut', 0));\n    }\n\n    /**\n     * @param {GameManager} manager\n     * @returns {ScreenSizeData}\n     */\n    getCurrentScreenSize(manager)\n    {\n        let gameContainer = manager.gameDom.getElement(GameConst.SELECTORS.GAME_CONTAINER);\n        let containerWidth = gameContainer.offsetWidth;\n        let containerHeight = gameContainer.offsetHeight;\n        let newWidth = containerWidth;\n        let newHeight = containerHeight;\n        let mapWidth = 0, mapHeight = 0;\n        let activeScene = manager.getActiveScene();\n        if(activeScene){\n            let activeSceneMap = activeScene.map;\n            if(activeSceneMap){\n                mapWidth = activeSceneMap.width * activeSceneMap.tileWidth;\n                mapHeight = activeSceneMap.height * activeSceneMap.tileHeight;\n                if(\n                    manager.config.getWithoutLogs('client/ui/screen/adjustUiElementsToMapSize', false)\n                    && 0 < mapWidth\n                    && 0 < mapHeight\n                ){\n                    newWidth = Math.min(containerWidth, mapWidth);\n                    newHeight = Math.min(containerHeight, mapHeight);\n                }\n            }\n        }\n        if(manager.config.getWithoutLogs('client/ui/maximum/enabled', true)){\n            let maxUiW = Number(manager.config.get('client/ui/maximum/x'));\n            newWidth = Math.min(newWidth, maxUiW);\n            let maxUiY = Number(manager.config.get('client/ui/maximum/y'));\n            newHeight = Math.min(newHeight, maxUiY);\n        }\n        return {newWidth, newHeight, containerWidth, containerHeight, mapWidth, mapHeight, activeScene};\n    }\n\n    /**\n     * @param {GameManager} manager\n     * @param {SceneDynamic} activeScene\n     * @param {number} newWidth\n     * @param {number} mapWidth\n     * @param {number} newHeight\n     * @param {number} mapHeight\n     */\n    centerSmallMapsCamera(manager, activeScene, newWidth, mapWidth, newHeight, mapHeight)\n    {\n        if(!manager.config.getWithoutLogs('client/ui/screen/centerSmallMapsCamera', true) || !activeScene){\n            return;\n        }\n        let cameraX = 0;\n        let cameraY = 0;\n        if (newWidth > mapWidth) {\n            cameraX = (newWidth - mapWidth) / 2;\n        }\n        if (newHeight > mapHeight) {\n            cameraY = (newHeight - mapHeight) / 2;\n        }\n        activeScene.cameras.main.setPosition(cameraX, cameraY);\n    }\n\n    /**\n     * @param {string} targetName\n     * @param {object} target\n     * @param {object} [previousTarget]\n     */\n    showTarget(targetName, target, previousTarget)\n    {\n        if(sc.hasOwn(this.uiScene, 'uiTarget')){\n            this.uiScene.uiTarget.getChildByID('box-target').style.display = 'block';\n            this.uiScene.uiTarget.getChildByID('target-container').innerHTML = this.targetDisplay(targetName, target);\n        }\n        this.eventsManager.emit('reldens.gameEngineShowTarget', this, target, previousTarget, targetName);\n    }\n\n    /**\n     * @param {string} targetName\n     * @param {object} target\n     * @returns {string}\n     */\n    targetDisplay(targetName, target)\n    {\n        let targetDisplayContent = targetName;\n        if(GameConst.TYPE_PLAYER === target.type){\n            targetDisplayContent += this.generateTargetPlayedTime(target);\n        }\n        return targetDisplayContent;\n    }\n\n    /**\n     * @param {object} target\n     * @returns {string}\n     */\n    generateTargetPlayedTime(target)\n    {\n        let playerTimeText = '';\n        let showPlayedTimeConfig = this.uiScene.gameManager.config.getWithoutLogs(\n            'client/players/playedTime/show',\n            GameConst.SHOW_PLAYER_TIME.ONLY_OWN_PLAYER\n        );\n        if(GameConst.SHOW_PLAYER_TIME.NONE === showPlayedTimeConfig){\n            return playerTimeText;\n        }\n        let currentPlayer = this.uiScene.gameManager.getCurrentPlayer();\n        if(GameConst.SHOW_PLAYER_TIME.ALL_PLAYERS === showPlayedTimeConfig || currentPlayer.playerId === target.id){\n            let targetPlayedTime = this.obtainPlayedTime(target, currentPlayer);\n            playerTimeText += this.createPlayedTimeLabel(targetPlayedTime);\n        }\n        return playerTimeText;\n    }\n\n    /**\n     * @param {number} playedTime\n     * @returns {string}\n     */\n    createPlayedTimeLabel(playedTime)\n    {\n        let htmlElement = this.uiScene.gameManager.gameDom.createElement('p');\n        htmlElement.innerHTML = this.uiScene.gameManager.config.get('client/players/playedTime/label').replace(\n            '%playedTimeInHs',\n            playedTime\n        );\n        return htmlElement.outerHTML;\n    }\n\n    /**\n     * @param {object} target\n     * @param {Player} currentPlayer\n     * @returns {number}\n     */\n    obtainPlayedTime(target, currentPlayer)\n    {\n        return (currentPlayer.players[target.id].playedTime / 60 / 60).toFixed(1);\n    }\n\n    clearTarget()\n    {\n        let currentScene = this.uiScene.gameManager.activeRoomEvents.getActiveScene();\n        let clearedTargetData = Object.assign({}, currentScene.player.currentTarget);\n        if(sc.hasOwn(this.uiScene, 'uiTarget')){\n            currentScene.player.currentTarget = false;\n            // @TODO - BETA - Refactor to replace styles by classes.\n            this.uiScene.uiTarget.getChildByID('box-target').style.display = 'none';\n            this.uiScene.uiTarget.getChildByID('target-container').innerHTML = '';\n        }\n        this.eventsManager.emit('reldens.gameEngineClearTarget', this, clearedTargetData);\n    }\n\n    /**\n     * @param {SceneDynamic} sceneDynamic\n     */\n    setupTabTarget(sceneDynamic)\n    {\n        sceneDynamic.keyTab = sceneDynamic.input.keyboard.addKey(Input.Keyboard.KeyCodes.TAB);\n        sceneDynamic.input.keyboard['addCapture'](Input.Keyboard.KeyCodes.TAB);\n        sceneDynamic.input.keyboard.on('keydown', (event) => {\n            if(9 === event.keyCode){\n                this.tabTarget();\n            }\n        });\n    }\n\n    tabTarget()\n    {\n        let currentPlayer = this.uiScene.gameManager.getCurrentPlayer();\n        let objects = this.uiScene.gameManager.getActiveScene().objectsAnimations;\n        let players = currentPlayer.players;\n        let closerTarget = false;\n        let targetName = '';\n        let previousTarget = currentPlayer.currentTarget ? Object.assign({}, currentPlayer.currentTarget) : false;\n        for(let i of Object.keys(objects)){\n            if(!objects[i].targetName){\n                continue;\n            }\n            let dist = Math.hypot(objects[i].x-currentPlayer.state.x, objects[i].y-currentPlayer.state.y);\n            if(currentPlayer.currentTarget.id !== objects[i].key && (!closerTarget || closerTarget.dist > dist)){\n                closerTarget = {id: objects[i].key, type: ObjectsConst.TYPE_OBJECT, dist};\n                targetName = objects[i].targetName;\n            }\n        }\n        for(let i of Object.keys(players)){\n            if(currentPlayer.playerName === players[i].playerName){\n                continue;\n            }\n            let dist = Math.hypot(players[i].x-currentPlayer.state.x, players[i].y-currentPlayer.state.y);\n            if(currentPlayer.currentTarget.id !== players[i].id && (!closerTarget || closerTarget.dist > dist)){\n                closerTarget = {id: i, type: GameConst.TYPE_PLAYER, dist};\n                targetName = players[i].playerName;\n            }\n        }\n        currentPlayer.currentTarget = closerTarget;\n        this.showTarget(targetName, closerTarget, previousTarget);\n        this.eventsManager.emit('reldens.gameEngineTabTarget', this, closerTarget, previousTarget);\n    }\n\n    showFPS()\n    {\n        this.fpsCounter = new FPSCounter(this.uiScene.gameManager.gameDom);\n        this.fpsCounter.start();\n    }\n\n}\n\nmodule.exports.GameEngine = GameEngine;\n"
  },
  {
    "path": "lib/game/client/game-manager.js",
    "content": "/**\n *\n * Reldens - GameManager\n *\n * Client-side game manager that orchestrates the game client, handles authentication,\n * manages rooms, features, and coordinates the Phaser game engine lifecycle.\n * Initialized on page load, handles user login/registration, joins game rooms,\n * activates features, and maintains the connection between client and server.\n *\n */\n\nconst { GameClient } = require('./game-client');\nconst { GameEngine } = require('./game-engine');\nconst { RoomEvents } = require('./room-events');\nconst { ClientStartHandler } = require('./handlers/client-start-handler');\nconst { FeaturesManager } = require('../../features/client/manager');\nconst { FirebaseConnector } = require('../../firebase/client/connector');\nconst { ConfigManager } = require('../../config/client/config-manager');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst Translations = require('./snippets/en_US');\nconst { GameDom } = require('./game-dom');\nconst { RoomsConst } = require('../../rooms/constants');\nconst { GameConst } = require('../constants');\nconst { ErrorManager, EventsManagerSingleton, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('colyseus.js').Room} Room\n * @typedef {import('./game-engine').GameEngine} GameEngine\n * @typedef {import('./room-events').RoomEvents} RoomEvents\n * @typedef {import('../../users/client/player-engine').PlayerEngine} PlayerEngine\n * @typedef {import('./scene-dynamic').SceneDynamic} SceneDynamic\n * @typedef {import('./scene-preloader').ScenePreloader} ScenePreloader\n * @typedef {object} UserData\n * @property {number} [forgot]\n * @property {string} [email]\n * @property {boolean} [isGuest]\n * @property {boolean} [isNewUser]\n * @property {string} [username]\n * @property {string} [password]\n * @property {string} [selectedPlayer]\n * @property {string} [selectedScene]\n */\nclass GameManager\n{\n\n    constructor()\n    {\n        /** @type {GameEngine|false} */\n        this.gameEngine = false;\n        /** @type {RoomEvents|null} */\n        this.activeRoomEvents = null;\n        /** @type {EventsManager} */\n        this.events = EventsManagerSingleton;\n        /** @type {GameDom} */\n        this.gameDom = GameDom;\n        /** @type {ConfigManager} */\n        this.config = new ConfigManager();\n        let initialConfig = this.gameDom.getWindow()?.reldensInitialConfig || {};\n        sc.deepMergeProperties(this.config, initialConfig);\n        /** @type {FeaturesManager} */\n        this.features = new FeaturesManager({gameManager: this, events: this.events});\n        /** @type {FirebaseConnector} */\n        this.firebase = new FirebaseConnector(this);\n        /** @type {Object<string, Room>} */\n        this.joinedRooms = {};\n        /** @type {UserData} */\n        this.userData = {};\n        /** @type {Object<string, object>} */\n        this.plugins = {};\n        /** @type {Object<string, object>} */\n        this.services = {};\n        /** @type {Object<string, HTMLElement>} */\n        this.elements = {};\n        /** @type {object|false} */\n        this.playerData = false;\n        /** @type {boolean} */\n        this.gameOver = false;\n        /** @type {boolean} */\n        this.forcedDisconnection = false;\n        /** @type {boolean} */\n        this.isChangingScene = false;\n        /** @type {boolean} */\n        this.canInitEngine = true;\n        /** @type {string} */\n        this.appServerUrl = '';\n        /** @type {string} */\n        this.gameServerUrl = '';\n        /** @type {string} */\n        this.locale = '';\n        TranslationsMapper.forConfig(this.config.client, Translations, GameConst.MESSAGE.DATA_VALUES);\n        /** @type {Object<string, any>} */\n        this.createdAnimations = {};\n    }\n\n    /**\n     * @param {boolean} changingScene\n     */\n    setChangingScene(changingScene)\n    {\n        this.isChangingScene = changingScene;\n        let rootElement = this.gameDom.getElement('#reldens div');\n        if(!rootElement){\n            return;\n        }\n        if(changingScene){\n            rootElement.classList.add('hidden-forced');\n            return;\n        }\n        rootElement.classList.remove('hidden-forced');\n    }\n\n    /**\n     * @param {string} customPluginKey\n     * @param {Function} customPlugin\n     */\n    setupCustomClientPlugin(customPluginKey, customPlugin)\n    {\n        this.plugins[customPluginKey] = new customPlugin();\n        this.plugins[customPluginKey].setup({gameManager: this, events: this.events});\n    }\n\n    clientStart()\n    {\n        this.events.emitSync('reldens.clientStartBefore', this);\n        /** @type {ClientStartHandler} */\n        this.startHandler = new ClientStartHandler(this);\n        this.startHandler.clientStart();\n    }\n\n    /**\n     * @param {object} formData\n     * @param {boolean} [isNewUser]\n     * @returns {Promise<boolean>}\n     */\n    async startGame(formData, isNewUser)\n    {\n        this.events.emitSync('reldens.startGameBefore', this);\n        let gameRoom = await this.joinGame(formData, isNewUser);\n        if(gameRoom){\n            this.handleLoginSuccess();\n            return true;\n        }\n        this.handleLoginError(formData);\n        return false;\n    }\n\n    handleLoginSuccess()\n    {\n        let body = this.gameDom.getElement(GameConst.SELECTORS.BODY);\n        body.classList.add(GameConst.CLASSES.GAME_STARTED);\n        body.classList.remove(GameConst.CLASSES.GAME_ERROR);\n        this.gameDom.getElement(GameConst.SELECTORS.FORMS_CONTAINER).remove();\n        this.events.emitSync('reldens.startGameAfter', this);\n    }\n\n    /**\n     * @param {object} formData\n     */\n    handleLoginError(formData)\n    {\n        let body = this.gameDom.getElement(GameConst.SELECTORS.BODY);\n        body.classList.remove(GameConst.CLASSES.GAME_STARTED);\n        body.classList.add(GameConst.CLASSES.GAME_ERROR);\n        // @NOTE: game room errors should always be because of some wrong login or registration data. For these cases\n        // we will check the isNewUser variable to know where to display the error.\n        this.submitedForm = false;\n        this.events.emitSync('reldens.gameRoomError', this);\n        // @TODO - BETA - Move to firebase plugin with an event subscriber.\n        if(this.firebase && 'firebase-login' === formData.formId){\n            this.firebase.app.auth().signOut();\n        }\n    }\n\n    /**\n     * @param {object} formData\n     * @param {boolean} [isNewUser]\n     * @returns {Promise<Room|boolean>}\n     */\n    async joinGame(formData, isNewUser = false)\n    {\n        // reset the user data in the object in case another form was used before:\n        this.userData = {};\n        await this.events.emit('reldens.beforeJoinGame', {gameManager: this, formData, isNewUser});\n        this.mapFormDataToUserData(formData, isNewUser);\n        // join the initial game room, because we return the promise, we don't need to catch the error here:\n        /** @type {Room|boolean} */\n        this.gameRoom = await this.gameClient.joinOrCreate(GameConst.ROOM_GAME, this.userData);\n        if(!this.gameRoom){\n            this.displayFormError('#'+formData.formId, this.gameClient.lastErrorMessage);\n            return false;\n        }\n        await this.events.emit('reldens.beforeJoinGameRoom', this.gameRoom);\n        this.handleGameRoomMessages();\n        this.activateResponsiveBehavior();\n        return this.gameRoom;\n    }\n\n    /**\n     * @param {object} formData\n     * @param {boolean} isNewUser\n     */\n    mapFormDataToUserData(formData, isNewUser)\n    {\n        if(sc.hasOwn(formData, 'forgot')){\n            this.userData.forgot = 1;\n            this.userData.email = formData['email'];\n        }\n        this.initializeClient();\n        if(formData.isGuest){\n            this.userData.isGuest = true;\n            this.userData.isNewUser = true;\n        }\n        if(isNewUser){\n            this.userData.isNewUser = true;\n            this.userData.email = formData['email'];\n        }\n        this.userData.username = formData['username'];\n        this.userData.password = formData['password'];\n    }\n\n    handleGameRoomMessages()\n    {\n        this.gameRoom.onMessage('*', async (message) => {\n            if(message.error){\n                Logger.error('Game Room message error.', message.message);\n                this.displayFormError(GameConst.SELECTORS.PLAYER_CREATE_FORM, message.message);\n                return false;\n            }\n            if(GameConst.START_GAME === message.act){\n                this.initialGameData = message;\n                return await this.beforeStartGame();\n            }\n            if(GameConst.CREATE_PLAYER_RESULT !== message.act){\n                return false;\n            }\n            this.initialGameData.player = message.player;\n            let playerSelection = this.gameDom.getElement(GameConst.SELECTORS.PLAYER_SELECTION);\n            if(playerSelection){\n                playerSelection.classList.add('hidden');\n            }\n            await this.initEngine();\n        });\n    }\n\n    activateResponsiveBehavior()\n    {\n        this.events.on('reldens.afterSceneDynamicCreate', async () => {\n            if(!this.config.getWithoutLogs('client/ui/screen/responsive', true)){\n                return;\n            }\n            this.gameEngine.updateGameSize(this);\n            this.gameDom.getWindow().addEventListener('resize', () => {\n                this.gameEngine.updateGameSize(this);\n            });\n        });\n    }\n\n    /**\n     * @param {string} formId\n     * @param {string} message\n     * @returns {boolean}\n     */\n    displayFormError(formId, message)\n    {\n        let errorElement = this.gameDom.getElement(formId+' '+GameConst.SELECTORS.RESPONSE_ERROR);\n        if(!errorElement){\n            return false;\n        }\n        errorElement.innerHTML = message;\n        let loadingContainer = this.gameDom.getElement(formId+' '+GameConst.SELECTORS.LOADING_CONTAINER);\n        if(loadingContainer){\n            loadingContainer?.classList.add(GameConst.CLASSES.HIDDEN);\n        }\n        return true;\n    }\n\n    initializeClient()\n    {\n        this.appServerUrl = this.getAppServerUrl();\n        this.gameServerUrl = this.getGameServerUrl();\n        /** @type {GameClient} */\n        this.gameClient = new GameClient(this.gameServerUrl, this.config);\n    }\n\n    /**\n     * @returns {Promise<boolean|object>}\n     */\n    async beforeStartGame()\n    {\n        await this.events.emit('reldens.beforeInitEngineAndStartGame', this.initialGameData, this);\n        if(!sc.hasOwn(this.initialGameData, 'gameConfig')){\n            ErrorManager.error('Missing game configuration.');\n        }\n        // apply the initial config to the processor:\n        sc.deepMergeProperties(this.config, (this.initialGameData?.gameConfig || {}));\n        // features list:\n        await this.features.loadFeatures((this.initialGameData?.features || {}));\n        await this.events.emit('reldens.beforeCreateEngine', this.initialGameData, this);\n        if(!this.canInitEngine){\n            return false;\n        }\n        return await this.initEngine();\n    }\n\n    /**\n     * @returns {Promise<Room|void>}\n     */\n    async initEngine()\n    {\n        // @NOTE we could leave the game room after the game initialized because at that point the user already\n        // joined the scene room and this room doesn't listen for anything, BUT we keep it to track all logged users.\n        // await this.gameRoom.leave();\n        this.playerData = this.initialGameData?.player || false;\n        if(!this.playerData || !this.playerData.state){\n            return this.gameDom.alertReload(this.services?.translator.t('game.errors.missingPlayerData'));\n        }\n        this.userData.selectedPlayer = this.playerData.id;\n        let selectedScene = this.initialGameData?.selectedScene || '';\n        this.userData.selectedScene = selectedScene;\n        let config = this.initialGameData?.gameConfig || {};\n        this.gameEngine = new GameEngine({config: config.client.gameEngine, events: this.events});\n        // since the user is now registered:\n        this.userData.isNewUser = false;\n        // for guests use the password from the server:\n        if(this.userData.isGuest){\n            if(this.initialGameData?.guestPassword){\n                this.userData.password = this.initialGameData.guestPassword;\n            }\n            if(this.initialGameData?.userName){\n                this.userData.username = this.initialGameData.userName;\n            }\n        }\n        await this.joinFeaturesRooms();\n        let useLastLocation = '' !== selectedScene && selectedScene !== RoomsConst.ROOM_LAST_LOCATION_KEY;\n        let playerScene = useLastLocation ? selectedScene : this.playerData.state.scene;\n        this.playerData.state.scene = playerScene;\n        let joinedFirstRoom = await this.gameClient.joinOrCreate(playerScene, this.userData);\n        if(!joinedFirstRoom){\n            // @NOTE: the errors while trying to join a rooms/scene will always be originated in the\n            // server. For these errors we will alert the user and reload the window automatically.\n            return this.gameDom.alertReload(\n                this.services?.translator.t('game.errors.joiningRoom', {joinRoomName: playerScene})\n            );\n        }\n        this.gameDom.getElement(GameConst.SELECTORS.BODY).classList.add(GameConst.CLASSES.GAME_ENGINE_STARTED);\n        this.gameDom.getElement(GameConst.SELECTORS.GAME_CONTAINER).classList.remove(GameConst.CLASSES.HIDDEN);\n        let playerSelection = this.gameDom.getElement(GameConst.SELECTORS.PLAYER_SELECTION);\n        if(playerSelection){\n            playerSelection.classList.add(GameConst.CLASSES.HIDDEN);\n        }\n        // @NOTE: remove the selected scene after the player used it because the login data will be used again every\n        // time the player changes the scene.\n        delete this.initialGameData['selectedScene'];\n        delete this.userData['selectedScene'];\n        await this.emitJoinedRoom(joinedFirstRoom, playerScene);\n        this.activeRoomEvents = this.createRoomEventsInstance(playerScene);\n        await this.events.emit('reldens.createdRoomsEventsInstance', joinedFirstRoom, this);\n        await this.activeRoomEvents.activateRoom(joinedFirstRoom);\n        await this.emitActivatedRoom(joinedFirstRoom, playerScene);\n        await this.events.emit('reldens.afterInitEngineAndStartGame', this.initialGameData, joinedFirstRoom);\n        return joinedFirstRoom;\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async joinFeaturesRooms()\n    {\n        /** @type {Array<string>} */\n        let featuresListKeys = Object.keys(this.features.featuresList);\n        if(0 === featuresListKeys.length){\n            return;\n        }\n        /** @type {Array<string>} */\n        let featuresRoomsNames = [];\n        for(let i of featuresListKeys){\n            let feature = this.features.featuresList[i];\n            if(!sc.hasOwn(feature, 'joinRooms')){\n                continue;\n            }\n            for(let joinRoomName of feature.joinRooms){\n                let joinedRoom = await this.gameClient.joinOrCreate(joinRoomName, this.userData);\n                if(!joinedRoom){\n                    // @NOTE: any join room error will always be originated in the server. For these errors we\n                    // will alert the user and reload the window automatically. Here the received \"data\" will\n                    // be the actual error message.\n                    return this.gameDom.alertReload(\n                        this.services.translator.t('game.errors.joiningFeatureRoom', {joinRoomName})\n                    );\n                }\n                //Logger.debug('Joined room: '+joinRoomName);\n                // after the room was joined added to the joinedRooms list:\n                this.joinedRooms[joinRoomName] = joinedRoom;\n                await this.emitJoinedRoom(joinedRoom, joinRoomName);\n                featuresRoomsNames.push(joinRoomName);\n            }\n        }\n        sc.deepMergeProperties(this.config, {client: {rooms: {featuresRoomsNames}}});\n    }\n\n    /**\n     * @param {object} message\n     * @param {Room} previousRoom\n     * @returns {Promise<void>}\n     */\n    async reconnectGameClient(message, previousRoom)\n    {\n        this.setChangingScene(true);\n        let newRoomEvents = this.createRoomEventsInstance(message.player.state.scene);\n        this.gameClient.joinOrCreate(newRoomEvents.roomName, this.userData).then(async (sceneRoom) => {\n            // leave the old room:\n            previousRoom.leave();\n            this.activeRoomEvents = newRoomEvents;\n            this.room = sceneRoom;\n            await this.emitJoinedRoom(sceneRoom, message.player.state.scene);\n            // start to listen to the new room events:\n            await newRoomEvents.activateRoom(sceneRoom, message.prev);\n            await this.emitActivatedRoom(sceneRoom, message.player.state.scene);\n        }).catch((error) => {\n            // @NOTE: the errors while trying to reconnect will always be originated in the server. For these errors we\n            // will alert the user and reload the window automatically.\n            Logger.error('Reconnect Game Client error.', {error, message, previousRoom});\n            this.gameDom.alertReload(this.services.translator.t('game.errors.reconnectClient'));\n        });\n    }\n\n    /**\n     * @param {Room} sceneRoom\n     * @param {string} playerScene\n     * @returns {Promise<void>}\n     */\n    async emitActivatedRoom(sceneRoom, playerScene)\n    {\n        await this.events.emit('reldens.activatedRoom', sceneRoom, this);\n        await this.events.emit('reldens.activatedRoom_'+playerScene, sceneRoom, this);\n    }\n\n    /**\n     * @param {Room} sceneRoom\n     * @param {string} playerScene\n     * @returns {Promise<void>}\n     */\n    async emitJoinedRoom(sceneRoom, playerScene)\n    {\n        await this.events.emit('reldens.joinedRoom', sceneRoom, this);\n        await this.events.emit('reldens.joinedRoom_'+playerScene, sceneRoom, this);\n    }\n\n    /**\n     * @param {string} roomName\n     * @returns {RoomEvents}\n     */\n    createRoomEventsInstance(roomName)\n    {\n        return new RoomEvents(roomName, this);\n    }\n\n    /**\n     * @returns {string}\n     */\n    getAppServerUrl()\n    {\n        if('' === this.appServerUrl){\n            this.appServerUrl = this.getUrlFromCurrentReferer();\n        }\n        return this.appServerUrl;\n    }\n\n    /**\n     * @returns {string}\n     */\n    getGameServerUrl()\n    {\n        if('' === this.gameServerUrl){\n            this.gameServerUrl = this.getUrlFromCurrentReferer(true);\n        }\n        return this.gameServerUrl;\n    }\n\n    /**\n     * @param {boolean} [useWebSocket]\n     * @returns {string}\n     */\n    getUrlFromCurrentReferer(useWebSocket = false)\n    {\n        let location = this.gameDom.getWindow().location;\n        let protocol = location.protocol;\n        if(useWebSocket){\n            protocol = 0 === protocol.indexOf('https') ? 'wss:' : 'ws:';\n        }\n        return protocol + '//'+location.hostname+(location.port ? ':'+location.port : '');\n    }\n\n    /**\n     * @returns {SceneDynamic}\n     */\n    getActiveScene()\n    {\n        return this.activeRoomEvents.getActiveScene();\n    }\n\n    /**\n     * @returns {ScenePreloader}\n     */\n    getActiveScenePreloader()\n    {\n        return this.gameEngine.scene.getScene(GameConst.SCENE_PRELOADER+this.getActiveScene().key);\n    }\n\n    /**\n     * @returns {PlayerEngine|boolean}\n     */\n    getCurrentPlayer()\n    {\n        let activeScene = this.getActiveScene();\n        if(!activeScene){\n            //Logger.debug('Missing active scene.');\n            return false;\n        }\n        return activeScene.player;\n    }\n\n    /**\n     * @returns {string}\n     */\n    currentPlayerName()\n    {\n        let currentPlayer = this.getCurrentPlayer();\n        if(!currentPlayer){\n            return '';\n        }\n        return currentPlayer.player_id+' - '+currentPlayer.playerName;\n    }\n\n    /**\n     * @returns {object}\n     */\n    getCurrentPlayerAnimation()\n    {\n        let current = this.getCurrentPlayer();\n        return current.players[current.playerId];\n    }\n\n    /**\n     * @param {string} uiName\n     * @param {boolean} [logError]\n     * @returns {object|boolean}\n     */\n    getUiElement(uiName, logError = true)\n    {\n        let uiScene = sc.get(this.gameEngine, 'uiScene', false);\n        if(uiScene){\n            return uiScene.getUiElement(uiName, logError);\n        }\n        if(logError){\n            Logger.error('UI Scene not defined.');\n        }\n        return false;\n    }\n\n    /**\n     * @param {string} featureKey\n     * @returns {object|boolean}\n     */\n    getFeature(featureKey)\n    {\n        let featuresList = this.features.featuresList;\n        if(!sc.hasOwn(featuresList, featureKey)){\n            Logger.error('Feature key not defined.', featureKey);\n            return false;\n        }\n        return featuresList[featureKey];\n    }\n\n    /**\n     * @param {string} key\n     * @returns {object}\n     */\n    getAnimationByKey(key)\n    {\n        return this.getActiveScene().getAnimationByKey(key);\n    }\n\n}\n\nmodule.exports.GameManager = GameManager;\n"
  },
  {
    "path": "lib/game/client/handlers/client-start-handler.js",
    "content": "/**\n *\n * Reldens - ClientStartHandler\n *\n * Initializes all client-side form handlers for the game start screen. Activates registration,\n * guest login, terms and conditions, regular login, and forgot password forms. Initializes Firebase\n * authentication if configured. Stores form handler instances in GameManager elements for access\n * throughout the application. Emits clientStartAfter event for custom initialization hooks.\n *\n */\n\nconst { RegistrationFormHandler } = require('./registration-form-handler');\nconst { TermsAndConditionsHandler } = require('./terms-and-conditions-handler');\nconst { LoginFormHandler } = require('./login-form-handler');\nconst { ForgotPasswordFormHandler } = require('./forgot-password-form-handler');\nconst { GuestFormHandler } = require('./guest-form-handler');\n\nclass ClientStartHandler\n{\n\n    /**\n     * @param {GameManager} gameManager\n     */\n    constructor(gameManager)\n    {\n        /** @type {GameManager} */\n        this.gameManager = gameManager;\n    }\n\n    clientStart()\n    {\n        let registrationForm = new RegistrationFormHandler(this.gameManager);\n        registrationForm.activateRegistration();\n        let guestForm = new GuestFormHandler(this.gameManager);\n        guestForm.activateGuest();\n        let termsAndConditions = new TermsAndConditionsHandler(this.gameManager);\n        termsAndConditions.activateTermsAndConditions();\n        let loginForm = new LoginFormHandler(this.gameManager);\n        loginForm.activateLogin();\n        let forgotPasswordForm = new ForgotPasswordFormHandler(this.gameManager);\n        forgotPasswordForm.activateForgotPassword();\n        forgotPasswordForm.displayForgotPassword();\n        if(this.gameManager.firebase){\n            this.gameManager.firebase.startFirebase();\n        }\n        Object.assign(this.gameManager.elements, {\n            registrationForm,\n            termsAndConditions,\n            loginForm,\n            forgotPasswordForm\n        });\n        this.gameManager.events.emitSync('reldens.clientStartAfter', this);\n    }\n\n}\n\nmodule.exports.ClientStartHandler = ClientStartHandler;\n"
  },
  {
    "path": "lib/game/client/handlers/errors-block-handler.js",
    "content": "/**\n *\n * Reldens - ErrorsBlockHandler\n *\n * Utility class for managing error message blocks in forms. Provides a static method to reset error\n * displays when users focus on form input fields, clearing error messages and hiding loading indicators.\n *\n */\n\nconst { GameConst } = require('../../constants');\n\nclass ErrorsBlockHandler\n{\n\n    /**\n     * @param {HTMLFormElement} form\n     * @returns {boolean}\n     */\n    static reset(form)\n    {\n        if(!form){\n            return false;\n        }\n        let errorBlock = form.querySelector(GameConst.SELECTORS.RESPONSE_ERROR);\n        if(!errorBlock){\n            return false;\n        }\n        let inputElement = form.querySelector(GameConst.SELECTORS.INPUT);\n        if(!inputElement){\n            return false;\n        }\n        inputElement.addEventListener('focus', () => {\n            errorBlock.innerHTML = '';\n            let loadingContainer = form.querySelector(GameConst.SELECTORS.LOADING_CONTAINER);\n            if(loadingContainer){\n                loadingContainer?.classList.add(GameConst.CLASSES.HIDDEN);\n            }\n        });\n    }\n\n}\n\nmodule.exports.ErrorsBlockHandler = ErrorsBlockHandler;\n"
  },
  {
    "path": "lib/game/client/handlers/forgot-password-form-handler.js",
    "content": "/**\n *\n * Reldens - ForgotPasswordFormHandler\n *\n * Manages the forgot password form for requesting password reset emails. Handles form submission,\n * validation, and communicates with the server to initiate the password recovery process.\n *\n */\n\nconst { ErrorsBlockHandler } = require('./errors-block-handler');\nconst { GameConst } = require('../../constants');\n\n/**\n * @typedef {import('../game-manager').GameManager} GameManager\n */\nclass ForgotPasswordFormHandler\n{\n\n    /**\n     * @param {GameManager} gameManager\n     */\n    constructor(gameManager)\n    {\n        this.gameManager = gameManager;\n        this.gameDom = this.gameManager.gameDom;\n        this.form = this.gameManager.gameDom.getElement(GameConst.SELECTORS.FORGOT_PASSWORD_FORM);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    activateForgotPassword()\n    {\n        if(!this.form){\n            return false;\n        }\n        if(!this.gameManager.config.get('client/general/users/allowRegistration')){\n            this.form.classList.add('hidden');\n            return true;\n        }\n        ErrorsBlockHandler.reset(this.form);\n        this.form.addEventListener('submit', (e) => {\n            e.preventDefault();\n            ErrorsBlockHandler.reset(this.form);\n            if(!this.form.checkValidity()){\n                return false;\n            }\n            this.form.querySelector(GameConst.SELECTORS.LOADING_CONTAINER).classList.remove(GameConst.CLASSES.HIDDEN);\n            let formData = {\n                formId: this.form.id,\n                forgot: true,\n                email: this.form.querySelector(GameConst.SELECTORS.FORGOT_PASSWORD.EMAIL).value\n            };\n            this.gameManager.startGame(formData, false);\n        });\n        return true;\n    }\n\n    displayForgotPassword()\n    {\n        this.gameDom.getJSON(this.gameManager.appServerUrl+GameConst.ROUTE_PATHS.MAILER, (err, response) => {\n            if(!response.enabled){\n                return;\n            }\n            this.gameDom.getElement(GameConst.SELECTORS.FORGOT_PASSWORD.CONTAINER).classList.remove(\n                GameConst.CLASSES.HIDDEN\n            );\n        });\n    }\n\n}\n\nmodule.exports.ForgotPasswordFormHandler = ForgotPasswordFormHandler;\n"
  },
  {
    "path": "lib/game/client/handlers/full-screen-handler.js",
    "content": "/**\n *\n * Reldens - FullScreenHandler\n *\n * Manages full-screen toggle functionality for the game. Handles full-screen button clicks and\n * browser full-screen API, applying CSS classes for full-screen state changes.\n *\n */\n\nconst { GameConst } = require('../../constants');\n\n/**\n * @typedef {import('../game-manager').GameManager} GameManager\n */\nclass FullScreenHandler\n{\n\n    /**\n     * @param {GameManager} gameManager\n     */\n    constructor(gameManager)\n    {\n        this.gameManager = gameManager;\n        this.gameDom = this.gameManager.gameDom;\n        this.body = this.gameDom.getElement(GameConst.SELECTORS.BODY);\n    }\n\n    activateFullScreen()\n    {\n        this.gameDom.getElement(GameConst.SELECTORS.FULL_SCREEN_BUTTON)?.addEventListener('click', (e) => {\n            e.preventDefault();\n            if(!this.gameDom.getDocument().fullscreenEnabled){\n                return;\n            }\n            if(!this.body.classList.contains(GameConst.CLASSES.FULL_SCREEN_ON)){\n                this.body.requestFullscreen();\n                this.goFullScreen();\n                return;\n            }\n            this.gameDom.getDocument().exitFullscreen();\n            this.exitFullScreen();\n        });\n        this.gameDom.getWindow().matchMedia('(display-mode: fullscreen)').addEventListener('change', ({ matches }) => {\n            if(matches){\n                this.goFullScreen();\n                return;\n            }\n            this.exitFullScreen();\n        });\n    }\n\n    goFullScreen()\n    {\n\n        this.body.classList.add(GameConst.CLASSES.FULL_SCREEN_ON);\n        if(this.gameManager?.gameEngine){\n            this.gameManager.gameEngine.updateGameSize(this.gameManager);\n        }\n    }\n\n    exitFullScreen()\n    {\n        this.body.classList.remove(GameConst.CLASSES.FULL_SCREEN_ON);\n        if(this.gameManager?.gameEngine){\n            this.gameManager.gameEngine.updateGameSize(this.gameManager);\n        }\n    }\n}\n\nmodule.exports.FullScreenHandler = FullScreenHandler;\n"
  },
  {
    "path": "lib/game/client/handlers/guest-form-handler.js",
    "content": "/**\n *\n * Reldens - GuestFormHandler\n *\n * Manages the guest login form for anonymous player access. Handles guest form submission,\n * generates random guest usernames, validates guest configuration, and initiates the game\n * session for guest players.\n *\n */\n\nconst { ErrorsBlockHandler } = require('./errors-block-handler');\nconst { GameConst } = require('../../constants');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../game-manager').GameManager} GameManager\n */\nclass GuestFormHandler\n{\n\n    /**\n     * @param {GameManager} gameManager\n     */\n    constructor(gameManager)\n    {\n        this.gameManager = gameManager;\n        this.gameDom = this.gameManager.gameDom;\n        this.form = gameManager.gameDom.getElement(GameConst.SELECTORS.GUEST_FORM);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    activateGuest()\n    {\n        if(!this.form){\n            return false;\n        }\n        let availableGuestRooms = this.gameManager.config.getWithoutLogs(\n            'client/rooms/selection/availableRooms/registrationGuest',\n            {}\n        );\n        if(\n            !this.gameManager.config.get('client/general/users/allowGuest')\n            || 0 === Object.keys(availableGuestRooms).length\n        ){\n            this.form.classList.add('hidden');\n            return true;\n        }\n        ErrorsBlockHandler.reset(this.form);\n        let selectors = GameConst.SELECTORS;\n        this.form.addEventListener('submit', (e) => {\n            e.preventDefault();\n            if(!this.form.checkValidity()){\n                return false;\n            }\n            this.form.querySelector(selectors.LOADING_CONTAINER).classList.remove(GameConst.CLASSES.HIDDEN);\n            let randomGuestName = 'guest-'+sc.randomChars(12);\n            let userName = this.gameManager.config.getWithoutLogs('client/general/users/allowGuestUserName', false)\n                ? this.gameDom.getElement(selectors.GUEST.USERNAME).value\n                : randomGuestName;\n            let formData = {\n                formId: this.form.id,\n                username: userName,\n                password: userName,\n                rePassword: userName,\n                isGuest: true\n            };\n            this.gameManager.startGame(formData, true);\n        });\n        return true;\n    }\n\n}\n\nmodule.exports.GuestFormHandler = GuestFormHandler;\n"
  },
  {
    "path": "lib/game/client/handlers/login-form-handler.js",
    "content": "/**\n *\n * Reldens - LoginFormHandler\n *\n * Manages the login form for existing player authentication. Handles form submission, validation,\n * and initiates the game session with provided credentials.\n *\n */\n\nconst { ErrorsBlockHandler } = require('./errors-block-handler');\nconst { GameConst } = require('../../constants');\n\n/**\n * @typedef {import('../game-manager').GameManager} GameManager\n */\nclass LoginFormHandler\n{\n\n    /**\n     * @param {GameManager} gameManager\n     */\n    constructor(gameManager)\n    {\n        this.gameManager = gameManager;\n        this.form = gameManager.gameDom.getElement(GameConst.SELECTORS.LOGIN_FORM);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    activateLogin()\n    {\n        if(!this.form){\n            return false;\n        }\n        ErrorsBlockHandler.reset(this.form);\n        this.form.addEventListener('submit', (e) => {\n            e.preventDefault();\n            ErrorsBlockHandler.reset(this.form);\n            if(!this.form.checkValidity()){\n                return false;\n            }\n            if(this.gameManager.submitedForm){\n                return false;\n            }\n            this.gameManager.submitedForm = true;\n            this.form.querySelector(GameConst.SELECTORS.LOADING_CONTAINER).classList.remove(GameConst.CLASSES.HIDDEN);\n            let formData = {\n                formId: this.form.id,\n                username: this.form.querySelector(GameConst.SELECTORS.LOGIN.USERNAME).value,\n                password: this.form.querySelector(GameConst.SELECTORS.LOGIN.PASSWORD).value\n            };\n            return this.gameManager.startGame(formData, false);\n        });\n        return true;\n    }\n\n}\n\nmodule.exports.LoginFormHandler = LoginFormHandler;\n"
  },
  {
    "path": "lib/game/client/handlers/registration-form-handler.js",
    "content": "/**\n *\n * Reldens - RegistrationFormHandler\n *\n * Manages the player registration form for creating new accounts. Handles form submission,\n * password confirmation validation, terms and conditions acceptance, and initiates the game\n * session for newly registered players.\n *\n */\n\nconst { ErrorsBlockHandler } = require('./errors-block-handler');\nconst { GameConst } = require('../../constants');\n\n/**\n * @typedef {import('../game-manager').GameManager} GameManager\n */\nclass RegistrationFormHandler\n{\n\n    /**\n     * @param {GameManager} gameManager\n     */\n    constructor(gameManager)\n    {\n        this.gameManager = gameManager;\n        this.gameDom = this.gameManager.gameDom;\n        this.form = gameManager.gameDom.getElement(GameConst.SELECTORS.REGISTER_FORM);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    activateRegistration()\n    {\n        if(!this.form){\n            return false;\n        }\n        if(!this.gameManager.config.get('client/general/users/allowRegistration')){\n            this.form.classList.add('hidden');\n            return true;\n        }\n        ErrorsBlockHandler.reset(this.form);\n        let selectors = GameConst.SELECTORS;\n        let acceptTermsCheckbox = this.gameDom.getElement(selectors.TERMS.ACCEPT);\n        let termsContainer = this.gameDom.getElement(selectors.TERMS.BOX);\n        this.form.addEventListener('submit', (e) => {\n            e.preventDefault();\n            if(!this.form.checkValidity()){\n                return false;\n            }\n            let password = this.gameDom.getElement(selectors.REGISTRATION.PASSWORD).value;\n            let rePassword = this.gameDom.getElement(selectors.REGISTRATION.RE_PASSWORD).value;\n            let responseErrorBlock = this.form.querySelector(selectors.RESPONSE_ERROR);\n            if(password !== rePassword && responseErrorBlock){\n                // @TODO - BETA - Execute translations before the game engine starts.\n                /*\n                responseErrorBlock.innerHTML = this.gameManager.services.translator.t(\n                    'game.passwordConfirmationNotMatch'\n                );\n                */\n                responseErrorBlock.innerHTML = 'Password and confirmation does not match.';\n                return false;\n            }\n            if(!acceptTermsCheckbox.checked && responseErrorBlock){\n                // @TODO - BETA - Execute translations before the game engine starts.\n                /*\n                responseErrorBlock.innerHTML = this.gameManager.services.translator.t(\n                    'game.pleaseReadTermsAndConditions'\n                );\n                */\n                responseErrorBlock.innerHTML = 'Please read and accept the terms and conditions and continue.';\n                return false;\n            }\n            termsContainer?.classList.add(GameConst.CLASSES.HIDDEN);\n            this.form.querySelector(selectors.LOADING_CONTAINER).classList.remove(GameConst.CLASSES.HIDDEN);\n            let formData = {\n                formId: this.form.id,\n                email: this.gameDom.getElement(selectors.REGISTRATION.EMAIL).value,\n                username: this.gameDom.getElement(selectors.REGISTRATION.USERNAME).value,\n                password: password,\n                rePassword: rePassword\n            };\n            this.gameManager.startGame(formData, true);\n        });\n        return true;\n    }\n\n}\n\nmodule.exports.RegistrationFormHandler = RegistrationFormHandler;\n"
  },
  {
    "path": "lib/game/client/handlers/terms-and-conditions-handler.js",
    "content": "/**\n *\n * Reldens - TermsAndConditionsHandler\n *\n * Manages the terms and conditions modal display. Fetches terms content from the server, handles\n * language-specific content, and manages the terms dialog open/close behavior.\n *\n */\n\nconst { GameConst } = require('../../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../game-manager').GameManager} GameManager\n */\nclass TermsAndConditionsHandler\n{\n\n    /**\n     * @param {GameManager} gameManager\n     */\n    constructor(gameManager)\n    {\n        this.gameManager = gameManager;\n        this.gameDom = this.gameManager.gameDom;\n        this.linkContainer = this.gameManager.gameDom.getElement(GameConst.SELECTORS.TERMS.LINK_CONTAINER);\n        this.overlay = null;\n    }\n\n    createOverlay()\n    {\n        if(this.overlay){\n            return this.overlay;\n        }\n        this.overlay = this.gameDom.getDocument().createElement('div');\n        this.overlay.className = 'modal-overlay';\n        this.gameDom.getDocument().body.appendChild(this.overlay);\n        return this.overlay;\n    }\n\n    showOverlay()\n    {\n        if(!this.overlay){\n            this.createOverlay();\n        }\n        this.overlay.classList.add('active');\n    }\n\n    hideOverlay()\n    {\n        if(!this.overlay){\n            return;\n        }\n        this.overlay.classList.remove('active');\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    activateTermsAndConditions()\n    {\n        if(!this.linkContainer){\n            return false;\n        }\n        let termsAndConditionsUrl = this.gameManager.appServerUrl+GameConst.ROUTE_PATHS.TERMS_AND_CONDITIONS;\n        let params = (new URL(this.gameDom.getDocument().location)).searchParams;\n        let language = params.get('lang', '');\n        if('' !== language){\n            termsAndConditionsUrl+= '?lang='+language;\n        }\n        this.gameDom.getJSON(termsAndConditionsUrl, (err, response) => {\n            if(!response.body || !response.heading || !response.checkboxLabel || !response.link){\n                return false;\n            }\n            if(err){\n                Logger.info('Registration error.', err);\n                return false;\n            }\n            let selectors = GameConst.SELECTORS.TERMS;\n            this.gameDom.updateContent(selectors.HEADING, response.heading);\n            this.gameDom.updateContent(selectors.BODY, response.body);\n            this.gameDom.updateContent(selectors.ACCEPT_LABEL, response.checkboxLabel);\n            this.gameDom.updateContent(selectors.LINK, response.link);\n            let termsLink = this.gameDom.getElement(selectors.LINK);\n            let termsContainer = this.gameDom.getElement(selectors.BOX);\n            termsLink?.addEventListener('click', (e) => {\n                e.preventDefault();\n                this.showOverlay();\n                termsContainer?.classList.remove(GameConst.CLASSES.HIDDEN);\n            });\n            let closeButtons = this.gameDom.getElements(selectors.CLOSE);\n            for(let closeButton of closeButtons){\n                closeButton.addEventListener('click', () => {\n                    this.hideOverlay();\n                    termsContainer?.classList.add(GameConst.CLASSES.HIDDEN);\n                });\n            }\n            this.createOverlay();\n            let register = this.gameDom.getElement(GameConst.SELECTORS.REGISTER_FORM);\n            if(register){\n                let errorBlock = this.gameDom.getElement(GameConst.SELECTORS.RESPONSE_ERROR, register);\n                let acceptTermsCheckbox = this.gameDom.getElement(selectors.ACCEPT);\n                acceptTermsCheckbox.addEventListener('click', () => {\n                    if(acceptTermsCheckbox.checked){\n                        errorBlock.innerHTML = '';\n                    }\n                });\n                this.gameDom.getElement(selectors.ACCEPT_LABEL).addEventListener('click', () => {\n                    if(acceptTermsCheckbox.checked){\n                        errorBlock.innerHTML = '';\n                    }\n                });\n            }\n            this.linkContainer?.classList.remove(GameConst.CLASSES.HIDDEN);\n        });\n        return true;\n    }\n\n}\n\nmodule.exports.TermsAndConditionsHandler = TermsAndConditionsHandler;\n"
  },
  {
    "path": "lib/game/client/instructions-ui.js",
    "content": "/**\n *\n * Reldens - InstructionsUi\n *\n * Client-side UI component for displaying game instructions dialog. Creates a DOM-based dialog box\n * with open/close buttons, handles click events to show/hide instructions, and registers the element\n * with the UI scene. Emits events for UI open/close to allow plugin hooks and customization.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('./user-interface').UserInterface} UserInterface\n * @typedef {object} InstConfig\n * @property {number} uiX\n * @property {number} uiY\n */\nclass InstructionsUi\n{\n\n    /**\n     * @param {InstConfig} instConfig\n     * @param {UserInterface} uiScene\n     * @returns {void|boolean}\n     */\n    createInstructions(instConfig, uiScene)\n    {\n        // @TODO - BETA - Replace by UserInterface.\n        let dialogBox = uiScene.add.dom(instConfig.uiX, instConfig.uiY).createFromCache('instructions');\n        if(!dialogBox){\n            Logger.info('Instructions dialog box could not be created.');\n            return false;\n        }\n        let dialogContainer = uiScene.gameManager.gameDom.getElement('#instructions');\n        if(!dialogContainer){\n            Logger.info('Instructions container not found.');\n            return false;\n        }\n        let openButton = dialogBox.getChildByProperty('id', 'instructions-open');\n        openButton?.addEventListener('click', () => {\n            // @TODO - BETA - Replace styles by classes.\n            dialogContainer.style.display = 'block';\n            uiScene.gameManager.events.emit(\n                'reldens.openUI',\n                {ui: this, openButton, dialogBox, dialogContainer, uiScene}\n            );\n        });\n        let closeButton = uiScene.gameManager.gameDom.getElement('#instructions-close');\n        closeButton?.addEventListener('click', () => {\n            // @TODO - BETA - Replace styles by classes.\n            dialogContainer.style.display = 'none';\n            uiScene.gameManager.events.emit(\n                'reldens.closeUI',\n                {ui: this, closeButton, openButton, dialogBox, dialogContainer, uiScene}\n            );\n        });\n        uiScene.elementsUi['instructions'] = dialogBox;\n    }\n\n}\n\nmodule.exports.InstructionsUi = InstructionsUi;\n"
  },
  {
    "path": "lib/game/client/joystick.js",
    "content": "/**\n *\n * Reldens - Joystick\n *\n * Client-side virtual joystick controller for touch and mouse-based player movement. Creates an on-screen\n * joystick UI with draggable thumb control, handles touch/mouse events, calculates a movement direction based\n * on thumb position, and sends directional commands to the player. Supports 8-directional movement with\n * a configurable threshold and positioning.\n *\n */\n\nconst { GameConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./game-manager').GameManager} GameManager\n * @typedef {import('./game-dom').GameDom} GameDom\n * @typedef {import('./scene-preloader').ScenePreloader} ScenePreloader\n * @typedef {object} JoystickProps\n * @property {ScenePreloader} [scenePreloader]\n * @property {boolean} [useJoystickOnLowResolutions]\n */\nclass Joystick\n{\n\n    /** @param {JoystickProps} props */\n    constructor(props)\n    {\n        /** @type {GameManager|undefined} */\n        this.gameManager = props?.scenePreloader?.gameManager;\n        /** @type {ScenePreloader|undefined} */\n        this.scenePreloader = props?.scenePreloader;\n        /** @type {GameDom|undefined} */\n        this.gameDom = this.gameManager?.gameDom;\n        /** @type {boolean} */\n        this.isDragging = false;\n        /** @type {number|boolean} */\n        this.centerX = false;\n        /** @type {number|boolean} */\n        this.centerY = false;\n        /** @type {number} */\n        this.threshold = this.gameManager.config.getWithoutLogs('client/ui/controls/joystickThreshold', 20);\n        /** @type {number} */\n        this.joystickLeft = this.gameManager.config.getWithoutLogs('client/ui/controls/joystickLeft', 25);\n        /** @type {number} */\n        this.joystickTop = this.gameManager.config.getWithoutLogs('client/ui/controls/joystickTop', 25);\n        /** @type {string} */\n        this.positionSufix = 'px';\n        /** @type {boolean} */\n        this.useJoystickOnLowResolutions = sc.get(props, 'useJoystickOnLowResolutions', false);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    registerJoystickController()\n    {\n        if(!this.gameManager){\n            Logger.error('GameManager undefined on Joystick.');\n            return false;\n        }\n        this.joystick = this.gameDom.getElement('#joystick');\n        if(!this.joystick){\n            Logger.error('Joystick element not found.');\n            return false;\n        }\n        this.joystickThumb = this.gameDom.getElement('#joystick-thumb');\n        this.joystickThumb.addEventListener('mousedown', (event) => {\n            this.applyMovement(event.clientX, event.clientY);\n        });\n        this.joystickThumb.addEventListener('touchstart', (event) => {\n            event.preventDefault();\n            if(!event.touches || 0 === event.touches.length){\n                Logger.debug('None event touches.', event);\n                return false;\n            }\n            let touch = event.touches[0];\n            this.applyMovement(touch.clientX, touch.clientY);\n        });\n        this.gameDom.getDocument().addEventListener('mousemove', this.handleMouseMove.bind(this));\n        this.gameDom.getDocument().addEventListener('mouseup', this.handleStop.bind(this));\n        this.gameDom.getDocument().addEventListener('touchmove', this.handleTouchMove.bind(this));\n        this.gameDom.getDocument().addEventListener('touchend', this.handleStop.bind(this));\n    }\n\n    /**\n     * @param {number} value\n     * @returns {string}\n     */\n    position(value)\n    {\n        return value+this.positionSufix;\n    }\n\n    /**\n     * @param {number} clientX\n     * @param {number} clientY\n     */\n    applyMovement(clientX, clientY)\n    {\n        this.isDragging = true;\n        let rect = this.joystick.getBoundingClientRect();\n        this.centerX = rect.width / 2;\n        this.centerY = rect.height / 2;\n        this.updateThumbPosition(clientX - rect.left, clientY - rect.top);\n    }\n\n    handleStop()\n    {\n        this.isDragging = false;\n        this.joystickThumb.style.left = this.position(this.joystickLeft);\n        this.joystickThumb.style.top = this.position(this.joystickTop);\n        this.gameManager.getCurrentPlayer().stop();\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @returns {string}\n     */\n    updateDirection(x, y)\n    {\n        let dx = x - this.centerX;\n        let dy = y - this.centerY;\n        let direction = GameConst.STOP;\n        if(Math.abs(dx) > Math.abs(dy)){\n            if(Math.abs(dx) > this.threshold){\n                direction = dx > 0\n                    ? (Math.abs(dy) > this.threshold ? (dy > 0 ? 'right-down' : 'right-up') : 'right')\n                    : (Math.abs(dy) > this.threshold ? (dy > 0 ? 'left-down' : 'left-up') : 'left');\n                for(let dir of direction.split('-')){\n                    try {\n                        this.gameManager.getCurrentPlayer()[dir]();\n                    } catch (error) {\n                        //Logger.debug('Unknown direction on PlayerEngine.', dir, error);\n                    }\n                }\n                return direction;\n            }\n        }\n        if(Math.abs(dy) > this.threshold){\n            direction = dy > 0\n                ? (Math.abs(dx) > this.threshold ? (dx > 0 ? 'down-right' : 'down-left') : 'down')\n                : (Math.abs(dx) > this.threshold ? (dx > 0 ? 'up-right' : 'up-left') : 'up');\n            for(let dir of direction.split('-')){\n                try {\n                    this.gameManager.getCurrentPlayer()[dir]();\n                } catch (error) {\n                    //Logger.debug('Unknown direction on PlayerEngine.', dir, error);\n                }\n            }\n            return direction;\n        }\n        this.gameManager.getCurrentPlayer().stop();\n        return direction;\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     */\n    updateThumbPosition(x, y)\n    {\n        let dx = x - this.centerX;\n        let dy = y - this.centerY;\n        let distance = Math.sqrt(dx * dx + dy * dy);\n        let maxDistance = Math.min(this.centerX, this.centerY);\n        if(distance > maxDistance){\n            let angle = Math.atan2(dy, dx);\n            let joystickLeft = Math.cos(angle) * maxDistance + this.centerX - this.joystickThumb.offsetWidth / 2;\n            this.joystickThumb.style.left = this.position(joystickLeft);\n            let joystickTop = Math.sin(angle) * maxDistance + this.centerY - this.joystickThumb.offsetHeight / 2;\n            this.joystickThumb.style.top = this.position(joystickTop);\n            return;\n        }\n        let joystickLeft = x - this.joystickThumb.offsetWidth / 2;\n        this.joystickThumb.style.left = this.position(joystickLeft);\n        let joystickTop = y - this.joystickThumb.offsetHeight / 2;\n        this.joystickThumb.style.top = this.position(joystickTop);\n    }\n\n    /**\n     * @param {MouseEvent} event\n     */\n    handleMouseMove(event)\n    {\n        if(!this.isDragging){\n            return;\n        }\n        let rect = this.joystick.getBoundingClientRect();\n        let x = event.clientX - rect.left;\n        let y = event.clientY - rect.top;\n        this.updateThumbPosition(x, y);\n        this.updateDirection(x, y);\n    }\n\n    /**\n     * @param {TouchEvent} event\n     * @returns {boolean}\n     */\n    handleTouchMove(event)\n    {\n        if(!this.isDragging){\n            return;\n        }\n        if(!event.touches || 0 === event.touches.length){\n            Logger.debug('None event touches for \"handleTouchMove\".', event);\n            return false;\n        }\n        let touch = event.touches[0];\n        let rect = this.joystick.getBoundingClientRect();\n        let x = touch.clientX - rect.left;\n        let y = touch.clientY - rect.top;\n        this.updateThumbPosition(x, y);\n        this.updateDirection(x, y);\n    }\n\n}\n\nmodule.exports.Joystick = Joystick;\n"
  },
  {
    "path": "lib/game/client/minimap-ui.js",
    "content": "/**\n *\n * Reldens - MinimapUi\n *\n * Client-side minimap UI component for managing the minimap display interface. Creates DOM-based\n * open/close buttons, handles minimap visibility toggling, waits for camera initialization, and\n * emits events for UI state changes. Works in conjunction with the Minimap class for camera management.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./minimap').Minimap} Minimap\n * @typedef {import('./scene-preloader').ScenePreloader} ScenePreloader\n * @typedef {object} MinimapConfig\n * @property {number} uiX\n * @property {number} uiY\n */\nclass MinimapUi\n{\n\n    /**\n     * @param {MinimapConfig} minimapConfig\n     * @param {ScenePreloader} scenePreloader\n     */\n    createMinimap(minimapConfig, scenePreloader)\n    {\n        // @TODO - BETA - Replace by UserInterface.\n        scenePreloader.elementsUi['minimap'] = scenePreloader.add.dom(minimapConfig.uiX, minimapConfig.uiY)\n            .createFromCache('minimap');\n        let openButton = scenePreloader.elementsUi['minimap'].getChildByProperty('id', 'minimap-open');\n        let closeButton = scenePreloader.elementsUi['minimap'].getChildByProperty('id', 'minimap-close');\n        openButton?.addEventListener('click', () => {\n            let box = scenePreloader.elementsUi['minimap'].getChildByProperty('id', 'minimap-ui');\n            box.classList.remove('hidden');\n            openButton.classList.add('hidden');\n            let minimap = scenePreloader.gameManager.getActiveScene().minimap;\n            if(!minimap){\n                return;\n            }\n            this.showMap(minimap, scenePreloader, openButton, closeButton, box);\n        });\n        closeButton?.addEventListener('click', () => {\n            let box = scenePreloader.elementsUi['minimap'].getChildByProperty('id', 'minimap-ui');\n            box.classList.add('hidden');\n            if(openButton){\n                openButton.classList.remove('hidden');\n            }\n            let minimap = scenePreloader.gameManager.getActiveScene().minimap;\n            if(!minimap){\n                return;\n            }\n            this.hideMap(minimap, scenePreloader, closeButton, box);\n        });\n    }\n\n    /**\n     * @param {Minimap} minimap\n     * @param {ScenePreloader} scenePreloader\n     * @param {HTMLElement} openButton\n     * @param {HTMLElement} closeButton\n     * @param {HTMLElement} box\n     */\n    showMap(minimap, scenePreloader, openButton, closeButton, box)\n    {\n        if(this.awaitForCamera(minimap)){\n            setTimeout(() => {\n                this.showMap(minimap, scenePreloader, openButton, closeButton, box);\n            }, minimap.awaitOnCamera);\n            return;\n        }\n        minimap.minimapCamera.setVisible(true);\n        if(minimap.circle){\n            minimap.circle.setVisible(true);\n        }\n        scenePreloader.gameManager.events.emit('reldens.openUI', {ui: this, openButton, minimap, box});\n    }\n\n    /**\n     * @param {Minimap} minimap\n     * @param {ScenePreloader} scenePreloader\n     * @param {HTMLElement} closeButton\n     * @param {HTMLElement} box\n     */\n    hideMap(minimap, scenePreloader, closeButton, box)\n    {\n        if(this.awaitForCamera(minimap)){\n            setTimeout(() => {\n                this.hideMap(minimap, scenePreloader, closeButton, box);\n            }, minimap.awaitOnCamera);\n            return;\n        }\n        minimap.minimapCamera.setVisible(false);\n        if(minimap.circle){\n            minimap.circle.setVisible(false);\n        }\n        scenePreloader.gameManager.events.emit(\n            'reldens.closeUI',\n            {ui: this, closeButton, minimap, box}\n        );\n    }\n\n    /**\n     * @param {Minimap} minimap\n     * @returns {boolean}\n     */\n    awaitForCamera(minimap)\n    {\n        return 0 < minimap.awaitOnCamera && (!minimap.minimapCamera || !sc.isFunction(minimap.minimapCamera.setVisible));\n    }\n\n}\n\nmodule.exports.MinimapUi = MinimapUi;\n"
  },
  {
    "path": "lib/game/client/minimap.js",
    "content": "/**\n *\n * Reldens - Minimap\n *\n * Client-side minimap component for displaying a scaled-down view of the game map. Creates a secondary\n * Phaser camera that follows the player, supports circular/round map display with masking, configurable\n * positioning, zoom levels, and styling. Integrates with the UI scene and emits events for plugin hooks.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('phaser').GameObjects.Sprite} Sprite\n * @typedef {import('./scene-dynamic').SceneDynamic} SceneDynamic\n *\n * @typedef {object} MinimapProps\n * @property {ConfigManager} config\n * @property {EventsManager} events\n */\nclass Minimap\n{\n\n    /** @param {MinimapProps} props */\n    constructor(props)\n    {\n        /** @type {ConfigManager} */\n        this.config = props.config;\n        /** @type {EventsManager} */\n        this.events = props.events;\n    }\n\n    /**\n     * @param {SceneDynamic} scene\n     * @param {Sprite} playerSprite\n     */\n    createMap(scene, playerSprite)\n    {\n        // @TODO - BETA - Improve camera.\n        this.minimapCamera = false;\n        this.circle = false;\n        this.scope = false;\n        this.awaitOnCamera = sc.get(this.config, 'awaitOnCamera', 400);\n        this.autoWidth = scene.map.widthInPixels / sc.get(this.config, 'mapWidthDivisor', 1);\n        this.camWidth = sc.get(this.config, 'fixedWidth', this.autoWidth);\n        this.autoHeight = scene.map.heightInPixels / sc.get(this.config, 'mapHeightDivisor', 1);\n        this.camHeight = sc.get(this.config, 'fixedHeight', this.autoHeight);\n        this.camX = sc.get(this.config, 'camX', 0);\n        this.camY = sc.get(this.config, 'camY', 0);\n        this.camBackgroundColor = sc.get(this.config, 'camBackgroundColor', 'rgba(0,0,0,0.6)');\n        this.camZoom = sc.get(this.config, 'camZoom', 0.15);\n        this.roundMap = sc.get(this.config, 'roundMap', false);\n        this.addCircle = sc.get(this.config, 'addCircle', false);\n        this.createMinimapCamera(scene, playerSprite);\n        this.createRoundMap(scene);\n        this.events.emitSync('reldens.createdMinimap', this);\n    }\n\n    /**\n     * @param {SceneDynamic} scene\n     * @param {Sprite} playerSprite\n     */\n    createMinimapCamera(scene, playerSprite)\n    {\n        this.minimapCamera = scene.cameras.add(this.camX, this.camY, this.camWidth, this.camHeight)\n            .setName('minimap')\n            .setBackgroundColor(this.camBackgroundColor)\n            .setZoom(this.camZoom)\n            .startFollow(\n                playerSprite,\n                sc.get(this.config, 'mapCameraRoundPixels', true),\n                sc.get(this.config, 'mapCameraLerpX', 1),\n                sc.get(this.config, 'mapCameraLerpY', 1)\n            )\n            .setRoundPixels(true)\n            .setVisible(false)\n            .setOrigin(\n                sc.get(this.config, 'mapCameraOriginX', 0.18),\n                sc.get(this.config, 'mapCameraOriginY', 0.18)\n            );\n    }\n\n    /**\n     * @param {SceneDynamic} scene\n     * @returns {boolean}\n     */\n    createRoundMap(scene)\n    {\n        if(!this.roundMap){\n            return false;\n        }\n        if(this.addCircle){\n            this.addMinimapCircle(scene);\n        }\n        this.createRoundCamera(scene);\n        return true;\n    }\n\n    /**\n     * @param {SceneDynamic} scene\n     */\n    addMinimapCircle(scene)\n    {\n        let activeScenePreloader = scene.gameManager.getActiveScenePreloader();\n        this.circle = activeScenePreloader.add.circle(\n            sc.get(this.config, 'circleX', 220),\n            sc.get(this.config, 'circleY', 88),\n            sc.get(this.config, 'circleRadio', 80.35),\n            sc.get(this.config, 'circleColor', 'rgb(0,0,0)'),\n            sc.get(this.config, 'circleAlpha', 1)\n        );\n        this.circle.setStrokeStyle(\n            sc.get(this.config, 'circleStrokeLineWidth', 6),\n            sc.get(this.config, 'circleStrokeColor', 0),\n            sc.get(this.config, 'circleStrokeAlpha', 0.6));\n        this.circle.setFillStyle(\n            sc.get(this.config, 'circleFillColor', 1),\n            sc.get(this.config, 'circleFillAlpha', 0)\n        );\n        this.circle.setVisible(false);\n    }\n\n    /**\n     * @param {SceneDynamic} scene\n     */\n    createRoundCamera(scene)\n    {\n        this.scope = scene.add.graphics();\n        this.scope.fillStyle(0x000000, 0).fillCircle(\n            sc.get(this.config, 'circleX', 220),\n            sc.get(this.config, 'circleY', 88),\n            sc.get(this.config, 'circleRadio', 80.35)\n        );\n        this.minimapCamera.setMask(this.scope.createGeometryMask());\n    }\n\n    destroyMap()\n    {\n        delete this.minimapCamera;\n        delete this.circle;\n        delete this.scope;\n    }\n\n}\nmodule.exports.Minimap = Minimap;\n"
  },
  {
    "path": "lib/game/client/room-events.js",
    "content": "/**\n *\n * Reldens - RoomEvents\n *\n * Manages Colyseus room event handlers for the client-side game. Handles player add/remove events,\n * room state synchronization, scene creation and preloading, player state changes (death, respawn),\n * and coordinates with GameManager, GameEngine, and Phaser scenes. Listens to server room messages\n * and player state updates. Manages game over screen display and retry logic.\n *\n */\n\nconst { PlayerEngine } = require('../../users/client/player-engine');\nconst { SceneDynamic } = require('./scene-dynamic');\nconst { ScenePreloader } = require('./scene-preloader');\nconst { RoomStateEntitiesManager } = require('./communication/room-state-entities-manager');\nconst { AnimationsDefaultsMerger } = require('./animations-defaults-merger');\nconst { GameConst } = require('../constants');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('colyseus.js').Room} Room\n * @typedef {import('./game-manager').GameManager} GameManager\n * @typedef {import('./game-engine').GameEngine} GameEngine\n * @typedef {import('./game-dom').GameDom} GameDom\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../users/client/player-engine').PlayerEngine} PlayerEngine\n * @typedef {import('./scene-dynamic').SceneDynamic} SceneDynamic\n * @typedef {import('./scene-preloader').ScenePreloader} ScenePreloader\n */\nclass RoomEvents\n{\n\n    /**\n     * @param {string} roomName\n     * @param {GameManager} gameManager\n     */\n    constructor(roomName, gameManager)\n    {\n        /** @type {Room|false} */\n        this.room = false;\n        /** @type {object} */\n        this.roomData = {};\n        /** @type {ScenePreloader|false} */\n        this.scenePreloader = false;\n        /** @type {Function|false} */\n        this.playersOnAddCallback = false;\n        /** @type {Function|false} */\n        this.playersOnRemoveCallback = false;\n        /** @type {Object<string, object>} */\n        this.playersQueue = {};\n        /** @type {GameManager} */\n        this.gameManager = gameManager;\n        /** @type {GameEngine} */\n        this.gameEngine = gameManager.gameEngine;\n        /** @type {GameDom} */\n        this.gameDom = gameManager.gameDom;\n        /** @type {string} */\n        this.roomName = roomName;\n        /** @type {EventsManager} */\n        this.events = gameManager.events;\n        /** @type {Object<string, object>} */\n        this.objectsUi = {};\n        /** @type {object} */\n        this.tradeUi = {};\n        /** @type {number} */\n        this.gameOverRetries = 0;\n        /** @type {number} */\n        this.gameOverMaxRetries = 0;\n        /** @type {number} */\n        this.gameOverRetryTime = 200;\n        /** @type {boolean} */\n        this.automaticallyCloseAllDialogsOnSceneChange = gameManager.config.getWithoutLogs(\n            'client/rooms/automaticallyCloseAllDialogsOnSceneChange',\n            true\n        );\n    }\n\n    /**\n     * @param {Room} room\n     * @param {string|boolean} [previousScene]\n     * @returns {Promise<void>}\n     */\n    async activateRoom(room, previousScene = false)\n    {\n        await this.events.emit('reldens.activateRoom', room, this.gameManager);\n        this.room = room;\n        this.playersManager = RoomStateEntitiesManager.onEntityAdd(\n            room,\n            'players',\n            (player, key) => {\n                this.checkAndCreateScene();\n                this.playersOnAdd(player, key, previousScene);\n                this.listenPlayerAndStateChanges(player, key);\n            }\n        );\n        this.playersRemoveManager = RoomStateEntitiesManager.onEntityRemove(\n            room,\n            'players',\n            (player, key) => {\n                this.playersOnRemove(player, key);\n            }\n        );\n        this.room.onMessage('*', async (message) => {\n            await this.roomOnMessage(message);\n        });\n        this.room.onLeave((code) => {\n            this.roomOnLeave(code);\n        });\n    }\n\n    /**\n     * @param {any} player\n     * @param {string} key\n     */\n    listenPlayerAndStateChanges(player, key)\n    {\n        let currentPlayerId = this.gameManager.getCurrentPlayer().player_id;\n        let playerManager = RoomStateEntitiesManager.createManager(this.room);\n        let playerProps = Object.keys(player);\n        for(let prop of playerProps){\n            playerManager.listen(player, prop, (value, previousValue) => {\n                this.playersOnChange(player, key, 'playerChange');\n            });\n        }\n        let stateProps = Object.keys(player.state);\n        for(let prop of stateProps){\n            playerManager.listen(player.state, prop, (value, previousValue) => {\n                player.state[prop] = value;\n                this.playersOnChange(player, key, 'playerChange');\n                if('inState' === prop && player.player_id === currentPlayerId){\n                    if(GameConst.STATUS.DEATH === value){\n                        return this.showGameOverBox();\n                    }\n                    this.hideGameOverBox();\n                }\n            });\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    checkAndCreateScene()\n    {\n        if(!this.room.state){\n            Logger.warning('Room state is not ready.');\n            return false;\n        }\n        if(0 === Object.keys(this.roomData).length){\n            this.roomData = AnimationsDefaultsMerger.mergeDefaults(sc.toJson(this.room.state.sceneData));\n        }\n        if(this.gameEngine.scene.getScene(this.roomName)){\n            return false;\n        }\n        let engineSceneDynamic = this.createSceneInstance(this.roomName, this.roomData, this.gameManager);\n        this.gameEngine.scene.add(this.roomName, engineSceneDynamic, false);\n        return true;\n    }\n\n    /**\n     * @param {any} player\n     * @param {string} key\n     * @param {string|boolean} previousScene\n     * @returns {Promise<void>}\n     */\n    async playersOnAdd(player, key, previousScene)\n    {\n        await this.events.emit('reldens.playersOnAdd', player, key, previousScene, this);\n        let mappedData = {\n            x: player.state.x,\n            y: player.state.y,\n            dir: player.state.dir,\n            playerName: player.playerName,\n            avatarKey: player.avatarKey,\n            playedTime: player.playedTime,\n            player_id: player.player_id\n        };\n        if(this.isCurrentPlayer(key)){\n            return await this.createCurrentPlayer(player, previousScene, key);\n        }\n        this.addOtherPlayers(player, key, mappedData);\n    }\n\n    /**\n     * @param {string} key\n     * @returns {boolean}\n     */\n    isCurrentPlayer(key)\n    {\n        return key === this.room.sessionId;\n    }\n\n    /**\n     * @param {any} player\n     * @param {string} key\n     * @param {any} addPlayerData\n     * @returns {boolean}\n     */\n    addOtherPlayers(player, key, addPlayerData)\n    {\n        if(!this.engineStarted){\n            this.playersQueue[key] = addPlayerData;\n            return false;\n        }\n        let currentScene = this.getActiveScene();\n        if(!this.isValidScene(currentScene, player)){\n            return false;\n        }\n        currentScene.player.addPlayer(key, addPlayerData);\n        return true;\n    }\n\n    /**\n     * @param {any} player\n     * @param {string|boolean} previousScene\n     * @param {string} key\n     * @returns {Promise<{player: any, key: string, previousScene: (string|boolean), roomEvents: RoomEvents}>}\n     */\n    async createCurrentPlayer(player, previousScene, key)\n    {\n        this.engineStarted = true;\n        await this.startEngineScene(player, this.room, previousScene);\n        let currentScene = this.getActiveScene();\n        if(!this.isValidScene(currentScene, player)){\n            return;\n        }\n        await this.events.emit('reldens.playersQueueBefore', player, key, previousScene, this);\n        for(let i of Object.keys(this.playersQueue)){\n            currentScene.player.addPlayer(i, this.playersQueue[i]);\n        }\n        let eventData = {player, key, previousScene, roomEvents: this};\n        await this.events.emit('reldens.createCurrentPlayer', eventData);\n        return eventData;\n    }\n\n    /**\n     * @param {SceneDynamic} currentScene\n     * @param {any} player\n     * @returns {boolean}\n     */\n    isValidScene(currentScene, player)\n    {\n        return currentScene.key === player.state.scene && currentScene.player && currentScene.player.players;\n    }\n\n    /**\n     * @param {any} player\n     * @param {string} key\n     * @param {string} from\n     */\n    playersOnChange(player, key, from)\n    {\n        if(player.state.scene !== this.roomName){\n            if(player.player_id === this.gameManager.getCurrentPlayer().player_id && !this.gameManager.isChangingScene){\n                Logger.info(\n                    'Player scene miss match.',\n                    {\n                        currentScene: this.roomName,\n                        playerSceneOnState: player?.state.scene,\n                        player: player?.sessionId,\n                        currentPlayer: this.gameManager.getCurrentPlayer()?.playerId,\n                        isChangingScene: this.gameManager.isChangingScene\n                    }\n                );\n            }\n            return;\n        }\n        let currentScene = this.getActiveScene();\n        if(!this.playerExists(currentScene, key)){\n            return;\n        }\n        currentScene.player.updatePlayer(key, player);\n    }\n\n    /**\n     * @param {any} player\n     * @param {string} key\n     */\n    playersOnRemove(player, key)\n    {\n        this.events.emitSync('reldens.playersOnRemove', player, key, this);\n        if(key === this.room.sessionId){\n            return this.gameOverReload();\n        }\n        return this.removePlayerByKey(key);\n    }\n\n    /**\n     * @param {string} key\n     */\n    removePlayerByKey(key)\n    {\n        let currentScene = this.getActiveScene();\n        if(!this.playerExists(currentScene, key)){\n            return;\n        }\n        currentScene.player.removePlayer(key);\n        if(currentScene.player.currentTarget?.id === key){\n            this.gameEngine.clearTarget();\n        }\n    }\n\n    gameOverReload()\n    {\n        let defaultReload = {confirmed: true};\n        this.events.emitSync('reldens.gameOverReload', this, defaultReload);\n        if(!this.gameManager.gameOver && defaultReload.confirmed){\n            this.gameDom.alertReload(this.gameManager.services.translator.t('game.errors.sessionEnded'));\n        }\n    }\n\n    /**\n     * @param {SceneDynamic} currentScene\n     * @param {string} key\n     * @returns {boolean}\n     */\n    playerExists(currentScene, key)\n    {\n        return currentScene.player && sc.hasOwn(currentScene.player.players, key);\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<void>}\n     */\n    async roomOnMessage(message)\n    {\n        await this.runGameOver(message);\n        await this.runRevived(message);\n        await this.runChangingScene(message);\n        await this.runChangedScene(message);\n        await this.runReconnect(message);\n        await this.runUpdateStats(message);\n        await this.runInitUi(message);\n        await this.closeBox(message);\n        await this.runCustomMessageListener(message);\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<boolean>}\n     */\n    async runInitUi(message)\n    {\n        if(message.act !== GameConst.UI || !message.id){\n            return false;\n        }\n        await this.events.emit('reldens.initUiBefore', message, this);\n        this.initUi(message);\n        await this.events.emit('reldens.initUiAfter', message, this);\n        return true;\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<boolean>}\n     */\n    async closeBox(message)\n    {\n        if(GameConst.CLOSE_UI_ACTION !== message.act || !message.id){\n            return false;\n        }\n        let closeButton = this.gameDom.getElement('#box-'+message.id+' .box-close');\n        if(!closeButton){\n            Logger.error('Box could not be closed ID \"'+message.id+'\".');\n            return false;\n        }\n        closeButton.click();\n        return true;\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<boolean>}\n     */\n    async runCustomMessageListener(message)\n    {\n        let listenerKey = sc.get(message, 'listener', '');\n        if('' === listenerKey){\n            return false;\n        }\n        let defaultListeners = this.gameManager.config.get('client/message/listeners', {});\n        let customListeners = this.gameManager.config.get('client/customClasses/message/listeners', {});\n        let listener = sc.get(customListeners, listenerKey, false);\n        if(!listener){\n            listener = sc.get(defaultListeners, listenerKey, false);\n        }\n        if(!listener){\n            Logger.error('Listener \"'+listenerKey+'\" is missing.');\n            return false;\n        }\n        if(!sc.isFunction(listener['executeClientMessageActions'])){\n            Logger.error('Listener is missing \"executeClientMessageActions\" method.', listener);\n            return false;\n        }\n        listener['executeClientMessageActions']({message, roomEvents: this});\n        return true;\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<boolean>}\n     */\n    async runUpdateStats(message)\n    {\n        if(message.act !== GameConst.PLAYER_STATS){\n            return false;\n        }\n        await this.events.emit('reldens.playerStatsUpdateBefore', message, this);\n        return await this.updatePlayerStats(message);\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<void>}\n     */\n    async runReconnect(message)\n    {\n        if(message.act !== GameConst.RECONNECT){\n            return;\n        }\n        await this.events.emit('reldens.beforeReconnectGameClient', message, this);\n        await this.gameManager.reconnectGameClient(message, this.room);\n    }\n\n    /**\n     * @param {any} message\n     */\n    async runChangingScene(message)\n    {\n        if(message.act !== GameConst.CHANGING_SCENE || this.room.sessionId !== message.id){\n            return;\n        }\n        this.gameManager.setChangingScene(true);\n        this.closeAllActiveDialogs();\n        this.gameManager.getActiveScene().scene.setVisible(false);\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<void>}\n     */\n    async runChangedScene(message)\n    {\n        if(\n            message.act !== GameConst.CHANGED_SCENE\n            || message.scene !== this.room.name\n            || this.room.sessionId === message.id\n        ){\n            return;\n        }\n        await this.events.emit('reldens.startChangedScene', {message, roomEvents: this});\n        let currentScene = this.getActiveScene();\n        let {id, x, y, dir, playerName, playedTime, avatarKey, player_id} = message;\n        let topOff = this.gameManager.config.get('client/players/size/topOffset');\n        let leftOff = this.gameManager.config.get('client/players/size/leftOffset');\n        let addPlayerData = {x: (x - leftOff), y: (y - topOff), dir, playerName, playedTime, avatarKey, player_id};\n        currentScene.player.addPlayer(id, addPlayerData);\n        this.gameManager.setChangingScene(false);\n        await this.events.emit('reldens.endChangedScene', {message, roomEvents: this});\n    }\n\n    closeAllActiveDialogs()\n    {\n        if(!this.automaticallyCloseAllDialogsOnSceneChange){\n            return;\n        }\n        let closeButtons = this.gameDom.getElements(GameConst.SELECTORS.BUTTONS_CLOSE);\n        if(0 === closeButtons.length){\n            return;\n        }\n        for(let closeButton of closeButtons){\n            closeButton.click();\n        }\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<void>}\n     */\n    async runRevived(message)\n    {\n        if(message.act !== GameConst.REVIVED){\n            return;\n        }\n        this.gameDom.getElement('#game-over').classList.add('hidden');\n        let currentPlayer = this.gameManager.getCurrentPlayer();\n        let showSprite = sc.get(currentPlayer.players, message.t, false);\n        if(!showSprite){\n            return;\n        }\n        showSprite.visible = true;\n        if(sc.hasOwn(showSprite, 'nameSprite') && showSprite.nameSprite){\n            showSprite.nameSprite.visible = true;\n        }\n        this.getActiveScene().stopOnDeathOrDisabledSent = false;\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<boolean>}\n     */\n    async runGameOver(message)\n    {\n        if(message.act !== GameConst.GAME_OVER){\n            return false;\n        }\n        try {\n            let defaultBehavior = true;\n            await this.events.emit('reldens.runGameOver', {message, defaultBehavior, roomEvents: this});\n            if(!defaultBehavior){\n                return false;\n            }\n            await this.events.emit('reldens.gameOver', message, this);\n            this.gameManager.gameOver = true;\n            let currentPlayer = this.gameManager.getCurrentPlayer();\n            if(!currentPlayer){\n                if(this.gameOverRetries < this.gameOverMaxRetries){\n                    setTimeout(() => this.runGameOver(message), this.gameOverRetryTime);\n                    this.gameOverRetries++;\n                }\n                return false;\n            }\n            let currentPlayerSprite = currentPlayer.players[currentPlayer.playerId];\n            currentPlayerSprite.visible = false;\n            this.showGameOverBox();\n        } catch (error) {\n            setTimeout(() => this.runGameOver(message), 200);\n            this.gameOverRetries++;\n            return false;\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    showGameOverBox()\n    {\n        return this.displayGameOverBox(true);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    hideGameOverBox()\n    {\n        return this.displayGameOverBox(false);\n    }\n\n    /**\n     * @param {boolean} display\n     * @returns {boolean}\n     */\n    displayGameOverBox(display)\n    {\n        Logger.debug('Display game over box: '+(display ? 'yes' : 'no')+'.');\n        let gameOverElement = this.gameDom.getElement('#game-over');\n        if(!gameOverElement){\n            Logger.debug('GameOver box element not found.');\n            return false;\n        }\n        if(display){\n            gameOverElement.classList.remove('hidden');\n            return true;\n        }\n        gameOverElement.classList.add('hidden');\n        return false;\n    }\n\n    /**\n     * @param {number} code\n     */\n    async roomOnLeave(code)\n    {\n        if(this.playersManager){\n            this.playersManager.dispose();\n        }\n        if(this.playersRemoveManager){\n            this.playersRemoveManager.dispose();\n        }\n        if(this.isAbnormalShutdown(code) && !this.gameManager.gameOver && !this.gameManager.forcedDisconnection){\n            Logger.error('There was a connection error.', {\n                code,\n                isGameOver: this.gameManager.gameOver,\n                isForcedDisconnection: this.gameManager.forcedDisconnection\n            });\n            this.gameDom.alertReload(this.gameManager.services.translator.t('game.errors.serverDown'));\n        }\n        await this.events.emit('reldens.playerLeftScene', {code, roomEvents: this});\n    }\n\n    /**\n     * @param {number} code\n     * @returns {boolean}\n     */\n    isAbnormalShutdown(code)\n    {\n        return 1001 <= code && 1015 >= code;\n    }\n\n    /**\n     * @param {any} message\n     * @returns {Promise<boolean>}\n     */\n    async updatePlayerStats(message)\n    {\n        if(!sc.hasOwn(message, 'stats') || !message.stats){\n            return false;\n        }\n        let currentScene = this.getActiveScene();\n        if(!currentScene.player || !sc.hasOwn(currentScene.player.players, this.room.sessionId)){\n            Logger.error('Player not available.', this.room, currentScene);\n            return false;\n        }\n        let playerSprite = currentScene.player.players[this.room.sessionId];\n        playerSprite.stats = message.stats;\n        this.gameManager.playerData.stats = message.stats;\n        this.gameManager.playerData.statsBase = message.statsBase;\n        this.updateStatsPanel(message);\n        await this.events.emit('reldens.playerStatsUpdateAfter', message, this);\n        return true;\n    }\n\n    updateStatsPanel(message)\n    {\n        // TODO - BETA - Extract HTML handling into a new service.\n        let statsPanel = this.gameDom.getElement(GameConst.SELECTORS.PLAYER_STATS_CONTAINER);\n        if (!statsPanel) {\n            return false;\n        }\n        let messageTemplate = this.gameEngine.uiScene.cache.html.get('playerStat');\n        statsPanel.innerHTML = '';\n        for (let i of Object.keys(message.stats)) {\n            let statData = sc.get(this.gameManager.config.client.players.initialStats[i], 'data', false);\n            let baseStatValue = (statData && sc.get(statData, 'showBase', false) ? ' / ' + message.statsBase[i] : '');\n            let parsedStatsTemplate = this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n                statLabel: this.gameManager.services.translator.t(i),\n                statValue: message.stats[i] + baseStatValue,\n                statKey: i\n            });\n            statsPanel.innerHTML = statsPanel.innerHTML + parsedStatsTemplate;\n        }\n    }\n\n    /**\n     * @param {any} props\n     */\n    initUi(props)\n    {\n        let uiScene = this.gameEngine.uiScene;\n        if(!uiScene || !sc.hasOwn(uiScene.elementsUi, props.id)){\n            Logger.error('User interface not found on UI Scene: '+props.id);\n            return;\n        }\n        let uiBox = uiScene.elementsUi[props.id];\n        this.uiSetTitle(uiBox, props);\n        this.uiSetContent(uiBox, props, uiScene);\n        let dialogContainer = uiBox.getChildByID('box-'+props.id);\n        let shouldSetDisplayNone = props.keepCurrentDisplay && 'none' === dialogContainer.style.display;\n        dialogContainer.style.display = shouldSetDisplayNone ? 'none' : 'block';\n        uiBox.setDepth(2);\n        if(this.gameManager.config.get('client/ui/uiTarget/hideOnDialog')){\n            this.gameEngine.clearTarget();\n        }\n    }\n\n    /**\n     * @param {any} uiBox\n     * @param {any} props\n     * @param {any} uiScene\n     */\n    uiSetTitleAndContent(uiBox, props, uiScene)\n    {\n        this.uiSetTitle(uiBox, props);\n        this.uiSetContent(uiBox, props, uiScene);\n    }\n\n    /**\n     * @param {any} uiBox\n     * @param {any} props\n     * @returns {boolean}\n     */\n    uiSetTitle(uiBox, props)\n    {\n        let newTitle = sc.get(props, 'title', false);\n        if(false === newTitle){\n            return false;\n        }\n        let boxTitle = uiBox.getChildByProperty('className', 'box-title');\n        if(!boxTitle){\n            return false;\n        }\n        boxTitle.innerHTML = newTitle;\n        return true;\n    }\n\n    /**\n     * @param {any} uiBox\n     * @param {any} props\n     * @param {any} uiScene\n     */\n    uiSetContent(uiBox, props, uiScene)\n    {\n        let newContent = sc.get(props, 'content', false);\n        if(false === newContent){\n            return;\n        }\n        let boxContent = uiBox.getChildByProperty('className', 'box-content');\n        if(!boxContent){\n            return;\n        }\n        boxContent.innerHTML = newContent;\n        this.uiSetContentOptions(uiScene, props, boxContent);\n    }\n\n    /**\n     * @param {any} uiScene\n     * @param {any} props\n     * @param {any} boxContent\n     * @returns {boolean}\n     */\n    uiSetContentOptions(uiScene, props, boxContent)\n    {\n        if(!props.options){\n            return false;\n        }\n        let optionsContainerTemplate = uiScene.cache.html.get('uiOptionsContainer');\n        let optionsContainer = this.gameManager.gameEngine.parseTemplate(\n            optionsContainerTemplate,\n            {id: 'ui-' + props.id}\n        );\n        boxContent.innerHTML += optionsContainer;\n        let optionsKeys = Object.keys(props.options);\n        if(0 === optionsKeys.length){\n            return false;\n        }\n        for(let i of optionsKeys){\n            let {label, value, icon} = props.options[i];\n            let optTemplate = icon ? 'Icon' : 'Button';\n            let buttonTemplate = uiScene.cache.html.get('uiOption' + optTemplate);\n            let templateVars = {\n                id: i,\n                object_id: props.id,\n                label,\n                value,\n                icon: '/assets/custom/items/'+icon+GameConst.FILES.EXTENSIONS.PNG\n            };\n            let buttonHtml = this.gameManager.gameEngine.parseTemplate(buttonTemplate, templateVars);\n            this.gameDom.appendToElement('#ui-' + props.id, buttonHtml);\n            let elementId = '#opt-' + i + '-' + props.id;\n            this.gameDom.getElement(elementId)?.addEventListener('click', (event) => {\n                let optionSend = {\n                    id: props.id,\n                    act: GameConst.BUTTON_OPTION,\n                    value: event.target.getAttribute('data-option-value')\n                };\n                let overrideSendOptions = sc.get(props, 'overrideSendOptions', {});\n                Object.assign(optionSend, overrideSendOptions);\n                this.send(optionSend);\n            });\n        }\n        return true;\n    }\n\n    /**\n     * @param {any} player\n     * @param {Room} room\n     * @param {string|boolean} [previousScene]\n     * @returns {Promise<void>}\n     */\n    async startEngineScene(player, room, previousScene = false)\n    {\n        await this.events.emit('reldens.startEngineScene', this, player, room, previousScene);\n        let uiScene = false;\n        if(!this.gameEngine.uiScene){\n            uiScene = true;\n        }\n        let preloaderName = GameConst.SCENE_PRELOADER+this.roomName;\n        !this.gameEngine.scene.getScene(preloaderName)\n            ? await this.createPreloaderAndScene(preloaderName, uiScene, player, room, previousScene)\n            : await this.createEngineOnScene(preloaderName, player, room, previousScene);\n    }\n\n    /**\n     * @param {string} preloaderName\n     * @param {any} player\n     * @param {Room} room\n     * @param {string|boolean} previousScene\n     * @returns {Promise<void>}\n     */\n    async createEngineOnScene(preloaderName, player, room, previousScene)\n    {\n        let currentScene = this.getActiveScene();\n        currentScene.objectsAnimationsData = this.roomData.objectsAnimationsData;\n        this.scenePreloader = this.gameEngine.scene.getScene(preloaderName);\n        await this.events.emit('reldens.createdPreloaderRecurring', this, this.scenePreloader);\n        await this.createEngineScene(player, room, previousScene);\n    }\n\n    /**\n     * @param {string} preloaderName\n     * @param {boolean} uiScene\n     * @param {any} player\n     * @param {Room} room\n     * @param {string|boolean} previousScene\n     * @returns {Promise<void>}\n     */\n    async createPreloaderAndScene(preloaderName, uiScene, player, room, previousScene)\n    {\n        this.scenePreloader = this.createPreloaderInstance({\n            name: preloaderName,\n            map: this.roomData.roomMap,\n            images: this.roomData.sceneImages,\n            uiScene: uiScene,\n            gameManager: this.gameManager,\n            preloadAssets: this.roomData.preloadAssets,\n            objectsAnimationsData: this.roomData.objectsAnimationsData\n        });\n        this.gameEngine.scene.add(preloaderName, this.scenePreloader, true);\n        await this.events.emit('reldens.createdPreloaderInstance', this, this.scenePreloader);\n        let preloader = this.gameEngine.scene.getScene(preloaderName);\n        preloader.load.on('complete', async () => {\n            if(!this.gameEngine.uiScene){\n                this.gameEngine.uiScene = preloader;\n                this.showPlayerName(this.gameManager.playerData.id + ' - ' + this.gameManager.playerData.name);\n            }\n            await this.createEngineScene(player, room, previousScene);\n        });\n    }\n\n    /**\n     * @param {string} playerName\n     * @returns {boolean}\n     */\n    showPlayerName(playerName)\n    {\n        let playerBox = this.gameManager.getUiElement('playerBox');\n        if(!playerBox){\n            return false;\n        }\n        let element = playerBox.getChildByProperty('className', 'player-name');\n        if(!element){\n            return false;\n        }\n        element.innerHTML = playerName;\n        return true;\n    }\n\n    /**\n     * @param {any} player\n     * @param {Room} room\n     * @param {string|boolean} previousScene\n     * @returns {Promise<{currentScene: Scene|any, previousScene: (string|boolean), roomEvents: RoomEvents}>}\n     */\n    async createEngineScene(player, room, previousScene)\n    {\n        let previousSceneInstance = this.gameEngine.scene.getScene(previousScene);\n        if(previousSceneInstance){\n            previousSceneInstance.scene.setVisible(false);\n        }\n        await this.events.emit('reldens.createEngineScene', player, room, previousScene, this);\n        if(this.gameManager.room){\n            await this.destroyPreviousScene(previousScene, player);\n        }\n        this.gameEngine.scene.start(player.state.scene);\n        this.gameManager.room = room;\n        let currentScene = this.gameEngine.scene.getScene(player.state.scene);\n        currentScene.player = this.createPlayerEngineInstance(currentScene, player, this.gameManager, room);\n        currentScene.player.create();\n        this.addExistentPlayers(room, currentScene);\n        this.updateSceneLabel(this.roomData.roomTitle);\n        this.send({act: GameConst.PLAYER_STATS});\n        this.send({act: GameConst.CLIENT_JOINED});\n        let playerAddEventData = { player: currentScene.player, previousScene, roomEvents: this};\n        await this.events.emit('reldens.playersOnAddReady', playerAddEventData);\n        let eventData = {currentScene, previousScene, roomEvents: this};\n        await this.events.emit('reldens.createEngineSceneDone', eventData);\n        return eventData;\n    }\n\n    /**\n     * @param {Room} room\n     * @param {SceneDynamic} currentScene\n     * @returns {boolean}\n     */\n    addExistentPlayers(room, currentScene)\n    {\n        if(0 === this.playersCountFromState(room)){\n            return false;\n        }\n        for(let i of this.playersKeysFromState(room)){\n            let tmp = this.playerBySessionIdFromState(room, i);\n            if(!tmp.sessionId || tmp.sessionId === room.sessionId){\n                continue;\n            }\n            let addPlayerData = {\n                x: tmp.state.x,\n                y: tmp.state.y,\n                dir: tmp.state.dir,\n                playerName: tmp.playerName,\n                playedTime: tmp.playedTime,\n                avatarKey: tmp.avatarKey,\n                player_id: tmp.player_id\n            };\n            currentScene.player.addPlayer(tmp.sessionId, addPlayerData);\n        }\n        return true;\n    }\n\n    /**\n     * @param {Room} room\n     * @param {string} i\n     * @returns {any}\n     */\n    playerBySessionIdFromState(room, i)\n    {\n        return room.state.players.get(i);\n    }\n\n    /**\n     * @param {Room} room\n     * @returns {number}\n     */\n    playersCountFromState(room)\n    {\n        return room.state.players.size;\n    }\n\n    /**\n     * @param {Room} room\n     * @returns {string[]}\n     */\n    playersKeysFromState(room)\n    {\n        return Array.from(room.state.players.keys());\n    }\n\n    /**\n     * @param {string|boolean} previousScene\n     * @returns {Promise<boolean>}\n     */\n    async destroyPreviousScene(previousScene)\n    {\n        if(!previousScene){\n            Logger.warning('Missing previous scene data.', previousScene);\n            return false;\n        }\n        let previousSceneInstance = this.gameEngine.scene.getScene(previousScene);\n        if(!previousSceneInstance){\n            Logger.warning('Missing previous scene instance.', previousSceneInstance);\n            return false;\n        }\n        await previousSceneInstance.changeScene();\n        this.gameEngine.scene.stop(previousScene);\n        return true;\n    }\n\n    /**\n     * @param {string} newLabel\n     * @returns {boolean}\n     */\n    updateSceneLabel(newLabel)\n    {\n        let sceneLabel = this.gameManager.getUiElement('sceneLabel');\n        if(!sceneLabel){\n            return false;\n        }\n        let element = sceneLabel.getChildByProperty('className', 'scene-label');\n        if(!element){\n            return false;\n        }\n        element.innerHTML = newLabel;\n        return true;\n    }\n\n    /**\n     * @returns {SceneDynamic}\n     */\n    getActiveScene()\n    {\n        return this.gameEngine.scene.getScene(this.roomName);\n    }\n\n    /**\n     * @param {string} sceneName\n     * @param {any} sceneData\n     * @param {GameManager} gameManager\n     * @returns {SceneDynamic}\n     */\n    createSceneInstance(sceneName, sceneData, gameManager)\n    {\n        return new SceneDynamic(sceneName, sceneData, gameManager);\n    }\n\n    /**\n     * @param {SceneDynamic} currentScene\n     * @param {any} player\n     * @param {GameManager} gameManager\n     * @param {Room} room\n     * @returns {PlayerEngine}\n     */\n    createPlayerEngineInstance(currentScene, player, gameManager, room)\n    {\n        return new PlayerEngine({scene: currentScene, playerData: player, gameManager, room, roomEvents: this});\n    }\n\n    /**\n     * @param {any} props\n     * @returns {ScenePreloader}\n     */\n    createPreloaderInstance(props)\n    {\n        return new ScenePreloader(props);\n    }\n\n    /**\n     * @param {any} data\n     * @param {string} [key]\n     * @returns {boolean}\n     */\n    send(data, key)\n    {\n        try {\n            if(this.room.connection.transport.ws.readyState === this.room.connection.transport.ws.CLOSED){\n                ErrorManager.error('Connection lost.');\n            }\n            if(this.room.connection.transport.ws.readyState === this.room.connection.transport.ws.CLOSING){\n                return false;\n            }\n            if(!key){\n                key = '*';\n            }\n            this.room.send(key, data);\n            return true;\n        } catch (error) {\n            Logger.critical(error.message, data);\n        }\n        this.gameDom.alertReload(this.gameManager.services.translator.t('game.errors.connectionLost'));\n        return false;\n    }\n\n}\n\nmodule.exports.RoomEvents = RoomEvents;\n"
  },
  {
    "path": "lib/game/client/scene-dynamic.js",
    "content": "/**\n *\n * Reldens - SceneDynamic\n *\n * Main game scene class extending Phaser Scene for rendering the game world.\n * Manages map creation, tileset animations, minimap, player movement, object interpolation,\n * and input handling. Coordinates with GameManager for scene lifecycle and state management.\n *\n */\n\nconst { Scene, Input } = require('phaser');\nconst { TileSetAnimation } = require('./tileset-animation');\nconst { Minimap } = require('./minimap');\nconst { GameConst } = require('../constants');\nconst { ActionsConst } = require('../../actions/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./game-manager').GameManager} GameManager\n */\nclass SceneDynamic extends Scene\n{\n\n    /**\n     * @param {string} key\n     * @param {Object} data\n     * @param {GameManager} gameManager\n     */\n    constructor(key, data, gameManager)\n    {\n        super({key});\n        this.key = key;\n        this.params = data;\n        this.gameManager = gameManager;\n        this.eventsManager = gameManager.events;\n        this.configManager = gameManager.config;\n        this.layers = {};\n        this.transition = true;\n        this.useTsAnimation = false;\n        this.arrowSprite = false;\n        this.objectsAnimationsData = false;\n        this.objectsAnimations = {};\n        this.setPropertiesFromConfig();\n        this.minimap = this.createMinimapInstance(this.minimapConfig);\n        this.player = false;\n        this.interpolatePlayersPosition = {};\n        this.interpolateObjectsPositions = {};\n        this.generatedTilesets = [];\n        this.tilesetAnimations = [];\n        this.stopOnDeathOrDisabledSent = false;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setPropertiesFromConfig()\n    {\n        // @TODO - BETA - Move defaults to constants.\n        if(!this.configManager){\n            this.configuredFrameRate = 10;\n            this.clientInterpolation = true;\n            this.interpolationSpeed = 0.1;\n            this.minimapConfig = {};\n            return false;\n        }\n        this.configuredFrameRate = this.configManager.getWithoutLogs('client/general/animations/frameRate', 10);\n        this.clientInterpolation = this.configManager.getWithoutLogs('client/general/engine/clientInterpolation', true);\n        this.interpolationSpeed = this.configManager.getWithoutLogs('client/general/engine/interpolationSpeed', 0.1);\n        this.minimapConfig = this.configManager.getWithoutLogs('client/ui/minimap', {});\n        return true;\n    }\n\n    /**\n     * @param {Object} config\n     * @returns {Minimap|false}\n     */\n    createMinimapInstance(config)\n    {\n        if(!this.minimapConfig.enabled){\n            return false;\n        }\n        return new Minimap({config, events: this.eventsManager});\n    }\n\n    init()\n    {\n        this.scene.setVisible(false, this.key);\n        this.input.keyboard.removeAllListeners();\n    }\n\n    async create()\n    {\n        this.eventsManager.emitSync('reldens.beforeSceneDynamicCreate', this);\n        this.disableContextMenu();\n        this.createControllerKeys();\n        this.setupKeyboardAndPointerEvents();\n        await this.createSceneMap();\n        this.cameras.main.on('camerafadeincomplete', () => {\n            this.transition = false;\n            this.gameManager.gameDom.activeElement().blur();\n            this.minimap.createMap(this, this.gameManager.getCurrentPlayerAnimation());\n            this.gameManager.setChangingScene(false);\n        });\n        this.eventsManager.emitSync('reldens.afterSceneDynamicCreate', this);\n    }\n\n    /**\n     * @param {number} time\n     * @param {number} delta\n     */\n    update(time, delta)\n    {\n        this.interpolatePositions();\n        this.movePlayerByPressedButtons();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    disableContextMenu()\n    {\n        if(!this.gameManager.config.get('client/ui/controls/disableContextMenu')){\n            return false;\n        }\n        this.gameManager.gameDom.getDocument().addEventListener('contextmenu', (event) => {\n            event.preventDefault();\n            event.stopPropagation();\n        });\n        return true;\n    }\n\n    setupKeyboardAndPointerEvents()\n    {\n        this.input.keyboard.on('keydown', (event) => {\n            return this.executeKeyDownBehavior(event);\n        });\n        this.input.keyboard.on('keyup', (event) => {\n            this.executeKeyUpBehavior(event);\n        });\n        this.input.on('pointerdown', (pointer, currentlyOver) => {\n            return this.executePointerDownAction(pointer, currentlyOver);\n        });\n    }\n\n    async createSceneMap()\n    {\n        this.map = this.make.tilemap({key: this.params.roomName});\n        let loadMapImagesData = this.processMissingImagesFromTilesets();\n        await this.addTilesetImages(loadMapImagesData);\n        this.registerLayers();\n        this.registerTilesetAnimation();\n    }\n\n    /**\n     * @returns {Array<Object>}\n     */\n    processMissingImagesFromTilesets()\n    {\n        let mapFromCache = this.cache?.tilemap?.entries?.entries[this.params.roomName]?.data;\n        let loadMapImages = this.params.sceneImages;\n        let loadingTilesetImageData = [];\n        let loadMapImagesData = [];\n        for(let tileset of mapFromCache.tilesets){\n            if(!sc.inArray(tileset.image, loadMapImages)){\n                this.load.image(tileset.image, `/assets/maps/${tileset.image}`).on('loaderror', (event) => {\n                    Logger.error('Load map image error: ' + tileset.image, event);\n                });\n                loadingTilesetImageData.push({tilesetName: tileset.name, imageKey: tileset.image});\n                continue;\n            }\n            loadMapImagesData.push({tilesetName: tileset.name, imageKey: tileset.image});\n        }\n        if(0 < loadingTilesetImageData.length){\n            this.load.on('complete', async () => {\n                for(let data of loadingTilesetImageData){\n                    Logger.debug('Adding tileset \"'+data.tilesetName+'\" with image key \"'+data.imageKey+'\".');\n                    let tileset = this.map.addTilesetImage(data.tilesetName, data.imageKey);\n                    this.generatedTilesets.push(tileset);\n                }\n            });\n            this.load.start();\n        }\n        return loadMapImagesData;\n    }\n\n    /**\n     * @param {Array<Object>} loadMapImages\n     */\n    async addTilesetImages(loadMapImages)\n    {\n        for(let data of loadMapImages){\n            let tilesetName = data.tilesetName;\n            Logger.debug('Adding missing image to tileset \"'+tilesetName+'\" with image key \"'+data.imageKey+'\".');\n            let tileset = this.map.addTilesetImage(tilesetName, data.imageKey);\n            if(!tileset){\n                Logger.critical(\n                    'Tileset creation error. Check if the tileset name equals the imageKey without the extension.',\n                    {\n                        roomName: this.params.roomName,\n                        imageKeys: loadMapImages,\n                        createdTileset: tileset\n                    }\n                );\n            }\n            this.generatedTilesets.push(tileset);\n        }\n    }\n\n    registerTilesetAnimation()\n    {\n        for(let tileset of this.generatedTilesets){\n            if(!this.hasTilesetAnimations(tileset)){\n                continue;\n            }\n            this.useTsAnimation = true;\n            for(let i of Object.keys(this.layers)){\n                let layer = this.layers[i];\n                let tilesetAnimation = new TileSetAnimation();\n                tilesetAnimation.register(layer, tileset);\n                tilesetAnimation.start();\n                this.tilesetAnimations.push(tilesetAnimation);\n            }\n        }\n    }\n\n    /**\n     * @param {Object} tileset\n     * @returns {boolean}\n     */\n    hasTilesetAnimations(tileset)\n    {\n        let tilesData = tileset?.tileData || {};\n        let dataKeys = Object.keys(tilesData);\n        if(0 === dataKeys.length){\n            return false;\n        }\n        for(let i of dataKeys){\n            if(tilesData[i].animation){\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @param {KeyboardEvent} event\n     * @returns {boolean|void}\n     */\n    executeKeyDownBehavior(event)\n    {\n        if(this.gameManager.gameDom.insideInput()){\n            return false;\n        }\n        // @TODO - BETA - Make configurable the keys related to the actions and skills.\n        if(Input.Keyboard.KeyCodes.SPACE === event.keyCode && !this.gameManager.gameDom.insideInput()){\n            if(!this.player){\n                return false;\n            }\n            this.player.runActions();\n        }\n        if(Input.Keyboard.KeyCodes.ESC === event.keyCode){\n            this.gameManager.gameEngine.clearTarget();\n        }\n        if(Input.Keyboard.KeyCodes.F5 === event.keyCode){\n            this.gameManager.forcedDisconnection = true;\n        }\n        return true;\n    }\n\n    /**\n     * @param {KeyboardEvent} event\n     */\n    executeKeyUpBehavior(event)\n    {\n        if(!this.player){\n            return;\n        }\n        // stop all directional keys (arrows and wasd):\n        let keys = this.availableControllersKeyCodes();\n        if(-1 !== keys.indexOf(event.keyCode)){\n            // @NOTE: all keyup events has to be sent.\n            this.player.stop();\n        }\n    }\n\n    createControllerKeys()\n    {\n        // @TODO - BETA - Controllers will be part of the configuration in the database.\n        this.keyLeft = this.input.keyboard.addKey(Input.Keyboard.KeyCodes.LEFT);\n        this.keyA = this.input.keyboard.addKey(Input.Keyboard.KeyCodes.A);\n        this.keyRight = this.input.keyboard.addKey(Input.Keyboard.KeyCodes.RIGHT);\n        this.keyD = this.input.keyboard.addKey(Input.Keyboard.KeyCodes.D);\n        this.keyUp = this.input.keyboard.addKey(Input.Keyboard.KeyCodes.UP);\n        this.keyW = this.input.keyboard.addKey(Input.Keyboard.KeyCodes.W);\n        this.keyDown = this.input.keyboard.addKey(Input.Keyboard.KeyCodes.DOWN);\n        this.keyS = this.input.keyboard.addKey(Input.Keyboard.KeyCodes.S);\n        let keys = this.availableControllersKeyCodes();\n        let inputElements = this.gameManager.gameDom.getElements('input');\n        for(let inputElement of inputElements){\n            this.addAndRemoveCapture(keys, inputElement);\n        }\n    }\n\n    /**\n     * @param {Array<number>} keys\n     * @param {HTMLElement} inputElement\n     */\n    addAndRemoveCapture(keys, inputElement)\n    {\n        this.loopKeysAddListenerToElement(keys, inputElement, 'focusin', 'removeCapture');\n        this.loopKeysAddListenerToElement(keys, inputElement, 'click', 'removeCapture');\n        this.loopKeysAddListenerToElement(keys, inputElement, 'focusout', 'addCapture');\n        this.loopKeysAddListenerToElement(keys, inputElement, 'blur', 'addCapture');\n    }\n\n    /**\n     * @returns {Array<number>}\n     */\n    availableControllersKeyCodes()\n    {\n        return [\n            Input.Keyboard.KeyCodes.LEFT,\n            Input.Keyboard.KeyCodes.A,\n            Input.Keyboard.KeyCodes.RIGHT,\n            Input.Keyboard.KeyCodes.D,\n            Input.Keyboard.KeyCodes.UP,\n            Input.Keyboard.KeyCodes.W,\n            Input.Keyboard.KeyCodes.DOWN,\n            Input.Keyboard.KeyCodes.S\n        ];\n    }\n\n    /**\n     * @param {Phaser.Input.Pointer} pointer\n     * @param {Array} currentlyOver\n     * @returns {boolean}\n     */\n    executePointerDownAction(pointer, currentlyOver)\n    {\n        if(0 < currentlyOver.length){\n            return false;\n        }\n        if(!this.gameManager.config.get('client/players/tapMovement/enabled')){\n            return false;\n        }\n        if(this.gameManager.activeRoomEvents.roomData?.worldConfig?.applyGravity){\n            return false;\n        }\n        let primaryMove = this.gameManager.config.get('client/ui/controls/primaryMove');\n        let primaryTouch = this.gameManager.config.get('client/ui/controls/allowPrimaryTouch');\n        if(\n            (!pointer.wasTouch && !pointer.primaryDown && primaryMove)\n            || (!pointer.wasTouch && pointer.primaryDown && !primaryMove)\n            || (pointer.wasTouch && !pointer.primaryDown && primaryTouch)\n        ){\n            return false;\n        }\n        // @TODO - BETA - Temporal avoid double actions, if you target something you will not be moved to the\n        //   pointer, in a future release this will be configurable, so you can walk to objects and they get\n        //   activated, for example: click on and NPC, automatically walk close and automatically get a dialog\n        //   opened.\n        if(this.gameManager.gameDom.insideInput()){\n            this.gameManager.gameDom.activeElement().blur();\n        }\n        if(!this.appendRowAndColumn(pointer)){\n            return false;\n        }\n        this.player.moveToPointer(pointer);\n        this.updatePointerObject(pointer);\n        return true;\n    }\n\n    movePlayerByPressedButtons()\n    {\n        // if player is writing there's no movement:\n        if(this.gameManager.gameDom.insideInput()){\n            return;\n        }\n        if(this.transition || this.gameManager.isChangingScene){\n            return;\n        }\n        if(this.player.isDeath() || this.player.isDisabled()){\n            if(!this.stopOnDeathOrDisabledSent){\n                this.player.fullStop();\n            }\n            this.stopOnDeathOrDisabledSent = true;\n            return;\n        }\n        // @TODO - BETA - Controllers will be part of the configuration in the database.\n        if(this.keyRight.isDown || this.keyD.isDown){\n            this.player.right();\n        }\n        if(this.keyLeft.isDown || this.keyA.isDown){\n            this.player.left();\n        }\n        if(this.keyDown.isDown || this.keyS.isDown){\n            this.player.down();\n        }\n        if(this.keyUp.isDown || this.keyW.isDown){\n            this.player.up();\n        }\n    }\n\n    interpolatePositions()\n    {\n        if(!this.clientInterpolation){\n            return;\n        }\n        this.processPlayersPositionInterpolation();\n        this.processObjectsPositionInterpolation();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    processPlayersPositionInterpolation()\n    {\n        let playerKeys = Object.keys(this.interpolatePlayersPosition);\n        if(0 === playerKeys.length){\n            return false;\n        }\n        if(!sc.get(this.player, 'players')){\n            return false;\n        }\n        for(let i of playerKeys){\n            let entityState = this.interpolatePlayersPosition[i];\n            if(!entityState){\n                continue;\n            }\n            let entity = this.player.players[i];\n            if(!entity){\n                continue;\n            }\n            if(this.isCurrentPosition(entity, entityState)){\n                delete this.interpolatePlayersPosition[i];\n                continue;\n            }\n            let newX = sc.roundToPrecision(\n                Phaser.Math.Linear(entity.x, (entityState.x - this.player.leftOff), this.interpolationSpeed),\n                2\n            );\n            let newY = sc.roundToPrecision(\n                Phaser.Math.Linear(entity.y, (entityState.y - this.player.topOff), this.interpolationSpeed),\n                2\n            );\n            //Logger.debug('Player interpolation update.', newX, newY);\n            this.player.processPlayerPositionAnimationUpdate(entity, entityState, i, newX, newY);\n            if(!entityState.mov){\n                delete this.interpolatePlayersPosition[i];\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    processObjectsPositionInterpolation()\n    {\n        let objectsKeys = Object.keys(this.interpolateObjectsPositions);\n        if(0 === objectsKeys.length){\n            return false;\n        }\n        let objectsPlugin = this.gameManager.getFeature('objects');\n        for(let i of objectsKeys){\n            this.interpolateBulletPosition(i, objectsPlugin);\n            this.interpolateObjectAnimationPosition(i, objectsPlugin);\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} i\n     * @param {Object} objectsPlugin\n     * @returns {boolean}\n     */\n    interpolateBulletPosition(i, objectsPlugin)\n    {\n        if(!this.isBullet(i)){\n            return false;\n        }\n        let entity = sc.get(objectsPlugin.bullets, i);\n        if(!entity){\n            return false;\n        }\n        let entityState = this.interpolateObjectsPositions[i];\n        if(!entityState){\n            return false;\n        }\n        if(this.isCurrentPosition(entity, entityState)){\n            delete this.interpolateObjectsPositions[i];\n            return false;\n        }\n        let x = sc.roundToPrecision(Phaser.Math.Linear(entity.x, entityState.x, this.interpolationSpeed), 0);\n        let y = sc.roundToPrecision(Phaser.Math.Linear(entity.y, entityState.y, this.interpolationSpeed), 0);\n        let bodyData = {x, y};\n        objectsPlugin.updateBulletBodyPosition(i, bodyData);\n        if(!entityState.mov){\n            delete this.interpolateObjectsPositions[i];\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} objectKey\n     * @returns {boolean}\n     */\n    isBullet(objectKey)\n    {\n        return -1 !== objectKey.indexOf('bullet');\n    }\n\n    /**\n     * @param {string} i\n     * @param {Object} objectsPlugin\n     * @returns {boolean}\n     */\n    interpolateObjectAnimationPosition(i, objectsPlugin)\n    {\n        let entity = this.objectsAnimations[i];\n        if(!entity){\n            return false;\n        }\n        let entityState = this.interpolateObjectsPositions[i];\n        if(!entityState){\n            return false;\n        }\n        if(this.isCurrentPosition(entity, entityState)){\n            delete this.interpolateObjectsPositions[i];\n            return false;\n        }\n        let x = sc.roundToPrecision(Phaser.Math.Linear(entity.x, entityState.x, this.interpolationSpeed), 0);\n        let y = sc.roundToPrecision(Phaser.Math.Linear(entity.y, entityState.y, this.interpolationSpeed), 0);\n        let bodyData = {x, y, inState: entityState.inState, mov: entityState.mov, dir: entityState.dir};\n        objectsPlugin.updateObjectsAnimations(i, bodyData, this);\n        if(!entityState.mov){\n            delete this.interpolateObjectsPositions[i];\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} entity\n     * @param {Object} entityState\n     * @returns {boolean}\n     */\n    isCurrentPosition(entity, entityState)\n    {\n        if(!entity || !entityState){\n            Logger.warning('None entity found to compare current entity position.');\n            return false;\n        }\n        return Math.round(entity.x) === Math.round(entityState.x) && Math.round(entity.y) === Math.round(entityState.y);\n    }\n\n    async changeScene()\n    {\n        this.minimap?.destroyMap();\n        this.eventsManager.emitSync('reldens.changeSceneDestroyPrevious', this);\n        this.objectsAnimations = {};\n        this.objectsAnimationsData = false;\n        if(this.useTsAnimation){\n            for(let tilesetAnimation of this.tilesetAnimations){\n                tilesetAnimation.destroy();\n            }\n        }\n    }\n\n    /**\n     * @return {boolean}\n     */\n    registerLayers()\n    {\n        if(0 === this.map.layers.length){\n            return false;\n        }\n        let idx = 0;\n        // @TODO - BETA - Use single get(client/map).\n        let depthBelowPlayer = this.configManager.get('client/map/layersDepth/belowPlayer');\n        let depthForChangePoints = this.configManager.get('client/map/layersDepth/changePoints');\n        for(let layer of this.map.layers){\n            this.layers[idx] = this.map.createLayer(layer.name, this.generatedTilesets);\n            if(!this.layers[idx]){\n                Logger.critical('Map layer could not be created.', layer.name, this.key);\n                continue;\n            }\n            if(-1 !== layer.name.indexOf('below-player')){\n                this.layers[idx].setDepth(depthBelowPlayer);\n            }\n            if(-1 !== layer.name.indexOf('over-player')){\n                // we need to set the depth higher than everything else (multiply to get the highest value):\n                this.layers[idx].setDepth(idx * this.map.height * this.map.tileHeight);\n            }\n            if(-1 !== layer.name.indexOf('change-points')){\n                this.layers[idx].setDepth(depthForChangePoints);\n            }\n            idx++;\n        }\n        return true;\n    }\n\n    /**\n     * @param {Phaser.Input.Pointer} pointer\n     * @returns {Object|boolean}\n     */\n    appendRowAndColumn(pointer)\n    {\n        let worldToTileXY = this.map.worldToTileXY(pointer.worldX, pointer.worldY);\n        let playerToTileXY = this.map.worldToTileXY(this.player.state.x, this.player.state.y);\n        if(!worldToTileXY || !playerToTileXY){\n            Logger.error('Move to pointer error.');\n            return false;\n        }\n        pointer.worldColumn = worldToTileXY.x;\n        pointer.worldRow = worldToTileXY.y;\n        pointer.playerOriginCol = playerToTileXY.x;\n        pointer.playerOriginRow = playerToTileXY.y;\n        return pointer;\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @param {string} message\n     * @param {string} color\n     * @param {string} font\n     * @param {number} [fontSize]\n     * @param {number} [duration]\n     * @param {number} [top]\n     * @param {string} [stroke]\n     * @param {number} [strokeThickness]\n     * @param {string} [shadowColor]\n     */\n    createFloatingText(\n        x,\n        y,\n        message,\n        color,\n        font,\n        fontSize = 14,\n        duration = 600,\n        top = 50,\n        stroke = '#000000',\n        strokeThickness = 4,\n        shadowColor = 'rgba(0,0,0,0.7)'\n    ){\n        let damageSprite = this.add.text(x, y, message, {fontFamily: font, fontSize: fontSize+'px'});\n        damageSprite.style.setColor(color);\n        damageSprite.style.setAlign('center');\n        damageSprite.style.setStroke(stroke, strokeThickness);\n        damageSprite.style.setShadow(5, 5, shadowColor, 5);\n        damageSprite.setDepth(200000);\n        this.add.tween({\n            targets: damageSprite, duration, ease: 'Exponential.In', y: y - top,\n            onComplete: () => {\n                damageSprite.destroy();\n            }\n        });\n    }\n\n    /**\n     * @param {Phaser.Input.Pointer} pointer\n     */\n    updatePointerObject(pointer)\n    {\n        if(!this.configManager.get('client/ui/pointer/show')){\n            return;\n        }\n        if(this.arrowSprite){\n            this.arrowSprite.destroy();\n        }\n        let topOffSet = this.configManager.get('client/ui/pointer/topOffSet', 16);\n        this.arrowSprite = this.physics.add.sprite(pointer.worldX, pointer.worldY - topOffSet, GameConst.ARROW_DOWN);\n        this.arrowSprite.setDepth(500000);\n        this.arrowSprite.anims.play(GameConst.ARROW_DOWN, true).on('animationcomplete', () => {\n            this.arrowSprite.destroy();\n        });\n    }\n\n    /**\n     * @param {string} key\n     * @returns {Object|false}\n     */\n    getAnimationByKey(key)\n    {\n        if(!this.anims || !this.anims?.anims || !this.anims?.anims?.entries){\n            Logger.error('Animations not loaded.', this.anims);\n            return false;\n        }\n        return sc.get(this.anims.anims.entries, key, false);\n    }\n\n    /**\n     * @param {string} objKey\n     * @param {Object} extraData\n     * @param {Object} currentPlayer\n     * @returns {Object|false}\n     */\n    getObjectFromExtraData(objKey, extraData, currentPlayer)\n    {\n        // @TODO - BETA - Replace with constants.\n        // objKey = t > target\n        // objKey = o > owner\n        let returnObj = false;\n        let dataTargetType = objKey+'T'; // tT - oT === DATA_TARGET_TYPE - DATA_OWNER_TYPE\n        let dataTargetKey = objKey+'K'; // tK - oK === DATA_TARGET_KEY - DATA_OWNER_KEY\n        let isTargetPlayer = extraData[dataTargetType] === ActionsConst.DATA_TYPE_VALUE_PLAYER;\n        if(!isTargetPlayer && sc.hasOwn(this.objectsAnimations, extraData[dataTargetKey])){\n            returnObj = this.objectsAnimations[extraData[dataTargetKey]];\n        }\n        if(isTargetPlayer && sc.hasOwn(currentPlayer.players, extraData[dataTargetKey])){\n            returnObj = currentPlayer.players[extraData[dataTargetKey]];\n        }\n        return returnObj;\n    }\n\n    /**\n     * @param {Array<number>} keys\n     * @param {HTMLElement} element\n     * @param {string} eventName\n     * @param {string} action\n     */\n    loopKeysAddListenerToElement(keys, element, eventName, action)\n    {\n        element.addEventListener(eventName, () => {\n            for(let keyCode of keys){\n                this.input.keyboard[action](keyCode);\n            }\n        });\n    }\n\n}\n\nmodule.exports.SceneDynamic = SceneDynamic;\n"
  },
  {
    "path": "lib/game/client/scene-preloader.js",
    "content": "/**\n *\n * Reldens - ScenePreloader\n *\n * Phaser preloader scene for loading game assets and creating the UI layer.\n * Manages asset loading for maps, images, sprites, and HTML templates, displays loading progress,\n * initializes UI elements (minimap, instructions, settings, joystick), creates animations,\n * and coordinates with the dynamic scene for game start.\n *\n */\n\nconst { Scene, Geom } = require('phaser');\nconst { FullScreenHandler } = require('./handlers/full-screen-handler');\nconst { MinimapUi } = require('./minimap-ui');\nconst { InstructionsUi } = require('./instructions-ui');\nconst { SettingsUi } = require('./settings-ui');\nconst { Joystick } = require('./joystick');\nconst { GameConst } = require('../constants');\nconst { ActionsConst } = require('../../actions/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./game-manager').GameManager} GameManager\n *\n * @typedef {Object} ScenePreloaderProps\n * @property {string} name\n * @property {string} map\n * @property {Object} images\n * @property {boolean} uiScene\n * @property {GameManager} gameManager\n * @property {Object} preloadAssets\n * @property {Object} objectsAnimationsData\n */\nclass ScenePreloader extends Scene\n{\n\n    /**\n     * @param {ScenePreloaderProps} props\n     */\n    constructor(props)\n    {\n        super({key: props.name});\n        this.relatedSceneKey = props.name.replace(GameConst.SCENE_PRELOADER, '');\n        this.progressBar = null;\n        this.progressCompleteRect = null;\n        this.progressRect = null;\n        this.userInterfaces = {};\n        this.preloadMapKey = props.map;\n        this.preloadImages = props.images;\n        this.uiScene = props.uiScene;\n        this.elementsUi = {};\n        this.gameManager = props.gameManager;\n        this.eventsManager = props.gameManager.events;\n        this.preloadAssets = props.preloadAssets || {};\n        this.directionalAnimations = {};\n        this.objectsAnimations = {};\n        if(!this.gameManager.createdAnimations){\n            this.gameManager.createdAnimations = {};\n        }\n        let currentScene = this.gameManager.activeRoomEvents.getActiveScene();\n        currentScene.objectsAnimationsData = props.objectsAnimationsData;\n        this.playerSpriteSize = {\n            frameWidth: this.gameManager.config.get('client/players/size/width', 52),\n            frameHeight: this.gameManager.config.get('client/players/size/height', 71)\n        };\n        this.useJoystick = this.gameManager.config.getWithoutLogs(\n            'client/ui/controls/useJoystick',\n            true\n        );\n        this.useJoystickOnLowResolutions = this.gameManager.config.getWithoutLogs(\n            'client/ui/controls/useJoystickOnLowResolutions',\n            true\n        );\n        this.joystick = new Joystick({scenePreloader: this});\n    }\n\n    preload()\n    {\n        // @NOTE: this event runs ONLY ONE TIME for each scene.\n        let eventUiScene = this.uiScene ? this : this.gameManager.gameEngine.uiScene;\n        this.eventsManager.emitSync('reldens.beforePreload', this, eventUiScene);\n        this.preloadUiScene();\n        this.preloadMapJson();\n        // @TODO - BETA - CHECK - Test a multiple tiles images case.\n        this.preloadMapImages();\n        this.preloadValidAssets();\n        this.preloadPlayerDefaultSprite();\n        this.preloadArrowPointer();\n        // @TODO - BETA - Move everything related to player stats into the users pack or create a new pack.\n        this.load.image(\n            GameConst.ICON_STATS,\n            this.gameManager.config.get('client/general/assets/statsIconPath', '/assets/icons/book.png')\n        );\n        this.load.on('fileprogress', this.onFileProgress, this);\n        this.load.on('progress', this.onLoadProgress, this);\n        this.load.on('complete', this.onLoadComplete, this);\n        this.configuredFrameRate = this.gameManager.config.get('client/general/animations/frameRate', 10);\n        this.showLoadingProgressBar();\n    }\n\n    preloadMapJson()\n    {\n        if(!this.preloadMapKey){\n            return;\n        }\n        // @TODO - BETA - Refactor to pass the map_filename from the server as a parameter.\n        this.load.tilemapTiledJSON(this.preloadMapKey, '/assets/maps/'+this.preloadMapKey+'.json');\n    }\n\n    preloadArrowPointer()\n    {\n        if(!this.gameManager.config.get('client/ui/pointer/show')){\n            return;\n        }\n        let pointerData = {\n            frameWidth: this.gameManager.config.getWithoutLogs('client/general/assets/arrowDownFrameWidth', 32),\n            frameHeight: this.gameManager.config.getWithoutLogs('client/general/assets/arrowDownFrameHeight', 32)\n        };\n        this.load.spritesheet(\n            GameConst.ARROW_DOWN,\n            this.gameManager.config.get('client/general/assets/arrowDownPath', '/assets/sprites/arrow-down.png'),\n            pointerData\n        );\n    }\n\n    preloadUiScene()\n    {\n        if(!this.uiScene){\n            return;\n        }\n        // @NOTE: the events here run only once over all the game progress.\n        this.eventsManager.emitSync('reldens.beforePreloadUiScene', this);\n        if(this.gameManager.config.get('client/ui/playerBox/enabled')){\n            this.load.html('playerBox', '/assets/html/ui-player-box.html');\n        }\n        if(this.gameManager.config.get('client/ui/controls/enabled')){\n            this.load.html('controls', '/assets/html/ui-controls.html');\n        }\n        if(this.gameManager.config.get('client/ui/sceneLabel/enabled')){\n            this.load.html('sceneLabel', '/assets/html/ui-scene-label.html');\n        }\n        if(this.gameManager.config.get('client/ui/instructions/enabled')){\n            this.load.html('instructions', '/assets/html/ui-instructions.html');\n        }\n        if(this.gameManager.config.get('client/ui/minimap/enabled')){\n            this.load.html('minimap', '/assets/html/ui-minimap.html');\n        }\n        if(this.gameManager.config.get('client/ui/settings/enabled')){\n            this.load.html('settings', '/assets/html/ui-settings.html');\n            this.load.html('settings-content', '/assets/html/ui-settings-content.html');\n        }\n        if(this.gameManager.config.getWithoutLogs('client/ui/preloadTarget/enabled', true)){\n            this.load.html('uiTarget', '/assets/html/ui-target.html');\n        }\n        if(this.gameManager.config.getWithoutLogs('client/ui/fullScreenButton/enabled', true)){\n            this.load.html('fullScreenButton', '/assets/html/ui-full-screen-button.html');\n        }\n        if(this.gameManager.config.getWithoutLogs('client/ui/preloadOptionsTemplates/enabled', true)){\n            this.load.html('uiOptionButton', '/assets/html/ui-option-button.html');\n            this.load.html('uiOptionIcon', '/assets/html/ui-option-icon.html');\n            this.load.html('uiOptionsContainer', '/assets/html/ui-options-container.html');\n        }\n        if(this.gameManager.config.getWithoutLogs('client/ui/preloadLoading/enabled', true)){\n            this.load.html('uiLoading', '/assets/html/ui-loading.html');\n        }\n        this.eventsManager.emitSync('reldens.preloadUiScene', this);\n    }\n\n    preloadMapImages()\n    {\n        if(!this.preloadImages){\n            return;\n        }\n        for(let imageFile of this.preloadImages){\n            this.load.image(imageFile, `/assets/maps/${imageFile}`);\n            //Logger.debug('Preload map image: \"'+imageFile+'\".');\n        }\n    }\n\n    preloadValidAssets()\n    {\n        if(!sc.isObject(this.preloadAssets)){\n            Logger.info('None assets available for preload.');\n            return;\n        }\n        // @TODO - BETA - Remove the hardcoded file extensions.\n        let preloadAssetsKeys = Object.keys(this.preloadAssets);\n        for(let i of preloadAssetsKeys){\n            let asset = this.preloadAssets[i];\n            if('spritesheet' !== asset.asset_type){\n                continue;\n            }\n            let assetParams = sc.toJson(asset.extra_params);\n            if(!assetParams){\n                Logger.error('Missing spritesheet params.', asset);\n                continue;\n            }\n            this.load.spritesheet(asset.asset_key, `/assets/custom/sprites/${asset.asset_file}`, assetParams);\n        }\n    }\n\n    create()\n    {\n        // @NOTE: this event runs once for each scene.\n        let eventUiScene = this.uiScene ? this : this.gameManager.gameEngine.uiScene;\n        this.eventsManager.emitSync('reldens.createPreload', this, eventUiScene);\n        if(this.uiScene){\n            this.createUiScene();\n        }\n        this.createPlayerAnimations(sc.get(this.gameManager.playerData, 'avatarKey', GameConst.IMAGE_PLAYER));\n        this.createArrowAnimation();\n    }\n\n    createUiScene()\n    {\n        // @NOTE: the events here run only once over all the game progress.\n        this.eventsManager.emitSync('reldens.beforeCreateUiScene', this);\n        // @TODO - BETA - Replace all different DOM references and standardize with the game engine driver.\n        this.createPlayerBox();\n        this.createTargetUi();\n        this.createSceneLabelBox();\n        this.createControlsBox();\n        this.createInstructionsBox();\n        this.createMiniMap();\n        this.createSettingsUi();\n        this.createFullScreenButton();\n        this.eventsManager.emitSync('reldens.createUiScene', this);\n    }\n\n    createFullScreenButton()\n    {\n        let fullScreenUi = this.getUiConfig('fullScreenButton');\n        if(!fullScreenUi.enabled){\n            return;\n        }\n        this.elementsUi['fullScreenButton'] = this.createUi('fullScreenButton', fullScreenUi);\n        this.fullScreen = new FullScreenHandler(this.gameManager);\n        this.fullScreen.activateFullScreen();\n    }\n\n    createSettingsUi() {\n        let settingsConfig = this.getUiConfig('settings');\n        if(!settingsConfig.enabled){\n            return;\n        }\n        this.settingsUi = new SettingsUi();\n        this.settingsUi.createSettings(settingsConfig, this);\n    }\n\n    createMiniMap()\n    {\n        let minimapConfig = this.getUiConfig('minimap');\n        if(!minimapConfig.enabled){\n            return;\n        }\n        this.minimapUi = new MinimapUi();\n        this.minimapUi.createMinimap(minimapConfig, this);\n    }\n\n    createInstructionsBox()\n    {\n        let instConfig = this.getUiConfig('instructions');\n        if(!instConfig.enabled){\n            return;\n        }\n        this.instructionsUi = new InstructionsUi();\n        this.instructionsUi.createInstructions(instConfig, this);\n    }\n\n    createControlsBox()\n    {\n        let controlsUi = this.getUiConfig('controls');\n        if(!controlsUi.enabled){\n            return;\n        }\n        this.elementsUi['controls'] = this.createUi('controls', controlsUi);\n        let controlsBox = this.gameManager.gameDom.getElement('.ui-box-controls-main-container');\n        if(this.useJoystick || this.useJoystickOnLowResolutions){\n            controlsBox.classList.add('ui-box-joystick');\n            this.joystick.registerJoystickController();\n        }\n        if(!this.useJoystickOnLowResolutions){\n            return;\n        }\n        if(controlsBox){\n            controlsBox.classList.add('joystick-small-resolutions-only');\n        }\n        this.registerControllers(this.elementsUi['controls']);\n    }\n\n    /**\n     * @param {string} key\n     * @param {Object} uiConfig\n     * @returns {Phaser.GameObjects.DOMElement}\n     */\n    createUi(key, uiConfig)\n    {\n        Logger.debug('Creating UI \"'+key+'\".', uiConfig);\n        return this.createContent(key, uiConfig.uiX, uiConfig.uiY);\n    }\n\n    /**\n     * @param {string} key\n     * @param {number} x\n     * @param {number} y\n     * @returns {Phaser.GameObjects.DOMElement}\n     */\n    createContent(key, x, y)\n    {\n        return this.add.dom(x, y).createFromCache(key);\n    }\n\n    createSceneLabelBox()\n    {\n        let sceneLabelUi = this.getUiConfig('sceneLabel');\n        if(!sceneLabelUi.enabled){\n            return;\n        }\n        this.elementsUi['sceneLabel'] = this.createUi('sceneLabel', sceneLabelUi);\n    }\n\n    createTargetUi()\n    {\n        let targetUi = this.getUiConfig('uiTarget');\n        if(!targetUi.enabled){\n            return;\n        }\n        this.uiTarget = this.createUi('uiTarget', targetUi);\n        let closeButton = this.uiTarget.getChildByProperty('className', 'close-target');\n        closeButton.addEventListener('click', () => {\n            this.gameManager.gameEngine.clearTarget();\n        });\n    }\n\n    createPlayerBox()\n    {\n        let playerBox = this.getUiConfig('playerBox');\n        if(!playerBox.enabled){\n            return;\n        }\n        this.elementsUi['playerBox'] = this.createUi('playerBox', playerBox);\n        let logoutButton = this.elementsUi['playerBox'].getChildByProperty('id', 'logout');\n        logoutButton?.addEventListener('click', () => {\n            this.gameManager.forcedDisconnection = true;\n            // @TODO - BETA - Move this into an event on the firebase plugin.\n            if(this.gameManager.firebase.isActive){\n                this.gameManager.firebase.app.auth().signOut();\n            }\n            this.gameManager.gameDom.getWindow().location.reload();\n        });\n    }\n\n    /**\n     * @param {string} uiName\n     * @param {number} [newWidth]\n     * @param {number} [newHeight]\n     * @returns {Object}\n     */\n    getUiConfig(uiName, newWidth, newHeight)\n    {\n        let {uiX, uiY} = this.getUiPosition(uiName, newWidth, newHeight);\n        return {enabled: this.gameManager.config.getWithoutLogs('client/ui/'+uiName+'/enabled'), uiX, uiY}\n    }\n\n    /**\n     * @param {string} uiName\n     * @param {number} [newWidth]\n     * @param {number} [newHeight]\n     * @returns {Object}\n     */\n    getUiPosition(uiName, newWidth, newHeight)\n    {\n        if('' === uiName){\n            uiName = 'default';\n        }\n        let uiConfig = this.gameManager.config.getWithoutLogs('client/ui/'+uiName, {});\n        let uiX = sc.get(uiConfig, 'x', 0);\n        let uiY = sc.get(uiConfig, 'y', 0);\n        if(this.gameManager.config.get('client/ui/screen/responsive')){\n            let rX = sc.get(uiConfig, 'responsiveX', false);\n            let rY = sc.get(uiConfig, 'responsiveY', false);\n            let gameContainer = this.gameManager.gameDom.getElement(GameConst.SELECTORS.GAME_CONTAINER);\n            if(!newWidth){\n                newWidth = gameContainer.offsetWidth;\n            }\n            if(!newHeight){\n                newHeight = gameContainer.offsetHeight;\n            }\n            uiX = false !== rX ? rX * newWidth / 100 : 0;\n            uiY = false !== rY ? rY * newHeight / 100 : 0;\n        }\n        return {uiX, uiY};\n    }\n\n    preloadPlayerDefaultSprite()\n    {\n        let fallbackImage = this.gameManager.config.get(\n            'client/players/animations/fallbackImage',\n            GameConst.IMAGE_PLAYER_BASE\n        );\n        this.load.spritesheet(GameConst.IMAGE_PLAYER, '/assets/custom/sprites/'+fallbackImage, this.playerSpriteSize);\n    }\n\n    /**\n     * @param {string} avatarKey\n     */\n    createPlayerAnimations(avatarKey)\n    {\n        let avatarFrames = this.gameManager.config.getWithoutLogs(\n            'client/players/animations/'+avatarKey+'Frames',\n            this.gameManager.config.get('client/players/animations/defaultFrames')\n        );\n        let availableAnimations = [{\n                k: avatarKey + '_' + GameConst.LEFT,\n                img: avatarKey,\n                start: avatarFrames.left.start || 3,\n                end: avatarFrames.left.end || 5,\n                repeat: -1,\n                hide: false\n            }, {\n                k: avatarKey + '_' + GameConst.RIGHT,\n                img: avatarKey,\n                start: avatarFrames.right.start || 6,\n                end: avatarFrames.right.end || 8,\n                repeat: -1,\n                hide: false\n            }, {\n                k: avatarKey + '_' + GameConst.UP,\n                img: avatarKey,\n                start: avatarFrames.up.start || 9,\n                end: avatarFrames.up.end || 11,\n                repeat: -1,\n                hide: false\n            }, {\n                k: avatarKey + '_' + GameConst.DOWN,\n                img: avatarKey,\n                start: avatarFrames.down.start || 0,\n                end: avatarFrames.down.end || 2,\n                repeat: -1,\n                hide: false\n            }\n        ];\n        for(let anim of availableAnimations){\n            this.createAnimationWith(anim);\n        }\n        this.eventsManager.emitSync('reldens.createPlayerAnimations', this, avatarKey);\n    }\n\n    createArrowAnimation()\n    {\n        if(!this.gameManager.config.get('client/ui/pointer/show')){\n            return;\n        }\n        let arrowAnim = {\n            k: GameConst.ARROW_DOWN,\n            img: GameConst.ARROW_DOWN, // this is the loaded image key\n            start: 0,\n            end: 2,\n            repeat: 3,\n            rate: 6\n        };\n        this.createAnimationWith(arrowAnim);\n    }\n\n    /**\n     * @param {Object} anim\n     * @returns {Object}\n     */\n    createAnimationWith(anim)\n    {\n        if(this.gameManager.createdAnimations[anim.k]){\n            return;\n        }\n        let animationConfig = {\n            key: anim.k,\n            frames: this.anims.generateFrameNumbers(anim.img, {start: anim.start, end: anim.end}),\n            frameRate: sc.get(anim, 'frameRate', this.configuredFrameRate),\n            repeat: anim.repeat,\n            hideOnComplete: sc.get(anim, 'hide', true),\n        };\n        //Logger.debug('Creating animation: '+anim.k, animationConfig);\n        this.gameManager.createdAnimations[anim.k] = this.anims.create(animationConfig);\n        return this.gameManager.createdAnimations[anim.k];\n    }\n\n    /**\n     * @param {Phaser.GameObjects.DOMElement} controllersBox\n     */\n    registerControllers(controllersBox)\n    {\n        // @TODO - BETA - Controllers will be part of the configuration in the database.\n        this.setupDirButtonInBox(GameConst.UP, controllersBox);\n        this.setupDirButtonInBox(GameConst.DOWN, controllersBox);\n        this.setupDirButtonInBox(GameConst.LEFT, controllersBox);\n        this.setupDirButtonInBox(GameConst.RIGHT, controllersBox);\n        this.setupDefaultActionKey(controllersBox);\n    }\n\n    /**\n     * @param {Phaser.GameObjects.DOMElement} controllersBox\n     */\n    setupDefaultActionKey(controllersBox)\n    {\n        // if the default action is not specified we won't show the button:\n        let defaultActionKey = this.gameManager.config.get('client/ui/controls/defaultActionKey');\n        if(!defaultActionKey){\n            return;\n        }\n        let actionBox = this.createActionBox(defaultActionKey);\n        this.gameManager.gameDom.appendToElement('.action-buttons', actionBox);\n        this.setupActionButtonInBox(defaultActionKey, controllersBox);\n    }\n\n    /**\n     * @param {string} actionKey\n     * @returns {string}\n     */\n    createActionBox(actionKey)\n    {\n        let skillTemplate = this.cache.html.get('actionBox');\n        return this.gameManager.gameEngine.parseTemplate(skillTemplate, {\n            key: actionKey,\n            actionName: actionKey\n        });\n    }\n\n    /**\n     * @param {string} dir\n     * @param {Phaser.GameObjects.DOMElement} box\n     */\n    setupDirButtonInBox(dir, box)\n    {\n        let btn = box.getChildByProperty('id', dir);\n        if(btn){\n            this.hold(btn, {dir: dir});\n        }\n    }\n\n    /**\n     * @param {string} action\n     * @param {Phaser.GameObjects.DOMElement} box\n     */\n    setupActionButtonInBox(action, box)\n    {\n        let actionButton = box.getChildByProperty('id', action);\n        if(!actionButton){\n            return;\n        }\n        if(this.gameManager.config.get('client/general/controls/action_button_hold')){\n            this.hold(actionButton, action);\n            return;\n        }\n        actionButton?.addEventListener('click', () => {\n            let currentScene = this.gameManager.activeRoomEvents.getActiveScene();\n            let dataSend = {\n                act: ActionsConst.ACTION,\n                target: currentScene.player.currentTarget,\n                type: action\n            };\n            this.gameManager.activeRoomEvents.send(dataSend);\n        });\n    }\n\n    /**\n     * @param {HTMLElement} button\n     * @param {Object|string} action\n     */\n    hold(button, action)\n    {\n        button.addEventListener('mousedown', (event) => {\n            this.startHold(event, button, action);\n        });\n        button.addEventListener('mouseup', (event) => {\n            this.endHold(event, button);\n        });\n        button.addEventListener('mouseout', (event) => {\n            this.endHold(event, button);\n        });\n        button.addEventListener('touchstart', (event) => {\n            this.startHold(event, button, action);\n        });\n        button.addEventListener('touchend', (event) => {\n            this.endHold(event, button);\n        });\n    }\n\n    /**\n     * @param {Event} event\n     * @param {HTMLElement} button\n     * @param {Object|string} action\n     */\n    startHold(event, button, action)\n    {\n        event.preventDefault();\n        if(this.gameManager.config.get('client/ui/controls/opacityEffect')){\n            button.classList.add('button-opacity-off');\n        }\n        let currentScene = this.gameManager.activeRoomEvents.getActiveScene();\n        let dataSend = action;\n        // @TODO - BETA - Controllers will be part of the configuration in the database.\n        if(!sc.hasOwn(action, 'dir')){\n            dataSend = {\n                act: ActionsConst.ACTION,\n                target: currentScene.player.currentTarget,\n                type: action.type\n            };\n        }\n        this.gameManager.activeRoomEvents.send(dataSend);\n    }\n\n    /**\n     * @param {Event} event\n     * @param {HTMLElement} button\n     */\n    endHold(event, button)\n    {\n        event.preventDefault();\n        if(this.gameManager.config.get('client/ui/controls/opacityEffect')){\n            button.classList.remove('button-opacity-off');\n        }\n        this.gameManager.activeRoomEvents.send({act: GameConst.STOP});\n    }\n\n    showLoadingProgressBar()\n    {\n        if(!this.gameManager.config.getWithoutLogs('client/ui/loading/show', true)){\n            return;\n        }\n        let Rectangle = Geom.Rectangle;\n        let main = Rectangle.Clone(this.cameras.main);\n        this.progressRect = new Rectangle(0, 0, main.width / 2, 50);\n        Rectangle.CenterOn(this.progressRect, main.centerX, main.centerY);\n        this.progressCompleteRect = Geom.Rectangle.Clone(this.progressRect);\n        this.progressBar = this.createGraphics();\n        let width = this.cameras.main.width;\n        let height = this.cameras.main.height;\n        let fontFamily = this.gameManager.config.get('client/ui/loading/font');\n        let loadingFontSize = this.gameManager.config.get('client/ui/loading/fontSize');\n        let loadingAssetsSize = this.gameManager.config.get('client/ui/loading/assetsSize');\n        this.loadingText = this.createText(\n            width / 2,\n            height / 2 - 50,\n            'Loading...',\n            {fontFamily, fontSize: loadingFontSize}\n        );\n        this.loadingText.setOrigin(0.5, 0.5);\n        this.loadingText.setFill(this.gameManager.config.get('client/ui/loading/loadingColor'));\n        this.percentText = this.createText(width / 2, height / 2 - 5, '0%', {fontFamily, fontSize: loadingAssetsSize});\n        this.percentText.setOrigin(0.5, 0.5);\n        this.percentText.setFill(this.gameManager.config.get('client/ui/loading/percentColor'));\n        this.assetText = this.createText(width / 2, height / 2 + 50, '', {fontFamily, fontSize: loadingAssetsSize});\n        this.assetText.setFill(this.gameManager.config.get('client/ui/loading/assetsColor'));\n        this.assetText.setOrigin(0.5, 0.5);\n    }\n\n    /**\n     * @param {number} width\n     * @param {number} height\n     * @param {string} text\n     * @param {Object} styles\n     * @returns {Phaser.GameObjects.Text}\n     */\n    createText(width, height, text, styles)\n    {\n        return this.add.text(width, height, text, styles);\n    }\n\n    /**\n     * @returns {Phaser.GameObjects.Graphics}\n     */\n    createGraphics()\n    {\n        return this.add.graphics();\n    }\n\n    onLoadComplete()\n    {\n        for(let child of this.children.list){\n            child.destroy();\n        }\n        this.loadingText.destroy();\n        this.assetText.destroy();\n        this.percentText.destroy();\n        this.scene.shutdown();\n    }\n\n    /**\n     * @param {Object} file\n     */\n    onFileProgress(file)\n    {\n        if(!this.gameManager.config.get('client/ui/loading/showAssets')){\n            return;\n        }\n        // @TODO - WIP - TRANSLATIONS.\n        this.assetText.setText('Loading '+file.key);\n    }\n\n    /**\n     * @param {number} progress\n     */\n    onLoadProgress(progress)\n    {\n        let progressText = parseInt(progress * 100) + '%';\n        this.percentText.setText(progressText);\n        let color = (0xffffff);\n        let fillColor = (0x222222);\n        this.progressRect.width = progress * this.progressCompleteRect.width;\n        this.progressBar\n            .clear()\n            .fillStyle(fillColor)\n            .fillRectShape(this.progressCompleteRect)\n            .fillStyle(color)\n            .fillRectShape(this.progressRect);\n    }\n\n    /**\n     * @param {string} uiName\n     * @param {boolean} [logError=true]\n     * @returns {Object|false}\n     */\n    getUiElement(uiName, logError = true)\n    {\n        if(sc.hasOwn(this.elementsUi, uiName)){\n            return this.elementsUi[uiName];\n        }\n        if(logError){\n            Logger.error('UI not found.', {uiName});\n        }\n        return false;\n    }\n\n}\n\nmodule.exports.ScenePreloader = ScenePreloader;\n"
  },
  {
    "path": "lib/game/client/settings-ui.js",
    "content": "/**\n *\n * Reldens - SettingsUi\n *\n * Client-side settings UI component for displaying the game settings dialog. Creates a DOM-based\n * dialog box with open/close buttons, handles click events to show/hide settings, and registers\n * the element with the UI scene. Emits events for UI open/close to allow plugin hooks.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('phaser').Scene} Scene\n */\nclass SettingsUi\n{\n\n    /**\n     * @param {Object} settingsConfig\n     * @param {Scene} uiScene\n     * @returns {boolean}\n     */\n    createSettings(settingsConfig, uiScene)\n    {\n        // @TODO - BETA - Replace by UserInterface.\n        let dialogBox = uiScene.add.dom(settingsConfig.uiX, settingsConfig.uiY).createFromCache('settings');\n        if(!dialogBox){\n            Logger.info('Settings dialog box could not be created.');\n            return false;\n        }\n        let settingsTemplate = uiScene.cache.html.get('settings-content');\n        if(!settingsTemplate){\n            Logger.info('Settings template not found.');\n            return false;\n        }\n        uiScene.gameManager.gameDom.appendToElement('.content', settingsTemplate);\n        let dialogContainer = uiScene.gameManager.gameDom.getElement('#settings-ui');\n        if(!dialogContainer){\n            Logger.info('Settings container not found.');\n            return false;\n        }\n        let closeButton = uiScene.gameManager.gameDom.getElement('#settings-close');\n        let openButton = dialogBox.getChildByProperty('id', 'settings-open');\n        openButton?.addEventListener('click', () => {\n            // @TODO - BETA - Replace styles classes.\n            dialogContainer.style.display = 'block';\n            if(openButton){\n                openButton.style.display = 'none';\n            }\n            uiScene.gameManager.events.emit(\n                'reldens.openUI',\n                {ui: this, openButton, dialogBox, dialogContainer, uiScene}\n            );\n        });\n        closeButton?.addEventListener('click', () => {\n            // @TODO - BETA - Replace styles classes.\n            dialogContainer.style.display = 'none';\n            if(openButton){\n                openButton.style.display = 'block';\n            }\n            uiScene.gameManager.events.emit(\n                'reldens.closeUI',\n                {ui: this, closeButton, openButton, dialogBox, dialogContainer, uiScene}\n            );\n        });\n        uiScene.elementsUi['settings'] = dialogBox;\n    }\n\n}\n\nmodule.exports.SettingsUi = SettingsUi;\n"
  },
  {
    "path": "lib/game/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    game: {\n        passwordConfirmationNotMatch: 'Password and confirmation does not match.',\n        pleaseReadTermsAndConditions: 'Please read and accept the terms and conditions and continue.',\n        sessionEnded: 'Your session ended, please login again.',\n        errors: {\n            missingClasses: 'None configured classes available.',\n            missingPlayerData: 'Missing player data.',\n            joiningRoom: 'There was an error while joining the room \"%joinRoomName\", please try again later.',\n            joiningFeatureRoom: 'There was an error while joining the feature room \"%joinRoomName\".',\n            reconnectClient: 'Reconnect Game Client error.',\n            sessionEnded: 'Your session ended, please login again.',\n            connectionLost: 'Connection lost, please login again.',\n            serverDown: 'Server is offline.'\n        },\n        pleaseSelectScene: 'Please select a Scene'\n    }\n}\n"
  },
  {
    "path": "lib/game/client/tileset-animation.js",
    "content": "/**\n *\n * Reldens - TileSetAnimation\n *\n * Handles animated tiles in Phaser tilemaps by cycling through tile frames based on tileset\n * animation data. Registers tile animations from tileset metadata and uses timers to swap\n * tiles at specified durations, creating animated map elements.\n *\n */\n\nclass TileSetAnimation\n{\n\n    /**\n     * @param {Object} [props]\n     * @param {Object} [props.timer]\n     */\n    constructor(props)\n    {\n        this.timer = props?.timer;\n    }\n\n    /**\n     * @param {Phaser.Tilemaps.TilemapLayer} layer\n     * @param {Object} tileset\n     */\n    register(layer, tileset)\n    {\n        this.animations = [];\n        this.registered = {};\n        this.layer = layer;\n        this.tileset = tileset;\n        for(let i of Object.keys(tileset.tileData)){\n            let tileData = tileset.tileData[i];\n            if(!tileData.animation){\n                continue;\n            }\n            tileData.id = i;\n            let indexCounter = 0;\n            for(let anInd of tileData.animation){\n                if(Number(i) === Number(anInd?.tileid || 0)){\n                    tileData.initIndex = indexCounter;\n                    break;\n                }\n                indexCounter++;\n            }\n            this.animations.push(tileData);\n        }\n    }\n\n    start()\n    {\n        for(let anim of this.animations){\n            let animation = anim.animation;\n            let total = animation.length;\n            let startIndex = Number(anim.initIndex || 0);\n            let next = Number((startIndex+1) % total);\n            this.repeat(anim, startIndex, next);\n        }\n    }\n\n    /**\n     * @param {Object} anim\n     * @param {number} index\n     * @param {number} next\n     */\n    repeat(anim, index, next)\n    {\n        let id = anim.id;\n        if(this.registered[id]){\n            this.registered[id] = null;\n        }\n        let animation = anim.animation;\n        let total = animation.length;\n        let firstId = Number(this.tileset.firstgid);\n        let replaceTile = Number(anim.animation[index].tileid)+firstId;\n        let replacementTile = Number(anim.animation[next].tileid)+firstId;\n        this.layer.replaceByIndex(replaceTile, replacementTile);\n        let duration = animation[next].duration;\n        let indexTotal = Number((next+1) % total);\n        this.registered[id] = this.setTimeout(this.repeat.bind(this, anim, Number(next), indexTotal), duration);\n    }\n\n    destroy()\n    {\n        for(let i of Object.keys(this.registered)){\n            if(this.registered[i]){\n                this.clearTimeout(this.registered[i]);\n            }\n        }\n    }\n\n    /**\n     * @param {Function} callback\n     * @param {number} duration\n     * @returns {*}\n     */\n    setTimeout(callback, duration)\n    {\n        if(this.timer){\n            return this.timer.setTimeout(callback, duration);\n        }\n        // fallback for old timers:\n        // @ts-ignore\n        return setTimeout(callback, duration);\n    }\n\n    /**\n     * @param {*} timer\n     * @returns {*}\n     */\n    clearTimeout(timer)\n    {\n        if(this.timer){\n            return this.timer.clearTimeout(timer);\n        }\n        // fallback for old timers:\n        // @ts-ignore\n        return clearTimeout(timer);\n    }\n\n}\n\nmodule.exports.TileSetAnimation = TileSetAnimation;\n"
  },
  {
    "path": "lib/game/client/ui-factory.js",
    "content": "/**\n *\n * Reldens - UiFactory\n *\n * Factory class for creating standardized UI dialog boxes in Phaser scenes. Provides a unified\n * interface for creating DOM-based dialogs with open/close buttons, event callbacks, depth\n * management, and event emission for plugin hooks.\n *\n */\n\nconst { GameConst } = require('../constants');\n\n/**\n * @typedef {import('./scene-preloader').ScenePreloader} ScenePreloader\n */\nclass UiFactory\n{\n\n    /**\n     * @param {ScenePreloader} uiScene\n     */\n    constructor(uiScene)\n    {\n        this.uiScene = uiScene;\n        this.gameManager = this.uiScene.gameManager;\n    }\n\n    /**\n     * @param {string} uiCodeName\n     * @param {number} depth\n     * @param {boolean} defaultOpen\n     * @param {boolean} defaultClose\n     * @param {function(): void} [openCallback]\n     * @param {function(): void} [closeCallback]\n     */\n    create(uiCodeName, depth, defaultOpen, defaultClose, openCallback, closeCallback)\n    {\n        // @TODO - BETA - Replace by UserInterface.\n        let {uiX, uiY} = this.uiScene.getUiConfig(uiCodeName);\n        let dialogBox = this.uiScene.add.dom(uiX, uiY).createFromCache(uiCodeName);\n        let openButton = dialogBox.getChildByProperty('id', uiCodeName+GameConst.UI_OPEN);\n        let closeButton = dialogBox.getChildByProperty('id', uiCodeName+GameConst.UI_CLOSE);\n        openButton?.addEventListener('click', () => {\n            // @TODO - BETA - Replace styles classes.\n            let dialogContainer = dialogBox.getChildByProperty('id', uiCodeName+'-ui');\n            if(defaultOpen){\n                if(dialogContainer){\n                    dialogContainer.style.display = 'block';\n                }\n                openButton.style.display = 'none';\n                dialogBox.setDepth(depth);\n            }\n            if(openCallback && 'function' === typeof (openCallback)){\n                openCallback();\n            }\n            this.gameManager.events.emit(\n                'reldens.openUI',\n                {ui: this, openButton, dialogBox, dialogContainer, uiScene: this.uiScene}\n            );\n        });\n        closeButton?.addEventListener('click', () => {\n            let dialogContainer = dialogBox.getChildByProperty('id', uiCodeName+'-ui');\n            if(defaultClose){\n                if(dialogContainer){\n                    dialogContainer.style.display = 'none';\n                }\n                dialogBox.setDepth(1);\n                if(openButton){\n                    openButton.style.display = 'block';\n                }\n            }\n            if(closeCallback && 'function' === typeof (closeCallback)){\n                closeCallback();\n            }\n            this.gameManager.events.emit(\n                'reldens.closeUI',\n                {ui: this, closeButton, openButton, dialogBox, dialogContainer, uiScene: this.uiScene}\n            );\n        });\n        this.uiScene.elementsUi[uiCodeName] = dialogBox;\n    }\n\n}\n\nmodule.exports.UiFactory = UiFactory;\n"
  },
  {
    "path": "lib/game/client/user-interface.js",
    "content": "/**\n *\n * Reldens - UserInterface\n *\n * Generic UI component class for creating dialog boxes and UI elements in the game. Handles preloading\n * HTML templates, creating DOM-based UI elements in Phaser scenes, managing open/close behavior,\n * and event-driven lifecycle management.\n *\n */\n\nconst { GameConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./game-manager').GameManager} GameManager\n */\nclass UserInterface\n{\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {Object} animProps\n     * @param {string} [template]\n     * @param {string} [uiPositionKey]\n     */\n    constructor(gameManager, animProps, template = '/assets/html/dialog-box.html', uiPositionKey)\n    {\n        this.events = gameManager.events;\n        this.gameDom = gameManager.gameDom;\n        this.initialTitle = '';\n        this.initialContent = '';\n        this.id = animProps.id;\n        this.animProps = animProps;\n        this.template = template;\n        this.uiPositionKey = uiPositionKey || 'default';\n        this.openButton = null;\n        this.closeButton = null;\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        this.events.on('reldens.beforePreload', (preloadScene) => {\n            this.preloadUiElement(preloadScene);\n        });\n        this.events.on('reldens.createPreload', (preloadScene, uiScene) => {\n            this.createUiElement(uiScene);\n        });\n    }\n\n    /**\n     * @param {Object} preloadScene\n     */\n    preloadUiElement(preloadScene)\n    {\n        if(!this.template){\n            return;\n        }\n        preloadScene.load.html(this.id, this.template);\n    }\n\n    /**\n     * @param {Object} uiScene\n     * @param {string} [templateKey='']\n     * @returns {this|false}\n     */\n    createUiElement(uiScene, templateKey = '')\n    {\n        if('' === templateKey){\n            templateKey = this.id;\n        }\n        let objectElementId = 'box-'+this.id;\n        if(sc.get(uiScene.elementsUi, this.id)){\n            return this;\n        }\n        let dialogBox = this.createDialogBox(uiScene, templateKey);\n        this.createBoxContent(uiScene, templateKey, dialogBox);\n        let dialogContainer = this.gameDom.getElement('.ui-box.ui-dialog-box', dialogBox.node);\n        if(!dialogContainer){\n            Logger.critical('Missing dialog container for template key: \"'+templateKey+'\".', {\n                dialogBox,\n                dialogContainer,\n                objectElementId\n            });\n            return false;\n        }\n        dialogContainer.id = objectElementId;\n        dialogContainer.classList.add('type-'+(this.animProps?.type || 'dialog-box'));\n        this.activateOpenButton(dialogBox, dialogContainer, uiScene);\n        this.activateCloseButton(dialogBox, dialogContainer, uiScene);\n        uiScene.userInterfaces[this.id] = this;\n        uiScene.elementsUi[this.id] = dialogBox;\n        // @TODO - BETA - refactor to return the created dialog box.\n        return this;\n    }\n\n    /**\n     * @param {Object} uiScene\n     * @param {string} templateKey\n     * @returns {Phaser.GameObjects.DOMElement}\n     */\n    createDialogBox(uiScene, templateKey)\n    {\n        let {newWidth, newHeight} = uiScene.gameManager.gameEngine.getCurrentScreenSize(uiScene.gameManager);\n        let {uiX, uiY} = uiScene.getUiPosition(this.uiPositionKey, newWidth, newHeight);\n        return uiScene.add.dom(uiX, uiY).createFromCache(templateKey);\n    }\n\n    /**\n     * @param {Object} uiScene\n     * @param {string} templateKey\n     * @param {Phaser.GameObjects.DOMElement} dialogBox\n     */\n    createBoxContent(uiScene, templateKey, dialogBox)\n    {\n        let messageTemplate = uiScene.cache.html.get(templateKey);\n        dialogBox.innerHTML = uiScene.gameManager.gameEngine.parseTemplate(messageTemplate, {\n            title: this.initialTitle,\n            content: this.initialContent\n        });\n    }\n\n    /**\n     * @param {Phaser.GameObjects.DOMElement} dialogBox\n     * @param {HTMLElement} dialogContainer\n     * @param {Object} uiScene\n     * @returns {HTMLElement|false}\n     */\n    activateOpenButton(dialogBox, dialogContainer, uiScene)\n    {\n        // @TODO - BETA - Extract into a new service.\n        this.openButton = this.gameDom.getElement('.'+GameConst.UI_BOX + GameConst.UI_OPEN, dialogBox.node);\n        if(!this.openButton){\n            return false;\n        }\n        this.openButton.id = GameConst.UI_BOX + GameConst.UI_OPEN + '-' + this.id\n        this.openButton.addEventListener('click', () => {\n            // @TODO - BETA - Replace styles classes.\n            if(sc.get(this.animProps, 'defaultOpen', true)){\n                dialogContainer.style.display = 'block';\n                this.openButton.style.display = 'none';\n                if(false !== sc.get(this.animProps, 'depth', false)){\n                    dialogBox.setDepth(this.animProps.depth);\n                }\n            }\n            if(sc.isFunction(this.animProps['openCallBack'])){\n                this.animProps['openCallBack']();\n            }\n            this.events.emit(\n                'reldens.openUI',\n                {ui: this, openButton: this.openButton, dialogBox, dialogContainer, uiScene}\n            );\n        });\n        return this.openButton;\n    }\n\n    /**\n     * @param {Phaser.GameObjects.DOMElement} dialogBox\n     * @param {HTMLElement} dialogContainer\n     * @param {Object} uiScene\n     */\n    activateCloseButton(dialogBox, dialogContainer, uiScene)\n    {\n        // @TODO - BETA - Extract into a new service.\n        this.closeButton = this.gameDom.getElement('.'+GameConst.UI_BOX + GameConst.UI_CLOSE, dialogBox.node);\n        if(!this.closeButton){\n            return false;\n        }\n        this.closeButton.id = GameConst.UI_BOX + GameConst.UI_CLOSE + '-' + this.id;\n        this.closeButton.addEventListener('click', () => {\n            if(!sc.hasOwn(this.animProps, 'sendCloseMessage') || false === this.animProps['sendCloseMessage']){\n                uiScene.gameManager.activeRoomEvents.send({act: GameConst.CLOSE_UI_ACTION, id: this.id});\n            }\n            // @TODO - BETA - Replace styles classes.\n            if(sc.get(this.animProps, 'defaultClose', true)){\n                dialogContainer.style.display = 'none';\n                if(this.openButton){\n                    this.openButton.style.display = 'block';\n                }\n                if(false !== sc.get(this.animProps, 'depth', false)){\n                    dialogBox.setDepth(1);\n                }\n            }\n            if(sc.isFunction(this.animProps['closeCallback'])){\n                this.animProps['closeCallback']();\n            }\n            this.events.emit('reldens.closeUI', {\n                ui: this,\n                closeButton: this.closeButton,\n                openButton: this.openButton,\n                dialogBox,\n                dialogContainer,\n                uiScene\n            });\n        });\n    }\n\n}\n\nmodule.exports.UserInterface = UserInterface;\n"
  },
  {
    "path": "lib/game/constants.js",
    "content": "/**\n *\n * Reldens - GameConst\n *\n * Core game constants object containing all shared constant values used across the Reldens platform.\n * Includes action types, room names, player states, UI selectors, CSS classes, route paths, message types,\n * file structure paths, DOM selectors for forms and UI elements, player status codes, graphics settings,\n * and animation types. Provides centralized constant definitions to avoid hardcoded strings throughout\n * the codebase.\n *\n */\n\nmodule.exports.GameConst = {\n    // @TODO - BETA - Move all the actions like \"START_GAME\" into ACTIONS property.\n    START_GAME: 's',\n    ACTION_KEY: 'act',\n    CREATE_PLAYER: 'cp',\n    CREATE_PLAYER_RESULT: 'cps',\n    CHANGING_SCENE: 'cgs',\n    CHANGED_SCENE: 'cs',\n    RECONNECT: 'r',\n    // @TODO - BETA - Move into \"rooms\" plugin.\n    ROOM_GAME: 'room_game',\n    ROOM_NAME_MAP: 'Map',\n    SCENE_PRELOADER: 'ScenePreloader',\n    PLAYER_STATS: 'ps',\n    ICON_STATS: 'player-stats',\n    CLIENT_JOINED: 'cj',\n    UI: 'ui',\n    CLOSE_UI_ACTION: 'closeUi',\n    TYPE_PLAYER: 'pj',\n    GAME_OVER: 'go',\n    REVIVED: 'rv',\n    BUTTON_OPTION: 'btn-opt',\n    UI_BOX: 'box',\n    UI_CLOSE: '-close',\n    UI_OPEN: '-open',\n    // @TODO - BETA - Move into DIRECTIONS property.\n    UP: 'up',\n    LEFT: 'left',\n    DOWN: 'down',\n    RIGHT: 'right',\n    STOP: 'stop',\n    POINTER: 'mp',\n    ARROW_DOWN: 'ard',\n    IMAGE_PLAYER: 'player',\n    IMAGE_PLAYER_BASE: 'player-base.png',\n    ACTIONS: {\n        LOGIN_UPDATE_ERROR: 'luer'\n    },\n    STATUS: {\n        ACTIVE: 1,\n        DISABLED: 2,\n        DEATH: 3,\n        AVOID_INTERPOLATION: 4\n    },\n    STRUCTURE: {\n        DEFAULT: 'default',\n        ASSETS: 'assets',\n        CSS: 'css',\n        DIST: 'dist',\n        THEME: 'theme',\n        LIB: 'lib',\n        SERVER: 'server',\n        CLIENT: 'client',\n        PLUGINS: 'plugins',\n        INDEX: 'index.html',\n        SCSS_FILE: 'styles.scss',\n        CSS_FILE: 'styles.css',\n        ADMIN: 'admin',\n        TEMPLATES: 'templates',\n        ADMIN_JS_FILE: 'reldens-admin-client.js',\n        ADMIN_CSS_FILE: 'reldens-admin-client.css',\n        INSTALLER_FOLDER: 'install',\n        INSTALL_LOCK: 'install.lock'\n    },\n    ROUTE_PATHS: {\n        DISCONNECT_USER: '/reldens-disconnect-user',\n        TERMS_AND_CONDITIONS: '/terms-and-conditions',\n        MAILER: '/reldens-mailer-enabled',\n        FIREBASE: '/reldens-firebase'\n    },\n    SELECTORS: {\n        BODY: 'body',\n        CANVAS: 'CANVAS',\n        INPUT: 'input',\n        FORMS_CONTAINER: '.forms-container',\n        REGISTER_FORM: '#register-form',\n        GUEST_FORM: '#guest-form',\n        LOGIN_FORM: '#login-form',\n        FORGOT_PASSWORD_FORM: '#forgot-form',\n        PLAYER_CREATE_FORM: '.player-create-form',\n        PLAYER_SELECTION: '#player-selection',\n        PLAYER_SELECTION_FORM: '#player-selector-form',\n        PLAYER_SELECT_ELEMENT: '#player-select-element',\n        PLAYER_SELECTION_ADDITIONAL_INFO: '.player-selection-additional-info',\n        PLAYER_STATS_CONTAINER: '#player-stats-container',\n        FULL_SCREEN_BUTTON: '#full-screen-btn',\n        RESPONSE_ERROR: '.response-error',\n        LOADING_CONTAINER: '.loading-container',\n        REGISTRATION: {\n            PASSWORD: '#reg-password',\n            RE_PASSWORD: '#reg-re-password',\n            EMAIL: '#reg-email',\n            USERNAME: '#reg-username'\n        },\n        GUEST: {\n            USERNAME: '#guest-username'\n        },\n        LOGIN: {\n            USERNAME: '#username',\n            PASSWORD: '#password',\n        },\n        FORGOT_PASSWORD: {\n            EMAIL: '#forgot-email',\n            CONTAINER: '.forgot-password-container',\n        },\n        TERMS: {\n            BOX: '#terms-and-conditions',\n            CONTAINER: '.terms-and-conditions-container',\n            LINK_CONTAINER: '.terms-and-conditions-link-container',\n            LINK: '.terms-and-conditions-link',\n            ACCEPT: '#accept-terms-and-conditions',\n            ACCEPT_LABEL: '.accept-terms-and-conditions-label',\n            HEADING: '.terms-heading',\n            BODY: '.terms-body',\n            CLOSE: '.terms-and-conditions-accept-close'\n        },\n        GAME_CONTAINER: '.game-container',\n        BUTTONS_CLOSE: '.box-close'\n    },\n    CLASSES: {\n        HIDDEN: 'hidden',\n        GAME_STARTED: 'game-started',\n        GAME_ERROR: 'game-error',\n        GAME_ENGINE_STARTED: 'game-engine-started',\n        FULL_SCREEN_ON: 'full-screen-on'\n    },\n    MESSAGE: {\n        DATA_VALUES: {\n            NAMESPACE: 'game'\n        }\n    },\n    LABELS: {\n        YES: 'Yes',\n        NO: 'No'\n    },\n    ANIMATIONS_TYPE: {\n        SPRITESHEET: 'spritesheet'\n    },\n    FILES: {\n        EXTENSIONS: {\n            PNG: '.png'\n        }\n    },\n    GRAPHICS: {\n        FRAME_WIDTH: 32,\n        FRAME_HEIGHT: 32\n    },\n    SHOW_PLAYER_TIME: {\n        NONE: -1,\n        ONLY_OWN_PLAYER: 0,\n        ALL_PLAYERS: 2\n    }\n};\n"
  },
  {
    "path": "lib/game/mime-types.js",
    "content": "/**\n *\n * Reldens - MimeTypes\n *\n * Constants object-mapping file type categories to their allowed MIME types. Used for validating\n * file uploads by checking the file's MIME type against these allowed lists. Categories include\n * audio files (AAC, MP3, OGG, WAV, etc.), image files (PNG, JPEG, GIF, SVG, etc.), and text files\n * (JSON, plain text). Works in conjunction with AllowedFileTypes and TypeDeterminer for file validation.\n *\n */\n\nmodule.exports.MimeTypes = {\n    audio: [\n        'audio/aac',\n        'audio/midi',\n        'audio/x-midi',\n        'audio/mpeg',\n        'audio/ogg',\n        'application/ogg',\n        'audio/opus',\n        'audio/wav',\n        'audio/webm',\n        'audio/3gpp2'\n    ],\n    image: [\n        'image/bmp',\n        'image/gif',\n        'image/jpeg',\n        'image/png',\n        'image/svg+xml',\n        'image/vnd.microsoft.icon',\n        'image/tiff',\n        'image/webp'\n    ],\n    text: [\n        'application/json',\n        'application/ld+json',\n        'text/plain',\n    ]\n};\n"
  },
  {
    "path": "lib/game/properties-handler.js",
    "content": "/**\n *\n * Reldens - PropertiesHandler\n *\n * Base utility class for validating and managing required properties on objects. Provides methods to\n * validate that all required properties are set (validate), and to copy properties from this instance\n * to another object (assignProperties). Designed to be extended by classes that need property validation.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\nclass PropertiesHandler\n{\n\n    constructor()\n    {\n        /** @type {Array<string>} */\n        this.requiredProperties = [];\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    validate()\n    {\n        for(let i of this.requiredProperties){\n            if(!this[i]){\n                Logger.error('Missing \"'+i+'\" in \"'+this.constructor.name+'\".');\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {object} objectInstance\n     * @returns {object}\n     */\n    assignProperties(objectInstance)\n    {\n        for(let i of this.requiredProperties){\n            objectInstance[i] = this[i];\n        }\n        return objectInstance;\n    }\n\n}\n\nmodule.exports.PropertiesHandler = PropertiesHandler;\n"
  },
  {
    "path": "lib/game/reldens-ascii.js",
    "content": "/**\n *\n * Reldens - In ASCII\n *\n */\n\nconst PackageData = require('./../../package.json');\n\nmodule.exports = '\\n\\n'\n    +'              _     _                \\n'\n    +'     _ __ ___| | __| | ___ _ __  ___ \\n'\n    +'    | \\'__/ _ \\\\ |/ _` |/ _ \\\\ \\'_ \\\\/ __|\\n'\n    +'    | | |  __/ | (_| |  __/ | | \\\\__ \\\\\\n'\n    +'    |_|  \\\\___|_|\\\\__,_|\\\\___|_| |_|___/\\n'\n    +'\\n'\n    +'    '+PackageData.version\n    +'\\n\\n';\n"
  },
  {
    "path": "lib/game/server/client-wrapper.js",
    "content": "/**\n *\n * Reldens - ClientWrapper\n *\n * Server-side wrapper for Colyseus client send and room broadcast methods. Simplifies message\n * sending by wrapping the client.send() and room.broadcast() calls with a consistent interface.\n * Used to abstract communication between server and client during game events and state updates.\n *\n */\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('@colyseus/core').Room} Room\n *\n * @typedef {Object} ClientWrapperProps\n * @property {Client} client\n * @property {Room} room\n */\nclass ClientWrapper\n{\n\n    /**\n     * @param {ClientWrapperProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Client} */\n        this.client = props.client;\n        /** @type {Room} */\n        this.room = props.room;\n    }\n\n    /**\n     * @param {Object<string, any>} data\n     */\n    send(data)\n    {\n        this.client.send('*', data);\n    }\n\n    /**\n     * @param {Object<string, any>} data\n     */\n    broadcast(data)\n    {\n        // @TODO - BETA - Replace '*' by message \"act\" value. Implement client wrapper as driver.\n        this.room.broadcast('*', data);\n    }\n\n}\n\nmodule.exports.ClientWrapper = ClientWrapper;"
  },
  {
    "path": "lib/game/server/data-server-config.js",
    "content": "/**\n *\n * Reldens - DataServerConfig\n *\n * Static utility class for preparing database configuration from environment variables and provided\n * properties. Handles connection string creation, pool configuration, storage driver selection, and\n * validation of required database credentials. Supports MySQL, MySQL2, and MongoDB client types with\n * configurable connection limits and pool sizes.\n *\n */\n\nconst { ErrorManager, Logger } = require('@reldens/utils');\n\nclass DataServerConfig\n{\n\n    /**\n     * @param {Object} props\n     * @param {string} [props.host]\n     * @param {number} [props.port]\n     * @param {string} [props.database]\n     * @param {string} [props.user]\n     * @param {string} [props.password]\n     * @param {string} [props.client]\n     * @param {number} [props.connectionLimit]\n     * @param {number} [props.poolMin]\n     * @param {number} [props.poolMax]\n     * @param {string} [props.storageDriver]\n     * @returns {Object}\n     */\n    static prepareDbConfig(props)\n    {\n        // @NOTE: see the .env.dist file in the module root to modify the variables.\n        let {host, port, database, user, password, client, connectionLimit, poolMin, poolMax, storageDriver} = props;\n        client = client || process.env.RELDENS_DB_CLIENT || 'mysql2';\n        storageDriver = storageDriver || process.env.RELDENS_STORAGE_DRIVER || 'objection-js';\n        let config = {\n            host: host || process.env.RELDENS_DB_HOST || 'localhost',\n            port: Number((port || process.env.RELDENS_DB_PORT || 3306)),\n            database: database || process.env.RELDENS_DB_NAME || false,\n            user: user || process.env.RELDENS_DB_USER || false,\n            password: password || process.env.RELDENS_DB_PASSWORD || ''\n        };\n        if(false === config.user){\n            Logger.critical('Missing storage user configuration.', props);\n            ErrorManager.error('Missing storage user configuration.');\n        }\n        if(false === config.database){\n            Logger.critical('Missing storage database name configuration.', props);\n            ErrorManager.error('Missing storage database name configuration.');\n        }\n        let limitEnv = Number(process.env.RELDENS_DB_LIMIT || 0);\n        if(connectionLimit || 0 < limitEnv){\n            config.connectionLimit = Number((connectionLimit || limitEnv));\n        }\n        let poolConfig = {\n            min: Number((poolMin || process.env.RELDENS_DB_POOL_MIN || 2)),\n            max: Number((poolMax || process.env.RELDENS_DB_POOL_MAX || 10))\n        };\n        let connectString = this.createConnectionString(client, config);\n        return {client, config, poolConfig, connectString, storageDriver};\n    }\n\n    /**\n     * @param {string} client\n     * @param {Object} config\n     * @returns {string}\n     */\n    static createConnectionString(client, config)\n    {\n        let connectString = process.env.RELDENS_DB_URL || '';\n        if('' !== connectString){\n            return connectString;\n        }\n        let connectStringOptions = process.env.RELDENS_DB_URL_OPTIONS || '';\n        let provider = client;\n        if(-1 !== provider.indexOf('mysql')){\n            provider = 'mysql';\n        }\n        return provider+'://'\n            +config.user\n            +(config.password ? ':'+config.password : '')\n            +'@'+config.host\n            +':'+config.port\n            +'/'+config.database\n            +(connectStringOptions ? '?'+connectStringOptions : '');\n    }\n}\n\nmodule.exports.DataServerConfig = DataServerConfig;\n"
  },
  {
    "path": "lib/game/server/data-server-initializer.js",
    "content": "/**\n *\n * Reldens - DataServerInitializer\n *\n * Static utility class for initializing the data server and database connections.\n * Handles loading entities, configuring storage drivers (ObjectionJS/MikroORM/Prisma),\n * and rebinding ObjectionJS models to new Knex instances. Provides helpers for\n * Prisma client initialization from the project's generated client.\n *\n */\n\nconst { DataServerConfig } = require('./data-server-config');\nconst { EntitiesLoader } = require('./entities-loader');\nconst { DriversMap } = require('./storage/drivers-map');\nconst { Logger, sc } = require('@reldens/utils');\nconst { FileHandler } = require('@reldens/server-utils');\n\nclass DataServerInitializer\n{\n\n    /**\n     * @param {Object} props\n     * @param {Object<string, any>} props.config\n     * @param {BaseDataServer} [props.dataServerDriver]\n     * @param {ServerManager} props.serverManager\n     * @param {PrismaClient|false} [props.prismaClient]\n     * @returns {{dataServerConfig: Object<string, any>, dataServer: BaseDataServer}}\n     */\n    static initializeEntitiesAndDriver(props)\n    {\n        let {config, dataServerDriver, serverManager, prismaClient} = props;\n        let dataServerConfig = DataServerConfig.prepareDbConfig(config);\n        let loadEntitiesOptions = {\n            serverManager: serverManager,\n            projectRoot: serverManager.themeManager.projectRoot,\n            reldensModuleLibPath: serverManager.themeManager.reldensModuleLibPath,\n            bucketFullPath: serverManager.themeManager.projectThemePath,\n            distPath: serverManager.themeManager.distPath,\n            isHotPlugEnabled: serverManager.isHotPlugEnabled,\n            withConfig: true,\n            withTranslations: true,\n            storageDriver: dataServerConfig.storageDriver\n        };\n        let loadedEntities = EntitiesLoader.loadEntities(loadEntitiesOptions);\n        dataServerConfig.loadedEntities = loadedEntities.entities;\n        dataServerConfig.translations = sc.get(loadedEntities, 'translations', {});\n        dataServerConfig.rawEntities = Object.assign(\n            (loadedEntities?.entitiesRaw || {}),\n            sc.get(config, 'rawEntities', {})\n        );\n        Logger.info('Storage Driver:', dataServerConfig.storageDriver);\n        if(prismaClient && 'prisma' === dataServerConfig.storageDriver){\n            dataServerConfig.prismaClient = prismaClient;\n        }\n        let dataServer = dataServerDriver || new DriversMap[dataServerConfig.storageDriver](dataServerConfig);\n        return {dataServerConfig, dataServer};\n    }\n\n    /**\n     * @param {BaseDataServer} dataServer\n     * @param {Object<string, any>} dataServerConfig\n     */\n    static rebindObjectionJsModelsToNewKnex(dataServer, dataServerConfig)\n    {\n        if('objection-js' !== dataServerConfig.storageDriver){\n            return;\n        }\n        if(!dataServer.knex){\n            Logger.error('Cannot rebind models: DataServer knex instance not available.');\n            return;\n        }\n        let rawEntities = dataServerConfig.rawEntities;\n        let rawEntityKeys = Object.keys(rawEntities);\n        if(!rawEntities || 0 === rawEntityKeys.length){\n            Logger.warning('No raw entities to rebind.');\n            return;\n        }\n        let firstEntityKey = [...rawEntityKeys].shift();\n        let firstEntity = rawEntities[firstEntityKey];\n        if(!firstEntity || 'function' !== typeof firstEntity.knex){\n            Logger.warning('Cannot check if rebind is needed: invalid first entity.');\n        }\n        if(firstEntity && 'function' === typeof firstEntity.knex){\n            try {\n                let entityKnex = firstEntity.knex();\n                if(entityKnex === dataServer.knex){\n                    Logger.debug('Entities already bound to correct knex instance, skipping rebind.');\n                    return;\n                }\n                Logger.info('Detected different knex instances, rebinding required.');\n            } catch(error) {\n                Logger.info('Entities not bound to knex, rebinding required.');\n            }\n        }\n        //Logger.debug('Rebinding ObjectionJS models to new knex instance.');\n        let reboundCount = 0;\n        for(let entityKey of rawEntityKeys){\n            let rawEntity = rawEntities[entityKey];\n            if(!rawEntity || 'function' !== typeof rawEntity.knex){\n                Logger.warning('Invalid raw entity for rebinding: '+entityKey);\n                continue;\n            }\n            rawEntity.knex(dataServer.knex);\n            reboundCount++;\n        }\n        Logger.info('Rebound '+reboundCount+' ObjectionJS models to new knex instance.');\n    }\n\n    /**\n     * @param {BaseDataServer|null} installerDataServer\n     * @param {string} projectRoot\n     * @returns {PrismaClient|false}\n     */\n    static loadProjectPrismaClient(installerDataServer, projectRoot)\n    {\n        let storageDriver = sc.get(process.env, 'RELDENS_STORAGE_DRIVER', 'objection-js');\n        if('prisma' !== storageDriver){\n            return false;\n        }\n        if(installerDataServer?.prisma){\n            return installerDataServer.prisma;\n        }\n        let clientPath = FileHandler.joinPaths(projectRoot, 'prisma', 'client');\n        if(!FileHandler.exists(clientPath)){\n            Logger.debug('Prisma client path not found: '+clientPath);\n            return false;\n        }\n        try {\n            let { PrismaClient } = require(clientPath);\n            return new PrismaClient();\n        } catch(error) {\n            Logger.error('Failed to load project Prisma client: '+error.message);\n            return false;\n        }\n    }\n\n}\n\nmodule.exports.DataServerInitializer = DataServerInitializer;\n"
  },
  {
    "path": "lib/game/server/entities-loader.js",
    "content": "/**\n *\n * Reldens - EntitiesLoader\n *\n * Static utility class for loading and configuring database entities from generated models. Handles\n * entity discovery, model overrides, configuration merging, translations loading, and plugin-based\n * entity customization. Supports multiple storage drivers (ObjectionJS, MikroORM, Prisma) and allows\n * custom entity configurations through plugins and implementation overrides.\n *\n */\n\nconst { EntitiesConfigOverrides } = require('../../admin/server/entities-config-override');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass EntitiesLoader\n{\n\n    /**\n     * @param {Object} props\n     * @param {string} props.reldensModuleLibPath\n     * @param {string} props.projectRoot\n     * @param {boolean} [props.withConfig]\n     * @param {boolean} [props.withTranslations]\n     * @param {string} [props.storageDriver]\n     * @param {Object} [props.customClasses]\n     * @returns {Object|false} Object with entities, entitiesRaw, and translations, or false if loading fails\n     */\n    static loadEntities(props)\n    {\n        if(!sc.isTrue(props, 'reldensModuleLibPath')){\n            Logger.error('Plugins path undefined.');\n            return false;\n        }\n        if(!sc.isTrue(props, 'projectRoot')){\n            Logger.error('Project root undefined.');\n            return false;\n        }\n        let withConfig = sc.get(props, 'withConfig', false);\n        let withTranslations = sc.get(props, 'withTranslations', false);\n        let storageDriver = sc.get(props, 'storageDriver', sc.get(process?.env, 'RELDENS_STORAGE_DRIVER', 'prisma'));\n        if(!sc.hasOwn(props, 'storageDriver')){\n            Logger.info('Storage driver not specified, using '+storageDriver+' as default.');\n        }\n        let generatedModelsPath = this.findGeneratedModelsPath(props.projectRoot, storageDriver);\n        if(!generatedModelsPath){\n            Logger.error('Generated entities not found for driver: '+storageDriver+' - In path: '+generatedModelsPath);\n            return false;\n        }\n        return this.loadFromGeneratedEntities(\n            generatedModelsPath,\n            props.reldensModuleLibPath,\n            withConfig,\n            withTranslations,\n            storageDriver,\n            props\n        );\n    }\n\n    /**\n     * @param {string} projectRoot\n     * @param {string} storageDriver\n     * @returns {string|false} Path to the registered models file, or false if not found\n     */\n    static findGeneratedModelsPath(projectRoot, storageDriver)\n    {\n        let generatedEntitiesPath = FileHandler.joinPaths(projectRoot, 'generated-entities');\n        if(!FileHandler.exists(generatedEntitiesPath)){\n            return false;\n        }\n        let generatedModelsPath = FileHandler.joinPaths(\n            generatedEntitiesPath,\n            'models',\n            storageDriver,\n            'registered-models-'+storageDriver+'.js'\n        );\n        if(!FileHandler.exists(generatedModelsPath)){\n            return false;\n        }\n        return generatedModelsPath;\n    }\n\n    /**\n     * @param {string} generatedModelsPath\n     * @param {string} reldensModuleLibPath\n     * @param {boolean} withConfig\n     * @param {boolean} withTranslations\n     * @param {string} storageDriver\n     * @param {Object} props\n     * @returns {Object} Object with entities, entitiesRaw, and translations\n     */\n    static loadFromGeneratedEntities(\n        generatedModelsPath,\n        reldensModuleLibPath,\n        withConfig,\n        withTranslations,\n        storageDriver,\n        props\n    ){\n        let classPath = generatedModelsPath.replace('.js', '');\n        let {rawRegisteredEntities, entitiesConfig, entitiesTranslations} = require(classPath);\n        if(!rawRegisteredEntities){\n            Logger.error('Generated entities not found.');\n            return false;\n        }\n        let customConfigOverride = this.loadImplementationConfigOverride(props);\n        let mergedOverrideParams = sc.deepMergeProperties(\n            Object.assign({}, EntitiesConfigOverrides),\n            customConfigOverride\n        );\n        let pluginData = this.loadPluginData(reldensModuleLibPath, storageDriver);\n        let implementationData = this.loadImplementationData(props);\n        let mergedConfig = sc.deepMergeProperties(Object.assign({}, entitiesConfig), mergedOverrideParams);\n        mergedConfig = this.applyEntityOverrides(mergedConfig, pluginData.entityOverrides, mergedOverrideParams, props);\n        mergedConfig = this.applyEntityOverrides(\n            mergedConfig,\n            implementationData.entityOverrides,\n            mergedOverrideParams,\n            props\n        );\n        let mergedTranslations = sc.deepMergeProperties(\n            Object.assign({}, entitiesTranslations || {}),\n            pluginData.translations\n        );\n        let entities = {};\n        let entitiesRaw = {};\n        let translations = {};\n        for(let key of Object.keys(rawRegisteredEntities)){\n            let modelClass = rawRegisteredEntities[key];\n            if(sc.hasOwn(pluginData.modelOverrides, key)){\n                modelClass = pluginData.modelOverrides[key];\n            }\n            if(sc.hasOwn(implementationData.modelOverrides, key)){\n                modelClass = implementationData.modelOverrides[key];\n            }\n            entitiesRaw[key] = modelClass;\n            entities[key] = withConfig ? {rawEntity: modelClass, config: mergedConfig[key] || {}} : modelClass;\n        }\n        if(withTranslations){\n            Object.assign(translations, mergedTranslations);\n        }\n        return {entities, entitiesRaw, translations};\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Object} Entities configuration override object\n     */\n    static loadImplementationConfigOverride(props)\n    {\n        let customClasses = sc.get(props, 'customClasses', false);\n        if(!customClasses){\n            return {};\n        }\n        return sc.get(customClasses, 'entitiesConfigOverride', {});\n    }\n\n    /**\n     * @param {Object} config\n     * @param {Object} overrides\n     * @param {Object} overrideParams\n     * @param {Object} props\n     * @returns {Object} Updated configuration with applied overrides\n     */\n    static applyEntityOverrides(config, overrides, overrideParams, props)\n    {\n        if(!overrides || 0 === Object.keys(overrides).length){\n            return config;\n        }\n        for(let key of Object.keys(overrides)){\n            let override = overrides[key];\n            if('function' !== typeof override){\n                continue;\n            }\n            let entityOverrideParams = overrideParams[key] || {};\n            config[key] = override.propertiesConfig(entityOverrideParams, props);\n        }\n        return config;\n    }\n\n    /**\n     * @param {string} reldensModuleLibPath\n     * @param {string} storageDriver\n     * @returns {Object} Object with entityOverrides, translations, and modelOverrides from all plugins\n     */\n    static loadPluginData(reldensModuleLibPath, storageDriver)\n    {\n        let entityOverrides = {};\n        let translations = {};\n        let modelOverrides = {};\n        let pluginFolders = this.discoverPluginFolders(reldensModuleLibPath);\n        for(let pluginName of pluginFolders){\n            let pluginServerPath = FileHandler.joinPaths(reldensModuleLibPath, pluginName, 'server');\n            if(!FileHandler.exists(pluginServerPath)){\n                continue;\n            }\n            this.loadPluginEntityOverrides(pluginServerPath, entityOverrides);\n            this.loadPluginTranslations(pluginServerPath, translations);\n            this.loadPluginModelOverrides(pluginServerPath, storageDriver, modelOverrides);\n        }\n        return {entityOverrides, translations, modelOverrides};\n    }\n\n    /**\n     * @param {string} reldensModuleLibPath\n     * @returns {Array<string>} Array of plugin folder names\n     */\n    static discoverPluginFolders(reldensModuleLibPath)\n    {\n        if(!FileHandler.exists(reldensModuleLibPath)){\n            Logger.error('Plugins path does not exist: '+reldensModuleLibPath);\n            return [];\n        }\n        let subFolders = FileHandler.fetchSubFoldersList(reldensModuleLibPath);\n        if(!subFolders || 0 === subFolders.length){\n            Logger.warning('No plugin folders found in: '+reldensModuleLibPath);\n            return [];\n        }\n        return subFolders;\n    }\n\n    /**\n     * @param {string} pluginServerPath\n     * @param {Object} entityOverrides\n     */\n    static loadPluginEntityOverrides(pluginServerPath, entityOverrides)\n    {\n        let configPath = FileHandler.joinPaths(pluginServerPath, 'entities-config.js');\n        if(!FileHandler.exists(configPath)){\n            return;\n        }\n        let {entitiesConfig} = require(configPath);\n        if(!entitiesConfig){\n            return;\n        }\n        Object.assign(entityOverrides, entitiesConfig);\n    }\n\n    /**\n     * @param {string} pluginServerPath\n     * @param {Object} translations\n     */\n    static loadPluginTranslations(pluginServerPath, translations)\n    {\n        let transPath = FileHandler.joinPaths(pluginServerPath, 'entities-translations.js');\n        if(!FileHandler.exists(transPath)){\n            return;\n        }\n        let {entitiesTranslations} = require(transPath);\n        if(!entitiesTranslations){\n            return;\n        }\n        for(let key of Object.keys(entitiesTranslations)){\n            if(!translations[key]){\n                translations[key] = {};\n            }\n            Object.assign(translations[key], entitiesTranslations[key]);\n        }\n    }\n\n    /**\n     * @param {string} pluginServerPath\n     * @param {string} storageDriver\n     * @param {Object} modelOverrides\n     */\n    static loadPluginModelOverrides(pluginServerPath, storageDriver, modelOverrides)\n    {\n        let overridePath = FileHandler.joinPaths(\n            pluginServerPath,\n            'models',\n            storageDriver,\n            'overridden-models-'+storageDriver+'.js'\n        );\n        if(!FileHandler.exists(overridePath)){\n            return;\n        }\n        let {overriddenModels} = require(overridePath);\n        if(!overriddenModels){\n            return;\n        }\n        Object.assign(modelOverrides, overriddenModels);\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Object} Object with entityOverrides and modelOverrides from implementation\n     */\n    static loadImplementationData(props)\n    {\n        let entityOverrides = {};\n        let modelOverrides = {};\n        let customClasses = sc.get(props, 'customClasses', false);\n        if(!customClasses){\n            return {entityOverrides, modelOverrides};\n        }\n        let entitiesConfig = sc.get(customClasses, 'entitiesConfig', false);\n        let modelsOverrides = sc.get(customClasses, 'modelsOverrides', false);\n        if(entitiesConfig){\n            Object.assign(entityOverrides, entitiesConfig);\n        }\n        if(modelsOverrides){\n            Object.assign(modelOverrides, modelsOverrides);\n        }\n        return {entityOverrides, modelOverrides};\n    }\n\n}\n\nmodule.exports.EntitiesLoader = EntitiesLoader;\n"
  },
  {
    "path": "lib/game/server/entity-properties.js",
    "content": "/**\n *\n * Reldens - EntityProperties\n *\n * Base class for defining entity property configurations. Designed to be extended by entity override\n * classes that provide custom property definitions and configurations for the admin panel. Each\n * entity override class should implement propertiesDefinition() and propertiesConfig() methods to\n * define how entity fields are displayed and edited in the admin interface.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\nclass EntityProperties\n{\n\n    /**\n     * @returns {Object} Entity properties definition object (to be implemented by subclasses)\n     */\n    static propertiesDefinition()\n    {\n        Logger.alert('Method not implemented propertiesDefinition().');\n        return {};\n    }\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object} Entity properties configuration object (to be implemented by subclasses)\n     */\n    static propertiesConfig(extraProps)\n    {\n        Logger.alert('Method not implemented propertiesConfig().', extraProps);\n        return {};\n    }\n\n}\n\nmodule.exports.EntityProperties = EntityProperties;\n"
  },
  {
    "path": "lib/game/server/forgot-password.js",
    "content": "/**\n *\n * Reldens - ForgotPassword\n *\n * Static utility class for handling password reset functionality. Defines Express routes for the\n * password reset page (/reset-password), validates reset tokens (old password hash), generates\n * new random passwords, updates user passwords in the database, and renders success/error templates.\n * Works in conjunction with LoginManager's forgot password email sending and Mailer service.\n *\n */\n\nconst { FileHandler } = require('@reldens/server-utils');\nconst { sc } = require('@reldens/utils');\n\nclass ForgotPassword\n{\n\n    /**\n     * @param {ServerManager} serverManager\n     * @returns {Promise<void>}\n     */\n    static async defineRequestOnServerManagerApp(serverManager)\n    {\n        serverManager.app.use('/reset-password', async (req, res) => {\n            let rEmail = req.query.email;\n            let rId = req.query.id;\n            let user = false;\n            if(rEmail && rId){\n                user = await serverManager.usersManager.loadUserByEmail(rEmail);\n            }\n            let content = await this.resetResultContent(user, rId, serverManager, rEmail);\n            res.send(\n                await serverManager.themeManager.templateEngine.render(\n                    FileHandler.fetchFileContents(FileHandler.joinPaths(\n                        serverManager.themeManager.projectAssetsPath,\n                        'html',\n                        'layout.html'\n                    )),\n                    {content, contentKey: 'forgot-password-content'}\n                )\n            );\n        });\n    }\n\n    /**\n     * @param {Object|false} user\n     * @param {string} rId\n     * @param {ServerManager} serverManager\n     * @param {string} rEmail\n     * @returns {Promise<string>}\n     */\n    static async resetResultContent(user, rId, serverManager, rEmail)\n    {\n        if(!user || user.password !== rId){\n            return await serverManager.themeManager.loadAndRenderTemplate(\n                serverManager.themeManager.assetPath('email', 'reset-error.html')\n            );\n        }\n        let newPass = sc.randomCharsWithSymbols(12);\n        let newPassHash = serverManager.loginManager.passwordManager.encryptPassword(newPass);\n        await serverManager.usersManager.updateUserByEmail(rEmail, {password: newPassHash});\n        return await serverManager.themeManager.loadAndRenderTemplate(\n            serverManager.themeManager.assetPath('email', 'reset-success.html'),\n            {userName: user.username, newPass}\n        );\n    }\n}\n\nmodule.exports.ForgotPassword = ForgotPassword;\n"
  },
  {
    "path": "lib/game/server/game-server.js",
    "content": "/**\n *\n * Reldens - GameServer\n *\n * Extends Colyseus Server to provide the game server with integrated monitoring capabilities.\n * Wraps the Colyseus core server and adds support for attaching the Colyseus Monitor\n * with optional authentication. Handles server shutdown gracefully.\n *\n */\n\nconst { monitor } = require('@colyseus/monitor');\nconst basicAuth = require('express-basic-auth');\nconst { Server } = require('@colyseus/core');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('express').Application} ExpressApplication\n * @typedef {import('@colyseus/ws-transport').WebSocketTransport} WebSocketTransport\n * @typedef {import('http').Server} HttpServer\n * @typedef {import('https').Server} HttpsServer\n *\n * @typedef {Object} GameServerOptions\n * @property {WebSocketTransport} transport\n * @property {HttpServer|HttpsServer} [server]\n * @property {number} [pingInterval]\n * @property {number} [pingMaxRetries]\n */\nclass GameServer extends Server\n{\n\n    /**\n     * @param {GameServerOptions} options\n     */\n    constructor(options)\n    {\n        // @TODO - BETA - Create a Colyseus driver.\n        super(options);\n        this.onShutdown(() => this.runOnShutDown());\n    }\n\n    /**\n     * @param {ExpressApplication} app\n     * @param {Object<string, any>} config\n     */\n    attachMonitor(app, config)\n    {\n        // @TODO - BETA - Extract into Colyseus driver.\n        this.hasAuthentication(config) ? this.attacheSecuredMonitor(config, app) : this.attachUnsecureMonitor(app);\n    }\n\n    /**\n     * @param {ExpressApplication} app\n     */\n    attachUnsecureMonitor(app)\n    {\n        app.use('/colyseus', monitor());\n        Logger.info('Attached UNSECURE Monitor at /colyseus.');\n    }\n\n    /**\n     * @param {Object<string, any>} config\n     * @param {ExpressApplication} app\n     */\n    attacheSecuredMonitor(config, app)\n    {\n        let basicAuthMiddleware = basicAuth({\n            users: {[config.user]: config.pass},\n            // sends WWW-Authenticate header, which will prompt the user to fill credentials in:\n            challenge: true\n        });\n        app.use('/colyseus', basicAuthMiddleware, monitor());\n        Logger.info('Attached secure Monitor at /colyseus.');\n    }\n\n    /**\n     * @param {Object<string, any>} config\n     * @returns {boolean}\n     */\n    hasAuthentication(config)\n    {\n        return config && config.auth && config.user && config.pass;\n    }\n\n    runOnShutDown()\n    {\n        Logger.info('Game Server is going down.');\n    }\n\n}\n\nmodule.exports.GameServer = GameServer;\n"
  },
  {
    "path": "lib/game/server/homepage-loader.js",
    "content": "/**\n *\n * Reldens - HomepageLoader\n *\n * Static utility class for loading and serving the game homepage (index.html) with multi-language\n * support. Handles language-specific index file selection (e.g., es-index.html, fr-index.html),\n * validates ISO language codes, and generates the client-side configuration file (config.js) with\n * initial game settings. Used by Express routes to serve the dynamic game entry point.\n *\n */\n\nconst { FileHandler } = require('@reldens/server-utils');\nconst { GameConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass HomepageLoader\n{\n\n    /**\n     * @param {string} requestLanguage\n     * @param {string} distPath\n     * @returns {Promise<string>}\n     */\n    static async loadContents(requestLanguage, distPath)\n    {\n        let languageParam = (requestLanguage || '').toString();\n        if('' !== languageParam){\n            if(!sc.isValidIsoCode(languageParam)){\n                Logger.error('Invalid selected language ISO code.');\n                languageParam = '';\n            }\n            Logger.info('Selected language: '+languageParam);\n        }\n        let indexPath = FileHandler.joinPaths(distPath, languageParam+'-'+GameConst.STRUCTURE.INDEX);\n        let defaultIndexPath = FileHandler.joinPaths(distPath, GameConst.STRUCTURE.INDEX);\n        let filePath = '' !== languageParam && FileHandler.exists(indexPath) ? indexPath : defaultIndexPath;\n        Logger.info('Loading index: '+filePath);\n        let html = FileHandler.readFile(filePath);\n        if(!html){\n            Logger.error('No index file found.', FileHandler.error);\n            return '';\n        }\n        return html;\n    }\n\n    /**\n     * @param {string} projectThemePath\n     * @param {Object<string, any>} initialConfiguration\n     * @returns {boolean}\n     */\n    static createConfigFile(projectThemePath, initialConfiguration)\n    {\n        let configFilePath = FileHandler.joinPaths(projectThemePath, 'config.js');\n        let configFileContents = 'window.reldensInitialConfig = '+JSON.stringify(initialConfiguration)+';';\n        let writeResult = FileHandler.writeFile(configFilePath, configFileContents);\n        if(!writeResult){\n            Logger.error('Failed to write config file: '+configFilePath);\n            return false;\n        }\n        Logger.info('Config file created: '+configFilePath);\n        return true;\n    }\n\n}\n\nmodule.exports.HomepageLoader = HomepageLoader;\n"
  },
  {
    "path": "lib/game/server/install-templates/.gitignore.dist",
    "content": "/.cache\n/.idea\n/node_modules\n/logs\n/.parcel-cache\n.env\nknexfile.js\n"
  },
  {
    "path": "lib/game/server/install-templates/data-package.json",
    "content": "{\n    \"name\": \"reldens-new-project\",\n    \"version\": \"0.1.0\",\n    \"description\": \"Reldens - New Project\",\n    \"main\": \"index.js\",\n    \"scripts\": {\n        \"start\": \"node .\"\n    },\n    \"engines\": {\n        \"node\": \">=18.0.0\",\n        \"npm\": \">=8.0.0\"\n    },\n    \"browserslist\": [\n        \"> 0.5%, last 2 versions, not dead\"\n    ],\n    \"targets\": {\n        \"main\": false\n    },\n    \"alias\": {\n        \"process\": false\n    },\n    \"dependencies\": {\n        \"reldens\": \"^4.0.0-beta.39\"\n    },\n    \"devDependencies\": {\n        \"@reldens/utils\": \"^0.53.0\",\n        \"@colyseus/loadtest\": \"^0.15.3\"\n    }\n}\n"
  },
  {
    "path": "lib/game/server/install-templates/knexfile.js.dist",
    "content": "module.exports = {\n    development: {\n        client: 'mysql2',\n        connection: {\n            host: 'localhost',\n            database: 'reldens_test',\n            user: 'reldens',\n            password: 'reldens',\n            multipleStatements: true\n        },\n        pool: {\n            min: 2,\n            max: 10\n        },\n        migrations: {\n            directory: './node_modules/reldens/migrations/development',\n            tableName: 'knex_migrations_dev'\n        }\n    },\n    production: {\n        client: '{{&db-client}}',\n        connection: {\n            host: '{{&db-host}}',\n            database: '{{&db-name}}',\n            user: '{{&db-username}}',\n            password: '{{&db-password}}',\n            multipleStatements: true\n        },\n        pool: {\n            min: 2,\n            max: 10\n        },\n        migrations: {\n            directory: './node_modules/reldens/migrations/production',\n            tableName: 'knex_migrations'\n        }\n    }\n};\n"
  },
  {
    "path": "lib/game/server/installer/entities-installation.js",
    "content": "/**\n *\n * Reldens - EntitiesInstallation\n *\n * Handles entity generation from the database schema for different storage drivers (ObjectionJS, MikroORM, Prisma).\n * For the Prisma driver, orchestrates schema introspection and client generation before entity creation.\n * Integrates with the EntitiesGenerator from @reldens/storage to produce entity classes.\n *\n */\n\nconst { DriversClassMap, EntitiesGenerator } = require('@reldens/storage');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} EntitiesInstallationProps\n * @property {string} [projectRoot]\n * @property {Object|false} [prismaInstallation]\n *\n * @typedef {Object} DbConfig\n * @property {string} client\n * @property {Object} config\n * @property {string} config.host\n * @property {number} config.port\n * @property {string} config.database\n * @property {string} config.user\n * @property {string} config.password\n * @property {boolean} config.multipleStatements\n * @property {boolean} debug\n */\nclass EntitiesInstallation\n{\n\n    /**\n     * @param {EntitiesInstallationProps} props\n     */\n    constructor(props)\n    {\n        /** @type {string} */\n        this.projectRoot = sc.get(props, 'projectRoot', './');\n        /** @type {Object|false} */\n        this.prismaInstallation = sc.get(props, 'prismaInstallation', false);\n    }\n\n    /**\n     * @param {Object} server\n     * @param {boolean} isOverride\n     * @param {boolean} isInstallationMode\n     * @param {boolean} isDryPrisma\n     * @param {DbConfig|null} dbConfig\n     * @param {string} storageDriverKey\n     * @returns {Promise<boolean>}\n     */\n    async generateEntities(server, isOverride, isInstallationMode, isDryPrisma, dbConfig, storageDriverKey)\n    {\n        let driverType = sc.get(DriversClassMap, server.constructor.name, storageDriverKey);\n        Logger.debug('Driver type detected: '+driverType+', Server constructor: '+server.constructor.name);\n        if('prisma' === driverType && !isDryPrisma){\n            Logger.info('Running prisma introspect \"npx prisma db pull\"...');\n            if(!dbConfig){\n                dbConfig = this.extractDbConfigFromServer(server);\n                Logger.debug('Extracted DB config.');\n            }\n            Logger.debug('DB config:', dbConfig);\n            if(dbConfig){\n                let generatedPrismaSchema = await this.prismaInstallation.generatePrismaSchema(dbConfig);\n                if(!generatedPrismaSchema){\n                    Logger.error('Prisma schema generation failed.');\n                    return false;\n                }\n                Logger.info('Generated Prisma schema for entities generation.');\n                if(isInstallationMode){\n                    Logger.info('Creating local Prisma client for entities generation...');\n                    let localPrismaClient = await this.prismaInstallation.createPrismaClient(this.projectRoot);\n                    if(localPrismaClient){\n                        this.prismaInstallation.prismaClient = localPrismaClient;\n                        server.prisma = localPrismaClient;\n                    }\n                }\n            }\n        }\n        if('prisma' === driverType && isDryPrisma){\n            Logger.info('Skipping Prisma schema generation due to --dry-prisma flag.');\n        }\n        let generatorConfig = {server, projectPath: this.projectRoot, isOverride};\n        if('prisma' === driverType && this.prismaInstallation.prismaClient){\n            generatorConfig.prismaClient = this.prismaInstallation.prismaClient;\n        }\n        let generator = new EntitiesGenerator(generatorConfig);\n        let success = await generator.generate();\n        if(!success){\n            Logger.error('Entities generation failed.');\n        }\n        return success;\n    }\n\n    /**\n     * @param {Object} server\n     * @returns {DbConfig|false}\n     */\n    extractDbConfigFromServer(server)\n    {\n        let config = sc.get(server, 'config');\n        if(!config){\n            Logger.warning('Could not extract database config from server.');\n            return false;\n        }\n        let dbConfig = {\n            client: sc.get(server, 'client', 'mysql'),\n            config: {\n                host: sc.get(config, 'host', 'localhost'),\n                port: sc.get(config, 'port', 3306),\n                database: sc.get(config, 'database', ''),\n                user: sc.get(config, 'user', ''),\n                password: sc.get(config, 'password', ''),\n                multipleStatements: true\n            },\n            debug: false\n        };\n        Logger.debug('Extracted DB config structure:', {\n            client: dbConfig.client,\n            host: dbConfig.config.host,\n            database: dbConfig.config.database\n        });\n        return dbConfig;\n    }\n\n}\n\nmodule.exports.EntitiesInstallation = EntitiesInstallation;\n"
  },
  {
    "path": "lib/game/server/installer/generic-driver-installation.js",
    "content": "/**\n *\n * Reldens - GenericDriverInstallation\n *\n * Handles database installation for non-Prisma storage drivers (ObjectionJS, MikroORM).\n * Executes SQL migration files directly via the driver's rawQuery method.\n * Supports installation SQL, basic configuration, and sample data migrations.\n *\n */\n\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} InstallationResult\n * @property {boolean} success\n * @property {string} [error]\n * @property {Object} [dbDriver]\n *\n * @typedef {Object} DbConfig\n * @property {string} client\n * @property {Object} config\n *\n * @typedef {Object} TemplateVariables\n * @property {string} [db-basic-config]\n * @property {string} [db-sample-data]\n * @property {string} [db-client]\n */\nclass GenericDriverInstallation\n{\n\n    /**\n     * @param {string} client\n     * @returns {boolean}\n     */\n    isMySqlClient(client)\n    {\n        if(!client){\n            return false;\n        }\n        return -1 !== client.indexOf('mysql');\n    }\n\n    /**\n     * @param {Object} dbDriver\n     * @param {string} migrationsPath\n     * @param {string} fileName\n     * @returns {Promise<void>}\n     */\n    async executeRawQuery(dbDriver, migrationsPath, fileName)\n    {\n        await dbDriver.rawQuery(FileHandler.readFile(FileHandler.joinPaths(migrationsPath, fileName)));\n    }\n\n    /**\n     * @param {Function} selectedDriver\n     * @param {DbConfig} dbConfig\n     * @param {TemplateVariables} templateVariables\n     * @param {string} migrationsPath\n     * @returns {Promise<InstallationResult>}\n     */\n    async executeInstallation(selectedDriver, dbConfig, templateVariables, migrationsPath)\n    {\n        try {\n            let dbDriver = new selectedDriver(dbConfig);\n            if(!await dbDriver.connect()){\n                return {success: false, error: 'connection-failed'};\n            }\n            if(!sc.isObjectFunction(dbDriver, 'rawQuery')){\n                return {success: false, error: 'raw-query-not-found'};\n            }\n            let client = sc.get(templateVariables, 'db-client', '');\n            let isMySql = this.isMySqlClient(client);\n            if(!isMySql){\n                Logger.info('Non-MySQL client detected ('+client+'), skipping automated SQL scripts.');\n                return {success: true, dbDriver: dbDriver};\n            }\n            await this.executeRawQuery(dbDriver, migrationsPath, 'reldens-install-v4.0.0.sql');\n            Logger.info('Installed tables.');\n            if('1' === templateVariables['db-basic-config']){\n                await this.executeRawQuery(dbDriver, migrationsPath, 'reldens-basic-config-v4.0.0.sql');\n                Logger.info('Installed basic-config.');\n            }\n            if('1' === templateVariables['db-sample-data']){\n                await this.executeRawQuery(dbDriver, migrationsPath, 'reldens-sample-data-v4.0.0.sql');\n                Logger.info('Installed sample-data.');\n            }\n            return {success: true, dbDriver: dbDriver};\n        } catch (error) {\n            Logger.critical('There was an error during the installation process.', error);\n            return {success: false, error: 'db-installation-process-failed'};\n        }\n    }\n\n}\n\nmodule.exports.GenericDriverInstallation = GenericDriverInstallation;\n"
  },
  {
    "path": "lib/game/server/installer/packages-installation.js",
    "content": "/**\n *\n * Reldens - PackagesInstallation\n *\n * Manages npm package installation and linking during Reldens project setup.\n * Supports three installation types: normal install, link all packages, link main package only.\n * Handles unlinking, checking installation status, and Prisma client installation for the Prisma driver.\n *\n */\n\nconst { execSync } = require('child_process');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} PackagesInstallationProps\n * @property {string} [projectRoot]\n * @property {string} [installationType]\n * @property {Array<string>} [linkablePackages]\n */\nclass PackagesInstallation\n{\n\n    /**\n     * @param {PackagesInstallationProps} props\n     */\n    constructor(props)\n    {\n        /** @type {string} */\n        this.projectRoot = sc.get(props, 'projectRoot', './');\n        /** @type {string} */\n        this.installationType = sc.get(props, 'installationType', 'normal');\n        /** @type {string} */\n        this.mainPackage = 'reldens';\n        /** @type {Array<string>} */\n        this.linkablePackages = sc.get(props, 'linkablePackages', [\n            '@reldens/cms',\n            '@reldens/game-data-generator',\n            '@reldens/items-system',\n            '@reldens/modifiers',\n            '@reldens/server-utils',\n            '@reldens/skills',\n            '@reldens/storage',\n            '@reldens/tile-map-generator',\n            '@reldens/utils'\n        ]);\n        /** @type {string} */\n        this.lockFilePath = FileHandler.joinPaths(\n            this.projectRoot, 'node_modules', this.mainPackage, 'package-lock.json'\n        );\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    unlinkAllPackages()\n    {\n        if('normal' === this.installationType){\n            Logger.debug('Skipping package unlinking for normal installation.');\n            return true;\n        }\n        let packagesToUnlink = [...this.linkablePackages, this.mainPackage];\n        Logger.info('Unlinking all packages before installation...');\n        for(let packageName of packagesToUnlink){\n            try {\n                execSync('npm unlink '+packageName, {stdio: 'ignore', cwd: this.projectRoot});\n            } catch (error) {\n                Logger.debug('Package not linked or unlink failed: '+packageName);\n            }\n        }\n        Logger.info('All packages unlinked.');\n        return true;\n    }\n\n    /**\n     * @param {string} storageDriverKey\n     * @returns {boolean}\n     */\n    checkAndInstallPackages(storageDriverKey)\n    {\n        let packagesToInstall = [];\n        let packagesToLink = [];\n        if('link' === this.installationType){\n            packagesToLink = [...this.linkablePackages, this.mainPackage];\n        }\n        if('link-main' === this.installationType){\n            packagesToInstall = [...this.linkablePackages];\n            packagesToLink = [this.mainPackage];\n        }\n        if('normal' === this.installationType){\n            packagesToInstall = [this.mainPackage];\n        }\n        if('prisma' === storageDriverKey){\n            packagesToInstall.push('@prisma/client');\n        }\n        return this.processPackages(packagesToInstall, 'install') && this.processPackages(packagesToLink, 'link');\n    }\n\n    /**\n     * @param {Object} lockData\n     * @param {string} packageName\n     * @returns {string}\n     */\n    findVersionInLockFile(lockData, packageName)\n    {\n        if(!lockData){\n            return '';\n        }\n        if(sc.hasOwn(lockData, 'packages')){\n            // @NOTE: 'node_modules/' is not a folder separator, it is the format npm uses for package-lock.json\n            let packageKey = 'node_modules/'+packageName;\n            let entry = sc.get(lockData.packages, packageKey, false);\n            if(entry){\n                return sc.get(entry, 'version', '');\n            }\n        }\n        if(sc.hasOwn(lockData, 'dependencies')){\n            let entry = sc.get(lockData.dependencies, packageName, false);\n            if(entry){\n                return sc.get(entry, 'version', '');\n            }\n        }\n        return '';\n    }\n\n    /**\n     * @param {Array<string>} packages\n     * @param {string} command\n     * @returns {boolean}\n     */\n    processPackages(packages, command)\n    {\n        if(0 === packages.length){\n            return true;\n        }\n        Logger.info('Processing packages with command: npm '+command);\n        let lockData = false;\n        if('install' === command){\n            lockData = FileHandler.fetchFileJson(this.lockFilePath);\n            if(lockData){\n                Logger.debug('Lock file loaded: '+this.lockFilePath);\n            }\n        }\n        for(let packageName of packages){\n            if(this.isPackageInstalled(packageName)){\n                Logger.debug('Package already '+command+'ed: '+packageName);\n                continue;\n            }\n            if(!lockData && 'install' === command){\n                lockData = FileHandler.fetchFileJson(this.lockFilePath);\n                if(lockData){\n                    Logger.debug('Lock file loaded: '+this.lockFilePath);\n                }\n            }\n            let version = '';\n            if(lockData){\n                version = this.findVersionInLockFile(lockData, packageName);\n            }\n            let installTarget = version ? packageName+'@'+version : packageName;\n            Logger.info('Executing: npm '+command+' '+installTarget);\n            try {\n                execSync('npm '+command+' '+installTarget, {stdio: 'inherit', cwd: this.projectRoot});\n            } catch (error) {\n                Logger.error('Failed to '+command+' package ('+packageName+'): '+error.message);\n                return false;\n            }\n        }\n        Logger.info('Packages processed successfully.');\n        return true;\n    }\n\n    /**\n     * @param {string} packageName\n     * @returns {boolean}\n     */\n    isPackageInstalled(packageName)\n    {\n        return FileHandler.exists(FileHandler.joinPaths(this.projectRoot, 'node_modules', packageName));\n    }\n\n}\n\nmodule.exports.PackagesInstallation = PackagesInstallation;\n"
  },
  {
    "path": "lib/game/server/installer/prisma-installation.js",
    "content": "/**\n *\n * Reldens - PrismaInstallation\n *\n * Handles Prisma-specific database installation and setup tasks.\n * Generates the Prisma schema via introspection, creates the Prisma client, and runs installation in a subprocess.\n * Uses child process fork to isolate Prisma client generation and avoid module caching issues.\n *\n */\n\nconst { fork } = require('child_process');\nconst { PrismaSchemaGenerator } = require('@reldens/storage');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('child_process').ChildProcess} ChildProcess\n *\n * @typedef {Object} PrismaInstallationProps\n * @property {string} [projectRoot]\n * @property {string} [reldensModulePath]\n * @property {number} [subprocessMaxAttempts]\n * @property {Object|false} [prismaClient]\n *\n * @typedef {Object} InstallationResult\n * @property {boolean} success\n * @property {string} [error]\n * @property {Object} [dbDriver]\n *\n * @typedef {Object} DbConfig\n * @property {string} client\n * @property {Object} config\n *\n * @typedef {Object} ConnectionData\n * @property {string} client\n * @property {Object} config\n */\nclass PrismaInstallation\n{\n\n    /**\n     * @param {PrismaInstallationProps} props\n     */\n    constructor(props)\n    {\n        /** @type {string} */\n        this.projectRoot = sc.get(props, 'projectRoot', './');\n        /** @type {string} */\n        this.reldensModulePath = sc.get(props, 'reldensModulePath', './');\n        /** @type {number} */\n        this.subprocessMaxAttempts = sc.get(props, 'subprocessMaxAttempts', 1800);\n        /** @type {Object|false} */\n        this.prismaClient = sc.get(props, 'prismaClient', false);\n    }\n\n    /**\n     * @param {string} clientPath\n     * @returns {Object} Prisma client module exports\n     */\n    requireClient(clientPath)\n    {\n        return require(clientPath);\n    }\n\n    /**\n     * @param {Function} selectedDriver\n     * @param {DbConfig} dbConfig\n     * @param {Object} templateVariables\n     * @param {string} migrationsPath\n     * @returns {Promise<InstallationResult>} Result with success flag, optional error, and driver instance\n     */\n    async executeInstallation(selectedDriver, dbConfig, templateVariables, migrationsPath)\n    {\n        let subprocessResult = await this.runSubprocessInstallation(dbConfig, templateVariables, migrationsPath);\n        if(!subprocessResult){\n            return {success: false, error: 'prisma-subprocess-failed'};\n        }\n        let dbDriver = new selectedDriver(dbConfig);\n        return {success: true, dbDriver: dbDriver};\n    }\n\n    /**\n     * @param {ConnectionData} connectionData\n     * @param {boolean} [useDataProxy]\n     * @returns {Promise<boolean>} Returns true if the schema generation succeeded, false on error\n     */\n    async generatePrismaSchema(connectionData, useDataProxy)\n    {\n        if(!connectionData){\n            Logger.error('Missing \"connectionData\" to generate Prisma Schema.');\n            return false;\n        }\n        let generator = new PrismaSchemaGenerator({\n            ...connectionData,\n            dataProxy: useDataProxy,\n            clientOutputPath: FileHandler.joinPaths(this.projectRoot, 'prisma', 'client'),\n            prismaSchemaPath: FileHandler.joinPaths(this.projectRoot, 'prisma')\n        });\n        let success = await generator.generate();\n        if(!success){\n            Logger.error('Prisma schema generation failed.');\n        }\n        return success;\n    }\n\n    /**\n     * @param {string} projectRoot\n     * @returns {Promise<Object|false>} Prisma client instance or false on error\n     */\n    async createPrismaClient(projectRoot)\n    {\n        try {\n            let clientPath = FileHandler.joinPaths(projectRoot, 'prisma', 'client');\n            if(!FileHandler.exists(clientPath)){\n                Logger.error('Prisma client path does not exist: '+clientPath);\n                return false;\n            }\n            let prismaClientModule = this.requireClient(clientPath);\n            let prismaClient = prismaClientModule.PrismaClient;\n            if(!prismaClient){\n                Logger.error('PrismaClient not found in module.');\n                return false;\n            }\n            return new prismaClient();\n        } catch (error) {\n            Logger.error('Failed to create Prisma client: '+error.message);\n            return false;\n        }\n    }\n\n    /**\n     * @param {DbConfig} dbConfig\n     * @param {Object} templateVariables\n     * @param {string} migrationsPath\n     * @returns {Promise<boolean>} Returns true if the subprocess installation succeeded, false on error or timeout\n     */\n    async runSubprocessInstallation(dbConfig, templateVariables, migrationsPath)\n    {\n        Logger.info('Subprocess Prisma installation - Starting...');\n        let workerPath = FileHandler.joinPaths(__dirname, 'prisma-subprocess-worker.js');\n        if(!FileHandler.exists(workerPath)){\n            Logger.error('Prisma subprocess worker not found: '+workerPath);\n            return false;\n        }\n        let worker = fork(workerPath, [], {\n            cwd: this.projectRoot,\n            stdio: ['pipe', 'pipe', 'pipe', 'ipc'],\n            env: {...process.env}\n        });\n        let message = {\n            dbConfig: dbConfig,\n            templateVariables: templateVariables,\n            migrationsPath: migrationsPath,\n            projectRoot: this.projectRoot\n        };\n        worker.stdout.on('data', (data) => {\n            Logger.info('Subprocess: '+data.toString().trim());\n        });\n        worker.stderr.on('data', (data) => {\n            Logger.error('Subprocess error: '+data.toString().trim());\n        });\n        worker.send(message);\n        let subprocessCompleted = false;\n        let subprocessSuccess = false;\n        let workerExited = false;\n        worker.on('message', (message) => {\n            subprocessCompleted = true;\n            subprocessSuccess = sc.get(message, 'success', false);\n            if(!subprocessSuccess){\n                Logger.error('Subprocess failed: '+sc.get(message, 'error', 'Unknown'));\n            }\n        });\n        worker.on('error', (error) => {\n            subprocessCompleted = true;\n            subprocessSuccess = false;\n            Logger.error('Subprocess error: '+error.message);\n        });\n        worker.on('exit', (code, signal) => {\n            workerExited = true;\n            if(!subprocessCompleted){\n                subprocessCompleted = true;\n                subprocessSuccess = false;\n            }\n        });\n        let attempts = 0;\n        while(!subprocessCompleted && attempts < this.subprocessMaxAttempts){\n            attempts++;\n            await this.waitMilliseconds(100);\n        }\n        if(!workerExited){\n            worker.kill('SIGTERM');\n            await this.waitMilliseconds(1000);\n            if(!workerExited){\n                worker.kill('SIGKILL');\n            }\n        }\n        Logger.info('Subprocess Prisma installation - Ended.');\n        return subprocessSuccess;\n    }\n\n    /**\n     * @param {number} ms\n     * @returns {Promise<void>}\n     */\n    async waitMilliseconds(ms)\n    {\n        return new Promise(resolve => setTimeout(resolve, ms));\n    }\n\n}\n\nmodule.exports.PrismaInstallation = PrismaInstallation;\n"
  },
  {
    "path": "lib/game/server/installer/prisma-subprocess-worker.js",
    "content": "/**\n *\n * Reldens - PrismaSubprocessWorker\n *\n * Subprocess worker for isolated Prisma database installation.\n * Runs in a forked child process to avoid Prisma client module caching issues with the main process.\n * Generates a minimal Prisma client, connects, executes migrations, and reports results via IPC.\n *\n */\n\nconst { MySQLInstaller } = require('@reldens/cms/lib/mysql-installer');\nconst { DriversMap } = require('@reldens/storage');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} MigrationFilesMap\n * @property {string} db-install\n * @property {string} db-basic-config\n * @property {string} db-sample-data\n *\n * @typedef {Object} SubprocessMessage\n * @property {Object} dbConfig\n * @property {Object} templateVariables\n * @property {string} migrationsPath\n * @property {string} projectRoot\n */\nclass PrismaSubprocessWorker\n{\n\n    constructor()\n    {\n        this.setupProcessHandlers();\n    }\n\n    /**\n     * @returns {MigrationFilesMap}\n     */\n    static migrationFiles()\n    {\n        return {\n            'db-install': 'reldens-install-v4.0.0.sql',\n            'db-basic-config': 'reldens-basic-config-v4.0.0.sql',\n            'db-sample-data': 'reldens-sample-data-v4.0.0.sql'\n        };\n    }\n\n    /**\n     * @param {string} client\n     * @returns {boolean}\n     */\n    isMySqlClient(client)\n    {\n        if(!client){\n            return false;\n        }\n        return -1 !== client.indexOf('mysql');\n    }\n\n    setupProcessHandlers()\n    {\n        process.on('message', async (message) => {\n            try {\n                await this.processIncomingMessage(message);\n            } catch(error) {\n                Logger.error('PrismaSubprocessWorker error: '+error.message);\n                this.sendErrorResponse(error.message);\n                setTimeout(() => process.exit(1), 100);\n            }\n        });\n        process.on('uncaughtException', (error) => {\n            Logger.error('PrismaSubprocessWorker uncaught exception: '+error.message);\n            this.sendErrorResponse(error.message);\n            setTimeout(() => process.exit(1), 100);\n        });\n        process.on('unhandledRejection', (error) => {\n            Logger.error('PrismaSubprocessWorker unhandled rejection: '+error.message);\n            this.sendErrorResponse(error.message);\n            setTimeout(() => process.exit(1), 100);\n        });\n    }\n\n    /**\n     * @param {SubprocessMessage} message\n     * @returns {Promise<void>}\n     */\n    async processIncomingMessage(message)\n    {\n        let dbConfig = sc.get(message, 'dbConfig', {});\n        let templateVariables = sc.get(message, 'templateVariables', {});\n        let migrationsPath = sc.get(message, 'migrationsPath', './migrations');\n        let projectRoot = sc.get(message, 'projectRoot', './');\n        this.setDatabaseUrlEnvVar(dbConfig);\n        let generatedClient = await MySQLInstaller.generateMinimalPrismaClient(dbConfig, projectRoot);\n        if(!generatedClient){\n            this.sendErrorResponse('Failed to generate Prisma client.');\n            return;\n        }\n        dbConfig.prismaClient = generatedClient;\n        let driverClass = DriversMap['prisma'];\n        if(!driverClass){\n            this.sendErrorResponse('Prisma driver class not found.');\n            return;\n        }\n        let dbDriver = new driverClass(dbConfig);\n        if(!await dbDriver.connect()){\n            this.sendErrorResponse('Database connection failed.');\n            return;\n        }\n        let client = sc.get(templateVariables, 'db-client', '');\n        let isMySql = this.isMySqlClient(client);\n        if(!isMySql){\n            Logger.info('Non-MySQL client detected ('+client+'), skipping automated SQL scripts.');\n            await generatedClient.$disconnect();\n            this.sendSuccessResponse('Subprocess installation completed (manual setup required).');\n            return;\n        }\n        let migrationFiles = PrismaSubprocessWorker.migrationFiles();\n        for(let checkboxName of Object.keys(migrationFiles)){\n            let fileName = migrationFiles[checkboxName];\n            let isMarked = 'db-install' === checkboxName\n                ? 'on'\n                : ('1' === sc.get(templateVariables, checkboxName, '0') ? 'on' : 'off');\n            let redirectError = await MySQLInstaller.executeQueryFile(\n                isMarked,\n                fileName,\n                dbDriver,\n                migrationsPath\n            );\n            if('' !== redirectError){\n                this.sendErrorResponse('Migration failed: '+fileName);\n                return;\n            }\n        }\n        await generatedClient.$disconnect();\n        this.sendSuccessResponse('Subprocess installation completed.');\n    }\n\n    /**\n     * @param {string} message\n     */\n    sendSuccessResponse(message)\n    {\n        process.send({success: true, message});\n    }\n\n    /**\n     * Send error response to parent process via IPC.\n     * @param {string} errorMessage\n     */\n    sendErrorResponse(errorMessage)\n    {\n        process.send({success: false, error: errorMessage});\n    }\n\n    /**\n     * @param {Object} dbConfig\n     */\n    setDatabaseUrlEnvVar(dbConfig)\n    {\n        let config = sc.get(dbConfig, 'config', {});\n        let provider = sc.get(dbConfig, 'client', 'mysql');\n        if(-1 !== provider.indexOf('mysql')){\n            provider = 'mysql';\n        }\n        let user = sc.get(config, 'user', '');\n        let password = sc.get(config, 'password', '');\n        let host = sc.get(config, 'host', 'localhost');\n        let port = sc.get(config, 'port', 3306);\n        let database = sc.get(config, 'database', '');\n        process.env.RELDENS_DB_URL = provider+'://'+user+':'+password+'@'+host+':'+port+'/'+database;\n    }\n\n}\n\nmodule.exports.PrismaSubprocessWorker = PrismaSubprocessWorker;\n\nnew PrismaSubprocessWorker();\n"
  },
  {
    "path": "lib/game/server/installer/project-files-creation.js",
    "content": "/**\n *\n * Reldens - ProjectFilesCreation\n *\n * Creates essential project configuration files after database installation.\n * Generates the .env, .gitignore, knexfile.js, and install.lock files from templates.\n * Handles asset cleanup for non-sample installations and an optional server start callback.\n *\n */\n\nconst { TemplateEngine } = require('../template-engine');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} ProjectFilesCreationProps\n * @property {Object} themeManager\n * @property {function(): void} [cleanAssetsCallback]\n * @property {function(Object): Promise<void>} [startCallback]\n *\n * @typedef {Object} CreationResult\n * @property {boolean} success\n * @property {string} [error]\n */\nclass ProjectFilesCreation\n{\n\n    /**\n     * @param {ProjectFilesCreationProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Object} */\n        this.themeManager = sc.get(props, 'themeManager');\n        /** @type {function(): void|undefined} */\n        this.cleanAssetsCallback = sc.get(props, 'cleanAssetsCallback');\n        /** @type {function(Object): Promise<void>|undefined} */\n        this.startCallback = sc.get(props, 'startCallback');\n    }\n\n    /**\n     * @param {Object} templateVariables\n     * @param {string} storageDriverKey\n     * @param {Object} dataServer\n     * @returns {Promise<CreationResult>} Result with success flag and optional error code\n     */\n    async createProjectFiles(templateVariables, storageDriverKey, dataServer)\n    {\n        let envFilePath = FileHandler.joinPaths(this.themeManager.projectRoot, '.env');\n        let gitignoreFilePath = FileHandler.joinPaths(this.themeManager.projectRoot, '.gitignore');\n        let knexFilePath = FileHandler.joinPaths(this.themeManager.projectRoot, 'knexfile.js');\n        let lockFilePath = FileHandler.joinPaths(this.themeManager.projectRoot, 'install.lock');\n        try {\n            // env file:\n            let envDistTemplate = FileHandler.readFile(this.themeManager.reldensModulePathInstallTemplateEnvDist);\n            let envFileContent = await TemplateEngine.render(envDistTemplate, templateVariables);\n            FileHandler.writeFile(envFilePath, envFileContent);\n            // gitignore:\n            let gitignoreFileContent = FileHandler.readFile(\n                this.themeManager.reldensModulePathInstallTemplateGitignoreDist\n            );\n            FileHandler.writeFile(gitignoreFilePath, gitignoreFileContent);\n            // knexfile:\n            if('objection-js' === storageDriverKey){\n                let knexDistTemplate = FileHandler.readFile(this.themeManager.reldensModulePathInstallTemplateKnexDist);\n                let knexFileContent = await TemplateEngine.render(knexDistTemplate, templateVariables);\n                FileHandler.writeFile(knexFilePath, knexFileContent);\n            }\n            // install.lock:\n            FileHandler.writeFile(lockFilePath, '');\n            // clean assets:\n            if('1' !== templateVariables['db-sample-data']){\n                if(this.cleanAssetsCallback){\n                    this.cleanAssetsCallback();\n                }\n            }\n        } catch (error) {\n            FileHandler.remove(envFilePath);\n            FileHandler.remove(gitignoreFilePath);\n            FileHandler.remove(knexFilePath);\n            FileHandler.remove(lockFilePath);\n            Logger.critical('There was an error during the theme creation process.', error);\n            return {success: false, error: 'installation-process-failed'};\n        }\n        Logger.info('Installation success!');\n        if(this.startCallback){\n            Logger.info('Running Server Start callback...');\n            await this.startCallback({dataServer});\n        }\n        return {success: true};\n    }\n\n}\n\nmodule.exports.ProjectFilesCreation = ProjectFilesCreation;\n"
  },
  {
    "path": "lib/game/server/installer.js",
    "content": "/**\n *\n * Reldens - Installer\n *\n * Manages the Reldens installation process through a web-based GUI. Orchestrates database setup,\n * entity generation, storage driver configuration (Prisma/ObjectionJS/MikroORM), project file\n * creation (.env, knexfile.js, etc.), and package installation. Provides Express middleware for\n * serving the installation wizard and processing installation form submissions.\n *\n */\n\nconst { EntitiesInstallation } = require('./installer/entities-installation');\nconst { PrismaInstallation } = require('./installer/prisma-installation');\nconst { GenericDriverInstallation } = require('./installer/generic-driver-installation');\nconst { ProjectFilesCreation } = require('./installer/project-files-creation');\nconst { PackagesInstallation } = require('./installer/packages-installation');\nconst { TemplateEngine } = require('./template-engine');\nconst { GameConst } = require('../constants');\nconst { DriversMap } = require('@reldens/storage');\nconst { Encryptor, FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('express').Application} ExpressApplication\n * @typedef {import('express').Request} ExpressRequest\n * @typedef {import('express').Response} ExpressResponse\n * @typedef {import('express').NextFunction} ExpressNextFunction\n *\n * @typedef {Object} InstallerProps\n * @property {ThemeManager} themeManager\n * @property {Function} [startCallback]\n * @property {string} [installationType]\n * @property {number} [subprocessMaxAttempts]\n * @property {Object} [prismaClient]\n */\nclass Installer\n{\n\n    /**\n     * @param {InstallerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {ThemeManager} */\n        this.themeManager = sc.get(props, 'themeManager');\n        /** @type {Function} */\n        this.startCallback = sc.get(props, 'startCallback');\n        /** @type {string} */\n        this.secretKey = Encryptor.generateSecretKey();\n        let projectRoot = sc.get(this.themeManager, 'projectRoot', './');\n        let installationType = sc.get(props, 'installationType', 'normal');\n        /** @type {PrismaInstallation} */\n        this.prismaInstallation = new PrismaInstallation({\n            projectRoot,\n            reldensModulePath: sc.get(this.themeManager, 'reldensModulePath', './'),\n            subprocessMaxAttempts: sc.get(props, 'subprocessMaxAttempts', 1800),\n            prismaClient: sc.get(props, 'prismaClient', false)\n        });\n        /** @type {EntitiesInstallation} */\n        this.entitiesInstallation = new EntitiesInstallation({\n            projectRoot,\n            prismaInstallation: this.prismaInstallation\n        });\n        /** @type {GenericDriverInstallation} */\n        this.genericDriverInstallation = new GenericDriverInstallation();\n        /** @type {PackagesInstallation} */\n        this.packagesInstallation = new PackagesInstallation({projectRoot, installationType});\n        /** @type {ProjectFilesCreation} */\n        this.projectFilesCreation = new ProjectFilesCreation({\n            themeManager: this.themeManager,\n            cleanAssetsCallback: () => this.cleanAssets(),\n            startCallback: this.startCallback\n        });\n        /** @type {string} */\n        this.statusFolder = sc.get(this.themeManager, 'installerPath', './dist/install');\n        /** @type {string} */\n        this.statusFilePath = FileHandler.joinPaths(this.statusFolder, 'install-status.json');\n    }\n\n    /**\n     * @param {string} message\n     */\n    updateInstallStatus(message)\n    {\n        try {\n            FileHandler.createFolder(this.statusFolder);\n            let statusData = JSON.stringify({message, timestamp: Date.now()});\n            FileHandler.writeFile(this.statusFilePath, statusData);\n            Logger.info('Installation status: '+message);\n        } catch(error) {\n            Logger.error('Failed to write installation status: '+error.message);\n        }\n    }\n\n    clearInstallStatus()\n    {\n        if(FileHandler.exists(this.statusFilePath)){\n            FileHandler.remove(this.statusFilePath);\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isInstalled()\n    {\n        if('' === sc.get(this.themeManager, 'installationLockPath', '')){\n            return false;\n        }\n        return FileHandler.exists(this.themeManager.installationLockPath);\n    }\n\n    /**\n     * @param {ExpressApplication} app\n     * @param {AppServerFactory} appServerFactory\n     * @returns {Promise<void>}\n     */\n    async prepareSetup(app, appServerFactory)\n    {\n        if(FileHandler.exists(this.themeManager.installerPathIndex)){\n            FileHandler.remove(this.themeManager.installerPathIndex, {recursive: true});\n        }\n        Logger.info('Building installer...');\n        await this.themeManager.buildInstaller();\n        app.use(appServerFactory.applicationFramework.static(\n            this.themeManager.installerPath,\n            {\n                index: false,\n                filter: (req, file) => {\n                    return '.html' !== FileHandler.extension(file);\n                }\n            }\n        ));\n        // @IMPORTANT: do not use session secret like this in the app (only here in the installer), it is not secure.\n        // @NOTE: Include \"secure: true\" for that case (that only works through SSL).\n        // app.use(session({secret: this.secretKey, resave: true, saveUninitialized: true, cookie: {secure: true}}));\n        app.use(appServerFactory.session({secret: this.secretKey, resave: true, saveUninitialized: true}));\n        app.get('/install-status.json', (req, res) => {\n            res.setHeader('Content-Type', 'application/json');\n            if(!FileHandler.exists(this.statusFilePath)){\n                res.status(404);\n                res.write(JSON.stringify({message: 'No status available'}));\n                return res.end();\n            }\n            let statusContent = FileHandler.readFile(this.statusFilePath, {encoding: this.encoding()});\n            res.write(statusContent);\n            return res.end();\n        });\n        app.use(async (req, res, next) => {\n            return await this.executeForEveryRequest(next, req, res, appServerFactory.applicationFramework);\n        });\n        app.post('/install', async (req, res) => {\n            return await this.executeInstallProcess(req, res);\n        });\n    }\n\n    /**\n     * @param {ExpressRequest} req\n     * @param {ExpressResponse} res\n     * @returns {Promise<ExpressResponse>} Response redirect to success page or error page\n     */\n    async executeInstallProcess(req, res)\n    {\n        if(this.isInstalled()){\n            return res.redirect('/?redirect=already-installed');\n        }\n        this.clearInstallStatus();\n        this.updateInstallStatus('Starting installation process...');\n        let templateVariables = req.body;\n        templateVariables['app-limit-key-generator'] = '' !== templateVariables['app-trusted-proxy'] ? 1 : 0;\n        this.normalizeFilePaths(templateVariables);\n        this.setCheckboxesMissingValues(templateVariables);\n        this.setSelectedOptions(templateVariables);\n        req.session.templateVariables = templateVariables;\n        let storageDriverKey = templateVariables['db-storage-driver'];\n        if('prisma' === storageDriverKey && -1 !== templateVariables['db-client'].indexOf('mysql')){\n            templateVariables['db-client'] = 'mysql';\n        }\n        if(!storageDriverKey){\n            Logger.critical('Missing storage driver in form submission.');\n            return res.redirect('/?error=missing-storage-driver');\n        }\n        let selectedDriver = DriversMap[storageDriverKey];\n        if(!selectedDriver){\n            Logger.critical('Invalid storage driver: '+storageDriverKey);\n            return res.redirect('/?error=invalid-driver');\n        }\n        let allowPackagesInstallation = '1' === templateVariables['app-allow-packages-installation'];\n        if(allowPackagesInstallation){\n            this.updateInstallStatus('Checking and installing required packages...');\n            this.packagesInstallation.unlinkAllPackages();\n            if(!this.packagesInstallation.checkAndInstallPackages(storageDriverKey)){\n                Logger.critical('Required packages installation failed.');\n                return res.redirect('/?error=installation-dependencies-failed');\n            }\n        }\n        this.updateInstallStatus('Configuring database connection...');\n        let dbConfig = {\n            client: templateVariables['db-client'],\n            config: {\n                host: templateVariables['db-host'],\n                port: Number(templateVariables['db-port']),\n                database: templateVariables['db-name'],\n                user: templateVariables['db-username'],\n                password: templateVariables['db-password'],\n                multipleStatements: true\n            },\n            debug: '1' === process?.env?.RELDENS_DEBUG_QUERIES\n        };\n        // ObjectionJsDriver, MikroOrmDriver, or PrismaDriver:\n        let dbDriver = false;\n        let migrationsPath = FileHandler.joinPaths(this.themeManager.reldensModulePath, 'migrations', 'production');\n        let driverInstallationClass = 'prisma' === storageDriverKey\n            ? this.prismaInstallation\n            : this.genericDriverInstallation;\n        this.updateInstallStatus('Installing database driver: '+storageDriverKey+'...');\n        let installationResult = await driverInstallationClass.executeInstallation(\n            selectedDriver,\n            dbConfig,\n            templateVariables,\n            migrationsPath\n        );\n        if(!installationResult.success){\n            Logger.critical('Driver installation failed: '+storageDriverKey);\n            return res.redirect('/?error='+installationResult.error);\n        }\n        dbDriver = installationResult.dbDriver;\n        if(!dbDriver){\n            Logger.critical('Database driver not initialized.');\n            return res.redirect('/?error=driver-not-initialized');\n        }\n        this.updateInstallStatus('Generating entities from database schema...');\n        let entitiesGenerated = await this.entitiesInstallation.generateEntities(\n            dbDriver,\n            true,\n            true,\n            false,\n            dbConfig,\n            storageDriverKey\n        );\n        if(!entitiesGenerated){\n            Logger.critical('Entities generation failed.');\n            return res.redirect('/?error=entities-generation-failed');\n        }\n        Logger.info('Entities generated successfully.');\n        // @NOTE: do NOT disconnect for Prisma - we need to pass the driver to the callback.\n        if('prisma' !== storageDriverKey){\n            await dbDriver.disconnect();\n        }\n        if('' === templateVariables['app-admin-path']){\n            templateVariables['app-admin-path'] = '/reldens-admin';\n        }\n        if('' === templateVariables['app-admin-secret']){\n            return res.redirect('/?error=db-installation-process-failed-missing-admin-secret');\n        }\n        this.setDatabaseUrl(templateVariables);\n        this.updateInstallStatus('Creating project files...');\n        let filesCreation = await this.projectFilesCreation.createProjectFiles(\n            templateVariables,\n            storageDriverKey,\n            dbDriver\n        );\n        if(!filesCreation.success){\n            return res.redirect('/?error='+filesCreation.error);\n        }\n        this.updateInstallStatus('Installation completed successfully!');\n        return res.redirect(templateVariables['app-host']+':'+templateVariables['app-port']);\n    }\n\n    /**\n     * @param {Object<string, any>} templateVariables\n     */\n    setDatabaseUrl(templateVariables)\n    {\n        let provider = sc.get(templateVariables, 'db-client', 'mysql');\n        if(-1 !== provider.indexOf('mysql')){\n            provider = 'mysql';\n        }\n        let user = sc.get(templateVariables, 'db-username', '');\n        let password = sc.get(templateVariables, 'db-password', '');\n        let host = sc.get(templateVariables, 'db-host', 'localhost');\n        let port = sc.get(templateVariables, 'db-port', '3306');\n        let database = sc.get(templateVariables, 'db-name', '');\n        templateVariables['db-url'] = provider+'://'+user+':'+password+'@'+host+':'+port+'/'+database;\n    }\n\n    /**\n     * @param {Object<string, any>} templateVariables\n     */\n    normalizeFilePaths(templateVariables)\n    {\n        let pathKeys = ['app-https-key-pem', 'app-https-cert-pem', 'app-https-chain-pem'];\n        for(let pathKey of pathKeys){\n            if(!sc.hasOwn(templateVariables, pathKey)){\n                continue;\n            }\n            let pathValue = templateVariables[pathKey];\n            if(!pathValue || 'string' !== typeof pathValue || '' === pathValue){\n                continue;\n            }\n            templateVariables[pathKey] = pathValue.replace(/\\\\/g, '/');\n        }\n    }\n\n    cleanAssets()\n    {\n        let removeFolders = [\n            ['audio'],\n            ['custom', 'actions'],\n            ['custom', 'groups'],\n            ['custom', 'items'],\n            ['custom', 'rewards'],\n            ['maps']\n        ];\n        for(let folderPath of removeFolders){\n            let assetsFolder = FileHandler.joinPaths(this.themeManager.projectAssetsPath, ...folderPath);\n            let assetsFolderDist = FileHandler.joinPaths(this.themeManager.assetsDistPath, ...folderPath);\n            FileHandler.remove(assetsFolder);\n            FileHandler.remove(assetsFolderDist);\n            FileHandler.createFolder(assetsFolder);\n            FileHandler.createFolder(assetsFolderDist);\n            Logger.debug('Empty folders paths.', assetsFolder, assetsFolderDist, folderPath);\n        }\n        let spritesPath = FileHandler.joinPaths(this.themeManager.projectAssetsPath, 'custom', 'sprites');\n        if(FileHandler.exists(spritesPath)){\n            let spritesInAssets = FileHandler.readFolder(spritesPath);\n            for(let fileName of spritesInAssets){\n                if(GameConst.IMAGE_PLAYER_BASE !== fileName){\n                    let fileToRemove = FileHandler.joinPaths(spritesPath, fileName);\n                    FileHandler.remove(fileToRemove);\n                    Logger.debug('Removed file path', fileToRemove);\n                }\n            }\n        }\n        let spritesDistPath = FileHandler.joinPaths(this.themeManager.assetsDistPath, 'custom', 'sprites');\n        if(FileHandler.exists(spritesDistPath)){\n            let spritesInAssetsDist = FileHandler.readFolder(spritesDistPath);\n            for(let fileName of spritesInAssetsDist){\n                if(GameConst.IMAGE_PLAYER_BASE !== fileName){\n                    let fileToRemove = FileHandler.joinPaths(spritesDistPath, fileName);\n                    FileHandler.remove(fileToRemove);\n                    Logger.debug('Removed file path', fileToRemove);\n                }\n            }\n        }\n        Logger.info('Assets cleaned successfully.');\n    }\n\n    /**\n     * @param {ExpressNextFunction} next\n     * @param {ExpressRequest} req\n     * @param {ExpressResponse} res\n     * @param {ExpressApplication} applicationFramework\n     * @returns {Promise<void|ExpressResponse>} Next middleware, response, or void\n     */\n    async executeForEveryRequest(next, req, res, applicationFramework)\n    {\n        if(this.isInstalled()){\n            return next();\n        }\n        if('' === req._parsedUrl.pathname || '/' === req._parsedUrl.pathname){\n            return res.send(await TemplateEngine.render(\n                FileHandler.readFile(this.themeManager.installerPathIndex),\n                req?.session?.templateVariables || this.fetchDefaults()\n            ));\n        }\n        if(!req.url.endsWith('.html')){\n            return applicationFramework.static(this.themeManager.installerPath)(req, res, next);\n        }\n        next();\n    }\n\n    /**\n     * @returns {Object<string, any>} Default template variables from environment or hardcoded defaults\n     */\n    fetchDefaults()\n    {\n        let host = sc.get(process.env, 'RELDENS_HOST', '');\n        let port = sc.get(process.env, 'RELDENS_PORT', '');\n        let publicUrl = sc.get(process.env, 'RELDENS_PUBLIC_URL', '');\n        let trustedProxy = sc.get(process.env, 'RELDENS_EXPRESS_TRUSTED_PROXY', '');\n        let adminPath = sc.get(process.env, 'RELDENS_ADMIN_ROUTE_PATH', '');\n        let hotPlug = Number(sc.get(process.env, 'RELDENS_HOT_PLUG', 1));\n        let dbClient = sc.get(process.env, 'RELDENS_DB_CLIENT', '');\n        let dbHost = sc.get(process.env, 'RELDENS_DB_HOST', '');\n        let dbPort = sc.get(process.env, 'RELDENS_DB_PORT', '');\n        let dbName = sc.get(process.env, 'RELDENS_DB_NAME', '');\n        return {\n            'app-host': '' !== host ? host : 'http://localhost',\n            'app-port': '' !== port ? port : '8080',\n            'app-public-url': '' !== publicUrl ? publicUrl : 'http://localhost:8080',\n            'app-trusted-proxy': trustedProxy,\n            'app-admin-path': '' !== adminPath ? adminPath : '/reldens-admin',\n            'app-admin-hot-plug-checked': 1 === hotPlug ? ' checked=\"checked\"' : '',\n            'app-allow-packages-installation-checked': ' checked=\"checked\"',\n            'db-storage-driver-prisma': ' selected=\"selected\"',\n            'db-client': '' !== dbClient ? dbClient : 'mysql2',\n            'db-host': '' !== dbHost ? dbHost : 'localhost',\n            'db-port': '' !== dbPort ? dbPort : '3306',\n            'db-name': '' !== dbName ? dbName : 'reldens',\n            'db-basic-config-checked': ' checked=\"checked\"',\n            'db-sample-data-checked': ' checked=\"checked\"'\n        };\n    }\n\n    /**\n     * @returns {string} Default file encoding from environment (default: 'utf8')\n     */\n    encoding()\n    {\n        return sc.get(process.env, 'RELDENS_DEFAULT_ENCODING', 'utf8');\n    }\n\n    /**\n     * @param {Object<string, any>} templateVariables\n     */\n    setCheckboxesMissingValues(templateVariables)\n    {\n        this.setVariable(templateVariables, 'app-admin-hot-plug');\n        this.setVariable(templateVariables, 'app-allow-packages-installation');\n        this.setVariable(templateVariables, 'app-use-https');\n        this.setVariable(templateVariables, 'app-use-monitor');\n        this.setVariable(templateVariables, 'app-secure-monitor');\n        this.setVariable(templateVariables, 'app-limit-key-generator');\n        this.setVariable(templateVariables, 'db-basic-config');\n        this.setVariable(templateVariables, 'db-sample-data');\n        this.setVariable(templateVariables, 'mailer-enable');\n        this.setVariable(templateVariables, 'mailer-secure');\n        this.setVariable(templateVariables, 'firebase-enable');\n    }\n\n    /**\n     * @param {Object<string, any>} templateVariables\n     * @param {string} checkboxId\n     */\n    setVariable(templateVariables, checkboxId)\n    {\n        if(!sc.hasOwn(templateVariables, checkboxId)){\n            templateVariables[checkboxId] = '0';\n            return;\n        }\n        templateVariables[checkboxId+'-checked'] = ' checked=\"checked\"';\n    }\n\n    /**\n     * @param {Object<string, any>} templateVariables\n     */\n    setSelectedOptions(templateVariables)\n    {\n        let selectedDriver = sc.get(templateVariables, 'db-storage-driver', 'prisma');\n        let selected = ' selected=\"selected\"';\n        templateVariables['db-storage-driver-objection-js'] = 'objection-js' === selectedDriver ? selected : '';\n        templateVariables['db-storage-driver-mikro-orm'] = 'mikro-orm' === selectedDriver ? selected : '';\n        templateVariables['db-storage-driver-prisma'] = 'prisma' === selectedDriver ? selected : '';\n        let selectedMailer = templateVariables['mailer-service'];\n        templateVariables['mailer-service-sendgrid'] = 'sendgrid' === selectedMailer ? selected : '';\n        templateVariables['mailer-service-nodemailer'] = 'nodemailer' === selectedMailer ? selected : '';\n    }\n\n}\n\nmodule.exports.Installer = Installer;\n"
  },
  {
    "path": "lib/game/server/login-manager.js",
    "content": "/**\n *\n * Reldens - LoginManager\n *\n * Manages all user authentication flows including login, registration, guest users, password reset,\n * and multiserver player disconnection. Handles user validation, password encryption, player creation,\n * initial state setup, and coordinates with the mailer for forgot password emails. Integrates with\n * ConfigManager, UsersManager, RoomsManager, and Mailer. Listens to events for custom authentication hooks.\n *\n */\n\nconst { RoomGame } = require('../../rooms/server/game');\nconst { ActivePlayers } = require('./memory/active-players');\nconst { RoomsConst } = require('../../rooms/constants');\nconst { GameConst } = require('../constants');\nconst { Encryptor } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('express').Application} ExpressApplication\n * @typedef {import('express').Request} ExpressRequest\n * @typedef {import('http').Server} HttpServer\n * @typedef {import('https').Server} HttpsServer\n *\n * @typedef {Object} LoginManagerProps\n * @property {ConfigManager} config\n * @property {Object<string, any>} configServer\n * @property {UsersManager} usersManager\n * @property {RoomsManager} roomsManager\n * @property {ExpressApplication|HttpServer|HttpsServer} appServer\n * @property {Mailer} mailer\n * @property {ThemeManager} themeManager\n * @property {EventsManager} [events]\n */\nclass LoginManager\n{\n\n    /**\n     * @param {LoginManagerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {ConfigManager} */\n        this.config = props.config;\n        /** @type {Object<string, any>} */\n        this.configServer = props.configServer;\n        /** @type {UsersManager} */\n        this.usersManager = props.usersManager;\n        /** @type {RoomsManager} */\n        this.roomsManager = props.roomsManager;\n        /** @type {Encryptor} */\n        this.passwordManager = Encryptor;\n        /** @type {ExpressApplication|HttpServer|HttpsServer} */\n        this.appServer = props.appServer;\n        /** @type {Mailer} */\n        this.mailer = props.mailer;\n        /** @type {ThemeManager} */\n        this.themeManager = props.themeManager;\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        this.listenEvents();\n        /** @type {{x: number, y: number, dir: string}} */\n        this.defaultStatePosition = {\n            x: this.config.get('client/map/tileData/width', 32) * 2,\n            y: this.config.get('client/map/tileData/height', 32) * 2,\n            dir: GameConst.DOWN\n        };\n        /** @type {boolean} */\n        this.disconnectUsersOnServerChange = this.config.getWithoutLogs(\n            'server/players/disconnectUsersOnServerChange',\n            true\n        );\n        /** @type {boolean} */\n        this.allowGuestUserName = this.config.getWithoutLogs('client/general/users/allowGuestUserName', false);\n        /** @type {string} */\n        this.guestEmailDomain = this.config.getWithoutLogs('server/players/guestsUser/emailDomain');\n        /** @type {typeof ActivePlayers} */\n        this.activePlayers = ActivePlayers;\n        this.activePlayers.guestsEmailDomain = this.guestEmailDomain;\n        /** @type {string} */\n        this.serverSelfUrl = this.configServer.publicUrl || this.configServer.host +':'+this.configServer.port;\n        /** @type {Object<string, Array<string>>} */\n        this.roomsPerServer = this.mapRoomsServers();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager undefined in LoginManager.');\n            return false;\n        }\n        this.events.on('reldens.serverBeforeListen', async (props) => {\n            await props.serverManager.app.post(GameConst.ROUTE_PATHS.DISCONNECT_USER, async (req, res) => {\n                let disconnectedUserResult = {isSuccess: await this.disconnectUserByLoginData(req)};\n                //Logger.debug('Disconnected user result:', disconnectedUserResult);\n                res.json(disconnectedUserResult);\n            });\n            // @TODO - BETA - Refactor, move into the initial request data and avoid the extra requests from the client.\n            await props.serverManager.app.get(GameConst.ROUTE_PATHS.MAILER, async (req, res) => {\n                res.json({\n                    enabled: this.mailer?.isEnabled()\n                });\n            });\n            props.serverManager.app.get(GameConst.ROUTE_PATHS.TERMS_AND_CONDITIONS, (req, res) => {\n                let languageParam = req.query.lang || '';\n                let termsConfig = this.config.getWithoutLogs(\n                    'client/login/termsAndConditions/'+languageParam,\n                    this.config.getWithoutLogs(\n                        'client/login/termsAndConditions',\n                        {}\n                    )\n                );\n                res.json({\n                    link: sc.get(termsConfig, 'link', ''),\n                    heading: sc.get(termsConfig, 'heading', ''),\n                    body: sc.get(termsConfig, 'body', ''),\n                    checkboxLabel: sc.get(termsConfig, 'checkboxLabel', '')\n                });\n            });\n        });\n        return true;\n    }\n\n    /**\n     * @param {ExpressRequest} req\n     * @returns {Promise<boolean>}\n     */\n    async disconnectUserByLoginData(req)\n    {\n        let userData = req.body;\n        if(!userData || !userData?.username){\n            //Logger.debug('Missing user data in request body.', req.body);\n            return false;\n        }\n        //Logger.debug('Disconnect user by login data:', userData?.username);\n        let activePlayer = this.activePlayers.fetchByRoomAndUserName(\n            userData.username,\n            this.activePlayers.gameRoomInstanceId\n        );\n        if(!activePlayer){\n            //Logger.debug('Missing active player.');\n            return true;\n        }\n        if(!activePlayer.userModel){\n            //Logger.debug('Missing active player user model.');\n            return false;\n        }\n        if(!await this.login(activePlayer.userModel, userData)){\n            return false;\n        }\n        return await this.disconnectUserFromEveryRoom(activePlayer.userModel);\n    }\n\n    /**\n     * @returns {Object<string, Array<string>>}\n     */\n    mapRoomsServers()\n    {\n        let roomsServersConfig = this.config.getWithoutLogs('client/rooms/servers', {});\n        let roomsServers = {};\n        for(let roomName of Object.keys(roomsServersConfig)){\n            if(!roomsServers[roomsServersConfig[roomName]]){\n                roomsServers[roomsServersConfig[roomName]] = [];\n            }\n            roomsServers[roomsServersConfig[roomName]].push(roomName);\n        }\n        // Logger.debug('Mapped rooms servers:', roomsServers);\n        return roomsServers;\n    }\n\n    /**\n     * @param {Object} userModel\n     * @param {Object<string, any>} options\n     * @returns {Promise<boolean>}\n     */\n    async broadcastDisconnectionMessage(userModel, options)\n    {\n        if(!this.disconnectUsersOnServerChange){\n            //Logger.debug('Configuration \"disconnectUsersOnServerChange\" is disabled.');\n            return true;\n        }\n        let roomServersList = Object.keys(this.roomsPerServer);\n        if(0 === roomServersList.length){\n            //Logger.debug('None Rooms in servers list to trigger disconnection.');\n            return true;\n        }\n        for(let serverUrl of roomServersList){\n            if(this.serverSelfUrl === serverUrl){\n                //Logger.debug('Current host is the room serverUrl:', this.serverSelfUrl, serverUrl);\n                continue;\n            }\n            //Logger.debug('Try disconnection from server URL:', serverUrl);\n            let disconnectionResult = await this.disconnectFromServer(serverUrl, options);\n            if(!disconnectionResult){\n                //Logger.debug('Disconnection result false.', disconnectionResult);\n                return false;\n            }\n        }\n        //Logger.debug('User disconnected from other servers.');\n        return true;\n    }\n\n    /**\n     * @param {string} serverUrl\n     * @param {Object<string, any>} options\n     * @returns {Promise<boolean>}\n     */\n    async disconnectFromServer(serverUrl, options)\n    {\n        let disconnectUrl = serverUrl+GameConst.ROUTE_PATHS.DISCONNECT_USER;\n        let body = JSON.stringify(options);\n        //Logger.debug('Disconnect from server \"'+disconnectUrl+'\", sending body: '+body);\n        let result = false;\n        try {\n            let response = await fetch(\n                disconnectUrl,\n                {\n                    method: 'POST',\n                    headers: {\n                        'Content-Type': 'application/json',\n                        'Content-Length': Buffer.byteLength(body)\n                    },\n                    body,\n                }\n            );\n            let responseData = await response?.json();\n            //Logger.debug('Disconnect from server response status: '+response.status, 'Response data:', responseData);\n            result = responseData.isSuccess;\n        } catch (error) {\n            Logger.error('Disconnect from server error.', serverUrl, error.message);\n            // if secondary server is down we will allow the user to login on the other server\n            result = true;\n        }\n        return result;\n    }\n\n    /**\n     * @param {Object} userModel\n     * @param {boolean} [avoidGameRoom=false]\n     * @returns {Promise<boolean>}\n     */\n    async disconnectUserFromEveryRoom(userModel, avoidGameRoom = false)\n    {\n        Logger.debug('Disconnect logged user: '+userModel.username);\n        let createdRoomsKeys = Object.keys(this.roomsManager.createdInstances);\n        for(let i of createdRoomsKeys){\n            let roomScene = this.roomsManager.createdInstances[i];\n            if(avoidGameRoom && roomScene instanceof RoomGame){\n                // there must be a single instance of RoomGame and we need to avoid it from disconnection:\n                Logger.debug('Avoiding RoomGame disconnection.');\n                continue;\n            }\n            let activePlayer = roomScene.activePlayerByUserName(userModel.username, roomScene.roomId);\n            if(!activePlayer){\n                Logger.debug(\n                    'Active player not found by username \"'+userModel.username+'\" in room: '\n                    +roomScene.roomName+' (ID: '+roomScene.roomId+').'\n                );\n                continue;\n            }\n            if(!sc.isFunction(roomScene.disconnectBySessionId)){\n                Logger.warning(\n                    'RoomScene ('+typeof roomScene+') does not have a \"disconnectBySessionId\" method. '\n                    +roomScene.roomName+' (ID: '+roomScene.roomId+').'\n                );\n                continue;\n            }\n            await roomScene.disconnectBySessionId(activePlayer.sessionId, activePlayer.client, userModel);\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object<string, any>|false} [userData=false]\n     * @returns {Promise<Object<string, any>>}\n     */\n    async processUserRequest(userData = false)\n    {\n        if(sc.hasOwn(userData, 'forgot')){\n            return await this.processForgotPassword(userData);\n        }\n        this.events.emitSync('reldens.processUserRequestIsValidDataBefore', this, userData);\n        let result = {error: 'Invalid user data.'};\n        if(!this.hasValidUserName(userData)){\n            Logger.debug('Missing username.', userData);\n            this.events.emitSync('reldens.invalidData', this, userData, result);\n            return result;\n        }\n        let user = await this.usersManager.loadUserByUsername(userData.username);\n        if(user && userData.isGuest && userData.isNewUser){\n            Logger.debug('Guest login invalid user data.', userData);\n            this.events.emitSync('reldens.guestLoginInvalidParams', this, user, userData, result);\n            return result;\n        }\n        if(user){\n            return await this.login(user, userData);\n        }\n        if(userData.isGuest){\n            userData = this.overrideWithGuestData(userData);\n            return await this.register(userData);\n        }\n        if(!userData.isNewUser){\n            Logger.info('Invalid user login data.', {user: userData.username});\n            this.events.emitSync('reldens.loginInvalidParams', this, user, userData, result);\n        }\n        if(userData.isNewUser){\n            user = await this.usersManager.loadUserByEmail(userData.email);\n            if(user){\n                Logger.info('User already exists.', userData);\n                this.events.emitSync('reldens.registrationInvalidParams', this, user, userData, result);\n            }\n            if(!user){\n                return await this.register(userData);\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @param {Object<string, any>} userData\n     * @returns {Object<string, any>}\n     */\n    overrideWithGuestData(userData)\n    {\n        if(-1 === userData.username.indexOf('guest-')){\n            let guestNameWithTimestamp = 'guest-' + sc.getTime() + '-';\n            userData.username = this.allowGuestUserName\n                ? userData.username.replace('guest-', guestNameWithTimestamp)\n                : guestNameWithTimestamp;\n        }\n        userData.email = userData.username+this.guestEmailDomain;\n        userData.password = sc.randomChars(12);\n        return userData;\n    }\n\n    /**\n     * @param {Object<string, any>} userData\n     * @returns {boolean}\n     */\n    hasValidUserName(userData)\n    {\n        return !(!userData || !sc.hasOwn(userData, 'username') || !userData.username.length);\n    }\n\n    /**\n     * @param {Object} user\n     */\n    mapPlayerStateRelation(user)\n    {\n        if(!sc.isArray(user.related_players)){\n            return;\n        }\n        for(let player of user.related_players){\n            if(player.related_players_state && !player.state){\n                player.state = player.related_players_state;\n            }\n        }\n    }\n\n    /**\n     * @param {Object} user\n     * @param {Object<string, any>} userData\n     * @returns {Promise<Object<string, any>>}\n     */\n    async login(user, userData)\n    {\n        let result = {error: 'Login, invalid user data.'};\n        // check guest user:\n        if(!this.isValidGuestLogin(userData, user)){\n            Logger.error('Guest user is not active for login.', userData);\n            this.events.emitSync('reldens.loginInvalidRole', this, user, userData, result);\n            return result;\n        }\n        // check if the passwords match:\n        if(!this.passwordManager.validatePassword(userData.password, user.password)){\n            Logger.error('Invalid password for user login.', userData);\n            this.events.emitSync('reldens.loginInvalidPassword', this, user, userData, result);\n            return result;\n        }\n        try {\n            if(sc.isArray(user.related_players) && 0 < user.related_players.length){\n                this.mapPlayerStateRelation(user);\n                // set the scene on the user players:\n                this.events.emitSync('reldens.setSceneOnPlayers', this, user, userData);\n                await this.setSceneOnPlayers(user, userData);\n            }\n            let result = {user: user};\n            this.events.emitSync('reldens.loginSuccess', this, user, userData, result);\n            return result;\n        } catch (error) {\n            Logger.error('Login try/catch error.', error, userData);\n            this.events.emitSync('reldens.loginError', this, user, userData, result);\n            return result;\n        }\n    }\n\n    /**\n     * @param {Object<string, any>} userData\n     * @param {Object} user\n     * @returns {boolean}\n     */\n    isValidGuestLogin(userData, user)\n    {\n        let guestRoleId = this.config.server?.players?.guestUser?.roleId || 0;\n        if(0 === guestRoleId){\n            Logger.warning('Guest role ID is not defined by configuration.');\n            return true;\n        }\n        if(!userData.isGuest && user.role_id !== guestRoleId){\n            return true;\n        }\n        return Boolean(this.activePlayers.fetchByRoomAndUserName(user.username, this.activePlayers.gameRoomInstanceId));\n    }\n\n    /**\n     * @param {Object} user\n     * @param {Object<string, any>} userData\n     * @returns {Promise<void>}\n     */\n    async setSceneOnPlayers(user, userData)\n    {\n        for(let player of user.related_players){\n            //Logger.debug('Player state:', player);\n            if(!player.state){\n                continue;\n            }\n            let config = this.config.get('client/rooms/selection');\n            if(\n                config.allowOnLogin\n                && userData['selectedScene']\n                && userData['selectedScene'] !== RoomsConst.ROOM_LAST_LOCATION_KEY\n            ){\n                await this.applySelectedLocation(player, userData['selectedScene']);\n            }\n            //Logger.debug('Get room name by ID. Player state:', player.state);\n            player.state.scene = await this.getRoomNameById(player.state.room_id);\n        }\n    }\n\n    /**\n     * @param {string} email\n     * @param {string} password\n     * @param {number} [roleId=0]\n     * @returns {Promise<Object|false>}\n     */\n    async roleAuthenticationCallback(email, password, roleId = 0)\n    {\n        let user = await this.usersManager.loadUserByEmail(email);\n        let validatedRole = 0 === roleId || String(user.role_id) === String(roleId);\n        if(user && validatedRole){\n            let result = this.passwordManager.validatePassword(\n                password,\n                user.password\n            );\n            if(result){\n                return user;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @param {Object} player\n     * @param {string} selectedScene\n     * @returns {Promise<boolean|void>}\n     */\n    async applySelectedLocation(player, selectedScene)\n    {\n        let selectedRoom = await this.roomsManager.loadRoomByName(selectedScene);\n        if(!selectedRoom){\n            return false;\n        }\n        player.state = this.getStateObjectFromRoom(selectedRoom);\n    }\n\n    /**\n     * @param {number} roomId\n     * @returns {Promise<string>}\n     */\n    async getRoomNameById(roomId)\n    {\n        let playerRoom = await this.roomsManager.loadRoomById(roomId);\n        if(playerRoom){\n            return playerRoom.roomName;\n        }\n        return GameConst.ROOM_NAME_MAP;\n    }\n\n    /**\n     * @param {Object<string, any>} userData\n     * @returns {Promise<Object<string, any>>}\n     */\n    async register(userData)\n    {\n        let result = {error: 'Registration error, there was an error with your request, please try again later.'};\n        if(!userData.isNewUser){\n            Logger.error('Registration invalid parameters.', userData);\n            await this.events.emit('reldens.register', this, userData, result);\n            return result;\n        }\n        try {\n            // if the email doesn't exist in the database, and it's a registration request:\n            // insert user, player, player state, player stats, class path:\n            let defaultRoleId = this.config.server.players.initialUser.roleId;\n            let roleId = !userData.isGuest ? defaultRoleId : this.config.server.players.guestUser.roleId;\n            let newUser = await this.usersManager.createUser({\n                email: userData.email,\n                username: userData.username,\n                password: this.passwordManager.encryptPassword(userData.password),\n                role_id: roleId,\n                status: this.config.server.players.initialUser.status\n            });\n            let result = {user: newUser};\n            await this.events.emit('reldens.createNewUserAfter', newUser, this, result);\n            return result;\n        } catch (error) {\n            Logger.error('Registration try/catch error.', error,  userData);\n            await this.events.emit('reldens.createNewUserError', this, userData, result);\n            return result;\n        }\n    }\n\n    /**\n     * @param {Object<string, any>} loginData\n     * @returns {Promise<Object<string, any>>}\n     */\n    async createNewPlayer(loginData)\n    {\n        // @TODO - BETA - Replace all result.message hardcoded values by snippets.\n        let minimumPlayerNameLength = this.config.getWithoutLogs('client/players/name/minimumLength', 3);\n        if(minimumPlayerNameLength > loginData['new-player-name'].toString().length){\n            let result = {error: true, message: 'Invalid player name, please choose another name.'};\n            await this.events.emit('reldens.playerNewName', this, loginData, result);\n            return result;\n        }\n        let initialState = await this.prepareInitialState(loginData['selectedScene']);\n        if(!await this.validateInitialState(initialState)){\n            let result = {\n                error: true,\n                message: 'There was an error with the player initial state, please contact the administrator.'\n            };\n            await this.events.emit('reldens.playerSceneUnavailable', this, loginData, result);\n            return result;\n        }\n        let playerData = {\n            name: loginData['new-player-name'],\n            user_id: loginData.user_id,\n            state: initialState\n        };\n        await this.events.emit('reldens.createNewPlayerBefore', loginData, playerData, this);\n        let isNameAvailable = await this.usersManager.isNameAvailable(playerData.name);\n        if(!isNameAvailable){\n            let result = {error: true, message: 'The player name is not available, please choose another name.'};\n            await this.events.emit('reldens.playerNewNameUnavailable', this, loginData, isNameAvailable, result);\n            return result;\n        }\n        try {\n            let player = await this.usersManager.createPlayer(playerData);\n            if(player.related_players_state && !player.state){\n                player.state = player.related_players_state;\n            }\n            player.state.scene = await this.getRoomNameById(initialState.room_id);\n            let result = {error: false, player};\n            await this.events.emit('reldens.createdNewPlayer', player, loginData, this, result);\n            return result;\n        } catch (error) {\n            Logger.error('Player creation error.', error.message);\n            let result = {error: true, message: 'There was an error creating your player, please try again.'};\n            await this.events.emit('reldens.createNewPlayerCriticalError', this, loginData, error, result);\n            return result;\n        }\n    }\n\n    /**\n     * @param {Object<string, any>} initialState\n     * @returns {Promise<Object|false>}\n     */\n    async validateInitialState(initialState)\n    {\n        if(!initialState){\n            return false;\n        }\n        let roomId = sc.get(initialState, 'room_id', false);\n        if(false === roomId){\n            return false;\n        }\n        return await this.roomsManager.loadRoomById(roomId);\n    }\n\n    /**\n     * @param {string} roomName\n     * @returns {Promise<Object<string, any>|false>}\n     */\n    async prepareInitialState(roomName)\n    {\n        let config = this.config.get('client/rooms/selection');\n        let initialState = this.config.server.players.initialState;\n        if(!config.allowOnRegistration || !roomName){\n            if(!initialState){\n                Logger.critical('Initial state is not defined!');\n                return false;\n            }\n            return initialState;\n        }\n        let selectedRoom = await this.roomsManager.loadRoomByName(roomName);\n        if(!selectedRoom){\n            if(!initialState){\n                Logger.critical('Initial state is not defined!');\n                return false;\n            }\n            return initialState;\n        }\n        return this.getStateObjectFromRoom(selectedRoom);\n    }\n\n    /**\n     * @param {Object} selectedRoom\n     * @returns {Object<string, any>}\n     */\n    getStateObjectFromRoom(selectedRoom)\n    {\n        // clone the default position and set the room id:\n        let stateData = Object.assign({room_id: selectedRoom.roomId}, this.defaultStatePosition);\n        if(selectedRoom.returnPointDefault){\n            stateData.x = selectedRoom.returnPointDefault[RoomsConst.RETURN_POINT_KEYS.X];\n            stateData.y = selectedRoom.returnPointDefault[RoomsConst.RETURN_POINT_KEYS.Y];\n            stateData.dir = selectedRoom.returnPointDefault[RoomsConst.RETURN_POINT_KEYS.DIRECTION];\n        }\n        return stateData;\n    }\n\n    /**\n     * @param {Object} userModel\n     * @returns {Promise<boolean>}\n     */\n    async updateLastLogin(userModel)\n    {\n        let updated = await this.usersManager.updateUserLastLogin(userModel);\n        if(!updated){\n            // @TODO - BETA - Logout user.\n            Logger.error('Last login update fail on user with ID \"'+userModel.id+'\".');\n        }\n        return updated;\n    }\n\n    /**\n     * @param {Object<string, any>} userData\n     * @returns {Promise<Object<string, any>>}\n     */\n    async processForgotPassword(userData)\n    {\n        // @TODO - WIP - TRANSLATIONS.\n        if(!this.mailer.isEnabled()){\n            return {error: 'The forgot password email can not be send, please contact the administrator.'};\n        }\n        if(!sc.hasOwn(userData, 'email')){\n            return {error: 'Please complete your email.'};\n        }\n        let existsMessage = {error: 'If the email exists then a reset password link should be received soon.'};\n        let user = await this.usersManager.loadUserByEmail(userData.email);\n        if(!user){\n            return existsMessage;\n        }\n        let forgotLimit = Number(process.env.RELDENS_MAILER_FORGOT_PASSWORD_LIMIT) || 4;\n        let microLimit = Date.now() - (forgotLimit * 60 * 60 * 1000);\n        let statusInt = Number(user.status);\n        if(statusInt >= microLimit){\n            Logger.debug('Reset link already sent to \"'+userData.email+'\".', statusInt);\n            return existsMessage;\n        }\n        let sendResult = {result: await this.sendForgotPasswordEmail(userData, user.password)};\n        if(sendResult.result){\n            Logger.debug('Reset link sent to \"'+userData.email+'\".');\n            await this.usersManager.updateUserByEmail(userData.email, {status: Date.now()});\n        }\n        this.events.emitSync('reldens.processForgotPassword', this, userData, sendResult);\n        return existsMessage;\n    }\n\n    /**\n     * @param {Object<string, any>} userData\n     * @param {string} oldPassword\n     * @returns {Promise<boolean>}\n     */\n    async sendForgotPasswordEmail(userData, oldPassword)\n    {\n        // @TODO - WIP - TRANSLATIONS.\n        let emailPath = this.themeManager.assetPath('email', 'forgot.html');\n        let serverUrl = this.config.server.publicUrl || this.config.server.baseUrl;\n        let resetLink = serverUrl+'/reset-password?email='+userData.email+'&id='+oldPassword;\n        let subject = this.config.getWithoutLogs('server/mailer/forgotPassword/subject', 'Forgot password');\n        let content = await this.themeManager.loadAndRenderTemplate(emailPath, {resetLink: resetLink});\n        // @TODO - BETA - Make all system messages configurable.\n        try {\n            return await this.mailer.sendEmail({\n                from: this.mailer.from,\n                to: userData.email,\n                subject,\n                html: content\n            });\n        } catch (error) {\n            return false;\n        }\n    }\n\n}\n\nmodule.exports.LoginManager = LoginManager;\n"
  },
  {
    "path": "lib/game/server/mailer/nodemailer-factory.js",
    "content": "/**\n *\n * Reldens - NodemailerFactory\n *\n * Factory for creating and using the Nodemailer SMTP transporter.\n * Validates the mailer configuration, creates a secure transport, and provides a sendMail interface.\n * Used for standard SMTP email sending (e.g., Gmail, ForwardEmail, custom SMTP servers).\n *\n */\n\nconst Nodemailer = require('nodemailer');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('nodemailer').Transporter} Transporter\n *\n * @typedef {Object} MailerConfig\n * @property {string} host\n * @property {number} port\n * @property {string} user\n * @property {string} pass\n * @property {boolean} [secure]\n *\n * @typedef {Object} SendMailProps\n * @property {Transporter} transporter\n * @property {Object} mailOptions\n */\nclass NodemailerFactory\n{\n\n    /**\n     * @param {MailerConfig} mailer\n     * @returns {Transporter|false}\n     */\n    setup(mailer)\n    {\n        if(!mailer){\n            Logger.error('Mailer not found on NodemailerFactory.');\n            return false;\n        }\n        if(!mailer.pass){\n            Logger.error('Required mailer password not found on NodemailerFactory.');\n            return false;\n        }\n        if(!mailer.host || !mailer.port || !mailer.user || !mailer.pass){\n            Logger.error('NodemailerFactory required configuration not specified.', {\n                host: mailer.host,\n                port: mailer.port,\n                user: mailer.user,\n                pass: mailer.pass\n            });\n            return false;\n        }\n        try {\n            return Nodemailer.createTransport({\n                host: mailer.host,\n                port: mailer.port,\n                secure: Boolean(sc.get(mailer, 'secure', true)),\n                auth: {\n                    // @NOTE: for example, this could be \"user\" and \"password\" values from https://forwardemail.net.\n                    user: mailer.user,\n                    pass: mailer.pass\n                }\n            });\n        } catch (error) {\n            Logger.error('Nodemailer transport error.', error);\n            return false;\n        }\n    }\n\n    /**\n     * @param {SendMailProps} props\n     * @returns {Promise<Object|false>}\n     */\n    async sendMail(props)\n    {\n        if(!props.transporter){\n            Logger.error('Transporter not found on Nodemailer.');\n            return false;\n        }\n        if(!props.mailOptions){\n            Logger.error('Mail options not found on Nodemailer.');\n            return false;\n        }\n        try {\n            return await props.transporter.sendMail(props.mailOptions);\n        } catch (error) {\n            Logger.error('Nodemailer sendMail error.', error, props.mailOptions);\n            return false;\n        }\n    }\n\n}\n\nmodule.exports.NodemailerFactory = NodemailerFactory;\n"
  },
  {
    "path": "lib/game/server/mailer/sendgrid-factory.js",
    "content": "/**\n *\n * Reldens - SendGridFactory\n *\n * Factory for creating and using the SendGrid mail service.\n * Validates the API key configuration, sets the SendGrid API key, and provides a sendMail interface.\n * Used for SendGrid-based transactional email sending with API integration.\n *\n */\n\nconst SendGridMail = require('@sendgrid/mail');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('@sendgrid/mail').MailService} MailService\n *\n * @typedef {Object} MailerConfig\n * @property {string} pass\n *\n * @typedef {Object} SendMailProps\n * @property {MailService} transporter\n * @property {Object} mailOptions\n */\nclass SendGridFactory\n{\n\n    /**\n     * @param {MailerConfig} mailer\n     * @returns {Promise<MailService|false>}\n     */\n    async setup(mailer)\n    {\n        if(!mailer){\n            Logger.error('Mailer not found on SendGridFactory.');\n            return false;\n        }\n        if(!mailer.pass){\n            Logger.error('Required mailer password not found on SendGridFactory.');\n            return false;\n        }\n        try {\n            SendGridMail.setApiKey(mailer.pass);\n            return SendGridMail;\n        } catch (error) {\n            Logger.error('SendGrid transport error.', error);\n            return false;\n        }\n    }\n\n    /**\n     * @param {SendMailProps} props\n     * @returns {Promise<Object|false>}\n     */\n    async sendMail(props)\n    {\n        if(!props.transporter){\n            Logger.error('Transporter not found on SendGrid.');\n            return false;\n        }\n        if(!props.mailOptions){\n            Logger.error('Mail options not found on SendGrid.');\n            return false;\n        }\n        try {\n            return await props.transporter.send(props.mailOptions);\n        } catch (error) {\n            Logger.error('SendGrid sendMail error.', error, error?.response?.body?.errors, props.mailOptions);\n            return false;\n        }\n    }\n\n}\n\nmodule.exports.SendGridFactory = SendGridFactory;\n"
  },
  {
    "path": "lib/game/server/mailer.js",
    "content": "/**\n *\n * Reldens - Mailer\n *\n * Email service abstraction layer supporting multiple mail providers (SendGrid, Nodemailer).\n * Manages email transporter configuration, credentials, and sending functionality. Configured\n * via environment variables or constructor props. Supports both text and HTML email formats.\n *\n */\n\nconst { SendGridFactory } = require('./mailer/sendgrid-factory');\nconst { NodemailerFactory } = require('./mailer/nodemailer-factory');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('nodemailer').Transporter} Transporter\n *\n * @typedef {Object} MailerProps\n * @property {string} [service]\n * @property {string|number} [port]\n * @property {string} [user]\n * @property {string} [pass]\n * @property {string} [from]\n * @property {string} [to]\n * @property {string} [subject]\n * @property {string} [text]\n */\nclass Mailer\n{\n\n    /**\n     * @param {MailerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Transporter|false} */\n        this.transporter = false;\n        /** @type {boolean} */\n        this.enabled = 1 === Number(process.env.RELDENS_MAILER_ENABLE || 0);\n        /** @type {string} */\n        this.service = (sc.get(props, 'service', (process.env.RELDENS_MAILER_SERVICE || ''))).toString();\n        /** @type {SendGridFactory|NodemailerFactory|false} */\n        this.serviceInstance = this.fetchServiceInstance(this.service);\n        /** @type {string|number} */\n        this.port = sc.get(props, 'port', process.env.RELDENS_MAILER_PORT);\n        /** @type {string} */\n        this.user = sc.get(props, 'user', process.env.RELDENS_MAILER_USER);\n        /** @type {string} */\n        this.pass = sc.get(props, 'pass', process.env.RELDENS_MAILER_PASS);\n        /** @type {string} */\n        this.from = sc.get(props, 'from', process.env.RELDENS_MAILER_FROM);\n        /** @type {string|false} */\n        this.to = sc.get(props, 'to', false);\n        /** @type {string|false} */\n        this.subject = sc.get(props, 'subject', false);\n        /** @type {string|false} */\n        this.text = sc.get(props, 'text', false);\n        /** @type {boolean} */\n        this.readyForSetup = this.enabled && this.serviceInstance;\n    }\n\n    /**\n     * @param {string} serviceKey\n     * @returns {SendGridFactory|NodemailerFactory|false} Service factory instance or false\n     */\n    fetchServiceInstance(serviceKey)\n    {\n        switch(serviceKey){\n            case 'sendgrid':\n                return new SendGridFactory();\n            case 'nodemailer':\n                return new NodemailerFactory();\n            default:\n                return false;\n        }\n    }\n\n    /**\n     * @returns {Promise<boolean>} True if transporter setup succeeded, false otherwise\n     */\n    async setupTransporter()\n    {\n        if(this.serviceInstance && sc.isObjectFunction(this.serviceInstance, 'setup')){\n            this.transporter = await this.serviceInstance.setup(this);\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * @returns {boolean} True if mailer is enabled and transporter is set up\n     */\n    isEnabled()\n    {\n        return this.enabled && this.transporter;\n    }\n\n    /**\n     * @param {Object} props\n     * @param {string} props.to\n     * @param {string} props.subject\n     * @param {string} [props.from]\n     * @param {string} [props.text]\n     * @param {string} [props.html]\n     * @returns {Promise<boolean>} True if email sent successfully, false otherwise\n     */\n    async sendEmail(props)\n    {\n        if(!sc.isObject(props)){\n            Logger.error('Send email empty properties error.');\n            return false;\n        }\n        if(!props.to || !props.subject || (!props.text && !props.html)){\n            Logger.error(\n                'Send email required properties missing.',\n                {to: props.to, subject: props.subject, text: props.text, html: props.html}\n            );\n            return false;\n        }\n        let mailOptions = {\n            from: props.from,\n            to: props.to,\n            subject: props.subject\n        };\n        if(sc.hasOwn(props, 'text')){\n            mailOptions.text = props.text;\n        }\n        if(sc.hasOwn(props, 'html')){\n            mailOptions.html = props.html;\n        }\n        if(!this.serviceInstance){\n            Logger.error('Missing mailer service instance.');\n            return false;\n        }\n        if(!sc.isObjectFunction(this.serviceInstance, 'sendMail')){\n            Logger.error('Missing sendMail is not a function.');\n            return false;\n        }\n        return await this.serviceInstance.sendMail({\n            mailOptions: mailOptions,\n            transporter: this.transporter\n        });\n    }\n\n}\n\nmodule.exports.Mailer = Mailer;\n"
  },
  {
    "path": "lib/game/server/manager.js",
    "content": "/**\n *\n * Reldens - ServerManager\n *\n * Main server orchestrator that manages game server, data storage, features, and configuration.\n * Initializes all subsystems (AppServer, GameServer, ConfigManager, FeaturesManager,\n * UsersManager, RoomsManager, LoginManager, Mailer) and coordinates the server lifecycle\n * from startup through configuration loading to game server initialization.\n *\n */\n\nconst dotenv = require('dotenv');\nconst { WebSocketTransport } = require('@colyseus/ws-transport');\nconst ReldensASCII = require('../reldens-ascii');\nconst PackageData = require('./../../../package.json');\nconst { GameServer } = require('./game-server');\nconst { HomepageLoader } = require('./homepage-loader');\nconst { ConfigManager } = require('../../config/server/manager');\nconst { DataServerInitializer } = require('./data-server-initializer');\nconst { FeaturesManager } = require('../../features/server/manager');\nconst { UsersManager } = require('../../users/server/manager');\nconst { LoginManager } = require('./login-manager');\nconst { RoomsManager } = require('../../rooms/server/manager');\nconst { Mailer } = require('./mailer');\nconst { ThemeManager } = require('./theme-manager');\nconst { MapsLoader } = require('./maps-loader');\nconst { ForgotPassword } = require('./forgot-password');\nconst { Installer } = require('./installer');\nconst { RoomScene } = require('../../rooms/server/scene');\nconst { GameConst } = require('../constants');\nconst { ChatConst } = require('../../chat/constants');\nconst { AppServerFactory } = require('@reldens/server-utils');\nconst { EventsManagerSingleton, Logger, sc } = require('@reldens/utils');\n\nclass ServerManager\n{\n\n    /** @type {Express.Application|false} */\n    app = false;\n    /** @type {http.Server|https.Server|Object} */\n    appServer = {};\n    /** @type {GameServer|false} */\n    gameServer = false;\n    /** @type {EventsManager|false} */\n    events = false;\n    /** @type {BaseDataServer|false} */\n    dataServerDriver = false;\n    /** @type {Object<string, any>} */\n    dataServerConfig = {};\n    /** @type {BaseDataServer|false} */\n    dataServer = false;\n    /** @type {BaseDataServer|null} */\n    installerDataServer = null;\n    /** @type {boolean} */\n    autoGenerateEntities = true;\n    /** @type {Object<string, any>|false} */\n    rawConfig = false;\n    /** @type {ConfigManager|Object} */\n    configManager = {};\n    /** @type {string} */\n    projectRoot = './';\n    /** @type {Object<string, any>|false} */\n    configServer = false;\n    /** @type {Mailer|false} */\n    mailer = false;\n    /** @type {FeaturesManager|false} */\n    featuresManager = false;\n    /** @type {RoomsManager|false} */\n    roomsManager = false;\n    /** @type {LoginManager|false} */\n    loginManager = false;\n    /** @type {UsersManager|false} */\n    usersManager = false;\n    /** @type {Object<string, string>} */\n    translations = {};\n\n    /**\n     * @param {Object<string, any>} config\n     * @param {EventsManager} [eventsManager]\n     * @param {BaseDataServer} [dataServerDriver]\n     */\n    constructor(config, eventsManager, dataServerDriver)\n    {\n        Logger.debug('Main server instance creation.', {config});\n        this.rawConfig = config;\n        this.dataServerDriver = dataServerDriver;\n        this.events = eventsManager || EventsManagerSingleton;\n        /** @type {ThemeManager} */\n        this.themeManager = new ThemeManager(config);\n        dotenv.config({debug: process.env.DEBUG, path: this.themeManager.envFilePath});\n        /** @type {AppServerFactory} */\n        this.appServerFactory = new AppServerFactory();\n        /** @type {string} */\n        this.installationType = String(process.env.RELDENS_INSTALLATION_TYPE || 'normal');\n        /** @type {Installer} */\n        this.installer = new Installer({\n            themeManager: this.themeManager,\n            installationType: this.installationType,\n            startCallback: async (props) => {\n                dotenv.config({debug: process.env.DEBUG, path: this.themeManager.envFilePath});\n                // for Prisma installations, the dataServer is passed with the prismaClient already set:\n                this.installerDataServer = sc.get(props, 'dataServer', null);\n                return await this.start();\n            }\n        });\n        this.initializeConfiguration(config);\n    }\n\n    /**\n     * @param {Object} config\n     * @returns {boolean|void}\n     */\n    setupCustomServerPlugin(config)\n    {\n        let customPluginClass = sc.get(config, 'customPlugin', false);\n        if(!customPluginClass){\n            return false;\n        }\n        /** @type {ServerPlugin} */\n        this.customPlugin = new customPluginClass();\n        this.customPlugin.setup({events: this.events});\n    }\n\n    /**\n     * @param {Object} config\n     */\n    initializeConfiguration(config)\n    {\n        Logger.info('Initialize Configuration.');\n        this.configManager = new ConfigManager({events: this.events, customClasses: (config.customClasses || {})});\n        this.projectRoot = sc.get(config, 'projectRoot', './');\n        Logger.info('Project root: '+this.projectRoot, 'Module root: '+__dirname);\n        this.configServer = this.fetchConfigServerFromEnvironmentVariables();\n        /** @type {boolean} */\n        this.isHotPlugEnabled = 1 === Number(process.env.RELDENS_HOT_PLUG || 1);\n        /** @type {string} */\n        this.guestsEmailDomain = String(process.env.RELDENS_GUESTS_EMAIL_DOMAIN || '@guest-reldens.com');\n    }\n\n    /**\n     * @returns {Object}\n     */\n    fetchConfigServerFromEnvironmentVariables()\n    {\n        let host = String(process.env.RELDENS_APP_HOST || 'http://localhost');\n        let port = Number(process.env.PORT || 0);\n        if(0 === port){\n            port = Number(process.env.RELDENS_APP_PORT || 0);\n            if(0 === port){\n                port = 8080;\n            }\n        }\n        let environmentConfig = {\n            appServerConfig: {\n                encoding: String(process.env.RELDENS_DEFAULT_ENCODING || 'utf-8'),\n                useHttps: 1 === Number(process.env.RELDENS_EXPRESS_USE_HTTPS || 0),\n                passphrase: String(process.env.RELDENS_EXPRESS_HTTPS_PASSPHRASE || ''),\n                httpsChain: String(process.env.RELDENS_EXPRESS_HTTPS_CHAIN || ''),\n                keyPath: String(process.env.RELDENS_EXPRESS_HTTPS_PRIVATE_KEY || ''),\n                certPath: String(process.env.RELDENS_EXPRESS_HTTPS_CERT || ''),\n                trustedProxy: String(process.env.RELDENS_EXPRESS_TRUSTED_PROXY || ''),\n                windowMs: Number(process.env.RELDENS_EXPRESS_RATE_LIMIT_MS || 60000),\n                maxRequests: Number(process.env.RELDENS_EXPRESS_RATE_LIMIT_MAX_REQUESTS || 30),\n                applyKeyGenerator: 1 === Number(process.env.RELDENS_EXPRESS_RATE_LIMIT_APPLY_KEY_GENERATOR || 0),\n                useHelmet: false\n            },\n            host,\n            port,\n            publicUrl: String(process.env.RELDENS_PUBLIC_URL || host+':'+port),\n            monitor: {\n                enabled: 1 === Number(process.env.RELDENS_MONITOR || 0) || false,\n                auth: Boolean(process.env.RELDENS_MONITOR_AUTH || false),\n                user: process.env.RELDENS_MONITOR_USER || '',\n                pass: process.env.RELDENS_MONITOR_PASS || '',\n            }\n        };\n        Logger.info('Server environment configuration:', environmentConfig);\n        return environmentConfig;\n    }\n\n    /**\n     * @param {Object} config\n     * @param {Object} [dataServerDriver]\n     * @returns {Promise<void>}\n     */\n    async initializeStorage(config, dataServerDriver)\n    {\n        Logger.info('Initialize Storage.');\n        let {dataServerConfig, dataServer} = DataServerInitializer.initializeEntitiesAndDriver({\n            config,\n            dataServerDriver,\n            serverManager: this,\n            prismaClient: DataServerInitializer.loadProjectPrismaClient(this.installerDataServer, this.projectRoot)\n        });\n        this.dataServerConfig = dataServerConfig;\n        this.dataServer = dataServer;\n        if(!await dataServer.connect()){\n            Logger.critical('Data Server could not be connected.');\n            process.exit();\n        }\n        Logger.info('Storage connected.', {config: dataServerConfig.config, initialized: dataServer.initialized});\n        DataServerInitializer.rebindObjectionJsModelsToNewKnex(dataServer, dataServerConfig);\n        if(this.autoGenerateEntities){\n            await dataServer.generateEntities();\n            Logger.info('Storage entities generated.');\n            Logger.debug({generatedEntities: Object.keys(dataServerConfig.loadedEntities)});\n        }\n        this.configManager.dataServer = this.dataServer;\n        //Logger.debug('Initialized Data Server:', dataServer);\n    }\n\n    /**\n     * @returns {Promise<boolean|Object>}\n     */\n    async start()\n    {\n        if(!this.installer.isInstalled()){\n            Logger.critical('\\n'+\n                '--------------------------------------------------\\n'+\n                '--------------------------------------------------\\n'+\n                ' - Reldens not installed, open the installation page in your browser: \\n'+\n                ' - '+this.configServer.host+':'+this.configServer.port+'\\n'+\n                '--------------------------------------------------\\n'+\n                '--------------------------------------------------'\n            );\n            await this.appServer.listen(this.configServer.port);\n            return false;\n        }\n        Logger.info('Server listening on '+this.configServer.host+':'+this.configServer.port);\n        Logger.info('Starting Server!');\n        if(this.appServer?.listening){\n            await this.appServer.close();\n            // @NOTE: at this point the environment variables could be changed by the .env created by the installer.\n            this.configServer = this.fetchConfigServerFromEnvironmentVariables();\n            let createdAppServer = this.appServerFactory.createAppServer(this.configServer.appServerConfig);\n            if(this.appServerFactory.error.message){\n                Logger.error(this.appServerFactory.error.message);\n                return false;\n            }\n            this.app = createdAppServer.app;\n            this.appServer = createdAppServer.appServer;\n        }\n        this.setupCustomServerPlugin(this.rawConfig);\n        //Logger.debug('Raw config', this.rawConfig, 'Data Server Driver', this.dataServerDriver);\n        await this.initializeStorage(this.rawConfig, this.dataServerDriver);\n        await this.initializeConfigManager();\n        await this.enableServeStaticsAndHomePage();\n        await this.themeManager.validateOrCreateTheme();\n        return await this.startGameServerInstance();\n    }\n\n    /**\n     * @returns {Promise<boolean|Object>}\n     */\n    async startGameServerInstance()\n    {\n        MapsLoader.reloadMaps(this.themeManager.projectThemePath, this.configManager);\n        await this.createGameServer();\n        if(!this.validateServer()){\n            return false;\n        }\n        if(!await this.initializeManagers()){\n            return false;\n        }\n        if(1 === Number(process.env.RELDENS_CREATE_CONFIG_FILE || 1)){\n            let populatedConfigFile = HomepageLoader.createConfigFile(\n                this.themeManager.projectThemePath,\n                Object.assign({}, this.configManager.gameEngine, {client: this.configManager.client})\n            );\n            if(!populatedConfigFile){\n                Logger.error('Failed to create config file for homepage.');\n            }\n            await this.themeManager.createClientBundle();\n        }\n        await this.events.emit('reldens.serverBeforeListen', {serverManager: this});\n        await this.gameServer.listen(this.configServer.port);\n        this.configManager.configList.server.baseUrl = this.configServer.host+':'+this.configServer.port;\n        this.configManager.configList.server.publicUrl = this.configServer.publicUrl;\n        this.showInfoLogs();\n        await this.events.emit('reldens.serverReady', {serverManager: this});\n        return this;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    validateServer()\n    {\n        if(!this.appServer){\n            Logger.critical('App Server is not defined.');\n            return false;\n        }\n        if(!this.gameServer){\n            Logger.critical('Game Server is not defined.');\n            return false;\n        }\n        return true;\n    }\n\n    showInfoLogs()\n    {\n        Logger.info('info', 'Server ready.'+ReldensASCII);\n        Logger.info('Main packages:', [\n            'parcel: '+PackageData.dependencies['@parcel/core'],\n            'colyseus: '+PackageData.dependencies['@colyseus/core'],\n            'phaser: '+PackageData.dependencies['phaser'],\n            'firebase: '+PackageData.dependencies['firebase'],\n            'reldens/utils: '+PackageData.dependencies['@reldens/utils'],\n            'reldens/storage: '+PackageData.dependencies['@reldens/storage'],\n            'reldens/modifiers: '+PackageData.dependencies['@reldens/modifiers'],\n            'reldens/items-system: '+PackageData.dependencies['@reldens/items-system'],\n            'reldens/skills: '+PackageData.dependencies['@reldens/skills'],\n        ]);\n        Logger.info('Server listening on '+this.configServer.host+':'+this.configServer.port);\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async createServers()\n    {\n        await this.createAppServer();\n        if(!this.installer.isInstalled()){\n            Logger.info('Reldens not installed, preparing setup procedure.');\n            return await this.installer.prepareSetup(this.app, this.appServerFactory);\n        }\n        return true;\n    }\n\n    /**\n     * @returns {Promise<boolean|void>}\n     */\n    async createAppServer()\n    {\n        // @TODO - BETA - Pass AppServerFactory to the ServerManager constructor to avoid the other libraries require\n        //   if are not needed. Modify theme/index.js.dist to pass it on the default installation.\n        /** @type {{serverManager: Object, continueProcess: boolean}} */\n        let event = {serverManager: this, continueProcess: true};\n        await this.events.emit('reldens.createAppServer', event);\n        if(!event.continueProcess){\n            return false;\n        }\n        Object.assign(this, this.appServerFactory.createAppServer(this.configServer.appServerConfig));\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async enableServeStaticsAndHomePage()\n    {\n        if(1 === Number(process.env.RELDENS_EXPRESS_SERVE_HOME || 0)){\n            await this.appServerFactory.enableServeHome(this.app, async (req) => {\n                return await HomepageLoader.loadContents(req.query?.lang, this.themeManager.distPath);\n            });\n        }\n        if(1 === Number(process.env.RELDENS_EXPRESS_SERVE_STATICS || 0)){\n            await this.appServerFactory.serveStatics(this.app, this.themeManager.distPath);\n        }\n    }\n\n    /**\n     * @returns {Promise<boolean|void>}\n     */\n    async createGameServer()\n    {\n        // @TODO - BETA - Extract into a GameServerFactory, pass it to the ServerManager constructor to avoid the other\n        //   libraries require if are not needed. Modify theme/index.js.dist to pass it on the default installation.\n        /** @type {GameServerOptions} */\n        let options = {\n            pingInterval: process.env.RELDENS_PING_INTERVAL || 5000,\n            pingMaxRetries: process.env.RELDENS_PING_MAX_RETRIES || 3\n        };\n        if(this.appServer){\n            options.server = this.appServer;\n        }\n        /** @type {{options: Object, continueProcess: boolean}} */\n        let event = {options, continueProcess: true};\n        await this.events.emit('reldens.createGameServer', event);\n        if(!event.continueProcess){\n            return false;\n        }\n        this.gameServer = new GameServer({transport: new WebSocketTransport(options)});\n        if(this.configServer.monitor.enabled){\n            this.gameServer.attachMonitor(this.app, this.configServer.monitor);\n        }\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async initializeManagers()\n    {\n        let event = {serverManager: this, continueProcess: true};\n        await this.events.emit('reldens.beforeInitializeManagers', event);\n        if(!event.continueProcess){\n            return false;\n        }\n        Logger.info('Initialize Managers.');\n        await this.initializeMailer();\n        await this.initializeFeaturesManager();\n        this.initializeUsersManager();\n        await this.initializeRoomsManager();\n        this.initializeLoginManager();\n        await this.defineServerRooms();\n        return true;\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async defineServerRooms()\n    {\n        await this.events.emit('reldens.serverBeforeDefineRooms', {serverManager: this});\n        await this.roomsManager.defineRoomsInGameServer(this.gameServer, {\n            loginManager: this.loginManager,\n            config: this.configManager,\n            dataServer: this.dataServer,\n            featuresManager: this.featuresManager\n        });\n    }\n\n    initializeLoginManager()\n    {\n        this.loginManager = new LoginManager({\n            config: this.configManager,\n            usersManager: this.usersManager,\n            roomsManager: this.roomsManager,\n            mailer: this.mailer,\n            themeManager: this.themeManager,\n            events: this.events,\n            configServer: this.configServer,\n            appServer: this.appServer\n        });\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async initializeRoomsManager()\n    {\n        // the \"rooms\" manager will receive the rooms configured on the features to be defined:\n        this.roomsManager = new RoomsManager({\n            events: this.events,\n            dataServer: this.dataServer,\n            config: this.configManager\n        });\n        await this.events.emit('reldens.serverBeforeLoginManager', {serverManager: this});\n    }\n\n    initializeUsersManager()\n    {\n        this.usersManager = new UsersManager({\n            events: this.events,\n            dataServer: this.dataServer,\n            config: this.configManager\n        });\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async initializeFeaturesManager()\n    {\n        this.featuresManager = new FeaturesManager({\n            events: this.events,\n            dataServer: this.dataServer,\n            config: this.configManager,\n            themeManager: this.themeManager\n        });\n        this.configManager.availableFeaturesList = await this.featuresManager.loadFeatures();\n        await this.events.emit('reldens.serverConfigFeaturesReady', {\n            serverManager: this,\n            configProcessor: this.configManager\n        });\n    }\n\n    /**\n     * @param {Object} [mailer]\n     * @returns {Promise<boolean|void>}\n     */\n    async initializeMailer(mailer)\n    {\n        // @TODO - BETA - Extract and pass to the ServerManager in the constructor.\n        this.mailer = mailer || new Mailer();\n        if(this.mailer.readyForSetup){\n            let result = await this.mailer.setupTransporter();\n            if(!result){\n                Logger.error('Mailer setup failed.');\n                return false;\n            }\n        }\n        Logger.info('Mailer: '+(this.mailer?.isEnabled() ? 'enabled' : 'disabled'));\n        // @TODO - BETA - Check if the forgot password is enabled or not before add the calls to the server.\n        await ForgotPassword.defineRequestOnServerManagerApp(this);\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async initializeConfigManager()\n    {\n        await this.configManager.loadConfigurations();\n        this.configManager.projectPaths = this.themeManager.paths();\n        this.configGuestEmailDomain();\n        await this.configRoomsServerUrl();\n        await this.events.emit('reldens.serverConfigReady', {serverManager: this, configProcessor: this.configManager});\n    }\n\n    configGuestEmailDomain()\n    {\n        let customGuestEmailDomain = this.configManager.getWithoutLogs('server/players/guestsUser/emailDomain', '');\n        if('' === customGuestEmailDomain){\n            sc.deepMergeProperties(\n                this.configManager,\n                {server: {players: {guestsUser: {emailDomain: this.guestsEmailDomain}}}}\n            );\n            return;\n        }\n        this.guestsEmailDomain = customGuestEmailDomain;\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async configRoomsServerUrl()\n    {\n        let roomsRepository = this.dataServer.getEntity('rooms');\n        /** @type {Array<Object>} */\n        let rooms = await roomsRepository.loadAll();\n        if(!rooms || 0 === rooms.length){\n            return;\n        }\n        /** @type {Object<string, string>} */\n        let servers = {};\n        for(let room of rooms){\n            servers[room.name] = room.server_url\n                || this.configServer.publicUrl\n                || this.configServer.host+':'+this.configServer.port;\n        }\n        sc.deepMergeProperties(this.configManager, {client: {rooms: {servers}}});\n    }\n\n    /**\n     * @param {Object} props\n     * @param {string} props.message\n     * @returns {Promise<boolean>}\n     */\n    async serverBroadcast(props)\n    {\n        if(!props.message){\n            return false;\n        }\n        if(!this.roomsManager?.createdInstances){\n            Logger.info('Room manager not available, make sure the callback is bind to this class.');\n            return false;\n        }\n        let messageSendModel = {\n            [GameConst.ACTION_KEY]: ChatConst.CHAT_ACTION,\n            [ChatConst.TYPES.KEY]: ChatConst.TYPES.ERROR,\n            [ChatConst.MESSAGE.KEY]: props.message,\n        };\n        let roomsKeys = Object.keys(this.roomsManager.createdInstances);\n        for(let roomKey of roomsKeys){\n            let room = this.roomsManager.createdInstances[roomKey];\n            if(room instanceof RoomScene){\n                room.broadcast('*', messageSendModel);\n            }\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.ServerManager = ServerManager;\n"
  },
  {
    "path": "lib/game/server/maps-loader.js",
    "content": "/**\n *\n * Reldens - MapsLoader\n *\n * Static utility class for loading and managing game map files from the theme's assets directory.\n * Scans the assets/maps folder for JSON map files, parses them, and stores them in the server\n * configuration for use by the game rooms. Creates the maps folder if it doesn't exist.\n *\n */\n\nconst { FileHandler } = require('@reldens/server-utils');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\nclass MapsLoader\n{\n\n    /**\n     * @param {string} themeFolder\n     * @param {ConfigManager} configManager\n     */\n    static reloadMaps(themeFolder, configManager)\n    {\n        if(!themeFolder){\n            ErrorManager.error('Theme folder not defined!');\n        }\n        let mapsFolder = FileHandler.joinPaths('assets', 'maps');\n        let mapFolderPath = FileHandler.joinPaths(themeFolder, mapsFolder);\n        if(!FileHandler.exists(mapFolderPath)){\n            FileHandler.createFolder(mapFolderPath);\n            Logger.notice('Maps folder has to be created.');\n            return;\n        }\n        let dirCont = FileHandler.readFolder(mapFolderPath);\n        let files = [];\n        for(let elm of dirCont){\n            if(elm.match(/.*\\.(json)/ig)){\n                files.push(elm);\n            }\n        }\n        configManager.configList.server.maps = {};\n        for(let file of files){\n            let fileFullPath = FileHandler.joinPaths(themeFolder, mapsFolder, file);\n            let mapKey = file.replace('.json', '');\n            let fileContents = FileHandler.readFile(fileFullPath);\n            if(!fileContents){\n                Logger.error('Load map error.', FileHandler.error.message);\n                continue;\n            }\n            try {\n                configManager.configList.server.maps[mapKey] = sc.toJson(fileContents);\n            } catch (error) {\n                Logger.error('Load map error.', error.message);\n            }\n        }\n    }\n\n}\n\nmodule.exports.MapsLoader = MapsLoader;\n"
  },
  {
    "path": "lib/game/server/memory/active-player.js",
    "content": "/**\n *\n * Reldens - ActivePlayer\n *\n * Represents an active player session in memory.\n * Stores the user, player, and session identifiers for quick lookup and access.\n * Determines the guest status based on email domain matching.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n *\n * @typedef {Object} UserModel\n * @property {number} id\n * @property {string} username\n * @property {string} email\n * @property {number} role_id\n * @property {Object} [player]\n * @property {number} [player.id]\n * @property {string} [player.name]\n *\n * @typedef {Object} ActivePlayerProps\n * @property {string} guestsEmailDomain\n * @property {UserModel} userModel\n * @property {Client} client\n * @property {string} roomId\n */\nclass ActivePlayer\n{\n\n    /**\n     * @param {ActivePlayerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {string} */\n        this.guestsEmailDomain = sc.get(props, 'guestsEmailDomain', '');\n        /** @type {UserModel} */\n        this.userModel = sc.get(props, 'userModel', {});\n        /** @type {Client} */\n        this.client = sc.get(props, 'client', {});\n        /** @type {string} */\n        this.roomId = sc.get(props, 'roomId', '');\n        /** @type {boolean} */\n        this.isGuest = '' !== this.guestsEmailDomain && -1 !== this.userModel.email.indexOf(this.guestsEmailDomain);\n        /** @type {number} */\n        this.userId = this.userModel.id;\n        /** @type {string} */\n        this.username = this.userModel.username;\n        /** @type {number|undefined} */\n        this.playerId = this.userModel.player?.id;\n        /** @type {string|undefined} */\n        this.playerName = this.userModel.player?.name;\n        /** @type {number} */\n        this.roleId = this.userModel.role_id;\n        /** @type {Object|undefined} */\n        this.playerData = this.userModel.player;\n        /** @type {string} */\n        this.sessionId = this.client.sessionId;\n    }\n\n}\n\nmodule.exports.ActivePlayer = ActivePlayer;\n"
  },
  {
    "path": "lib/game/server/memory/active-players.js",
    "content": "/**\n *\n * Reldens - ActivePlayers\n *\n * Singleton registry for tracking all active player sessions across rooms.\n * Provides multiple lookup indexes: by session ID, user ID, username, player ID, and player name.\n * Manages the player session lifecycle (add, fetch, remove) for multi-session user support.\n *\n */\n\nconst { ActivePlayer } = require('./active-player');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('@colyseus/core').Room} Room\n *\n * @typedef {Object} UserModel\n * @property {number} id\n * @property {string} username\n * @property {Object} [player]\n *\n * @typedef {Object} RoomPlayerIndexes\n * @property {Object<string, ActivePlayer>} bySessionId\n * @property {Object<number, string>} byUserId\n * @property {Object<string, string>} byUserName\n * @property {Object<number, string>} byPlayerId\n * @property {Object<string, string>} byPlayerName\n */\nclass ActivePlayers\n{\n\n    constructor()\n    {\n        /** @type {string} */\n        this.guestsEmailDomain = '';\n        /** @type {string} */\n        this.gameRoomInstanceId = '';\n        /** @type {Object<string, RoomPlayerIndexes>} */\n        this.playersByRoomId = {};\n        /** @type {Object<number, Object<string, string>>} */\n        this.playersSessionsByUserId = {};\n    }\n\n    /**\n     * @param {UserModel} userModel\n     * @param {Client} client\n     * @param {Room} room\n     * @returns {ActivePlayer} Created ActivePlayer instance\n     */\n    add(userModel, client, room)\n    {\n        let activePlayer = new ActivePlayer({\n            guestsEmailDomain: this.guestsEmailDomain,\n            userModel,\n            client,\n            roomId: room.roomId,\n        });\n        if(!this.playersByRoomId[activePlayer.roomId]){\n            this.playersByRoomId[activePlayer.roomId] = {\n                bySessionId: {},\n                byUserId: {},\n                byUserName: {},\n                byPlayerId: {},\n                byPlayerName: {},\n            };\n        }\n        if(!this.playersByRoomId[activePlayer.roomId].byUserId[userModel.id]){\n            this.playersByRoomId[activePlayer.roomId].byUserId[userModel.id] = {};\n        }\n        if(!this.playersByRoomId[activePlayer.roomId].byUserName[userModel.username]){\n            this.playersByRoomId[activePlayer.roomId].byUserName[userModel.username] = {};\n        }\n        if(activePlayer.playerId){\n            this.playersByRoomId[activePlayer.roomId].byPlayerId[activePlayer.playerId]\n                = this.playersByRoomId[activePlayer.roomId].byPlayerName[activePlayer.playerName]\n                = activePlayer.sessionId;\n        }\n        this.playersByRoomId[activePlayer.roomId].byUserId[userModel.id]\n            = this.playersByRoomId[activePlayer.roomId].byUserName[userModel.username]\n            = activePlayer.sessionId;\n        this.playersByRoomId[activePlayer.roomId].bySessionId[activePlayer.sessionId] = activePlayer;\n        if(!this.playersSessionsByUserId[userModel.id]){\n            this.playersSessionsByUserId[userModel.id] = {};\n        }\n        this.playersSessionsByUserId[userModel.id][activePlayer.sessionId] = room.roomId;\n        return activePlayer;\n    }\n\n    /**\n     * @param {string} sessionId\n     * @param {string} roomId\n     * @param {boolean} [withPlayer]\n     * @returns {ActivePlayer|false} ActivePlayer instance or false if not found\n     */\n    fetchByRoomAndSessionId(sessionId, roomId, withPlayer = false)\n    {\n        if(!sessionId){\n            //Logger.debug('Missing sessionId on \"fetchByRoomAndSessionId\".');\n            return false;\n        }\n        if(!roomId){\n            //Logger.debug('Missing roomId on \"fetchByRoomAndSessionId\".');\n            return false;\n        }\n        // @NOTE: GameRoom instance won't have a player on the user model, this only happens in the RoomScene.onJoin().\n        if(withPlayer && this.gameRoomInstanceId === roomId){\n            Logger.warning('Fetching active user withPlayer on gameRoomInstance.');\n            return false;\n        }\n        let roomPlayersBySessionId = sc.get(this.playersByRoomId[roomId], 'bySessionId');\n        if(!roomPlayersBySessionId){\n            Logger.warning('Missing bySessionId on \"fetchByRoomAndSessionId\".');\n            return false;\n        }\n        return roomPlayersBySessionId[sessionId];\n    }\n\n    /**\n     * @param {string} userName\n     * @param {string} roomId\n     * @param {boolean} [withPlayer]\n     * @returns {ActivePlayer|false} ActivePlayer instance or false if not found\n     */\n    fetchByRoomAndUserName(userName, roomId, withPlayer = false)\n    {\n        if(!userName){\n            return false;\n        }\n        if(!roomId){\n            return false;\n        }\n        // @NOTE: GameRoom instance won't have a player on the user model, this only happens in the RoomScene.onJoin().\n        if(withPlayer && this.gameRoomInstanceId === roomId){\n            return false;\n        }\n        let playersByRoomId = this.playersByRoomId[roomId];\n        let roomPlayersByUserName = sc.get(playersByRoomId, 'byUserName');\n        if(!roomPlayersByUserName){\n            return false;\n        }\n        let playerSessionIdInRoom = sc.get(roomPlayersByUserName, userName);\n        if(!playerSessionIdInRoom){\n            return false;\n        }\n        return this.fetchByRoomAndSessionId(playerSessionIdInRoom, roomId, withPlayer);\n    }\n\n    /**\n     * @param {number} playerId\n     * @param {string} roomId\n     * @param {boolean} [withPlayer]\n     * @returns {ActivePlayer|false} ActivePlayer instance or false if not found\n     */\n    fetchByRoomAndPlayerId(playerId, roomId, withPlayer = false)\n    {\n        // @NOTE: GameRoom instance won't have a player on the user model, this only happens in the RoomScene.onJoin().\n        if(withPlayer && this.gameRoomInstanceId === roomId){\n            return false;\n        }\n        let roomPlayersByPlayerId = sc.get(this.playersByRoomId[roomId], 'byPlayerId');\n        if(!roomPlayersByPlayerId){\n            return false;\n        }\n        let playerSessionIdInRoom = sc.get(roomPlayersByPlayerId, playerId);\n        if(!playerSessionIdInRoom){\n            return false;\n        }\n        return this.fetchByRoomAndSessionId(playerSessionIdInRoom, roomId, withPlayer);\n    }\n\n    /**\n     * @param {string} playerName\n     * @param {string} roomId\n     * @param {boolean} [withPlayer]\n     * @returns {ActivePlayer|false} ActivePlayer instance or false if not found\n     */\n    fetchByRoomAndPlayerName(playerName, roomId, withPlayer = false)\n    {\n        // @NOTE: GameRoom instance won't have a player on the user model, this only happens in the RoomScene.onJoin().\n        if(withPlayer && this.gameRoomInstanceId === roomId){\n            return false;\n        }\n        let roomPlayersByPlayerName = sc.get(this.playersByRoomId[roomId], 'byPlayerName');\n\n        if(!roomPlayersByPlayerName){\n            return false;\n        }\n        let playerSessionIdInRoom = sc.get(roomPlayersByPlayerName, playerName);\n        if(!playerSessionIdInRoom){\n            return false;\n        }\n        return this.fetchByRoomAndSessionId(playerSessionIdInRoom, roomId, withPlayer);\n    }\n\n    /**\n     * @param {number} userId\n     * @returns {boolean} Returns true if sessions were found and removed, false if the user has no sessions\n     */\n    removeAllByUserId(userId)\n    {\n        let userRoomsSessions = this.playersSessionsByUserId[userId];\n        if(!userRoomsSessions){\n            return false;\n        }\n        let sessionsIds = Object.keys(userRoomsSessions);\n        for(let sessionId in sessionsIds){\n            this.removeByRoomAndSessionId(sessionId, sessionsIds[sessionId]);\n        }\n        this.playersSessionsByUserId[userId] = {};\n        return true;\n    }\n\n    /**\n     * @param {string} sessionId\n     * @param {string} roomId\n     * @returns {boolean} Returns true if the session was found and removed, false if the room or session was not found\n     */\n    removeByRoomAndSessionId(sessionId, roomId)\n    {\n        let room = this.playersByRoomId[roomId];\n        if(!room){\n            return false;\n        }\n        let activePlayer = this.fetchByRoomAndSessionId(sessionId, roomId, false);\n        if(activePlayer){\n            delete this.playersSessionsByUserId[activePlayer.userId][sessionId];\n            delete room.byUserId[activePlayer.userId];\n            delete room.byUserName[activePlayer.username];\n            delete room.byPlayerId[activePlayer.playerId];\n            delete room.byPlayerName[activePlayer.playerName];\n        }\n        delete room.bySessionId[sessionId];\n        return true;\n    }\n\n}\n\nmodule.exports.ActivePlayers = new ActivePlayers();\n"
  },
  {
    "path": "lib/game/server/storage/drivers-map.js",
    "content": "/**\n *\n * Reldens - DriversMap\n *\n * Map of storage driver keys to DataServer class constructors.\n * Used by the installer and entity generators to resolve the driver from a key string.\n * Supports ObjectionJS (default), MikroORM, and Prisma storage drivers.\n *\n */\n\nconst {ObjectionJsDataServer, MikroOrmDataServer, PrismaDataServer } = require('@reldens/storage');\n\n/**\n * @typedef {import('@reldens/storage').ObjectionJsDataServer} ObjectionJsDataServer\n * @typedef {import('@reldens/storage').MikroOrmDataServer} MikroOrmDataServer\n * @typedef {import('@reldens/storage').PrismaDataServer} PrismaDataServer\n *\n * Map of storage driver keys to DataServer class constructors.\n * @type {Object<string, typeof ObjectionJsDataServer | typeof MikroOrmDataServer | typeof PrismaDataServer>}\n */\nmodule.exports.DriversMap = {\n    'objection-js': ObjectionJsDataServer,\n    'mikro-orm': MikroOrmDataServer,\n    'prisma': PrismaDataServer\n};\n"
  },
  {
    "path": "lib/game/server/template-engine.js",
    "content": "/**\n *\n * Reldens - TemplateEngine\n *\n * Static utility class for rendering Mustache templates. Provides methods for rendering template\n * strings directly or loading and rendering template files. Used for generating HTML emails,\n * dynamic pages, and other server-side rendered content with variable substitution.\n *\n */\n\nconst TemplateEngineRender = require('mustache');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger } = require('@reldens/utils');\n\nclass TemplateEngine\n{\n\n    /**\n     * @param {string} content\n     * @param {Object} params\n     * @returns {Promise<string>}\n     */\n    static async render(content, params)\n    {\n        return await TemplateEngineRender.render(content, params);\n    }\n\n    /**\n     * @param {string} filePath\n     * @param {Object} params\n     * @returns {Promise<string>}\n     */\n    static async renderFile(filePath, params)\n    {\n        let fileContent = FileHandler.fetchFileContents(filePath);\n        if(!fileContent){\n            Logger.error('File to be rendered not found.', {filePath});\n            return '';\n        }\n        return await this.render(fileContent, params);\n    }\n\n}\n\nmodule.exports.TemplateEngine = TemplateEngine;\n"
  },
  {
    "path": "lib/game/server/templates-to-path-mapper.js",
    "content": "/**\n *\n * Reldens - TemplatesToPathMapper\n *\n * Singleton utility class for mapping template names to file paths. Recursively processes template\n * lists and constructs full file paths by joining the base path with template names. Used for\n * resolving template file locations in the theme system. Exported as a singleton instance for\n * shared use across the application.\n *\n */\n\nconst { sc } = require('@reldens/utils');\nconst { FileHandler } = require('@reldens/server-utils');\n\nclass TemplatesToPathMapper\n{\n\n    /**\n     * @param {Object<string, string|Object>} templateList\n     * @param {string} path\n     * @returns {Object<string, string>}\n     */\n    map(templateList, path)\n    {\n        let result = {};\n        for(let templateName of Object.keys(templateList)){\n            if(sc.isObject(templateList[templateName])){\n                result[templateName] = this.map(templateList[templateName], FileHandler.joinPaths(path, templateName));\n                continue;\n            }\n            result[templateName] = FileHandler.joinPaths(path, templateList[templateName]);\n        }\n        return result;\n    }\n\n}\n\nmodule.exports.TemplatesToPathMapper = new TemplatesToPathMapper();\n"
  },
  {
    "path": "lib/game/server/theme-manager.js",
    "content": "/**\n *\n * Reldens - ThemeManager\n *\n * Manages theme assets, paths, and bundling for the Reldens game project.\n * Handles theme installation, asset copying, CSS/JS bundling with Parcel,\n * and provides path resolution for project files, theme files, and Reldens module files.\n * Coordinates between the project root, theme directory, dist directory, and node_modules.\n *\n */\n\nconst { TemplatesList } = require('../../admin/server/templates-list');\nconst { TemplateEngine } = require('./template-engine');\nconst { TemplatesToPathMapper } = require('./templates-to-path-mapper');\nconst { GameConst } = require('../constants');\nconst { Parcel, createWorkerFarm } = require('@parcel/core');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} ThemeManagerProps\n * @property {string} projectRoot\n * @property {string} [projectThemeName]\n * @property {boolean} [jsSourceMaps]\n * @property {boolean} [cssSourceMaps]\n */\nclass ThemeManager\n{\n\n    /** @type {string} */\n    projectRoot = '';\n    /** @type {string} */\n    projectRootPackageJson = '';\n    /** @type {string} */\n    envFilePath = '';\n    /** @type {string} */\n    gitignoreFilePath = '';\n    /** @type {string} */\n    installationLockPath = '';\n    /** @type {string} */\n    reldensModulePath = '';\n    /** @type {string} */\n    reldensModuleLibPath = '';\n    /** @type {string} */\n    reldensModuleThemePath = '';\n    /** @type {string} */\n    reldensModuleDefaultThemePath = '';\n    /** @type {string} */\n    reldensModuleDefaultThemeAssetsPath = '';\n    /** @type {string} */\n    reldensModuleThemePluginsPath = '';\n    /** @type {string} */\n    reldensModuleInstallerPath = '';\n    /** @type {string} */\n    reldensModulePathInstallTemplatesFolder = '';\n    /** @type {string} */\n    reldensModuleThemeAdminPath = '';\n    /** @type {string} */\n    distPath = '';\n    /** @type {string} */\n    assetsDistPath = '';\n    /** @type {string} */\n    cssDistPath = '';\n    /** @type {string} */\n    themePath = '';\n    /** @type {string} */\n    projectThemeName = GameConst.STRUCTURE.DEFAULT;\n    /** @type {string} */\n    projectThemePath = '';\n    /** @type {string} */\n    projectPluginsPath = '';\n    /** @type {string} */\n    projectAdminPath = '';\n    /** @type {string} */\n    projectAssetsPath = '';\n    /** @type {string} */\n    projectCssPath = '';\n    /** @type {string} */\n    projectIndexPath = '';\n    /** @type {string} */\n    projectGenerateDataPath = '';\n    /** @type {string} */\n    projectGeneratedDataPath = '';\n    /** @type {Object<string, any>} */\n    defaultBrowserBundleOptions = {};\n\n    /**\n     * @param {ThemeManagerProps} props\n     */\n    constructor(props)\n    {\n        if(!sc.hasOwn(props, 'projectRoot')){\n            ErrorManager.error('Missing project property.');\n        }\n        /** @type {string} */\n        this.encoding = (process.env.RELDENS_DEFAULT_ENCODING || 'utf8');\n        /** @type {TemplateEngine} */\n        this.templateEngine = TemplateEngine;\n        /** @type {TemplatesList} */\n        this.adminTemplatesList = TemplatesList;\n        /** @type {boolean} */\n        this.jsSourceMaps = sc.get(props, 'jsSourceMaps', false);\n        /** @type {boolean} */\n        this.cssSourceMaps = sc.get(props, 'cssSourceMaps', false);\n        this.setupPaths(props);\n    }\n\n    /**\n     * @param {ThemeManagerProps} props\n     */\n    setupPaths(props)\n    {\n        let structure = GameConst.STRUCTURE;\n        this.projectRoot = sc.get(props, 'projectRoot', '');\n        this.projectRootPackageJson = FileHandler.joinPaths(this.projectRoot, 'package.json');\n        this.envFilePath = FileHandler.joinPaths(this.projectRoot, '.env');\n        this.gitignoreFilePath = FileHandler.joinPaths(this.projectRoot, '.gitignore');\n        this.installationLockPath = FileHandler.joinPaths(this.projectRoot, structure.INSTALL_LOCK);\n        this.projectThemeName = sc.get(props, 'projectThemeName', structure.DEFAULT);\n        this.projectGenerateDataPath = FileHandler.joinPaths(this.projectRoot, 'generate-data');\n        this.projectGeneratedDataPath = FileHandler.joinPaths(this.projectGenerateDataPath, 'generated');\n        this.reldensModulePath = sc.get(\n            props,\n            'reldensModulePath',\n            FileHandler.joinPaths(this.projectRoot, 'node_modules', 'reldens')\n        );\n        this.reldensModuleLibPath = FileHandler.joinPaths(this.reldensModulePath, structure.LIB);\n        this.reldensModuleThemePath = FileHandler.joinPaths(this.reldensModulePath, structure.THEME);\n        this.reldensModuleDefaultThemePath = FileHandler.joinPaths(this.reldensModuleThemePath, structure.DEFAULT);\n        this.reldensModuleDefaultThemeAssetsPath = FileHandler.joinPaths(\n            this.reldensModuleDefaultThemePath,\n            structure.ASSETS\n        );\n        this.reldensModuleThemePluginsPath = FileHandler.joinPaths(this.reldensModuleThemePath, structure.PLUGINS);\n        this.reldensModuleThemeAdminPath = FileHandler.joinPaths(this.reldensModuleThemePath, structure.ADMIN);\n        this.reldensModuleInstallerPath = FileHandler.joinPaths(this.reldensModulePath, structure.INSTALLER_FOLDER);\n        this.reldensModuleInstallerIndexPath = FileHandler.joinPaths(this.reldensModuleInstallerPath, structure.INDEX);\n        this.reldensModulePathInstallTemplatesFolder = FileHandler.joinPaths(\n            this.reldensModulePath,\n            structure.LIB,\n            'game',\n            structure.SERVER,\n            'install-templates'\n        );\n        this.reldensModulePathInstallTemplateEnvDist = FileHandler.joinPaths(\n            this.reldensModulePathInstallTemplatesFolder,\n            '.env.dist'\n        );\n        this.reldensModulePathInstallTemplateGitignoreDist = FileHandler.joinPaths(\n            this.reldensModulePathInstallTemplatesFolder,\n            '.gitignore.dist'\n        );\n        this.reldensModulePathInstallTemplateKnexDist = FileHandler.joinPaths(\n            this.reldensModulePathInstallTemplatesFolder,\n            'knexfile.js.dist'\n        );\n        this.installerPath = FileHandler.joinPaths(this.projectRoot, structure.INSTALLER_FOLDER);\n        this.installerPathIndex = FileHandler.joinPaths(this.installerPath, structure.INDEX);\n        this.themePath = FileHandler.joinPaths(this.projectRoot, structure.THEME);\n        this.projectAdminPath = FileHandler.joinPaths(this.themePath, structure.ADMIN);\n        this.projectAdminTemplatesPath = FileHandler.joinPaths(this.projectAdminPath, structure.TEMPLATES);\n        this.adminTemplates = TemplatesToPathMapper.map(this.adminTemplatesList, this.projectAdminTemplatesPath);\n        this.distPath = FileHandler.joinPaths(this.projectRoot, structure.DIST);\n        this.assetsDistPath = FileHandler.joinPaths(this.distPath, structure.ASSETS);\n        this.cssDistPath = FileHandler.joinPaths(this.distPath, structure.CSS);\n        this.projectThemePath = FileHandler.joinPaths(this.themePath, this.projectThemeName);\n        this.projectPluginsPath = FileHandler.joinPaths(this.themePath, structure.PLUGINS);\n        this.projectAssetsPath = FileHandler.joinPaths(this.projectThemePath, structure.ASSETS);\n        this.projectCssPath = FileHandler.joinPaths(this.projectThemePath, structure.CSS);\n        this.projectIndexPath = FileHandler.joinPaths(this.projectThemePath, structure.INDEX);\n    }\n\n    /**\n     * @returns {Object<string, string>}\n     */\n    paths()\n    {\n        return {\n            projectRoot: this.projectRoot,\n            reldensModulePath: this.reldensModulePath,\n            reldensModuleLibPath: this.reldensModuleLibPath,\n            reldensModuleThemePath: this.reldensModuleThemePath,\n            reldensModuleDefaultThemePath: this.reldensModuleDefaultThemePath,\n            reldensModuleDefaultThemeAssetsPath: this.reldensModuleDefaultThemeAssetsPath,\n            reldensModuleThemePluginsPath: this.reldensModuleThemePluginsPath,\n            distPath: this.distPath,\n            assetsDistPath: this.assetsDistPath,\n            themePath: this.themePath,\n            projectThemePath: this.projectThemePath,\n            projectPluginsPath: this.projectPluginsPath,\n            projectAssetsPath: this.projectAssetsPath,\n            projectIndexPath: this.projectIndexPath\n        };\n    }\n\n    /**\n     * @param {...string} args\n     * @returns {string}\n     */\n    assetPath(...args)\n    {\n        return FileHandler.joinPaths(this.projectAssetsPath, ...args);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    permissionsCheck()\n    {\n        return FileHandler.permissionsCheck(this.projectRoot);\n    }\n\n    resetDist()\n    {\n        this.removeDist();\n        FileHandler.createFolder(this.distPath);\n        FileHandler.createFolder(this.assetsDistPath);\n        FileHandler.createFolder(this.cssDistPath);\n        Logger.info('Reset \"dist\" folder, created: '+this.distPath);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    removeDist()\n    {\n        return FileHandler.remove(this.distPath);\n    }\n\n    installDefaultTheme()\n    {\n        if(!FileHandler.copyFolderSync(this.reldensModuleDefaultThemePath, this.projectThemePath)){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n        }\n        if(!FileHandler.copyFolderSync(this.reldensModuleThemePluginsPath, this.projectPluginsPath)){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n        }\n        if(!FileHandler.copyFolderSync(this.reldensModuleThemeAdminPath, this.projectAdminPath)){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n        }\n        if(!FileHandler.copyFolderSync(this.reldensModuleDefaultThemePath, this.distPath)){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n        }\n        Logger.info('Install \"default\" theme:'\n            +'\\n'+this.reldensModuleDefaultThemePath+' > '+this.projectThemePath\n            +'\\n'+this.reldensModuleThemePluginsPath+' > '+this.projectPluginsPath\n            +'\\n'+this.reldensModuleDefaultThemePath+' > '+this.distPath\n        );\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    copyAssetsToDist()\n    {\n        if(!FileHandler.copyFolderSync(this.projectAssetsPath, this.assetsDistPath)){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n            return false;\n        }\n        Logger.info('Copied \"assets\" to \"dist\" from:' +'\\n'+this.projectAssetsPath+' > '+this.assetsDistPath);\n        return true;\n    }\n\n    copyKnexFile()\n    {\n        let knexFile = FileHandler.joinPaths(this.projectRoot, 'knexfile.js');\n        FileHandler.copyFileSyncIfDoesNotExist(\n            FileHandler.joinPaths(this.reldensModulePathInstallTemplatesFolder, 'knexfile.js.dist'),\n            knexFile\n        );\n        Logger.info('Reminder: edit the knexfile.js file!');\n    }\n\n    copyEnvFile()\n    {\n        FileHandler.copyFileSyncIfDoesNotExist(\n            FileHandler.joinPaths(this.reldensModulePathInstallTemplatesFolder, '.env.dist'),\n            this.envFilePath\n        );\n        Logger.info('Reminder: edit the .env file!');\n    }\n\n    copyGitignoreFile()\n    {\n        FileHandler.copyFileSyncIfDoesNotExist(\n            FileHandler.joinPaths(this.reldensModulePathInstallTemplatesFolder, '.gitignore.dist'),\n            this.gitignoreFilePath\n        );\n        Logger.info('Reminder: edit the .gitignore file!');\n    }\n\n    /**\n     * @param {boolean} [override=false]\n     * @returns {Promise<boolean>}\n     */\n    async copyIndex(override = false)\n    {\n        let indexFile = FileHandler.joinPaths(this.projectRoot, 'index.js');\n        if(FileHandler.exists(indexFile) && !override){\n            Logger.info('File already exists: index.js');\n            return false;\n        }\n        let templatePath = FileHandler.joinPaths(this.reldensModuleThemePath, 'index.js.dist');\n        let fileContent = FileHandler.fetchFileContents(templatePath);\n        if(!fileContent){\n            Logger.error('Failed to read template file.', templatePath);\n            return false;\n        }\n        let parsedContents = await this.templateEngine.render(\n            fileContent,\n            {yourThemeName: this.projectThemeName || 'default'}\n        );\n        try {\n            await FileHandler.updateFileContents(indexFile, parsedContents.toString());\n        } catch (error) {\n            Logger.error('Failed to create index.js file.', error);\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    copyDefaultAssets()\n    {\n        if(!FileHandler.copyFolderSync(this.reldensModuleDefaultThemeAssetsPath, this.assetsDistPath)){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n            return false;\n        }\n        Logger.info('Copied default assets:'+'\\n'+this.reldensModuleDefaultThemeAssetsPath+' > '+this.assetsDistPath);\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    copyDefaultTheme()\n    {\n        if(!FileHandler.copyFolderSync(this.reldensModuleDefaultThemePath, this.projectThemePath)){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n            return false;\n        }\n        Logger.info('Copied default theme:'+'\\n'+this.reldensModuleDefaultThemePath+' > '+this.projectThemePath);\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    copyPackage()\n    {\n        if(!FileHandler.copyFolderSync(this.reldensModuleThemePluginsPath, this.projectPluginsPath)){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n            return false;\n        }\n        Logger.info('Copied plugins:'+'\\n'+this.reldensModuleThemePluginsPath+' > '+this.projectPluginsPath);\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    copyAdmin()\n    {\n        if(!FileHandler.copyFolderSync(this.reldensModuleThemeAdminPath, this.projectAdminPath)){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n            return false;\n        }\n        Logger.info('Copied admin:'+'\\n'+this.reldensModuleThemeAdminPath+' > '+this.projectAdminPath);\n        return true;\n    }\n\n    /**\n     * @returns {Promise<boolean|void>}\n     */\n    async buildCss()\n    {\n        let allowBuildCss = 1 === Number(sc.get(process.env, 'RELDENS_ALLOW_BUILD_CSS', 1));\n        if(!allowBuildCss){\n            Logger.info('CSS build skipped (RELDENS_ALLOW_BUILD_CSS=0)');\n            return false;\n        }\n        let themeScss = FileHandler.joinPaths(this.projectCssPath, GameConst.STRUCTURE.SCSS_FILE).toString();\n        let bundler = this.createCssBundler(themeScss);\n        try {\n            let { buildTime } = await bundler.run();\n            Logger.info('Built Game CSS in '+buildTime+'ms!');\n        } catch (error) {\n            Logger.critical({'Parcel diagnostics for error': sc.get(error, 'diagnostics', error)});\n            ErrorManager.error('Parcel build CSS process failed.');\n        }\n        FileHandler.createFolder(this.cssDistPath);\n        FileHandler.copyFileSyncIfDoesNotExist(\n            FileHandler.joinPaths(this.projectCssPath, GameConst.STRUCTURE.CSS_FILE),\n            FileHandler.joinPaths(this.cssDistPath, GameConst.STRUCTURE.CSS_FILE)\n        );\n    }\n\n    copyAdminFiles()\n    {\n        let jsDistPath = FileHandler.joinPaths(this.distPath, 'js');\n        FileHandler.createFolder(jsDistPath);\n        FileHandler.createFolder(this.cssDistPath);\n        // copy functions.js to dist/js:\n        let functionsSource = FileHandler.joinPaths(this.projectAdminPath, 'functions.js');\n        FileHandler.copyFile(functionsSource, FileHandler.joinPaths(jsDistPath, 'functions.js'));\n        // copy reldens-specific functions to dist root:\n        let reldensFunctionsSource = FileHandler.joinPaths(this.projectAdminPath, 'reldens-functions.js');\n        FileHandler.copyFile(reldensFunctionsSource, FileHandler.joinPaths(this.distPath, 'reldens-functions.js'));\n        // copy admin js to dist root:\n        let adminJsSource = FileHandler.joinPaths(this.projectAdminPath, GameConst.STRUCTURE.ADMIN_JS_FILE);\n        FileHandler.copyFile(adminJsSource, FileHandler.joinPaths(this.distPath, GameConst.STRUCTURE.ADMIN_JS_FILE));\n        // copy admin css to dist/css:\n        let adminCssSource = FileHandler.joinPaths(this.projectAdminPath, GameConst.STRUCTURE.ADMIN_CSS_FILE);\n        FileHandler.copyFile(adminCssSource, FileHandler.joinPaths(this.cssDistPath, GameConst.STRUCTURE.ADMIN_CSS_FILE));\n        Logger.info('Admin files copied to dist.');\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async copyAdminAssetsToDist()\n    {\n        if(!FileHandler.copyFolderSync(\n            FileHandler.joinPaths(this.projectAdminPath, GameConst.STRUCTURE.ASSETS),\n            this.assetsDistPath\n        )){\n            Logger.error('File copy folder sync error.', FileHandler.error);\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async buildSkeleton()\n    {\n        await this.buildCss();\n        await this.buildClient();\n        Logger.info('Built Skeleton.');\n    }\n\n    /**\n     * @returns {Promise<boolean|void>}\n     */\n    async buildClient()\n    {\n        let allowBuildClient = 1 === Number(sc.get(process.env, 'RELDENS_ALLOW_BUILD_CLIENT', 1));\n        if(!allowBuildClient){\n            Logger.info('Client build skipped (RELDENS_ALLOW_BUILD_CLIENT=0)');\n            return false;\n        }\n        let elementsCollection = FileHandler.readFolder(this.projectThemePath);\n        for(let element of elementsCollection){\n            if(-1 === element.indexOf('.html')){\n                continue;\n            }\n            let elementPath = FileHandler.joinPaths(this.projectThemePath, element);\n            if(!FileHandler.isFile(elementPath)){\n                continue;\n            }\n            try {\n                let bundler = this.createBrowserBundler(elementPath);\n                let { buildTime } = await bundler.run();\n                Logger.info('Built '+elementPath+' in '+buildTime+'ms!');\n            } catch (error) {\n                Logger.critical({'Parcel diagnostics for error': sc.get(error, 'diagnostics', error), elementPath});\n                ErrorManager.error('Parcel build Game Client process failed.');\n            }\n        }\n    }\n\n    /**\n     * @param {string} folderPath\n     * @returns {Promise<void>}\n     */\n    async clearBundlerCache(folderPath)\n    {\n        FileHandler.remove(FileHandler.joinPaths(folderPath, '.parcel-cache'));\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async buildInstaller()\n    {\n        try {\n            let bundleOptions = this.generateDefaultBrowserBundleOptions(this.reldensModuleInstallerIndexPath);\n            FileHandler.createFolder(this.installerPath);\n            bundleOptions.targets.modern.distDir = this.installerPath;\n            bundleOptions.defaultTargetOptions.distDir = this.installerPath;\n            let bundler = new Parcel(bundleOptions);\n            let { buildTime } = await bundler.run();\n            Logger.info('Built '+this.reldensModuleInstallerIndexPath+' in '+buildTime+'ms!');\n        } catch (error) {\n            Logger.critical('Parcel diagnostics for error on build installer.', sc.get(error, 'diagnostics', error));\n            ErrorManager.error('Parcel build installer process failed.');\n        }\n    }\n\n    /**\n     * @param {string} entryPath\n     * @returns {Parcel}\n     */\n    createBrowserBundler(entryPath)\n    {\n        return new Parcel(this.generateDefaultBrowserBundleOptions(entryPath));\n    }\n\n    /**\n     * @param {string} entryPath\n     * @returns {Object<string, any>}\n     */\n    generateDefaultBrowserBundleOptions(entryPath)\n    {\n        let workerFarm = createWorkerFarm({ backend: 'process' });\n        this.defaultBrowserBundleOptions = {\n            defaultConfig: 'reldens/lib/bundlers/drivers/parcel-config',\n            shouldDisableCache: true,\n            workerFarm,\n            targets: {\n                modern: {\n                    engines: {\n                        browsers: ['> 0.5%, last 2 versions, not dead']\n                    },\n                    distDir: this.distPath,\n                    outputFormat: 'esmodule'\n                },\n            },\n            entries: entryPath,\n            logLevel: 'verbose',\n            defaultTargetOptions: {\n                shouldDisableCache: true,\n                shouldOptimize: true,\n                sourceMaps: this.jsSourceMaps,\n                distEntry: entryPath,\n                distDir: this.distPath,\n                isLibrary: false,\n                outputFormat: 'esmodule'\n            }\n        };\n        return this.defaultBrowserBundleOptions;\n    }\n\n    /**\n     * @param {string} entryPath\n     * @returns {Parcel}\n     */\n    createCssBundler(entryPath)\n    {\n        let workerFarm = createWorkerFarm({ backend: 'process' });\n        return new Parcel({\n            defaultConfig: 'reldens/lib/bundlers/drivers/parcel-config',\n            entries: entryPath,\n            shouldDisableCache: true,\n            workerFarm,\n            defaultTargetOptions: {\n                shouldDisableCache: true,\n                shouldOptimize: true,\n                sourceMaps: this.cssSourceMaps,\n                distDir: this.projectCssPath,\n                isLibrary: false,\n                outputFormat: 'esmodule',\n                publicUrl: './'\n            }\n        });\n    }\n\n    copyNew()\n    {\n        this.copyDefaultAssets();\n        this.copyDefaultTheme();\n        this.copyPackage();\n        this.copyAdmin();\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async fullRebuild()\n    {\n        this.copyNew();\n        await this.buildSkeleton();\n        this.copyAdminFiles();\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async installSkeleton()\n    {\n        await this.copyIndex(true);\n        await this.copyServerFiles();\n        this.resetDist();\n        await this.fullRebuild();\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async createApp()\n    {\n        await this.copyIndex(true);\n        await this.updatePackageJson();\n        this.validateOrCreateTheme();\n        this.resetDist();\n        await this.fullRebuild();\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async copyServerFiles()\n    {\n        this.copyEnvFile();\n        this.copyKnexFile();\n        this.copyGitignoreFile();\n        await this.copyIndex();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    distPathExists()\n    {\n        let result = FileHandler.exists(this.distPath);\n        Logger.info('Dist path: '+this.distPath, 'Dist folder exists? '+(result ? 'yes' : 'no'));\n        return result;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    themePathExists()\n    {\n        let result = FileHandler.exists(this.projectThemePath);\n        Logger.info('Theme path: '+this.projectThemePath, 'Theme folder exists? '+(result ? 'yes' : 'no'));\n        return result;\n    }\n\n    validateOrCreateTheme()\n    {\n        let distExists = this.distPathExists();\n        let themeExists = this.themePathExists();\n        if(false === themeExists){\n            this.installDefaultTheme();\n            Logger.error(\n                'Project theme folder was not found: '+this.projectThemeName\n                +'\\nA copy from default has been made.'\n            );\n        }\n        if(false === distExists){\n            this.copyAssetsToDist();\n        }\n    }\n\n    /**\n     * @param {string} filePath\n     * @param {Object<string, any>} [params]\n     * @returns {Promise<string|false>}\n     */\n    async loadAndRenderTemplate(filePath, params)\n    {\n        if(!FileHandler.exists(filePath)){\n            Logger.error('Template not found.', {filePath});\n            return false;\n        }\n        let fileContent = FileHandler.fetchFileContents(filePath);\n        return await this.templateEngine.render(fileContent, params);\n    }\n\n    /**\n     * @returns {Promise<boolean|void>}\n     */\n    async createClientBundle()\n    {\n        // @TODO - BETA - Remove this function, just move to an auto-installation on first run feature.\n        let runBundler = 1 === Number(sc.get(process.env, 'RELDENS_ALLOW_RUN_BUNDLER', 0));\n        if(!runBundler){\n            return false;\n        }\n        let forceResetDistOnBundle = 1 === Number(sc.get(process.env, 'RELDENS_FORCE_RESET_DIST_ON_BUNDLE', 0));\n        if(forceResetDistOnBundle){\n            await this.resetDist();\n        }\n        let forceCopyAssetsOnBundle = 1 === Number(sc.get(process.env, 'RELDENS_FORCE_COPY_ASSETS_ON_BUNDLE', 0));\n        if(forceCopyAssetsOnBundle){\n            this.copyAssetsToDist();\n        }\n        Logger.info('Running bundle on: '+this.projectIndexPath);\n        await this.buildClient();\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async updatePackageJson()\n    {\n        let jsonFile = FileHandler.joinPaths(this.projectRoot, 'package.json');\n        Logger.info('Updating package.json.', jsonFile);\n        let readFile = jsonFile;\n        if(!FileHandler.exists(jsonFile)){\n            readFile = FileHandler.joinPaths(this.reldensModulePathInstallTemplatesFolder, 'data-package.json');\n            Logger.error('File package.json does not exists, changing read-file.', jsonFile);\n        }\n        let data = FileHandler.fetchFileJson(readFile);\n        if(!data){\n            Logger.critical('Invalid package.json data.', readFile);\n            return;\n        }\n        if(!data.alias){\n            data.alias = {};\n        }\n        if(data.alias.process){\n            Logger.critical('Data alias process already exists, it must be set to \"false\" for the bundler.', data);\n            data.alias.processBackup = data.alias.process;\n        }\n        data.alias.process = false;\n        if(!data.targets){\n            data.targets = {};\n        }\n        if(data.targets.main){\n            Logger.critical('Data targets main already exists, it must be set to \"false\" for the bundler.', data);\n            data.targets.mainBackup = data.targets.main;\n        }\n        data.targets.main = false;\n        await FileHandler.updateFileContents(jsonFile, JSON.stringify(data, null, 2));\n        Logger.info('File package.json updated successfully.', jsonFile);\n\n    }\n\n}\n\nmodule.exports.ThemeManager = ThemeManager;\n"
  },
  {
    "path": "lib/game/type-determiner.js",
    "content": "/**\n *\n * Reldens - TypeDeterminer\n *\n * Utility class for determining the type of game entities (players vs objects). Used primarily in\n * the skills system to identify whether a skill owner or target is a player entity (has sessionId)\n * or a game object entity (has key property). Provides type checking methods for skills, actions,\n * and battle calculations.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../users/server/player').Player} Player\n * @typedef {import('../objects/server/object-instance').ObjectInstance} ObjectInstance\n */\n\nclass TypeDeterminer\n{\n\n    /**\n     * @param {Player|ObjectInstance} skillOwner\n     * @returns {boolean}\n     */\n    isPlayer(skillOwner)\n    {\n        // @TODO - BETA - Improve.\n        return sc.hasOwn(skillOwner, 'sessionId');\n    }\n\n    /**\n     * @param {Player|ObjectInstance} skillOwner\n     * @returns {boolean}\n     */\n    isObject(skillOwner)\n    {\n        // @TODO - BETA - Improve.\n        return sc.hasOwn(skillOwner, 'key');\n    }\n\n}\n\nmodule.exports.TypeDeterminer = TypeDeterminer;\n"
  },
  {
    "path": "lib/import/server/attributes-per-level-importer.js",
    "content": "/**\n *\n * Reldens - AttributesPerLevelImporter\n *\n * Imports player stat configurations per level and class path. Creates stats definitions,\n * then generates level modifiers that incrementally increase player stats (hp, mp, atk, etc.)\n * as they level up within each class path.\n *\n */\n\nconst { ClassPathKeyFactory } = require('../../actions/factories/class-path-key-factory');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/server/manager').ServerManager} ServerManager\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\nclass AttributesPerLevelImporter\n{\n\n    /**\n     * @param {ServerManager} serverManager\n     */\n    constructor(serverManager)\n    {\n        /** @type {ServerManager} */\n        this.serverManager = serverManager;\n        /** @type {BaseDriver} */\n        this.statsRepository = this.serverManager?.dataServer?.getEntity('stats');\n        /** @type {BaseDriver} */\n        this.objectsStatsRepository = this.serverManager?.dataServer?.getEntity('objectsStats');\n        /** @type {BaseDriver} */\n        this.classPathRepository = this.serverManager.dataServer.getEntity('skillsClassPath');\n        /** @type {BaseDriver} */\n        this.levelRepository = this.serverManager.dataServer.getEntity('skillsLevels');\n        /** @type {BaseDriver} */\n        this.levelModifiersRepository = this.serverManager.dataServer.getEntity('skillsLevelsModifiers');\n        /** @type {Object<string, Object>} */\n        this.statsModels = {};\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {Promise<boolean>}\n     */\n    async import(data)\n    {\n        if(!data){\n            Logger.critical('Import data not found.');\n            return false;\n        }\n        if(!this.validRepositories([\n            'statsRepository',\n            'objectsStatsRepository',\n            'classPathRepository',\n            'levelRepository',\n            'levelModifiersRepository'\n        ])){\n            return false;\n        }\n        /** @type {string} */\n        this.modifierKeyPrefix = data.modifierKeyPrefix || 'inc_';\n        /** @type {number} */\n        this.operationId = data.operationId || 1;\n        /** @type {Array<string>} */\n        this.propertiesPaths = data.propertiesPaths || ['stats/', 'statsBase/'];\n        this.statsModels = data.statsModels || {};\n        if(data.stats){\n            await this.createStats(data.stats);\n        }\n        if(data.statsByVariation?.player){\n            await this.createPlayerStatsPerLevelAndClassPath(data.statsByVariation.player);\n        }\n        return true;\n    }\n\n    /**\n     * @param {Array<string>} repositoriesKey\n     * @returns {boolean}\n     */\n    validRepositories(repositoriesKey)\n    {\n        for(let repositoryKey of repositoriesKey){\n            if(!this[repositoryKey]){\n                Logger.critical('Repository \"'+repositoryKey+'\" not found.');\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object<string, Object>} statsData\n     * @returns {Promise<Object<string, Object>>}\n     */\n    async createStats(statsData)\n    {\n        for(let i of Object.keys(statsData)){\n            let stat = statsData[i];\n            stat.key = i;\n            this.statsModels[i] = await this.statsRepository.create(stat);\n        }\n        return this.statsModels;\n    }\n\n    /**\n     * @param {Object<string, Object>} playerStatsByLevelAndClassPath\n     * @returns {Promise<void>}\n     */\n    async createPlayerStatsPerLevelAndClassPath(playerStatsByLevelAndClassPath)\n    {\n        for(let level of Object.keys(playerStatsByLevelAndClassPath)){\n            let statsByClassPath = playerStatsByLevelAndClassPath[level];\n            await this.createPlayerStatsPerClassPath(statsByClassPath, level);\n        }\n    }\n\n    /**\n     * @param {Object<string, Object>} statsByClassPath\n     * @param {string} level\n     * @returns {Promise<void>}\n     */\n    async createPlayerStatsPerClassPath(statsByClassPath, level)\n    {\n        for(let classPathLabel of Object.keys(statsByClassPath)){\n            let key = ClassPathKeyFactory.fromLabel(classPathLabel);\n            let levelModel = await this.fetchLevelByClassPathKey(level, key);\n            if(!levelModel){\n                Logger.error('Level ID not found for key \"' + level + '\" and class path key \"' + key + '\".');\n                continue;\n            }\n            let statsData = statsByClassPath[classPathLabel];\n            await this.createPlayerStats(statsData, levelModel);\n        }\n    }\n\n    /**\n     * @param {Object} statsData\n     * @param {Object} levelModel\n     * @returns {Promise<void>}\n     */\n    async createPlayerStats(statsData, levelModel)\n    {\n        for(let statKey of Object.keys(statsData)){\n            let statId = this.statsModels[statKey] || await this.fetchStatIdByKey(statKey);\n            if(!statId){\n                Logger.error('Stat ID not found for key \"' + statKey + '\".');\n                continue;\n            }\n            await this.createStatsModifiers(levelModel, statKey, statsData);\n        }\n    }\n\n    /**\n     * @param {Object} levelModel\n     * @param {string} statKey\n     * @param {Object} statsData\n     * @returns {Promise<void>}\n     */\n    async createStatsModifiers(levelModel, statKey, statsData)\n    {\n        for(let propertyPath of this.propertiesPaths){\n            let modifierCreateData = {\n                level_id: levelModel.id,\n                key: this.modifierKeyPrefix + statKey,\n                property_key: propertyPath + statKey,\n                operation: this.operationId,\n                value: statsData[statKey]\n            };\n            let result = await this.levelModifiersRepository.create(modifierCreateData);\n            if(result){\n                Logger.info('Created level modifier with ID \"' + result.id + '\".', modifierCreateData);\n            }\n        }\n    }\n\n    /**\n     * @param {string} statKey\n     * @returns {Promise<Object|null>}\n     */\n    async fetchStatIdByKey(statKey)\n    {\n        return await this.statsRepository.loadOneBy('key', statKey);\n    }\n\n    /**\n     * @param {string} level\n     * @param {string} classPathKey\n     * @returns {Promise<Object|boolean>}\n     */\n    async fetchLevelByClassPathKey(level, classPathKey)\n    {\n        let classPath = await this.classPathRepository.loadOneBy('key', classPathKey);\n        if(!classPath){\n            Logger.error('ClassPath not found for key \"'+classPath+'\".');\n            return false;\n        }\n        return await this.levelRepository.loadOne({key: Number(level), level_set_id: classPath.levels_set_id});\n    }\n\n}\n\nmodule.exports.AttributesPerLevelImporter = AttributesPerLevelImporter;\n"
  },
  {
    "path": "lib/import/server/class-paths-importer.js",
    "content": "/**\n *\n * Reldens - ClassPathsImporter\n *\n * Imports character class paths and their progression systems. Creates levels sets,\n * imports experience requirements per level, and assigns ability labels per level within each class path.\n *\n */\n\nconst { ClassPathKeyFactory } = require('../../actions/factories/class-path-key-factory');\nconst { PlayersExperiencePerLevelImporter } = require('./players-experience-per-level-importer');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/server/manager').ServerManager} ServerManager\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\nclass ClassPathsImporter\n{\n\n    /**\n     * @param {ServerManager} serverManager\n     */\n    constructor(serverManager)\n    {\n        /** @type {ServerManager} */\n        this.serverManager = serverManager;\n        /** @type {PlayersExperiencePerLevelImporter} */\n        this.playersExperiencePerLevelImporter = new PlayersExperiencePerLevelImporter(serverManager);\n        /** @type {BaseDriver} */\n        this.levelsSetRepository = this.serverManager.dataServer.getEntity('skillsLevelsSet');\n        /** @type {BaseDriver} */\n        this.classPathRepository = this.serverManager.dataServer.getEntity('skillsClassPath');\n        /** @type {BaseDriver} */\n        this.classLabelRepository = this.serverManager.dataServer.getEntity('skillsClassPathLevelLabels');\n        /** @type {BaseDriver} */\n        this.levelRepository = this.serverManager.dataServer.getEntity('skillsLevels');\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {Promise<boolean>}\n     */\n    async import(data)\n    {\n        if(!data){\n            Logger.critical('Import data not found.');\n            return false;\n        }\n        if(!data.classPaths){\n            Logger.critical('Class paths data not found.');\n            return false;\n        }\n        if(!data.levelsSets){\n            Logger.critical('Levels sets data not found.');\n            return false;\n        }\n        this.preAppendRaceToAbilities(data);\n        let levelSetsKeys = Object.keys(data.levelsSets);\n        let pathsKeys = Object.keys(data.classPaths);\n        for(let label of pathsKeys){\n            let levelsSetModel = -1 === levelSetsKeys.indexOf(label) || data.levelsSets?.all\n                ? await this.levelsSetRepository.create({autoFillRanges: 0})\n                : await this.levelsSetRepository.load(data.levelsSets[label]);\n            if(!levelsSetModel){\n                Logger.critical('Levels set not found for label \"'+label+'\".');\n                continue;\n            }\n            Logger.info('Created level set with ID \"'+levelsSetModel.id+'\".');\n            await this.playersExperiencePerLevelImporter.import(\n                data.levelsSets[label] || data.levelsSets.all,\n                levelsSetModel.id\n            );\n            let key = ClassPathKeyFactory.fromLabel(label);\n            let createdClassPath = await this.classPathRepository.create({\n                key,\n                label,\n                levels_set_id: levelsSetModel.id\n            });\n            let classPathData = {key, label, levels_set_id: levelsSetModel.id};\n            Logger.info('Created class path with ID \"'+createdClassPath.id+'\".', classPathData);\n            await this.createSubClasses(createdClassPath.id, data, label);\n        }\n        return true;\n    }\n\n    /**\n     * @param {number} classPathId\n     * @param {Object} data\n     * @param {string} label\n     * @returns {Promise<void>}\n     */\n    async createSubClasses(classPathId, data, label)\n    {\n        let path = data.classPaths[label];\n        let pathKeys = Object.keys(path);\n        for(let pathKey of pathKeys){\n            let level = await this.levelRepository.loadOneBy('key', Number(pathKey));\n            let classPathLabelData = {class_path_id: classPathId, label: path[pathKey], level_id: level.id};\n            await this.classLabelRepository.create(classPathLabelData);\n            Logger.info('Created class path label.', classPathLabelData);\n        }\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {Object|boolean}\n     */\n    preAppendRaceToAbilities(data)\n    {\n        if(!data.classPaths){\n            return false;\n        }\n        if(!data.preAppendRace){\n            return false;\n        }\n        for(let classPath in data.classPaths){\n            let race = classPath.split(' - ')[0];\n            let abilities = data.classPaths[classPath];\n            for(let level in abilities){\n                abilities[level] = race + ' - ' + abilities[level];\n            }\n        }\n        return data;\n    }\n\n}\n\nmodule.exports.ClassPathsImporter = ClassPathsImporter;\n"
  },
  {
    "path": "lib/import/server/maps-importer.js",
    "content": "/**\n *\n * Reldens - MapsImporter\n *\n * Imports Tiled map files (.json) into the Reldens database, creating room records,\n * handling tileset image extrusion, copying assets to dist folders, and setting up\n * room change points and return points from map layer properties.\n *\n */\n\nconst { ExtrudeTileset } = require('./tile-extruder');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n * @typedef {import('../../game/server/theme-manager').ThemeManager} ThemeManager\n *\n * @typedef {Object} MapsImporterProps\n * @property {ConfigManager} configManager\n * @property {BaseDataServer} dataServer\n * @property {ThemeManager} themeManager\n */\nclass MapsImporter\n{\n\n    /**\n     * @param {MapsImporterProps} props\n     */\n    constructor(props)\n    {\n        /** @type {ConfigManager} */\n        this.config = props?.configManager;\n        /** @type {BaseDataServer} */\n        this.dataServer = props?.dataServer;\n        /** @type {ThemeManager} */\n        this.themeManager = props?.themeManager;\n        /** @type {string} */\n        this.generatedDataPath = this.themeManager?.projectGeneratedDataPath;\n        /** @type {boolean} */\n        this.importAssociationsForChangePoints = false;\n        /** @type {boolean} */\n        this.importAssociationsRecursively = false;\n        /** @type {boolean} */\n        this.verifyTilesetImage = true;\n        /** @type {Object<string, string>} */\n        this.maps = {};\n        /** @type {Object<string, Object>} */\n        this.mapsJson = {};\n        /** @type {Object<string, Array<string>>} */\n        this.mapsImages = {};\n        /** @type {Object<string, Object>} */\n        this.roomsChangePoints = {};\n        /** @type {Object<string, Object>} */\n        this.roomsReturnPoints = {};\n        /** @type {Object<string, Object>} */\n        this.createdRooms = {};\n        /** @type {string} */\n        this.errorCode = '';\n        this.setupRepositories();\n    }\n\n    setupRepositories()\n    {\n        if (!this.dataServer){\n            Logger.warning('Data server not found on MapsImporter.');\n            return false;\n        }\n        /** @type {BaseDriver} */\n        this.roomsRepository = this.dataServer.getEntity('rooms');\n        /** @type {BaseDriver} */\n        this.roomsChangePointsRepository = this.dataServer.getEntity('roomsChangePoints');\n        /** @type {BaseDriver} */\n        this.roomsReturnPointsRepository = this.dataServer.getEntity('roomsReturnPoints');\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {Promise<boolean>}\n     */\n    async import(data)\n    {\n        if(!data){\n            Logger.critical('Import data not found.');\n            return false;\n        }\n        if(!this.validRepositories(['roomsRepository', 'roomsChangePointsRepository', 'roomsReturnPointsRepository'])){\n            return false;\n        }\n        this.maps = data.maps;\n        this.importAssociationsForChangePoints = 1 === Number(sc.get(data, 'importAssociationsForChangePoints', 0));\n        this.importAssociationsRecursively = 1 === Number(sc.get(data, 'importAssociationsRecursively', 0));\n        this.verifyTilesetImage = 1 === Number(sc.get(data, 'verifyTilesetImage', 1));\n        /** @type {boolean} */\n        this.automaticallyExtrudeMaps = 1 === Number(sc.get(data, 'automaticallyExtrudeMaps', 0));\n        /** @type {Object<string, any>} */\n        this.handlerParams = sc.get(data, 'handlerParams', {});\n        this.setImportFilesPath(data);\n        if(this.maps){\n            if(!await this.loadValidMaps()){\n                return false;\n            }\n        }\n        if(this.mapsJson){\n            if(!await this.createRooms()){\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} data\n     */\n    setImportFilesPath(data)\n    {\n        let generatedDataPath = String(sc.get(data, 'generatedDataPath', ''));\n        if('' !== generatedDataPath){\n            this.generatedDataPath = generatedDataPath;\n        }\n        let relativeGeneratedDataPath = String(sc.get(data, 'relativeGeneratedDataPath', ''));\n        if('' !== relativeGeneratedDataPath){\n            this.generatedDataPath = FileHandler.joinPaths(this.themeManager.projectRoot, relativeGeneratedDataPath);\n        }\n    }\n\n    /**\n     * @param {Array<string>} repositoriesKey\n     * @returns {boolean}\n     */\n    validRepositories(repositoriesKey)\n    {\n        for(let repositoryKey of repositoriesKey){\n            if(!this[repositoryKey]){\n                Logger.critical('Repository \"'+repositoryKey+'\" not found.');\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async loadValidMaps()\n    {\n        for(let mapTitle of Object.keys(this.maps)){\n            let mapExists = await this.roomsRepository.loadOneBy('name', this.maps[mapTitle]);\n            if(mapExists){\n                Logger.error('Map with name \"'+this.maps[mapTitle]+'\" already exists.');\n                this.errorCode = 'mapExists';\n                return false;\n            }\n            if(!this.loadMapByTitle(mapTitle)){\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} mapTitle\n     * @param {boolean} [useTitleAsFileName]\n     * @returns {boolean}\n     */\n    loadMapByTitle(mapTitle, useTitleAsFileName = false)\n    {\n        let mapName = useTitleAsFileName ? mapTitle : this.maps[mapTitle];\n        let fullPath = FileHandler.joinPaths(this.generatedDataPath, mapName + '.json');\n        let fileContent = FileHandler.exists(fullPath) ? FileHandler.readFile(fullPath) : '';\n        if('' === fileContent){\n            Logger.critical('File \"' + mapName + '.json\" not found.', fullPath);\n            this.errorCode = 'mapJsonNotFound';\n            return false;\n        }\n        let jsonContent = sc.toJson(fileContent);\n        if(this.verifyTilesetImage){\n            let tilesets = jsonContent?.tilesets || [];\n            if(0 === tilesets.length){\n                Logger.critical('File \"' + mapName + '.json\" must have at least one tileset.');\n                this.errorCode = 'mapJsonMissingTileset';\n                return false;\n            }\n            for(let tileset of tilesets){\n                if(!tileset.image){\n                    Logger.critical('File \"' + mapName + '.json\" must have at least one tileset with an image.');\n                    this.errorCode = 'mapJsonMissingTilesetImage';\n                    return false;\n                }\n                let checkImagePath = FileHandler.joinPaths(this.generatedDataPath, tileset.image);\n                if(!FileHandler.exists(checkImagePath)){\n                    Logger.critical('File \"' + checkImagePath + '\" not found.');\n                    this.errorCode = 'mapTilesetImageNotFound';\n                    return false;\n                }\n                if(!this.mapsImages[mapName]){\n                    this.mapsImages[mapName] = [];\n                }\n                if(-1 === this.mapsImages[mapName].indexOf(tileset.image)){\n                    this.mapsImages[mapName].push(tileset.image);\n                }\n            }\n        }\n        this.mapsJson[mapName] = sc.deepJsonClone(jsonContent);\n        return true;\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async createRooms()\n    {\n        for(let mapTitle of Object.keys(this.maps)){\n            if(!await this.createRoomByMapTitle(mapTitle)){\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {Array<string>} fileNames\n     * @returns {Promise<boolean>}\n     */\n    async copyExtrudedFiles(fileNames)\n    {\n        for(let fileName of fileNames){\n            let from = FileHandler.joinPaths(this.generatedDataPath, fileName);\n            let to = FileHandler.joinPaths(this.generatedDataPath, fileName.replace('.png', '-original.png'));\n            let result = FileHandler.copyFile(from, to);\n            if(!result){\n                Logger.error('File copy error.', FileHandler.error);\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} mapTitle\n     * @param {boolean} [useTitleAsFileName]\n     * @returns {Promise<Object|boolean>}\n     */\n    async createRoomByMapTitle(mapTitle, useTitleAsFileName = false)\n    {\n        if(this.createdRooms[mapTitle]){\n            return this.createdRooms[mapTitle];\n        }\n        let mapName = useTitleAsFileName ? mapTitle : this.maps[mapTitle];\n        let mapFileName = mapName + '.json';\n        let mapsImages = this.mapsImages[mapName] || [];\n        if(this.automaticallyExtrudeMaps){\n            let createExtrudeBackups = await this.copyExtrudedFiles(mapsImages);\n            if(!createExtrudeBackups){\n                this.errorCode = 'createExtrudeBackupsError';\n                return false;\n            }\n            let margin = Number(sc.get(this.handlerParams, 'margin', 0));\n            let mapJson = this.mapsJson[mapName];\n            for(let image of mapsImages){\n                let inputPath = image.replace('.png', '-original.png');\n                try {\n                    let imageObject = await ExtrudeTileset(\n                        mapJson.tilewidth,\n                        mapJson.tileheight,\n                        FileHandler.joinPaths(this.generatedDataPath, inputPath),\n                        {\n                            margin,\n                            spacing: Number(sc.get(this.handlerParams, 'spacing', 0)),\n                            color: sc.get(this.handlerParams, 'color', 0xffffff00),\n                            extrusion: Number(sc.get(this.handlerParams, 'extrusion', 1))\n                        }\n                    );\n                    try {\n                        await imageObject.write(FileHandler.joinPaths(this.generatedDataPath, image));\n                    } catch (error) {\n                        Logger.critical('Image object could not be saved as file.', image, error);\n                        this.errorCode = 'imageObjectSaveError';\n                        return false;\n                    }\n                    for(let tileset of mapJson.tilesets){\n                        if(tileset.image !== image){\n                            continue;\n                        }\n                        tileset.margin = this.config.getWithoutLogs('maps/extrude/margin', 1);\n                        tileset.spacing = this.config.getWithoutLogs('maps/extrude/spacing', 2);\n                        tileset.imagewidth = imageObject.bitmap.width;\n                        tileset.imageheight = imageObject.bitmap.height;\n                        if(margin){\n                            tileset.tilewidth = tileset.tilewidth + 2 * margin;\n                            tileset.tileheight = tileset.tileheight + 2 * margin;\n                        }\n                    }\n                } catch (error) {\n                    Logger.critical('Image object could not be extruded.', image, error);\n                    this.errorCode = 'imageObjectExtrudeError';\n                    return false;\n                }\n            }\n            if(margin){\n                mapJson.tilewidth = mapJson.tilewidth + 2 * margin;\n                mapJson.tileheight = mapJson.tileheight + 2 * margin;\n            }\n            await FileHandler.updateFileContents(\n                FileHandler.joinPaths(this.generatedDataPath, mapFileName),\n                JSON.stringify(mapJson)\n            );\n        }\n        let filesCopied = await this.copyFiles([mapFileName, ...mapsImages]);\n        if(!filesCopied){\n            Logger.critical('Could not copy map files for \"' + mapName + '\" / \"' + mapFileName + '\".');\n            this.errorCode = 'copyMapFilesError';\n            return false;\n        }\n        let roomCreateData = {\n            name: mapName,\n            title: this.fetchRoomTitle(mapName, mapTitle),\n            map_filename: mapFileName,\n            scene_images: mapsImages.join(',')\n        };\n        let result = false;\n        try {\n            result = await this.roomsRepository.create(roomCreateData);\n        } catch (error) {\n            Logger.critical('Map \"' + mapName + '\" could not be saved. Error: ' + error.message, roomCreateData);\n            this.errorCode = 'mapSaveError';\n            return false;\n        }\n        if(!result){\n            Logger.critical('Could not create room with title \"' + roomCreateData.title + '\".', roomCreateData);\n            this.errorCode = 'createRoomError';\n            return false;\n        }\n        this.createdRooms[mapName] = result;\n        Logger.info('Created room \"'+mapName+'\".');\n        await this.createRoomsChangePoints(mapName, result);\n        await this.createRoomsReturnPoints(result);\n        return this.createdRooms[mapName];\n    }\n\n    /**\n     * @param {string} mapName\n     * @param {string} mapTitle\n     * @returns {string}\n     */\n    fetchRoomTitle(mapName, mapTitle)\n    {\n        let mapJson = this.mapsJson[mapName];\n        if(sc.isArray(mapJson.properties)){\n            for(let property of mapJson.properties){\n                if(property.name === 'mapTitle'){\n                    return property.value;\n                }\n            }\n        }\n        return mapTitle;\n    }\n\n    /**\n     * @param {Array<string>} fileNames\n     * @returns {Promise<boolean>}\n     */\n    async copyFiles(fileNames)\n    {\n        for(let fileName of fileNames){\n            let from = FileHandler.joinPaths(this.generatedDataPath, fileName);\n            let to = FileHandler.joinPaths(this.themeManager.projectAssetsPath, 'maps', fileName);\n            let result = FileHandler.copyFile(from, to);\n            if(!result){\n                Logger.critical('Could not copy file \"' + from + '\" to \"' + to + '\".');\n                return false;\n            }\n            let toDist = FileHandler.joinPaths(this.themeManager.assetsDistPath, 'maps', fileName);\n            let resultDist = FileHandler.copyFile(from, toDist);\n            if(!resultDist){\n                Logger.critical('Could not copy file \"' + from + '\" to \"' + to + '\".');\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} mapName\n     * @param {Object} createdRoom\n     * @returns {Promise<void>}\n     */\n    async createRoomsChangePoints(mapName, createdRoom)\n    {\n        Logger.info('Creating rooms change points for \"'+mapName+'\".');\n        let mapJson = this.mapsJson[mapName];\n        if(!sc.isArray(mapJson.layers)){\n            Logger.info('Warning Map JSON not found for \"'+mapName+'\".');\n            return false;\n        }\n        let changePointForKey = 'change-point-for-';\n        for(let layer of mapJson.layers){\n            if(!sc.isArray(layer.properties)){\n                Logger.info('Layer \"'+layer.name+'\" properties is not an array on \"'+mapName+'\".');\n                continue;\n            }\n            let roomChangePoints = [];\n            for(let property of layer.properties){\n                if(0 === property.name.indexOf(changePointForKey)){\n                    roomChangePoints.push(property);\n                }\n            }\n            Logger.info(\n                'Found '+roomChangePoints.length+' rooms change points on \"'+mapName+'\".',\n                changePointForKey,\n                layer.properties\n            );\n            for(let changePointData of roomChangePoints){\n                let nextRoomName = changePointData.name.replace(changePointForKey, '');\n                let nextRoomModel = await this.provideRoomByName(nextRoomName);\n                if(!nextRoomModel){\n                    Logger.error(\n                        'Could not find room \"'+nextRoomName+'\" while creating change points.',\n                        changePointData\n                    );\n                    continue;\n                }\n                let roomChangePointCreateData = {\n                    room_id: createdRoom.id,\n                    tile_index: changePointData.value,\n                    next_room_id: nextRoomModel.id\n                };\n                let result = await this.roomsChangePointsRepository.create(roomChangePointCreateData);\n                if(!result){\n                    Logger.critical(\n                        'Could not create rooms change point for \"'+nextRoomName+'\".',\n                        roomChangePointCreateData\n                    );\n                    continue;\n                }\n                Logger.info('Created rooms change point with ID \"'+result.id+'\".', roomChangePointCreateData);\n            }\n        }\n    }\n\n    /**\n     * @param {Object} createdRoom\n     * @returns {Promise<void>}\n     */\n    async createRoomsReturnPoints(createdRoom)\n    {\n        Logger.info('Creating room return points for \"'+createdRoom.name+'\".');\n        let currentRoomMapJson = this.mapsJson[createdRoom.name];\n        if(!sc.isArray(currentRoomMapJson.layers)){\n            Logger.info('Warning Map JSON not found for \"'+createdRoom.name+'\".');\n            return false;\n        }\n        let returnPointForKey = 'return-point-for-';\n        let returnPointForDefaultKey = 'return-point-for-default-';\n        for(let layer of currentRoomMapJson.layers){\n            if(!sc.isArray(layer.properties)){\n                Logger.info('Layer \"'+layer.name+'\" properties is not an array on \"'+createdRoom.name+'\".');\n                continue;\n            }\n            let roomReturnPoints = this.fetchReturnPointsFromLayer(layer, returnPointForKey);\n            Logger.info(\n                'Found '+roomReturnPoints.length+' rooms return points on \"'+createdRoom.name+'\".',\n                layer.properties\n            );\n            for(let i = 0; i < roomReturnPoints.length; i++){\n                let returnPointData = roomReturnPoints[i];\n                let isDefault = -1 !== returnPointData.name.indexOf(returnPointForDefaultKey);\n                let returnPointForName = returnPointData.name.replace(\n                    isDefault ? returnPointForDefaultKey : returnPointForKey,\n                    ''\n                );\n                let roomModel = this.createdRooms[returnPointForName] || await this.roomsRepository.loadOneBy(\n                    'name',\n                    returnPointForName\n                );\n                if(!roomModel){\n                    Logger.error(\n                        'Could not find room \"'+returnPointForName+'\" while creating return point.',\n                        returnPointData\n                    );\n                    continue;\n                }\n                await this.saveReturnPoint(\n                    isDefault,\n                    createdRoom,\n                    roomModel,\n                    returnPointData,\n                    currentRoomMapJson,\n                    returnPointForName\n                );\n            }\n        }\n    }\n\n    /**\n     * @param {Object} layer\n     * @returns {Array<Object>}\n     */\n    fetchReturnPointsFromLayer(layer)\n    {\n        let key = 'return-point-';\n        let keyFor = key + 'for-';\n        let keyX = key + 'x-';\n        let keyY = key + 'y-';\n        let keyPosition = key + 'position-';\n        let keyIsDefault = key + 'isDefault-';\n        let roomReturnPoints = [];\n        let roomReturnPointsIndex = {};\n        let roomReturnPointsX = {};\n        let roomReturnPointsY = {};\n        let roomReturnPointsPosition = {};\n        let roomReturnPointsIsDefault = {};\n        // get all the data from the layer that could be in any order\n        for(let property of layer.properties){\n            let normalizedName = property.name\n                .replace(keyFor, '')\n                .replace(keyX, '')\n                .replace(keyY, '')\n                .replace(keyPosition, '')\n                .replace(keyIsDefault, '')\n                .replace('default-', '');\n            if(0 === property.name.indexOf(keyFor)){\n                roomReturnPointsIndex[normalizedName] = property;\n            }\n            if(0 === property.name.indexOf(keyX)){\n                roomReturnPointsX[normalizedName] = property;\n            }\n            if(0 === property.name.indexOf(keyY)){\n                roomReturnPointsY[normalizedName] = property;\n            }\n            if(0 === property.name.indexOf(keyPosition)){\n                roomReturnPointsPosition[normalizedName] = property;\n            }\n            if(0 === property.name.indexOf(keyIsDefault)){\n                roomReturnPointsIsDefault[normalizedName] = property;\n            }\n        }\n        // map only points with indexes:\n        for(let propertyName of Object.keys(roomReturnPointsIndex)){\n            let newPoint = {\n                name: propertyName,\n                value: roomReturnPointsIndex[propertyName].value\n            };\n            if(roomReturnPointsX[propertyName]){\n                newPoint.x = roomReturnPointsX[propertyName].value;\n            }\n            if(roomReturnPointsY[propertyName]){\n                newPoint.y = roomReturnPointsY[propertyName].value;\n            }\n            if(roomReturnPointsPosition[propertyName]){\n                newPoint.position = roomReturnPointsPosition[propertyName].value;\n            }\n            if(roomReturnPointsIsDefault[propertyName]){\n                newPoint.isDefault = roomReturnPointsIsDefault[propertyName].value;\n            }\n            roomReturnPoints.push(newPoint);\n        }\n        return roomReturnPoints;\n    }\n\n    /**\n     * @param {boolean} isDefault\n     * @param {Object} createdRoom\n     * @param {Object} roomModel\n     * @param {Object} returnPointData\n     * @param {Object} currentRoomMapJson\n     * @param {string} returnPointForName\n     * @returns {Promise<boolean>}\n     */\n    async saveReturnPoint(isDefault, createdRoom, roomModel, returnPointData, currentRoomMapJson, returnPointForName)\n    {\n        // a valid \"x\" is determined by the map width in points:\n        let mapWidthInPoints = currentRoomMapJson.width * currentRoomMapJson.tilewidth;\n        let x = (returnPointData.x * currentRoomMapJson.tilewidth) + (currentRoomMapJson.tilewidth / 2);\n        if(mapWidthInPoints < x){\n            x = mapWidthInPoints - (currentRoomMapJson.tilewidth / 2);\n        }\n        // a valid \"y\" is determined by the specified return position (top or down for now):\n        let playerY = 'down' === returnPointData.position\n            ? currentRoomMapJson.tileheight\n            : -currentRoomMapJson.tileheight;\n        let y = (returnPointData.y * currentRoomMapJson.tileheight) + playerY;\n        // create the room return point:\n        let roomReturnPointCreateData = {\n            // destination room id, for example going from the map in to the house this will be the house ID:\n            room_id: createdRoom.id,\n            // display direction:\n            direction: returnPointData.position,\n            // x position in map in pixels + half tile because the player occupies one tile space:\n            x,\n            // y position in map in pixels + half tile because the player occupies one tile space:\n            y,\n            // if is the default place where the player starts when selecting the map:\n            is_default: Boolean(isDefault || returnPointData.isDefault),\n            // room id where the change point was hit, for example the town ID:\n            from_room_id: isDefault ? null : roomModel.id\n        };\n        let result = await this.roomsReturnPointsRepository.create(roomReturnPointCreateData);\n        if(!result){\n            Logger.critical(\n                'Could not create rooms return point for \"' + returnPointForName + '\".',\n                roomReturnPointCreateData\n            );\n            return false;\n        }\n        Logger.info('Created rooms return point with ID \"' + result.id + '\".', roomReturnPointCreateData);\n        return true;\n    }\n\n    /**\n     * @param {string} roomName\n     * @returns {Promise<Object|boolean>}\n     */\n    async provideRoomByName(roomName)\n    {\n        if(this.importAssociationsForChangePoints){\n            if(!this.mapsJson[roomName]){\n                this.loadMapByTitle(roomName, true);\n            }\n            if(this.createdRooms[roomName]){\n                return this.createdRooms[roomName];\n            }\n            return await this.createRoomByMapTitle(roomName, true);\n        }\n        return this.roomsRepository.loadOneBy('name', roomName);\n    }\n\n}\n\nmodule.exports.MapsImporter = MapsImporter;\n"
  },
  {
    "path": "lib/import/server/objects-importer.js",
    "content": "/**\n *\n * Reldens - ObjectsImporter\n *\n * Imports game objects (NPCs, enemies, interactable) into database rooms. Creates object records\n * with associated assets, animations, stats, respawn areas, and experience rewards. Supports bulk\n * import with attribute/experience enrichment from external JSON files.\n *\n */\n\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/server/theme-manager').ThemeManager} ThemeManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\nclass ObjectsImporter\n{\n\n    /**\n     * @param {Object} props\n     * @param {ThemeManager} props.themeManager\n     * @param {BaseDataServer} props.dataServer\n     */\n    constructor(props)\n    {\n        /** @type {ThemeManager} */\n        this.themeManager = sc.get(props, 'themeManager');\n        /** @type {BaseDataServer} */\n        this.dataServer = sc.get(props, 'dataServer');\n        /** @type {Object<number, Object>} */\n        this.statsById = {};\n        /** @type {Object<string, number>} */\n        this.statsIdsByKeys = {};\n        /** @type {Object<string, number>} */\n        this.objectTypesIdByName = {};\n        /** @type {Object} */\n        this.defaults = {};\n        /** @type {string} */\n        this.attributesPerLevelFile = '';\n        /** @type {string} */\n        this.experiencePerLevelFile = '';\n        /** @type {Object} */\n        this.attributesPerLevel = {};\n        /** @type {Object} */\n        this.experiencePerLevel = {};\n        this.setupRepositories();\n        // @TODO - BETA - Improve importer to only load required rooms once.\n        // this.roomsById = {};\n        // this.roomsIdsByNames = {};\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setupRepositories()\n    {\n        if(!this.dataServer){\n            Logger.error('Data server not available on Objects Importer.');\n            return false;\n        }\n        /** @type {BaseDriver} */\n        this.objectTypesRepository = this.dataServer.getEntity('objectsTypes');\n        /** @type {BaseDriver} */\n        this.statsRepository = this.dataServer.getEntity('stats');\n        /** @type {BaseDriver} */\n        this.roomsRepository = this.dataServer.getEntity('rooms');\n        /** @type {BaseDriver} */\n        this.objectsRepository = this.dataServer.getEntity('objects');\n        /** @type {BaseDriver} */\n        this.objectsStatsRepository = this.dataServer.getEntity('objectsStats');\n        /** @type {BaseDriver} */\n        this.objectsAssetsRepository = this.dataServer.getEntity('objectsAssets');\n        /** @type {BaseDriver} */\n        this.objectsAnimationsRepository = this.dataServer.getEntity('objectsAnimations');\n        /** @type {BaseDriver} */\n        this.respawnRepository = this.dataServer.getEntity('respawn');\n        /** @type {BaseDriver} */\n        this.rewardsRepository = this.dataServer.getEntity('rewards');\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {Promise<boolean>}\n     */\n    async import(data)\n    {\n        if(!data){\n            Logger.critical('Import data not found.');\n            return false;\n        }\n        if(!sc.isArray(data.objects)){\n            Logger.critical('Import Objects data not found.', data);\n            return false;\n        }\n        if(!this.validRepositories([\n            'objectTypesRepository',\n            'statsRepository',\n            'roomsRepository',\n            'objectsRepository',\n            'objectsStatsRepository',\n            'objectsAssetsRepository',\n            'objectsAnimationsRepository',\n            'respawnRepository',\n            'rewardsRepository'\n        ])){\n            return false;\n        }\n        await this.loadObjectTypes();\n        await this.loadStats();\n        this.attributesPerLevelFile = sc.get(data, 'attributesPerLevelFile', '');\n        this.experiencePerLevelFile = sc.get(data, 'experiencePerLevelFile', '');\n        this.attributesPerLevel = sc.get(\n            this.loadDataFromJsonFile(this.attributesPerLevelFile),\n            'statsByVariation',\n            {}\n        );\n        this.experiencePerLevel = this.loadDataFromJsonFile(this.experiencePerLevelFile);\n        this.defaults = sc.get(data, 'defaults', {});\n        for(let objectData of data.objects){\n            await this.createObjectPerRoom(\n                this.enrichObjectData(objectData)\n            );\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} objectData\n     * @returns {Object}\n     */\n    enrichObjectData(objectData)\n    {\n        let enrichedObjectData = sc.deepMergeProperties(sc.deepJsonClone(this.defaults), objectData);\n        let level = String(sc.get(enrichedObjectData, 'level', '1'));\n        let attributes = this.fetchAttributes(enrichedObjectData, level);\n        if(attributes){\n            enrichedObjectData.stats = attributes;\n        }\n        enrichedObjectData.experience = this.fetchExperience(enrichedObjectData, level);\n        return enrichedObjectData;\n    }\n\n    /**\n     * @param {Object} enrichedObjectData\n     * @param {string} level\n     * @returns {Object|boolean}\n     */\n    fetchAttributes(enrichedObjectData, level)\n    {\n        if(0 === Object.keys(this.attributesPerLevel).length){\n            Logger.debug('No \"attributesPerLevel\" found.');\n            return false;\n        }\n        let attributesKey = sc.get(enrichedObjectData, 'attributesKey', false);\n        if(!attributesKey){\n            Logger.debug('No \"attributesKey\" found.');\n            return false;\n        }\n        let subKey = sc.get(enrichedObjectData, 'attributesSubTypeKey', false);\n        if(!subKey){\n            Logger.debug('No \"subKey\" found.');\n            return false;\n        }\n        let attributesByKey = sc.get(this.attributesPerLevel, attributesKey, false);\n        if(!attributesByKey){\n            Logger.debug('No \"attributesByKey\" found.');\n            return false;\n        }\n        let attributesByKeyAndLevel = sc.get(attributesByKey, level, false);\n        if(!attributesByKeyAndLevel){\n            Logger.debug('No \"attributesByKeyAndLevel\" found.');\n            return false;\n        }\n        return attributesByKeyAndLevel[subKey];\n    }\n\n    /**\n     * @param {Object} enrichedObjectData\n     * @param {string} level\n     * @returns {number|boolean}\n     */\n    fetchExperience(enrichedObjectData, level)\n    {\n        let experiencePerLevel = sc.get(this.experiencePerLevel, level, false);\n        if(!experiencePerLevel){\n            Logger.debug('No \"experiencePerLevel\" found.');\n            return false;\n        }\n        let experienceKey = sc.get(enrichedObjectData, 'experienceKey', false);\n        if(!experienceKey){\n            Logger.debug('No \"experienceKey\" found.');\n            return false;\n        }\n        let experiencePerLevelAndKey = sc.get(experiencePerLevel, experienceKey, false);\n        if(!experiencePerLevelAndKey){\n            Logger.debug('No \"experiencePerLevelAndKey\" found.');\n            return false;\n        }\n        return experiencePerLevelAndKey.exp;\n    }\n\n    /**\n     * @param {Array<string>} repositoriesKey\n     * @returns {boolean}\n     */\n    validRepositories(repositoriesKey)\n    {\n        for(let repositoryKey of repositoriesKey){\n            if(!this[repositoryKey]){\n                Logger.critical('Repository \"' + repositoryKey + '\" not found.');\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async loadObjectTypes()\n    {\n        let objectTypesModels = await this.objectTypesRepository.loadAll();\n        if(!sc.isArray(objectTypesModels) || 0 === objectTypesModels.length){\n            return false;\n        }\n        for(let objectType of objectTypesModels){\n            this.objectTypesIdByName[objectType.key] = objectType.id;\n        }\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async loadStats()\n    {\n        let statsModels = await this.statsRepository.loadAll();\n        if(!sc.isArray(statsModels) || 0 === statsModels.length){\n            return false;\n        }\n        for(let stat of statsModels){\n            this.statsById[stat.id] = stat;\n            this.statsIdsByKeys[stat.key] = stat.id;\n        }\n    }\n\n    /**\n     * @param {string} filePath\n     * @returns {Object}\n     */\n    loadDataFromJsonFile(filePath)\n    {\n        if('' === filePath){\n            return {};\n        }\n        return FileHandler.fetchFileJson(FileHandler.joinPaths(this.themeManager.projectGenerateDataPath, filePath));\n    }\n\n    /**\n     * @param {Object} objectData\n     * @returns {Promise<boolean>}\n     */\n    async createObjectPerRoom(objectData)\n    {\n        let objectRooms = await this.fetchRooms(objectData);\n        if(0 === objectRooms.length){\n            return false;\n        }\n        // @TODO - BETA - Improve importer to only load required rooms once.\n        // this.mapRooms(objectRooms);\n        for(let room of objectRooms){\n            let clientKey = sc.get(objectData, 'clientKey', '');\n            objectData.objectClassKey = room.name+'_'+ clientKey;\n            await this.createObjectForRoom(objectData, room.id);\n            Logger.info('Generated object \"'+clientKey+'\" in room \"'+room.name+'\".');\n        }\n    }\n\n    /**\n     * @param {Object} objectData\n     * @returns {Promise<Array<Object>>}\n     */\n    async fetchRooms(objectData)\n    {\n        let objectRoomsIds = sc.get(objectData, 'roomsId');\n        let objectRooms = [];\n        if(sc.isArray(objectRoomsIds) && 0 < objectRoomsIds.length){\n            objectRooms = await this.fetchRoomsBy('id', objectRoomsIds);\n        }\n        let objectRoomsNames = sc.get(objectData, 'roomsNames');\n        if (sc.isArray(objectRoomsNames) && 0 < objectRoomsNames.length) {\n            objectRooms = await this.fetchRoomsBy('name', objectRoomsNames);\n        }\n        return objectRooms;\n    }\n\n    // @TODO - BETA - Improve importer to only load required rooms once.\n    /*\n    mapRooms(loadedRooms)\n    {\n        if(!sc.isArray(loadedRooms) || 0 === loadedRooms.length){\n            return [];\n        }\n        let objectRoomsIds = [];\n        for(let room of loadedRooms){\n            this.roomsById[room.id] = room;\n            this.roomsIdsByNames[room.name] = room.id;\n            objectRoomsIds.push(room.id);\n        }\n        return objectRoomsIds;\n    }\n    */\n\n    /**\n     * @param {Object} objectData\n     * @param {number} roomId\n     * @returns {Promise<void>}\n     */\n    async createObjectForRoom(objectData, roomId)\n    {\n        try {\n            let createdObject = await this.objectsRepository.create({\n                room_id: roomId,\n                layer_name: objectData['layer'],\n                tile_index: objectData['tileIndex'],\n                class_type: this.fetchClassTypeId(objectData['classType']),\n                object_class_key: objectData['objectClassKey'],\n                client_key: objectData['clientKey'],\n                title: objectData['title'],\n                private_params: this.convertToJsonString(objectData['privateParams']),\n                client_params: this.convertToJsonString(objectData['clientParams']),\n                enabled: objectData['enabled']\n            });\n            await this.createObjectAssets(createdObject.id, objectData);\n            await this.createObjectAnimations(createdObject.id, objectData);\n            await this.createObjectStats(createdObject.id, objectData);\n            await this.createObjectRespawn(createdObject.id, objectData);\n            await this.createObjectExperienceReward(createdObject.id, objectData);\n        } catch (error) {\n            Logger.warning('Create object for room error.', error.message, {roomId, objectData});\n        }\n    }\n\n    /**\n     * @param {string|number} classType\n     * @returns {number}\n     */\n    fetchClassTypeId(classType)\n    {\n        if(!classType){\n            return this.objectTypesIdByName['base'];\n        }\n        if(sc.isString(classType) && this.objectTypesIdByName[classType]){\n            return this.objectTypesIdByName[classType];\n        }\n        return classType;\n    }\n\n    /**\n     * @param {number} createdObjectId\n     * @param {Object} objectData\n     * @returns {Promise<boolean>}\n     */\n    async createObjectAssets(createdObjectId, objectData)\n    {\n        if(!sc.isArray(objectData.assets) || 0 === objectData.assets.length){\n            return false;\n        }\n        try {\n            for(let asset of objectData.assets){\n                await this.objectsAssetsRepository.create({\n                    object_id: createdObjectId,\n                    asset_type: sc.get(asset, 'assetType', 'spritesheet'),\n                    asset_key: asset['assetKey'],\n                    asset_file: asset['assetFile'],\n                    extra_params: this.convertToJsonString(asset['extraParams']),\n                });\n            }\n        } catch (error) {\n            Logger.warning('Create object asset error.', error.message, {createdObjectId, objectData});\n        }\n    }\n\n    /**\n     * @param {number} createdObjectId\n     * @param {Object} objectData\n     * @returns {Promise<boolean>}\n     */\n    async createObjectAnimations(createdObjectId, objectData)\n    {\n        if(!sc.isObject(objectData.animations)){\n            return false;\n        }\n        let animationsKeys = Object.keys(objectData.animations);\n        if(0 === animationsKeys.length){\n            return false;\n        }\n        try {\n            for(let key of animationsKeys){\n                await this.objectsAnimationsRepository.create({\n                    object_id: createdObjectId,\n                    animationKey: objectData.layer+'_'+createdObjectId+'_'+key,\n                    animationData: this.convertToJsonString(objectData.animations[key])\n                });\n            }\n        } catch (error) {\n            Logger.warning('Create object animation error.', error.message, {createdObjectId, objectData});\n        }\n    }\n\n    /**\n     * @param {Object|string} data\n     * @returns {string}\n     */\n    convertToJsonString(data)\n    {\n        if(!data){\n            return '{}';\n        }\n        if(sc.isString(data)){\n            return data;\n        }\n        if(sc.isString(data['childObjectType'])){\n            data['childObjectType'] = this.fetchClassTypeId(data.childObjectType);\n        }\n        return JSON.stringify(data);\n    }\n\n    /**\n     * @param {number} createdObjectId\n     * @param {Object} objectData\n     * @returns {Promise<boolean>}\n     */\n    async createObjectStats(createdObjectId, objectData)\n    {\n        if(!sc.isObject(objectData.stats)){\n            return false;\n        }\n        try {\n            let statsKeys = Object.keys(objectData.stats);\n            for(let statKey of statsKeys){\n                let statId = sc.get(this.statsIdsByKeys, statKey);\n                if(!statId){\n                    Logger.error('Create Object stats, stat ID not found by key \"'+statKey+'\".', objectData);\n                    continue;\n                }\n                let statValue = objectData.stats[statKey];\n                await this.objectsStatsRepository.create({\n                    object_id: createdObjectId,\n                    stat_id: statId,\n                    base_value: statValue,\n                    value: statValue\n                });\n            }\n        } catch (error) {\n            Logger.warning('Create object stats error.', error.message, {createdObjectId, objectData});\n        }\n    }\n\n    /**\n     * @param {number} createdObjectId\n     * @param {Object} objectData\n     * @returns {Promise<boolean>}\n     */\n    async createObjectRespawn(createdObjectId, objectData)\n    {\n        if(!sc.isObject(objectData.respawn)){\n            return false;\n        }\n        try {\n            let layer = String(sc.get(objectData.respawn, 'layer', objectData.layer));\n            await this.respawnRepository.create({\n                object_id: createdObjectId,\n                respawn_time: sc.get(objectData.respawn, 'respawnTime', 1000),\n                instances_limit: sc.get(objectData.respawn, 'instancesLimit', 1),\n                layer\n            });\n        } catch (error) {\n            Logger.warning('Create object respawn area error.', error.message, {createdObjectId, objectData});\n        }\n    }\n\n    /**\n     * @param {number} createdObjectId\n     * @param {Object} objectData\n     * @returns {Promise<boolean>}\n     */\n    async createObjectExperienceReward(createdObjectId, objectData)\n    {\n        if(!sc.isNumber(objectData.experience)){\n            Logger.debug('Object data \"experience\" is not a number.');\n            return false;\n        }\n        try {\n            await this.rewardsRepository.create({\n                object_id: createdObjectId,\n                experience: objectData.experience,\n                drop_rate: 100,\n                drop_quantity: 1\n            });\n        } catch (error) {\n            Logger.warning('Create object respawn area error.', error.message, {createdObjectId, objectData});\n        }\n    }\n\n    /**\n     * @param {string} field\n     * @param {Array<string|number>} objectRoomsDataSet\n     * @returns {Promise<Array<Object>>}\n     */\n    async fetchRoomsBy(field, objectRoomsDataSet)\n    {\n        let loadResult = await this.roomsRepository.load({[field]: {operator: 'IN', value: objectRoomsDataSet}});\n        if(!sc.isArray(loadResult)){\n            return [];\n        }\n        return loadResult;\n    }\n\n}\n\nmodule.exports.ObjectsImporter = ObjectsImporter;\n"
  },
  {
    "path": "lib/import/server/players-experience-per-level-importer.js",
    "content": "/**\n *\n * Reldens - PlayersExperiencePerLevelImporter\n *\n * Imports player experience requirements per level. Creates level records with experience\n * thresholds required to reach each level within a given level set.\n *\n */\n\n/**\n * @typedef {import('../../game/server/manager').ServerManager} ServerManager\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\nclass PlayersExperiencePerLevelImporter\n{\n\n    /**\n     * @param {ServerManager} serverManager\n     */\n    constructor(serverManager)\n    {\n        /** @type {ServerManager} */\n        this.serverManager = serverManager;\n        /** @type {BaseDriver} */\n        this.levelsRepository = this.serverManager.dataServer.getEntity('skillsLevels');\n    }\n\n    /**\n     * @param {Object<string, Object>} data\n     * @param {number} levelSetId\n     * @returns {Promise<void>}\n     */\n    async import(data, levelSetId)\n    {\n        for(let key of Object.keys(data)){\n            await this.levelsRepository.create({\n                key,\n                label: key,\n                required_experience: data[key].req,\n                level_set_id: levelSetId\n            });\n        }\n    }\n\n}\n\nmodule.exports.PlayersExperiencePerLevelImporter = PlayersExperiencePerLevelImporter;\n"
  },
  {
    "path": "lib/import/server/skills-importer.js",
    "content": "/**\n *\n * Reldens - SkillsImporter\n *\n * Imports skills system data including skill definitions, attack data, physical properties, animations,\n * owner/target effects, owner conditions, and skill-to-class-path/object associations. Supports create,\n * update, and override modes for bulk skill imports with complete skill configurations.\n *\n */\n\nconst { SkillDataFactory } = require('../../actions/factories/skill-data-factory');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\nclass SkillsImporter\n{\n\n    /**\n     * @param {Object} props\n     * @param {BaseDataServer} props.dataServer\n     */\n    constructor(props)\n    {\n        /** @type {BaseDataServer} */\n        this.dataServer = sc.get(props, 'dataServer');\n        /** @type {Object} */\n        this.defaults = {};\n        /** @type {Object<string, Object>} */\n        this.operationTypes = {};\n        /** @type {Object<string, Object>} */\n        this.skillTypes = {};\n        this.setupRepositories();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setupRepositories()\n    {\n        if(!this.dataServer){\n            Logger.error('Data server not available on Skills Importer.');\n            return false;\n        }\n        /** @type {BaseDriver} */\n        this.skillRepository = this.dataServer.getEntity('skillsSkill');\n        /** @type {BaseDriver} */\n        this.skillAttackRepository = this.dataServer.getEntity('skillsSkillAttack');\n        /** @type {BaseDriver} */\n        this.skillTargetEffectsRepository = this.dataServer.getEntity('skillsSkillTargetEffects');\n        /** @type {BaseDriver} */\n        this.skillPhysicalDataRepository = this.dataServer.getEntity('skillsSkillPhysicalData');\n        /** @type {BaseDriver} */\n        this.skillOwnerConditionsRepository = this.dataServer.getEntity('skillsSkillOwnerConditions');\n        /** @type {BaseDriver} */\n        this.skillOwnerEffectsRepository = this.dataServer.getEntity('skillsSkillOwnerEffects');\n        /** @type {BaseDriver} */\n        this.skillAnimationsRepository = this.dataServer.getEntity('skillsSkillAnimations');\n        /** @type {BaseDriver} */\n        this.classPathLevelSkillsRepository = this.dataServer.getEntity('skillsClassPathLevelSkills');\n        /** @type {BaseDriver} */\n        this.levelsRepository = this.dataServer.getEntity('skillsLevels');\n        /** @type {BaseDriver} */\n        this.classPathRepository = this.dataServer.getEntity('skillsClassPath');\n        /** @type {BaseDriver} */\n        this.objectsRepository = this.dataServer.getEntity('objects');\n        /** @type {BaseDriver} */\n        this.objectsSkillsRepository = this.dataServer.getEntity('objectsSkills');\n        /** @type {BaseDriver} */\n        this.targetOptionsRepository = this.dataServer.getEntity('targetOptions');\n        /** @type {BaseDriver} */\n        this.operationTypesRepository = this.dataServer.getEntity('operationTypes');\n        /** @type {BaseDriver} */\n        this.skillTypeRepository = this.dataServer.getEntity('skillsSkillType');\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {Promise<boolean>}\n     */\n    async import(data)\n    {\n        // @TODO - BETA - Implement error handling and errorMessages.\n        Logger.info('Skill import starting...');\n        if(!data){\n            Logger.critical('Import data not found.');\n            return false;\n        }\n        this.options = sc.get(data, 'options', {\n            removeAll: false,\n            override: false,\n            update: false\n        });\n        this.defaults = sc.get(data, 'defaults', {});\n        this.skills = sc.get(data, 'skills', {});\n        if(0 === Object.keys(this.skills).length){\n            Logger.critical('Skills data not found.', data);\n            return false;\n        }\n        await this.loadTargetOptions();\n        await this.loadOperationTypes();\n        await this.loadSkillTypes();\n        await this.loadClassPaths();\n        await this.removeAllSKills();\n        for(let key of Object.keys(this.skills)){\n            let existentSkill = await this.loadExistentSkill(key);\n            if(!this.options.override && !this.options.update && existentSkill){\n                continue;\n            }\n            await this.upsertSkill(key, existentSkill);\n        }\n        Logger.info('Skill import finished.');\n        return true;\n    }\n\n    /**\n     * @param {string} key\n     * @param {Object} existentSkill\n     * @returns {Promise<void>}\n     */\n    async upsertSkill(key, existentSkill)\n    {\n        try {\n            let skillRawData = this.skills[key];\n            let skillsData = (new SkillDataFactory()).mapData(key, skillRawData, this.defaults);\n            skillsData.type = this.skillTypes[skillRawData.typeData.key].id;\n            if(this.options.update && existentSkill){\n                await this.updateSkill(existentSkill, skillsData);\n                Logger.debug('Updated skill: \"' + key + '\".');\n                return;\n            }\n            if(this.options.override && existentSkill){\n                await this.deleteSkill(existentSkill.id);\n            }\n            await this.createSkill(key, skillsData);\n            Logger.debug('Created skill: \"' + key + '\".');\n        } catch (error) {\n            Logger.warning('Create skill error.', error.message, {key, existentSkill});\n        }\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async loadTargetOptions()\n    {\n        let targetOptionsModels = await this.targetOptionsRepository.loadAll();\n        this.defaults.targetOptions = {};\n        for(let targetOption of targetOptionsModels){\n            this.defaults.targetOptions[targetOption.target_key] = targetOption;\n        }\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async loadOperationTypes()\n    {\n        let operationTypesModels = await this.operationTypesRepository.loadAll();\n        for(let operationType of operationTypesModels){\n            this.operationTypes[operationType.key] = operationType;\n        }\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async loadSkillTypes()\n    {\n        let skillTypesModels = await this.skillTypeRepository.loadAll();\n        for(let skillType of skillTypesModels){\n            this.skillTypes[skillType.key] = skillType;\n        }\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async loadClassPaths()\n    {\n        let classPathsModels = await this.classPathRepository.loadAll();\n        this.defaults.classPaths = {};\n        for(let classPath of classPathsModels){\n            classPath.relatedLevels = await this.levelsRepository.loadBy('level_set_id', classPath.levels_set_id);\n            this.defaults.classPaths[classPath.key] = classPath;\n        }\n    }\n\n    /**\n     * @param {Object} existentSkill\n     * @param {Object} skillsData\n     * @returns {Promise<void>}\n     */\n    async updateSkill(existentSkill, skillsData)\n    {\n        await this.updateSkillAssociations(skillsData, existentSkill);\n        await this.skillRepository.updateById(existentSkill.id, skillsData.skillBaseData());\n    }\n\n    /**\n     * @param {string} key\n     * @param {Object} skillsData\n     * @returns {Promise<void>}\n     */\n    async createSkill(key, skillsData)\n    {\n        let existentSkill = await this.skillRepository.create(skillsData.skillBaseData());\n        skillsData.clearPrevious = ['targetEffects', 'ownerEffects', 'ownerConditions'];\n        await this.updateSkillAssociations(skillsData, existentSkill);\n    }\n\n    /**\n     * @param {Object} skillsData\n     * @param {Object} existentSkill\n     * @returns {Promise<void>}\n     */\n    async updateSkillAssociations(skillsData, existentSkill)\n    {\n        await this.updateClassPathLevelSkill(skillsData, existentSkill);\n        await this.updateObjectSkill(skillsData, existentSkill);\n        await this.updateSkillAttack(skillsData, existentSkill);\n        await this.updateSkillPhysicalData(skillsData, existentSkill);\n        await this.updateTargetEffects(skillsData, existentSkill);\n        await this.updateOwnerEffects(skillsData, existentSkill);\n        await this.updateOwnerConditions(skillsData, existentSkill);\n        await this.updateAnimations(skillsData, existentSkill);\n    }\n\n    /**\n     * @param {Object} skillsData\n     * @param {Object} existentSkill\n     * @returns {Promise<boolean|Object>}\n     */\n    async updateSkillPhysicalData(skillsData, existentSkill)\n    {\n        if(!skillsData.physicalData){\n            return false;\n        }\n        let existentPhysicalData = await this.skillPhysicalDataRepository.loadOneBy('skill_id', existentSkill.id);\n        if(!existentPhysicalData){\n            skillsData.physicalData.skill_id = existentSkill.id;\n            return this.skillPhysicalDataRepository.create(skillsData.physicalData);\n        }\n        return this.skillPhysicalDataRepository.updateBy('skill_id', existentSkill.id, skillsData.physicalData);\n    }\n\n    /**\n     * @param {Object} skillsData\n     * @param {Object} existentSkill\n     * @returns {Promise<boolean|Object>}\n     */\n    async updateSkillAttack(skillsData, existentSkill)\n    {\n        if(!skillsData.attack){\n            return false;\n        }\n        let existentAttack = await this.skillAttackRepository.loadOneBy('skill_id', existentSkill.id);\n        if(!existentAttack){\n            skillsData.attack.skill_id = existentSkill.id;\n            return this.skillAttackRepository.create(skillsData.attack);\n        }\n        return await this.skillAttackRepository.updateBy('skill_id', existentSkill.id, skillsData.attack);\n    }\n\n    /**\n     * @param {Object} skillsData\n     * @param {Object} existentSkill\n     * @returns {Promise<void>}\n     */\n    async updateTargetEffects(skillsData, existentSkill)\n    {\n        if(-1 !== skillsData.clearPrevious.indexOf('targetEffects')){\n            await this.skillTargetEffectsRepository.delete({skill_id: existentSkill.id});\n        }\n        if(0 < skillsData.targetEffects.length){\n            for(let targetEffect of skillsData.targetEffects){\n                let operation = this.operationTypes[targetEffect.operationKey];\n                if(!operation){\n                    Logger.warning('Operation not found by key: \"' + targetEffect.operationKey + '\".');\n                    continue;\n                }\n                targetEffect.skill_id = existentSkill.id;\n                targetEffect.operation = operation.key;\n                delete targetEffect['operationKey'];\n                delete targetEffect['propertyKey'];\n                await this.skillTargetEffectsRepository.create(targetEffect);\n            }\n        }\n    }\n\n    /**\n     * @param {Object} skillsData\n     * @param {Object} existentSkill\n     * @returns {Promise<void>}\n     */\n    async updateOwnerEffects(skillsData, existentSkill)\n    {\n        if(-1 !== skillsData.clearPrevious.indexOf('ownerEffects')){\n            await this.skillOwnerEffectsRepository.delete({skill_id: existentSkill.id});\n        }\n        if(0 === skillsData.ownerEffects.length){\n            return;\n        }\n        for(let ownerEffect of skillsData.ownerEffects){\n            let operation = this.operationTypes[ownerEffect.operationKey];\n            if(!operation){\n                Logger.warning('Operation not found by key: \"' + ownerEffect.operationKey + '\".');\n                continue;\n            }\n            ownerEffect.skill_id = existentSkill.id;\n            ownerEffect.operation = operation.key;\n            delete ownerEffect['operationKey'];\n            delete ownerEffect['propertyKey'];\n            await this.skillOwnerEffectsRepository.create(ownerEffect);\n        }\n    }\n\n    /**\n     * @param {Object} skillsData\n     * @param {Object} existentSkill\n     * @returns {Promise<void>}\n     */\n    async updateAnimations(skillsData, existentSkill)\n    {\n        if(-1 !== skillsData.clearPrevious.indexOf('animations')){\n            await this.skillAnimationsRepository.delete({skill_id: existentSkill.id});\n        }\n        if(0 === skillsData.animations.length){\n            return;\n        }\n        for(let animation of skillsData.animations){\n            animation.skill_id = existentSkill.id;\n            let existentAnimation = await this.skillAnimationsRepository.loadOne({\n                skill_id: existentSkill.id,\n                key: animation.key\n            });\n            if(existentAnimation){\n                await this.skillAnimationsRepository.updateBy('skill_id', existentSkill.id, animation);\n                continue;\n            }\n            try {\n                await this.skillAnimationsRepository.create(animation);\n            } catch (error) {\n                Logger.debug('Create skill animation error.', error, animation, skillsData, existentSkill);\n            }\n        }\n    }\n\n    /**\n     * @param {Object} skillsData\n     * @param {Object} existentSkill\n     * @returns {Promise<void>}\n     */\n    async updateOwnerConditions(skillsData, existentSkill)\n    {\n        if(-1 !== skillsData.clearPrevious.indexOf('ownerConditions')){\n            await this.skillOwnerConditionsRepository.delete({skill_id: Number(existentSkill.id)});\n            Logger.debug('Cleared previous skill owner conditions.', existentSkill.id);\n        }\n        if(0 === skillsData.ownerConditions.length){\n            return;\n        }\n        for(let ownerCondition of skillsData.ownerConditions){\n            ownerCondition.skill_id = existentSkill.id;\n            delete ownerCondition['propertyKey'];\n            await this.skillOwnerConditionsRepository.create(ownerCondition);\n            Logger.debug('Created owner condition.', ownerCondition);\n        }\n    }\n\n    /**\n     * @param {Object} skillsData\n     * @param {Object} existentSkill\n     * @returns {Promise<void>}\n     */\n    async updateClassPathLevelSkill(skillsData, existentSkill)\n    {\n        if(0 === skillsData.classPaths.length){\n            return;\n        }\n        for(let classPathData of skillsData.classPaths){\n            classPathData.skill_id = existentSkill.id;\n            let existentClassPathLevelSkill = await this.classPathLevelSkillsRepository.loadOne(classPathData);\n            if(!existentClassPathLevelSkill){\n                await this.classPathLevelSkillsRepository.create(classPathData);\n            }\n        }\n    }\n\n    /**\n     * @param {Object} skillsData\n     * @param {Object} existentSkill\n     * @returns {Promise<boolean>}\n     */\n    async updateObjectSkill(skillsData, existentSkill)\n    {\n        if(0 === skillsData.objects.length){\n            return false;\n        }\n        for(let objectData of skillsData.objects){\n            let existentObject = await this.objectsRepository.loadOneBy('object_class_key', objectData.objectKey);\n            if(!existentObject){\n                Logger.warning('Object not found by key: \"' + objectData.objectKey + '\".');\n                continue;\n            }\n            objectData.object_id = existentObject.id;\n            objectData.skill_id = existentSkill.id;\n            delete objectData['objectKey'];\n            let objectSkill = await this.objectsSkillsRepository.loadOne({\n                object_id: existentObject.id,\n                skill_id: existentSkill.id\n            });\n            if(objectSkill){\n                this.objectsSkillsRepository.updateById(objectSkill.id, objectData);\n                continue;\n            }\n            this.objectsSkillsRepository.create(objectData);\n        }\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async removeAllSKills()\n    {\n        if(!this.options.removeAll){\n            return false;\n        }\n        await this.objectsSkillsRepository.delete({});\n        await this.classPathLevelSkillsRepository.delete({});\n        await this.skillAnimationsRepository.delete({});\n        await this.skillAttackRepository.delete({});\n        await this.skillTargetEffectsRepository.delete({});\n        await this.skillPhysicalDataRepository.delete({});\n        await this.skillOwnerConditionsRepository.delete({});\n        await this.skillOwnerEffectsRepository.delete({});\n        await this.skillRepository.delete({});\n        Logger.debug('Removed all skills.');\n        return true;\n    }\n\n    /**\n     * @param {number} skillId\n     * @returns {Promise<void>}\n     */\n    async deleteSkill(skillId)\n    {\n        let filter = {skill_id: skillId};\n        await this.objectsSkillsRepository.delete(filter);\n        await this.classPathLevelSkillsRepository.delete(filter);\n        await this.skillAnimationsRepository.delete(filter);\n        await this.skillAttackRepository.delete(filter);\n        await this.skillTargetEffectsRepository.delete(filter);\n        await this.skillPhysicalDataRepository.delete(filter);\n        await this.skillOwnerConditionsRepository.delete(filter);\n        await this.skillOwnerEffectsRepository.delete(filter);\n        await this.skillRepository.delete(filter);\n        Logger.debug('Removed skill with ID \"'+skillId+'\".');\n    }\n\n    /**\n     * @param {string} key\n     * @returns {Promise<Object>}\n     */\n    async loadExistentSkill(key)\n    {\n        return await this.skillRepository.loadOneByWithRelations('key', key, [\n            'related_skills_skill_attack',\n            'related_skills_skill_physical_data',\n            'related_skills_skill_owner_conditions',\n            'related_skills_skill_owner_effects',\n            'related_skills_skill_target_effects'\n        ]);\n    }\n\n}\n\nmodule.exports.SkillsImporter = SkillsImporter;\n"
  },
  {
    "path": "lib/import/server/tile-extruder.js",
    "content": "/**\n *\n * Reldens - Tile-Extruder\n *\n * Ported from https://github.com/sporadic-labs/tile-extruder\n * Updated for Jimp 1.2.0.\n *\n */\n\nconst { Jimp } = require('jimp');\n\n/**\n * @param {Jimp} srcImage\n * @param {number} srcX\n * @param {number} srcY\n * @param {number} srcW\n * @param {number} srcH\n * @param {Jimp} destImage\n * @param {number} destX\n * @param {number} destY\n */\nfunction copyPixels(srcImage, srcX, srcY, srcW, srcH, destImage, destX, destY)\n{\n    srcImage.scan(srcX, srcY, srcW, srcH, (curSrcX, curSrcY, curSrcIndex) => {\n        let curDestX = destX + (curSrcX - srcX);\n        let curDestY = destY + (curSrcY - srcY);\n        let curDestIndex = destImage.getPixelIndex(curDestX, curDestY);\n        destImage.bitmap.data[curDestIndex] = srcImage.bitmap.data[curSrcIndex];\n        destImage.bitmap.data[curDestIndex + 1] = srcImage.bitmap.data[curSrcIndex + 1];\n        destImage.bitmap.data[curDestIndex + 2] = srcImage.bitmap.data[curSrcIndex + 2];\n        destImage.bitmap.data[curDestIndex + 3] = srcImage.bitmap.data[curSrcIndex + 3];\n    });\n}\n\n/**\n * @param {Jimp} srcImage\n * @param {number} srcX\n * @param {number} srcY\n * @param {Jimp} destImage\n * @param {number} destX\n * @param {number} destY\n * @param {number} destW\n * @param {number} destH\n */\nfunction copyPixelToRect(srcImage, srcX, srcY, destImage, destX, destY, destW, destH)\n{\n    let srcIndex = srcImage.getPixelIndex(srcX, srcY);\n    destImage.scan(destX, destY, destW, destH, (curDestX, curDestY, curDestIndex) => {\n        destImage.bitmap.data[curDestIndex] = srcImage.bitmap.data[srcIndex];\n        destImage.bitmap.data[curDestIndex + 1] = srcImage.bitmap.data[srcIndex + 1];\n        destImage.bitmap.data[curDestIndex + 2] = srcImage.bitmap.data[srcIndex + 2];\n        destImage.bitmap.data[curDestIndex + 3] = srcImage.bitmap.data[srcIndex + 3];\n    });\n}\n\n/**\n * @param {number} tw\n * @param {number} th\n * @param {string} inputPath\n * @param {Object} options\n * @param {number} [options.margin]\n * @param {number} [options.spacing]\n * @param {number} [options.color]\n * @param {number} [options.extrusion]\n * @returns {Promise<Jimp>}\n */\nasync function ExtrudeTileset(tw, th, inputPath, {margin = 0, spacing = 0, color = 0xffffff00, extrusion = 1} = {})\n{\n    let image = await Jimp.read(inputPath).catch((err) => {\n        throw err;\n    });\n    let cols = (image.bitmap.width - 2 * margin + spacing) / (tw + spacing);\n    let rows = (image.bitmap.height - 2 * margin + spacing) / (th + spacing);\n    if(!Number.isInteger(cols) || !Number.isInteger(rows)){\n        throw new Error('Non-integer number of rows or cols found.');\n    }\n    let extruded = await new Jimp({\n        width: 2 * margin + (cols - 1) * spacing + cols * (tw + 2 * extrusion),\n        height: 2 * margin + (rows - 1) * spacing + rows * (th + 2 * extrusion),\n        color\n    });\n    for(let row = 0; row < rows; row++){\n        for(let col = 0; col < cols; col++){\n            let srcX = margin + col * (tw + spacing);\n            let srcY = margin + row * (th + spacing);\n            let destX = margin + col * (tw + spacing + 2 * extrusion);\n            let destY = margin + row * (th + spacing + 2 * extrusion);\n            copyPixels(image, srcX, srcY, tw, th, extruded, destX + extrusion, destY + extrusion);\n            let newSrcX = srcX + tw - 1;\n            let newSrcY = srcY + th - 1;\n            let newDestX = destX + extrusion + tw;\n            let newDestY = destY + extrusion + th;\n            for(let i = 0; i < extrusion; i++){\n                copyPixels(image, srcX, srcY, tw, 1, extruded, destX + extrusion, destY + i);\n                copyPixels(image, srcX, newSrcY, tw, 1, extruded, destX + extrusion, newDestY + (extrusion - i - 1));\n                copyPixels(image, srcX, srcY, 1, th, extruded, destX + i, destY + extrusion);\n                copyPixels(image, newSrcX, srcY, 1, th, extruded, newDestX + (extrusion - i - 1), destY + extrusion);\n            }\n            copyPixelToRect(image, srcX, srcY, extruded, destX, destY, extrusion, extrusion);\n            copyPixelToRect(image, newSrcX, srcY, extruded, newDestX, destY, extrusion, extrusion);\n            copyPixelToRect(image, srcX, newSrcY, extruded, destX, newDestY, extrusion, extrusion);\n            copyPixelToRect(image, newSrcX, newSrcY, extruded, newDestX, newDestY, extrusion, extrusion);\n        }\n    }\n    return extruded;\n}\n\nmodule.exports.ExtrudeTileset = ExtrudeTileset;\n"
  },
  {
    "path": "lib/inventory/client/exchange/trade-target-action.js",
    "content": "/**\n *\n * Reldens - TradeTargetAction\n *\n * Manages trade action UI for targeted players on the client side.\n * Displays trade start buttons when targeting other players.\n *\n */\n\nconst { InventoryConst } = require('../../constants');\nconst { GameConst } = require('../../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../game/client/game-manager').GameManager} GameManager\n */\nclass TradeTargetAction\n{\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {Object} target\n     * @param {Object} previousTarget\n     * @param {string} targetName\n     * @returns {boolean}\n     */\n    showTargetExchangeAction(gameManager, target, previousTarget, targetName)\n    {\n        if(GameConst.TYPE_PLAYER !== target.type || gameManager.getCurrentPlayer().playerId === target.id){\n            return false;\n        }\n        let uiScene = gameManager.gameEngine.uiScene;\n        let uiTarget = sc.get(uiScene, 'uiTarget', false);\n        if(false === uiTarget){\n            return false;\n        }\n        let inventoryTradeStartTemplate = uiScene.cache.html.get('inventoryTradeStart');\n        if(!inventoryTradeStartTemplate){\n            Logger.critical('Template \"inventoryTradeStart\" not found.');\n            return false;\n        }\n        gameManager.gameDom.appendToElement(\n            '#target-container',\n            gameManager.gameEngine.parseTemplate(\n                inventoryTradeStartTemplate,\n                {\n                    playerName: targetName,\n                    playerId: target.id\n                }\n            )\n        );\n        let tradeStartButton = gameManager.gameDom.getElement('.start-trade-'+target.id+' button');\n        if(!tradeStartButton){\n            Logger.critical('Trade start button not found for selector: \"'+'.start-trade-'+target.id+' button'+'\"');\n            return false;\n        }\n        tradeStartButton.addEventListener('click', () => {\n            let sendData = {act: InventoryConst.ACTIONS.TRADE_START, id: target.id};\n            gameManager.activeRoomEvents.send(sendData);\n        });\n        return true;\n    }\n\n}\n\nmodule.exports.TradeTargetAction = TradeTargetAction;\n"
  },
  {
    "path": "lib/inventory/client/inventory-receiver.js",
    "content": "/**\n *\n * Reldens - InventoryReceiver\n *\n * Handles inventory item animations and visual effects on the client side.\n * Extends Receiver from items-system to process item execution animations.\n *\n */\n\nconst { InventoryConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Receiver } = require('@reldens/items-system');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass InventoryReceiver extends Receiver\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        if(!sc.hasOwn(props, 'gameManager')){\n            ErrorManager.error('InventoryReceiver gameManager not specified.');\n        }\n        super(props);\n        /** @type {GameManager} */\n        this.gameManager = props.gameManager;\n        /** @type {Object<string, Object>} */\n        this.itemSprites = {};\n        /** @type {Object<string, Object>} */\n        this.itemsAnimations = {};\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {boolean|void}\n     */\n    onExecuting(message)\n    {\n        // @TODO - BETA - Improve, split in several classes, methods and functionalities.\n        let item = message.item;\n        if(!sc.hasOwn(item, 'animationData')){\n            Logger.warning('Item does not contain animation data.', message);\n            return false;\n        }\n        let animKey = InventoryConst.ANIMATION_KEY_PREFIX+item.key;\n        let currentScene = this.gameManager.getActiveScene();\n        let existentAnimation = this.itemSprites[animKey]\n            && this.itemSprites[animKey].anims\n            && currentScene.anims.get(animKey);\n        if(existentAnimation){\n            Logger.debug('Animation already exists, playing: '+animKey);\n            this.playSpriteAnimation(animKey, item);\n            return false;\n        }\n        // @TODO - BETA - Remove hardcoded file extension.\n        currentScene.load.spritesheet(animKey, '/assets/custom/sprites/'+item.key+GameConst.FILES.EXTENSIONS.PNG, {\n            frameWidth: item.animationData.frameWidth || 64,\n            frameHeight: item.animationData.frameHeight || 64\n        }).on('loaderror', (event) => {\n            Logger.error('Sprite load error: '+animKey, event);\n        });\n        currentScene.load.on('complete', () => {\n            Logger.debug('Scene load complete, playing: '+animKey);\n            this.createItemSprites(animKey, item, message, currentScene);\n        });\n        currentScene.load.start();\n    }\n\n    /**\n     * @param {string} animKey\n     * @param {Object} item\n     * @param {Object} message\n     * @param {Object} currentScene\n     * @returns {boolean|void}\n     */\n    createItemSprites(animKey, item, message, currentScene)\n    {\n        let targetId = this.extractTargetId(item, message, currentScene);\n        if(!targetId){\n            Logger.error('Target ID not found.');\n            return false;\n        }\n        let playerSprite = sc.get(currentScene.player.players, targetId, false);\n        if(!playerSprite){\n            Logger.error('Player sprite not found by target ID.');\n            return false;\n        }\n        // @TODO - BETA - Make all the defaults configurable.\n        let animationFromScene = currentScene.anims.get(animKey);\n        if(!animationFromScene){\n            Logger.debug('Creating new animation on scene: '+animKey);\n            animationFromScene = currentScene.anims.create({\n                key: animKey,\n                frames: currentScene.anims.generateFrameNumbers(animKey, {\n                    start: item.animationData.start || 0,\n                    end: item.animationData.end || 1\n                }),\n                frameRate: sc.get(item.animationData, 'frameRate', currentScene.configuredFrameRate),\n                repeat: item.animationData.repeat || 3,\n                hideOnComplete: sc.get(item.animationData, 'hide', true),\n                showOnStart: sc.get(item.animationData, 'showOnStart', true),\n            });\n        }\n        this.itemsAnimations[animKey] = animationFromScene;\n        let x = sc.get(item.animationData, 'fixedX', (item.animationData.usePlayerPosition ? playerSprite.x : 0));\n        let y = sc.get(item.animationData, 'fixedY', (item.animationData.usePlayerPosition ? playerSprite.y : 0));\n        this.itemSprites[animKey] = currentScene.physics.add.sprite(x, y, animKey);\n        this.itemSprites[animKey] = this.itemSprites[animKey].setDepth(90000);\n        this.itemSprites[animKey].depthByPlayer = 'above';\n        if(item.animationData.followPlayer){\n            playerSprite.moveSprites[animKey] = this.itemSprites[animKey];\n        }\n        // @TODO - BETA - Make auto-destroy configurable.\n        Logger.debug('Playing sprite: '+animKey);\n        this.playSpriteAnimation(animKey, item).on('animationcomplete', () => {\n            if(item.animationData.destroyOnComplete){\n                this.destroyAnimation(item, animKey, playerSprite);\n            }\n        });\n    }\n\n    /**\n     * @param {string} animKey\n     * @param {Object} item\n     * @returns {Object|boolean}\n     */\n    playSpriteAnimation(animKey, item)\n    {\n        // @TODO - BETA - Make closeInventoryOnUse and ignoreIfPlaying default values configurable.\n        let closeInventoryOnUse = sc.get(item.animationData, 'closeInventoryOnUse', false);\n        if(closeInventoryOnUse){\n            this.gameManager.gameDom.getElement('#inventory-close')?.click();\n        }\n        let spriteAnims = this.itemSprites[animKey].anims;\n        if(!spriteAnims){\n            Logger.error('Sprite animation not found: '+animKey);\n            return false;\n        }\n        spriteAnims.visible = true;\n        return spriteAnims.play(animKey, sc.get(item.animationData, 'ignoreIfPlaying', true));\n    }\n\n    /**\n     * @param {Object} item\n     * @param {string} animKey\n     * @param {Object} playerSprite\n     */\n    destroyAnimation(item, animKey, playerSprite)\n    {\n        this.itemSprites[animKey].destroy();\n        delete this.itemSprites[animKey];\n        delete this.itemsAnimations[animKey];\n        if(item.animationData.followPlayer){\n            delete playerSprite.moveSprites[animKey];\n        }\n        Logger.debug('Animation and sprite destroyed: '+animKey);\n    }\n\n    /**\n     * @param {Object} item\n     * @param {Object} message\n     * @param {Object} currentScene\n     * @returns {number|boolean}\n     */\n    extractTargetId(item, message, currentScene)\n    {\n        if(item.animationData.startsOnTarget && message.target?.playerId){\n            return message.target.playerId;\n        }\n        return currentScene.player?.playerId || false;\n    }\n\n}\n\nmodule.exports.InventoryReceiver = InventoryReceiver;\n"
  },
  {
    "path": "lib/inventory/client/inventory-ui.js",
    "content": "/**\n *\n * Reldens - InventoryUi\n *\n * Manages the creation and display of inventory UI elements.\n * Extends UiFactory to provide inventory-specific UI functionality.\n *\n */\n\nconst { UiFactory } = require('../../game/client/ui-factory');\nconst { InventoryConst } = require('../constants');\n\nclass InventoryUi extends UiFactory\n{\n\n    createUi()\n    {\n        // @TODO - BETA - Replace by UserInterface.\n        if(0 < this.gameManager.initialGameData.availableItems){\n            this.create('inventory', 5, true, true, null, () => {\n                this.inventoryVisibility('inventory');\n            });\n        }\n        if(0 < this.gameManager.initialGameData.equipmentGroups){\n            this.create('equipment', 4, true, true, null, () => {\n                this.inventoryVisibility('inventory');\n            });\n        }\n    }\n\n    /**\n     * @param {string} constantCodeName\n     */\n    inventoryVisibility(constantCodeName)\n    {\n        // @TODO - BETA - Replace border styles by a class.\n        let containerId = '#'+InventoryConst[constantCodeName+'_ITEMS'];\n        let itemImages = this.gameManager.gameDom.getElements(containerId+' .item-box .image-container img');\n        for(let itemImage of itemImages){\n            itemImage.style.border = 'none';\n        }\n        let itemContainers = this.gameManager.gameDom.getElements(containerId+' .item-data-container')\n        for(let itemContainer of itemContainers){\n            itemContainer.style.border = 'none';\n        }\n    }\n\n}\n\nmodule.exports.InventoryUi = InventoryUi;\n"
  },
  {
    "path": "lib/inventory/client/plugin.js",
    "content": "/**\n *\n * Reldens - InventoryPlugin\n *\n * Client-side plugin for the inventory system.\n * Manages UI, event listeners, trade actions, and player inventory instances.\n *\n */\n\nconst { InventoryUi } = require('./inventory-ui');\nconst { InventoryReceiver } = require('./inventory-receiver');\nconst { TradeTargetAction } = require('./exchange/trade-target-action');\nconst { TradeMessageListener } = require('./trade-message-listener');\nconst { UserInterface } = require('../../game/client/user-interface');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { TemplatesHandler } = require('./templates-handler');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst Translations = require('./snippets/en_US');\nconst { InventoryConst } = require('../constants');\nconst { ItemsEvents, ItemsConst } = require('@reldens/items-system');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass InventoryPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    async setup(props)\n    {\n        // @TODO - BETA - Refactor plugin, extract all the methods into new classes.\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in InventoryPlugin.');\n        }\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in InventoryPlugin.');\n        }\n        this.tradeTargetAction = new TradeTargetAction();\n        this.setTradeUi();\n        this.listenEvents();\n        this.setListener();\n        this.setTranslations();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    setTranslations()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations, InventoryConst.MESSAGE.DATA_VALUES);\n        return true;\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    setTradeUi()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        // @TODO - BETA - Make the dialogBox template load on it's own so we can reuse the same object from cache.\n        // @NOTE: the tradeUi works as preload for the trade template which at the end is an dialog-box.\n        this.tradeUi = new UserInterface(this.gameManager, {id: 'trade', type: 'trade'});\n        return true;\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    setListener()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        this.gameManager.config.client.message.listeners['trade'] = new TradeMessageListener();\n        return true;\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        this.events.on('reldens.playersOnAdd', (player, key, previousScene, roomEvents) => {\n            this.onPlayerAdd(key, roomEvents, player);\n        });\n        this.events.on('reldens.preloadUiScene', (preloadScene) => {\n            TemplatesHandler.preloadTemplates(preloadScene);\n        });\n        this.events.on('reldens.createUiScene', (preloadScene) => {\n            return this.onPreloadUiScene(preloadScene);\n        });\n        this.events.on('reldens.gameEngineShowTarget', (gameEngine, target, previousTarget, targetName) => {\n            this.tradeTargetAction.showTargetExchangeAction(this.gameManager, target, previousTarget, targetName);\n        });\n        return true;\n    }\n\n    /**\n     * @param {Object} preloadScene\n     */\n    onPreloadUiScene(preloadScene)\n    {\n        this.uiManager = new InventoryUi(preloadScene);\n        this.uiManager.createUi();\n        let manager = preloadScene.gameManager.inventory.manager;\n        let equipmentPanel = this.activateGroupAndEquipmentUi(preloadScene, manager);\n        let inventoryPanel = this.activateInventoryUi(preloadScene, manager, equipmentPanel);\n        this.listenInventoryEvents(preloadScene, inventoryPanel, equipmentPanel);\n    }\n\n    /**\n     * @param {Object} preloadScene\n     * @param {Object} manager\n     * @returns {Object|boolean}\n     */\n    activateGroupAndEquipmentUi(preloadScene, manager)\n    {\n        let equipmentElement = preloadScene.getUiElement('equipment');\n        if(!equipmentElement){\n            Logger.warning('EquipmentElement not found.', equipmentElement);\n            return false;\n        }\n        let equipmentPanel = equipmentElement.getChildByProperty(\n            'id',\n            InventoryConst.EQUIPMENT_ITEMS\n        );\n        if(!equipmentPanel){\n            Logger.warning('Equipment UI not found.', equipmentPanel);\n            return false;\n        }\n        let inventoryGroups = sc.get(manager, 'groups', {});\n        if(Object.keys(inventoryGroups).length){\n            let equipmentItemsElement = preloadScene.gameManager.gameDom.getElement(\n                '#' + InventoryConst.EQUIPMENT_ITEMS\n            );\n            if(!equipmentItemsElement){\n                Logger.warning('Element \"equipmentItemsElement\" not found.');\n                return false;\n            }\n            equipmentItemsElement.innerHTML = '';\n            let orderedGroups = this.sortGroups(inventoryGroups);\n            for (let i of orderedGroups){\n                let output = this.createGroupBox(inventoryGroups[i], preloadScene.gameManager, preloadScene);\n                preloadScene.gameManager.gameDom.appendToElement('#' + InventoryConst.EQUIPMENT_ITEMS, output);\n            }\n        }\n        return equipmentPanel;\n    }\n\n    /**\n     * @param {Object} preloadScene\n     * @param {Object} manager\n     * @param {Object} equipmentPanel\n     * @returns {Object|boolean}\n     */\n    activateInventoryUi(preloadScene, manager, equipmentPanel)\n    {\n        let inventoryElement = preloadScene.getUiElement('inventory');\n        if(!inventoryElement){\n            Logger.warning('InventoryElement not found.', inventoryElement);\n            return false;\n        }\n        let inventoryPanel = inventoryElement.getChildByProperty(\n            'id',\n            InventoryConst.INVENTORY_ITEMS\n        );\n        if(!inventoryPanel){\n            Logger.warning('Inventory UI not found.', inventoryPanel);\n            return false;\n        }\n        let itemsElements = sc.get(manager, 'items', {});\n        let itemsKeys = Object.keys(itemsElements);\n        if(0 < itemsKeys.length){\n            for (let i of itemsKeys){\n                let item = itemsElements[i];\n                this.displayItem(item, preloadScene, equipmentPanel, inventoryPanel, i);\n            }\n        }\n        return inventoryPanel;\n    }\n\n    /**\n     * @param {string} key\n     * @param {Object} roomEvents\n     * @param {Object} player\n     * @returns {boolean|void}\n     */\n    onPlayerAdd(key, roomEvents, player)\n    {\n        if(key !== roomEvents.room.sessionId){\n            return false;\n        }\n        if(!roomEvents.gameManager.inventory){\n            this.createInventoryInstance(player, roomEvents);\n        }\n        roomEvents.room.onMessage('*', (message) => {\n            roomEvents.gameManager.inventory.processMessage(message);\n        });\n        return true;\n    }\n\n    /**\n     * @param {Object} player\n     * @param {Object} roomEvents\n     */\n    createInventoryInstance(player, roomEvents)\n    {\n        let receiverProps = {\n            owner: player,\n            ownerIdProperty: 'sessionId',\n            gameManager: roomEvents.gameManager\n        };\n        let inventoryClasses = roomEvents.gameManager.config.getWithoutLogs('client/customClasses/inventory/items', {});\n        if(inventoryClasses && 0 < Object.keys(inventoryClasses).length){\n            receiverProps.itemClasses = inventoryClasses;\n        }\n        let groupClasses = roomEvents.gameManager.config.getWithoutLogs('client/customClasses/inventory/groups', {});\n        if(groupClasses && Object.keys(groupClasses).length){\n            receiverProps.groupClasses = groupClasses;\n        }\n        roomEvents.gameManager.inventory = new InventoryReceiver(receiverProps);\n    }\n\n    /**\n     * @param {Object} uiScene\n     * @param {Object} inventoryPanel\n     * @param {Object} equipmentPanel\n     */\n    listenInventoryEvents(uiScene, inventoryPanel, equipmentPanel)\n    {\n        let gameManager = uiScene.gameManager;\n        let masterKey = gameManager.inventory.manager.getOwnerEventKey();\n        gameManager.inventory.manager.listenEvent(\n            ItemsEvents.ADD_ITEM,\n            (inventory, item) => {\n                let output = this.createItemBox(item, 'inventoryItem', gameManager, uiScene);\n                gameManager.gameDom.appendToElement('#'+InventoryConst.INVENTORY_ITEMS, output);\n                this.setupButtonsActions(inventoryPanel, item.getInventoryId(), item, uiScene);\n            },\n            gameManager.inventory.manager.getOwnerUniqueEventKey('addItemPack'),\n            masterKey\n        );\n        gameManager.inventory.manager.listenEvent(\n            ItemsEvents.SET_ITEMS,\n            (props) => {\n                inventoryPanel.innerHTML = '';\n                for(let i of Object.keys(props.items)){\n                    let item = props.items[i];\n                    this.displayItem(item, uiScene, equipmentPanel, inventoryPanel, i);\n                }\n            },\n            gameManager.inventory.manager.getOwnerUniqueEventKey('setItemsPack'),\n            masterKey\n        );\n        gameManager.inventory.manager.listenEvent(\n            ItemsEvents.MODIFY_ITEM_QTY,\n            (item) => {\n                let qtyBox = uiScene.getUiElement('inventory').getChildByID('item-qty-'+item.getInventoryId());\n                qtyBox.innerHTML = item.qty;\n            },\n            gameManager.inventory.manager.getOwnerUniqueEventKey('modifyItemQtyPack'),\n            masterKey\n        );\n        gameManager.inventory.manager.listenEvent(\n            ItemsEvents.REMOVE_ITEM,\n            (inventory, itemKey) => {\n                uiScene.getUiElement('inventory').getChildByID('item-'+itemKey).remove();\n            },\n            gameManager.inventory.manager.getOwnerUniqueEventKey('removeItemPack'),\n            masterKey\n        );\n        gameManager.inventory.manager.listenEvent(\n            ItemsEvents.SET_GROUPS,\n            (props) => {\n                // @TODO - BETA - If groups are re-set or updated we will need to update the items as well.\n                let reEquipItems = false;\n                let equipmentItemsGroups = gameManager.gameDom.getElement('#'+InventoryConst.EQUIPMENT_ITEMS);\n                if(equipmentItemsGroups.innerHTML !== ''){\n                    reEquipItems = true;\n                }\n                equipmentItemsGroups.innerHTML = '';\n                let orderedGroups = this.sortGroups(props.groups);\n                for(let i of orderedGroups){\n                    let output = this.createGroupBox(props.groups[i], gameManager, uiScene);\n                    gameManager.gameDom.appendToElement('#'+InventoryConst.EQUIPMENT_ITEMS, output);\n                }\n                if(reEquipItems){\n                    this.resetEquippedItemsDisplay(gameManager, uiScene, equipmentPanel, inventoryPanel);\n                }\n            },\n            gameManager.inventory.manager.getOwnerUniqueEventKey('setGroupsPack'),\n            masterKey\n        );\n        gameManager.inventory.manager.listenEvent(\n            ItemsEvents.EQUIP_ITEM,\n            (item) => {\n                this.displayItem(item, uiScene, equipmentPanel, inventoryPanel, item.getInventoryId());\n            },\n            gameManager.inventory.manager.getOwnerUniqueEventKey('equipItemPack'),\n            masterKey\n        );\n        gameManager.inventory.manager.listenEvent(\n            ItemsEvents.UNEQUIP_ITEM,\n            (item) => {\n                this.displayItem(item, uiScene, equipmentPanel, inventoryPanel, item.getInventoryId());\n            },\n            gameManager.inventory.manager.getOwnerUniqueEventKey('unequipItemPack'),\n            masterKey\n        );\n    }\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {Object} uiScene\n     * @param {Object} equipmentPanel\n     * @param {Object} inventoryPanel\n     * @returns {boolean|void}\n     */\n    resetEquippedItemsDisplay(gameManager, uiScene, equipmentPanel, inventoryPanel)\n    {\n        let items = Object.keys(gameManager.inventory.manager.items);\n        if(0 === items.length){\n            return false;\n        }\n        for(let i of items){\n            let item = gameManager.inventory.manager.items[i];\n            if(!this.isEquipped(item)){\n                continue;\n            }\n            this.displayItem(item, uiScene, equipmentPanel, inventoryPanel, item.getInventoryId());\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} item\n     * @param {Object} uiScene\n     * @param {Object} equipmentPanel\n     * @param {Object} inventoryPanel\n     * @param {string} itemIdx\n     */\n    displayItem(item, uiScene, equipmentPanel, inventoryPanel, itemIdx)\n    {\n        let output = this.createItemBox(item, 'inventoryItem', uiScene.gameManager, uiScene);\n        let existentElement = uiScene.gameManager.gameDom.getElement('#item-'+item.getInventoryId());\n        if(existentElement){\n            existentElement.remove();\n        }\n        if(!this.isEquipped(item)){\n            uiScene.gameManager.gameDom.appendToElement('#' + InventoryConst.INVENTORY_ITEMS, output);\n            this.setupButtonsActions(inventoryPanel, itemIdx, item, uiScene);\n            return;\n        }\n        this.displayItemInGroups(item, uiScene, output);\n        if(!equipmentPanel){\n            return;\n        }\n        this.setupButtonsActions(equipmentPanel, itemIdx, item, uiScene);\n    }\n\n    /**\n     * @param {Object} item\n     * @param {Object} uiScene\n     * @param {string} output\n     */\n    displayItemInGroups(item, uiScene, output)\n    {\n        let group = this.getGroupById(item.group_id, uiScene.gameManager.inventory.manager.groups);\n        if(group && uiScene.gameManager.gameDom.getElement('#group-item-' + group.key + ' .equipped-item')){\n            uiScene.gameManager.gameDom.updateContent('#group-item-' + group.key + ' .equipped-item', output);\n            return;\n        }\n        // @TODO - BETA - Make this append optional for now we will leave it to make the equipment action\n        //   visible.\n        // Logger.error('Group element not found. Group ID: '+item.group_id);\n        uiScene.gameManager.gameDom.appendToElement('#' + InventoryConst.EQUIPMENT_ITEMS, output);\n    }\n\n    /**\n     * @param {Object} item\n     * @param {GameManager} gameManager\n     */\n    updateEquipmentStatus(item, gameManager)\n    {\n        let currentItemElement = gameManager.gameDom.getElement('#item-equip-'+item.idx);\n        let equipState = item.equipped ? 'equipped' : 'unequipped';\n        // @TODO - BETA - Replace fixed image type.\n        currentItemElement.src = '/assets/features/inventory/assets/'+ equipState+GameConst.FILES.EXTENSIONS.PNG;\n    }\n\n    /**\n     * @param {Object} item\n     * @param {string} templateKey\n     * @param {GameManager} gameManager\n     * @param {Object} uiScene\n     * @returns {string}\n     */\n    createItemBox(item, templateKey, gameManager, uiScene)\n    {\n        let messageTemplate = uiScene.cache.html.get(templateKey);\n        return gameManager.gameEngine.parseTemplate(messageTemplate, {\n            key: item.key,\n            label: item.label,\n            description: item.description,\n            id: item.getInventoryId(),\n            qty: item.qty,\n            usable: this.isUsable(item) ? this.getUsableContent(item, gameManager, uiScene) : '',\n            equipment: this.isEquipment(item) ? this.getEquipContent(item, gameManager, uiScene) : ''\n        });\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {boolean}\n     */\n    isEquipment(item)\n    {\n        return item.isType(ItemsConst.TYPES.EQUIPMENT) || item.isType(ItemsConst.TYPES.SINGLE_EQUIPMENT);\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {boolean}\n     */\n    isEquipped(item)\n    {\n        return this.isEquipment(item) && true === item.equipped;\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {boolean}\n     */\n    isUsable(item)\n    {\n        return item.isType(ItemsConst.TYPES.USABLE) || item.isType(ItemsConst.TYPES.SINGLE_USABLE);\n    }\n\n    /**\n     * @param {Object<string, Object>} groups\n     * @returns {Array<string>}\n     */\n    sortGroups(groups)\n    {\n        return Object.keys(groups).sort((a,b) => {\n            return (groups[a].sort > groups[b].sort) ? 1 : -1;\n        });\n    }\n\n    /**\n     * @param {Object} group\n     * @param {GameManager} gameManager\n     * @param {Object} uiScene\n     * @returns {string}\n     */\n    createGroupBox(group, gameManager, uiScene)\n    {\n        let messageTemplate = uiScene.cache.html.get('inventoryGroup');\n        return gameManager.gameEngine.parseTemplate(messageTemplate, {\n            key: group.key,\n            label: group.label,\n            description: group.description,\n            fileName: group.files_name\n        });\n    }\n\n    /**\n     * @param {Object} inventoryPanel\n     * @param {string} idx\n     * @param {Object} item\n     * @param {Object} preloadScene\n     * @returns {boolean|void}\n     */\n    setupButtonsActions(inventoryPanel, idx, item, preloadScene)\n    {\n        // @TODO - BETA - Improve and move all the styles into an external class, and make it configurable.\n        let domMan = preloadScene.gameManager.gameDom;\n        // show item data:\n        let itemImage = inventoryPanel.querySelector('#item-' + idx + ' .image-container img');\n        if(!itemImage){\n            Logger.error(['Missing image element.', '#item-' + idx]);\n            return false;\n        }\n        itemImage.addEventListener('click', () => {\n            let details = inventoryPanel.querySelector('#item-' + idx + ' .item-data-container');\n            let show = false;\n            if(details.style.display !== 'block'){\n                show = true;\n            }\n            inventoryPanel.querySelectorAll('.item-box .image-container img').forEach(function(element){\n                element.style.border = 'none';\n            });\n            inventoryPanel.querySelectorAll('.item-data-container').forEach(function(element){\n                element.style.display = 'none';\n            });\n            if(show){\n                itemImage.style.border = '1px solid #fff';\n                details.style.display = 'block';\n            }\n        });\n        let buttonElement = inventoryPanel.querySelector('#item-trash-' + idx + ' img');\n        if(!buttonElement){\n            Logger.error(['Missing button.', buttonElement]);\n            return false;\n        }\n        buttonElement.addEventListener('click', () => {\n            inventoryPanel.querySelector('#trash-confirm-' + idx).style.display = 'block';\n        });\n        inventoryPanel.querySelector('#trash-cancel-' + idx).addEventListener('click', () => {\n            inventoryPanel.querySelector('#trash-confirm-' + idx).style.display = 'none';\n        });\n        inventoryPanel.querySelector('#trash-confirmed-' + idx).addEventListener('click', () => {\n            let optionSend = {\n                idx: idx,\n                act: InventoryConst.ACTIONS.REMOVE\n            };\n            preloadScene.gameManager.activeRoomEvents.send(optionSend);\n        });\n        if(this.isUsable(item)){\n            let useBtn = domMan.getElement('#item-use-'+idx);\n            useBtn.addEventListener(\n                'click',\n                this.clickedBox.bind(this, idx, InventoryConst.ACTIONS.USE, preloadScene)\n            );\n        }\n        if(this.isEquipment(item)){\n            let equipBtn = domMan.getElement('#item-equip-'+idx);\n            equipBtn.addEventListener(\n                'click',\n                this.clickedBox.bind(this, idx, InventoryConst.ACTIONS.EQUIP, preloadScene)\n            );\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} itemId\n     * @param {string} action\n     * @param {Object} preloadScene\n     */\n    clickedBox(itemId, action, preloadScene)\n    {\n        preloadScene.gameManager.activeRoomEvents.send({act: action, idx: itemId});\n    }\n\n    /**\n     * @param {Object} item\n     * @param {GameManager} gameManager\n     * @param {Object} uiScene\n     * @returns {string}\n     */\n    getUsableContent(item, gameManager, uiScene)\n    {\n        let messageTemplate = uiScene.cache.html.get('inventoryItemUse');\n        return gameManager.gameEngine.parseTemplate(messageTemplate, {\n            id: item.getInventoryId()\n        });\n    }\n\n    /**\n     * @param {Object} item\n     * @param {GameManager} gameManager\n     * @param {Object} uiScene\n     * @returns {string}\n     */\n    getEquipContent(item, gameManager, uiScene)\n    {\n        let messageTemplate = uiScene.cache.html.get('inventoryItemEquip');\n        return gameManager.gameEngine.parseTemplate(messageTemplate, {\n            id: item.getInventoryId(),\n            equipStatus: item.equipped ? 'equipped' : 'unequipped'\n        });\n    }\n\n    /**\n     * @param {number} groupId\n     * @param {Object<string, Object>} groupsList\n     * @returns {Object|boolean}\n     */\n    getGroupById(groupId, groupsList)\n    {\n        let groups = Object.keys(groupsList);\n        if(0 === groups.length){\n            return false;\n        }\n        for(let i of groups){\n            if(groupsList[i].id === groupId){\n                return groupsList[i];\n            }\n        }\n    }\n\n}\n\nmodule.exports.InventoryPlugin = InventoryPlugin;\n"
  },
  {
    "path": "lib/inventory/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    items: {\n        undefinedItem: 'Add item error, undefined item.',\n        undefinedMethodInventoryId: 'Add item error, undefined getInventoryId.',\n        undefinedItemKey: 'Add item error, undefined item key.',\n        invalidItemInstance: 'Invalid item instance.',\n        lockedForAddItem: 'Inventory locked, cannot add item: %itemUid',\n        maxTotalReachedForAddItem: 'Cannot add item, max total reached.',\n        itemExistsForAddItem: 'Cannot add item, item already exists: %itemUid',\n        itemLimitExceededForAddItem: 'Cannot add item, item qty limit exceeded.',\n        addItemsError: 'Cannot add item \"%itemUid\".',\n        lockedForSetItem: 'Inventory locked, cannot set item: %itemUid.',\n        lockedForRemoveItem: 'Inventory locked, cannot remove item: %itemUid.',\n        keyNotFound: 'Cannot remove item, key not found: %itemUid.',\n        lockedForModifyItemQty: 'Inventory locked, cannot modify item qty: %itemUid.',\n        undefinedItemKeyForOperation: 'Cannot \"%operation\" item qty, undefined item key: %itemUid.',\n        qtyNotANumber: 'Cannot \"%operation\" item qty, quantity is not a number: %qty.',\n        itemQtyLimitExceeded: 'Cannot \"%operation\" item qty, item qty limit exceeded: %qty > %limitPerItem.',\n        lockedForSetItems: 'Inventory locked, cannot set items.',\n        tradeWith: 'Trading with %playerName',\n        trade: {\n            actions: {\n                confirm: 'confirm',\n                disconfirm: 'decline',\n                cancel: 'cancel',\n            }\n        },\n        exchange: {\n            missingConfirmation: 'Missing confirmation.',\n            invalidPushedQuantity: 'Invalid item pushed quantity (%qty), available: %pushedItemQty.',\n            invalidQuantity: 'Invalid item quantity 0.',\n            invalidExchange: 'Inventories \"FROM\" and \"TO\" are the same, exchange cancelled.',\n            decreaseQuantity: 'Exchange inventory decrease error.',\n            itemAdd: 'Exchange add inventory result error.'\n        },\n        requirements: {\n            itemNotPresent: 'Required item \"%requiredItemKey\" is not present.',\n            quantityNotAvailable: 'Required item \"%requiredItemKey\" quantity %totalRequiredQuantity'\n                +' is not available.',\n            itemNotPushed: 'Required item \"%requiredItemKey\" was not pushed for exchange.',\n            itemQuantityNotPushed: 'Required item \"%requiredItemKey\" quantity %totalRequiredQuantity'\n                +' was not pushed for exchange.',\n            itemDoesNotExists: 'Requirement error, item \"%itemUid\" does not exits on inventory.',\n            itemAdd: 'Requirement add item error.'\n        },\n        reward: {\n            doesNotExists: 'Reward error, item \"%itemUid\" does not exits.',\n            missingItem: 'Reward error, item \"%itemUid\" does not exits.',\n            itemNotPresent: 'Reward item \"%rewardItemKey\" is not present on inventory.',\n            quantityNotAvailable: 'Reward item %rewardItemKey reward quantity (%rewardQuantity) is not available.',\n            missingPushed: 'Missing pushed for exchange item \"%itemUid\".',\n            getItemDoesNotExists: 'Reward error, item \"%itemUid\" does not exits on inventory.',\n            processItem: 'Process item reward error, item \"%itemUid\".',\n            processInventory: 'Rewards process inventory error.',\n            addItems: 'Rewards error on add items: %itemsKeys.',\n            quantityOverload: 'Reward quantity (%rewardQuantityTotal) is bigger than the available in the'\n                +' inventory (%rewardInventoryItemQty).'\n        },\n        equipment: {\n            modifiersApply: 'Cannot apply modifiers the item is not equipped: %itemUid',\n            modifiersRevert: 'Cannot revert modifiers the item is not equipped: %itemUid',\n        }\n    }\n};\n"
  },
  {
    "path": "lib/inventory/client/templates-handler.js",
    "content": "/**\n *\n * Reldens - TemplatesHandler\n *\n * Handles loading of inventory-related HTML templates.\n *\n */\n\nclass TemplatesHandler\n{\n\n    /**\n     * @param {Object} preloadScene\n     */\n    static preloadTemplates(preloadScene)\n    {\n        // @TODO - BETA - Replace by loader replacing snake name file name by camel case for the template key.\n        let inventoryTemplatePath = '/assets/features/inventory/templates/';\n        // @TODO - BETA - Move the preload HTML as part of the engine driver.\n        preloadScene.load.html('inventory', inventoryTemplatePath+'ui-inventory.html');\n        preloadScene.load.html('equipment', inventoryTemplatePath+'ui-equipment.html');\n        preloadScene.load.html('inventoryItem', inventoryTemplatePath+'item.html');\n        preloadScene.load.html('inventoryItemUse', inventoryTemplatePath+'usable.html');\n        preloadScene.load.html('inventoryItemEquip', inventoryTemplatePath+'equip.html');\n        preloadScene.load.html('inventoryGroup', inventoryTemplatePath+'group.html');\n        preloadScene.load.html('inventoryTradeContainer', inventoryTemplatePath+'trade-container.html');\n        preloadScene.load.html('inventoryTradePlayerContainer', inventoryTemplatePath+'trade-player-container.html');\n        preloadScene.load.html('inventoryTradeRequirements', inventoryTemplatePath+'trade-requirements.html');\n        preloadScene.load.html('inventoryTradeRewards', inventoryTemplatePath+'trade-rewards.html');\n        preloadScene.load.html('inventoryTradeAction', inventoryTemplatePath+'trade-action.html');\n        preloadScene.load.html('inventoryTradeActionRemove', inventoryTemplatePath+'trade-action-remove.html');\n        preloadScene.load.html('inventoryTradeItem', inventoryTemplatePath+'trade-item.html');\n        preloadScene.load.html('inventoryTradeItemQuantity', inventoryTemplatePath+'trade-item-quantity.html');\n        preloadScene.load.html('inventoryTradeStart', inventoryTemplatePath+'trade-start.html');\n        preloadScene.load.html('inventoryTradeAccept', inventoryTemplatePath+'trade-accept.html');\n    }\n\n}\n\nmodule.exports.TemplatesHandler = TemplatesHandler;\n"
  },
  {
    "path": "lib/inventory/client/trade-items-helper.js",
    "content": "/**\n *\n * Reldens - TradeItemsHelper\n *\n * Helper class for trade items operations.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\nclass TradeItemsHelper\n{\n\n    /**\n     * @param {Object} items\n     * @param {string} i\n     * @param {Object} itemsManager\n     * @returns {Object}\n     */\n    static createItemInstance(items, i, itemsManager)\n    {\n        let messageItem = items[i];\n        let itemsProps = Object.assign({manager: itemsManager}, messageItem, {uid: i});\n        let itemClass = sc.get(\n            itemsManager.itemClasses,\n            itemsProps.key,\n            itemsManager.types.classByTypeId(itemsProps.type)\n        );\n        let itemInstance = new itemClass(itemsProps);\n        itemInstance.quantityDisplay = 1;\n        itemInstance.quantityMaxDisplay = Math.max(itemInstance.qty_limit, messageItem.qty);\n        return itemInstance;\n    }\n\n}\n\nmodule.exports.TradeItemsHelper = TradeItemsHelper;\n"
  },
  {
    "path": "lib/inventory/client/trade-message-handler.js",
    "content": "/**\n *\n * Reldens - TradeMessageHandler\n *\n * Handles trade-related messages and UI updates on the client side.\n * Manages trade requests, confirmations, and item exchange display.\n *\n */\n\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\nconst { InventoryConst } = require('../constants');\nconst { ObjectsConst } = require('../../objects/constants');\nconst { UserInterface } = require('../../game/client/user-interface');\nconst { TradeItemsHelper } = require('./trade-items-helper');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('../../game/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('../../game/client/game-dom').GameDom} GameDom\n * @typedef {import('@reldens/items-system').ItemsClient} ItemsClient\n * @typedef {import('phaser').Scene} Scene\n */\nclass TradeMessageHandler\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {RoomEvents|boolean} */\n        this.roomEvents = sc.get(props, 'roomEvents', false);\n        /** @type {Object|boolean} */\n        this.message = sc.get(props, 'message', false);\n        /** @type {GameManager} */\n        this.gameManager = this.roomEvents?.gameManager;\n        /** @type {GameDom} */\n        this.gameDom = this.gameManager?.gameDom;\n        /** @type {Scene} */\n        this.uiScene = this.gameManager?.gameEngine?.uiScene;\n        /** @type {ItemsClient} */\n        this.itemsManager = this.gameManager?.inventory?.manager;\n        this.validate();\n    }\n\n    validate()\n    {\n        if(!this.roomEvents){\n            ErrorManager.error('Missing RoomEvents.');\n        }\n        if(!this.message){\n            ErrorManager.error('Missing message.');\n        }\n        if(!this.gameManager){\n            ErrorManager.error('Missing GameManager.');\n        }\n        if(!this.uiScene){\n            ErrorManager.error('Missing UiScene.');\n        }\n        if(!this.itemsManager){\n            ErrorManager.error('Missing ItemsManager.');\n        }\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    updateContents()\n    {\n        if(InventoryConst.ACTIONS.TRADE_START === this.message.act){\n            return this.showTradeRequest();\n        }\n        if(InventoryConst.ACTIONS.TRADE_SHOW === this.message.act){\n            return this.showTradeBox();\n        }\n        return false;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    showTradeRequest()\n    {\n        // @TODO - BETA - Make all these values configurable.\n        let tradeUiKey = 'trade'+this.message.id;\n        this.createTradeUi(tradeUiKey);\n        this.roomEvents.initUi({\n            id: tradeUiKey,\n            title: this.gameManager.config.getWithoutLogs(\n                'client/trade/titles/tradeRequestFromLabel',\n                'Trade request from:'\n            ),\n            content: this.message.from,\n            options: this.gameManager.config.get('client/ui/options/acceptOrDecline'),\n            overrideSendOptions: {\n                act: InventoryConst.ACTIONS.TRADE_ACCEPTED,\n                id: this.message.id\n            }\n        });\n        this.gameDom.getElement('#box-'+tradeUiKey)?.classList?.add('trade-request');\n        this.gameDom.getElement('#opt-2-'+tradeUiKey)?.addEventListener('click', () => {\n            this.gameDom.getElement('#box-close-'+tradeUiKey)?.click();\n        });\n        return true;\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    showTradeBox()\n    {\n        let tradeUiKey = 'trade'+this.message.id;\n        this.createTradeUi(tradeUiKey);\n        // this will create or reset the ui content:\n        this.roomEvents.initUi({\n            id: tradeUiKey,\n            title: this.gameManager.services.translator.t('items.tradeWith', {playerName: this.message.with}),\n            content: '',\n            options: {}\n        });\n        let boxElement = this.gameDom.getElement('#box-'+tradeUiKey);\n        boxElement?.classList?.remove('trade-request');\n        boxElement?.classList?.add('trade-in-progress');\n        let container = this.gameManager.gameDom.getElement('#box-'+tradeUiKey+' .box-content');\n        if(!container){\n            Logger.error('Missing container: \"#box-'+tradeUiKey+' .box-content\".');\n            return false;\n        }\n        if(true === this.message.isTradeEnd){\n            this.gameDom.getElement('#box-close-'+'trade'+this.message.id)?.click();\n            return true;\n        }\n        let items = sc.get(this.message, 'items', false);\n        let traderItemsData = sc.get(this.message, 'traderItemsData', {});\n        let exchangeData = sc.get(this.message, 'exchangeData', {});\n        let traderExchangeKey = sc.get(this.message, 'playerToExchangeKey', 'A');\n        // my exchange key is the opposite to the received exchange key:\n        let myExchangeKey = 'A' === traderExchangeKey ? 'B' : 'A';\n        this.updateItemsList(items, container, exchangeData[myExchangeKey]);\n        this.updateMyExchangeData((exchangeData[myExchangeKey] || {}), items, myExchangeKey);\n        this.updateTraderExchangeData((exchangeData[traderExchangeKey] || {}), traderItemsData, traderExchangeKey);\n        return true;\n    }\n\n    /**\n     * @param {string} tradeUiKey\n     * @returns {Object|undefined}\n     */\n    createTradeUi(tradeUiKey)\n    {\n        let tradeUi = sc.get(this.roomEvents.tradeUi, tradeUiKey);\n        if(!tradeUi){\n            this.roomEvents.tradeUi[tradeUiKey] = new UserInterface(\n                this.gameManager,\n                {id: tradeUiKey, type: 'trade'},\n                '/assets/html/dialog-box.html',\n                'trade'\n            );\n            this.roomEvents.tradeUi[tradeUiKey].createUiElement(this.uiScene, 'trade');\n        }\n        return tradeUi;\n    }\n\n    /**\n     * @param {Object} items\n     * @param {HTMLElement} container\n     * @param {Object} exchangeData\n     */\n    updateItemsList(items, container, exchangeData)\n    {\n        if(!items){\n            return;\n        }\n        let tradeItems = '';\n        let tempItemsList = {};\n        for(let i of Object.keys(items)){\n            tempItemsList[i] = TradeItemsHelper.createItemInstance(items, i, this.itemsManager);\n            tempItemsList[i].tradeAction = 'trade';\n            tradeItems += this.createTradeItemBox(tempItemsList[i], sc.get(exchangeData, tempItemsList[i].uid, false));\n        }\n        container.innerHTML = this.createTradeContainer(tradeItems);\n        this.activateItemsBoxActions(tempItemsList);\n        this.activateConfirmButtonAction(sc.get(this.message, 'exchangeData', {}));\n    }\n\n    /**\n     * @param {Object} exchangeData\n     */\n    activateConfirmButtonAction(exchangeData)\n    {\n        let confirmButton = this.gameManager.gameDom.getElement('.confirm-'+this.message.id);\n        let disconfirmButton = this.gameManager.gameDom.getElement('.disconfirm-'+this.message.id);\n        let myExchangeKey = sc.get(this.message, 'playerToExchangeKey', 'A');\n        let traderExchangeKey = 'A' === myExchangeKey ? 'B' : 'A';\n        let myExchangeData = exchangeData[myExchangeKey] || {};\n        let traderExchangeData = exchangeData[traderExchangeKey] || {};\n        let myHasItems = 0 < Object.keys(myExchangeData).length;\n        let traderHasItems = 0 < Object.keys(traderExchangeData).length;\n        let hasAnyItems = myHasItems || traderHasItems;\n        let iConfirmed = sc.get(this.message, 'myConfirmed', false);\n        if(confirmButton){\n            confirmButton.disabled = iConfirmed || !hasAnyItems;\n            confirmButton.addEventListener('click', () => {\n                this.gameManager.activeRoomEvents.send({\n                    act: InventoryConst.ACTIONS.TRADE_ACTION,\n                    id: this.message.id,\n                    value: this.message.id,\n                    sub: ObjectsConst.TRADE_ACTIONS.CONFIRM\n                });\n            });\n        }\n        if(disconfirmButton){\n            disconfirmButton.disabled = !iConfirmed;\n            disconfirmButton.addEventListener('click', () => {\n                this.gameManager.activeRoomEvents.send({\n                    act: InventoryConst.ACTIONS.TRADE_ACTION,\n                    id: this.message.id,\n                    value: this.message.id,\n                    sub: ObjectsConst.TRADE_ACTIONS.DISCONFIRM\n                });\n            });\n        }\n        let cancelButton = this.gameManager.gameDom.getElement('.cancel-'+this.message.id);\n        cancelButton?.addEventListener('click', () => {\n            this.gameDom.getElement('#box-close-'+'trade'+this.message.id)?.click();\n        });\n    }\n\n    /**\n     * @param {Object} exchangeDataItems\n     * @param {Object} items\n     * @param {string} exchangeKey\n     * @returns {boolean}\n     */\n    updateMyExchangeData(exchangeDataItems, items, exchangeKey)\n    {\n        if(0 === Object.keys(exchangeDataItems).length){\n            return false;\n        }\n        let content = this.createConfirmItemsBox(exchangeDataItems, items);\n        let itemsContainer = this.gameDom.getElement('.trade-items-boxes .trade-player-col.trade-col-2');\n        if(!itemsContainer){\n            Logger.error('Missing \"'+exchangeKey+'\" items container.');\n            return false;\n        }\n        itemsContainer.innerHTML = content;\n        this.assignRemoveActions(exchangeDataItems, items);\n        return true;\n    }\n\n    /**\n     * @param {Object} exchangeDataItems\n     * @param {Object} traderItemsData\n     * @param {string} exchangeKey\n     * @returns {boolean}\n     */\n    updateTraderExchangeData(exchangeDataItems, traderItemsData, exchangeKey)\n    {\n        if(0 === Object.keys(exchangeDataItems).length){\n            return false;\n        }\n        let content = this.createReceivingItemsBox(exchangeDataItems, traderItemsData);\n        let itemsContainer = this.gameDom.getElement('.trade-items-boxes .trade-player-col.trade-col-3');\n        if(!itemsContainer){\n            Logger.error('Missing \"'+exchangeKey+'\" items container.');\n            return false;\n        }\n        itemsContainer.innerHTML = content;\n        return true;\n    }\n\n    /**\n     * @param {Object} exchangeItems\n     * @param {Object} items\n     * @returns {string}\n     */\n    createConfirmItemsBox(exchangeItems, items)\n    {\n        // @TODO - BETA - Since we are using one template \"inventoryTradeItem\", use only one \"createConfirmItemsBox\".\n        let exchangeItemsUids = Object.keys(exchangeItems);\n        if(0 === exchangeItemsUids.length){\n            Logger.info('Undefined exchange items on confirmation trade-message-handler.', {message: this.message});\n            return '';\n        }\n        let content = '';\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeItem');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeItem\".');\n            return '';\n        }\n        for(let itemUid of exchangeItemsUids){\n            let qty = exchangeItems[itemUid];\n            let item = items[itemUid];\n            content += this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n                key: item.key,\n                label: item.label,\n                description: item.description,\n                id: itemUid,\n                qty: item.qty,\n                hiddenClass: '',\n                tradeAction: this.createTradeActionRemove(item),\n                tradeActionKey: this.message.id,\n                tradeQuantityContent: qty\n            });\n        }\n        return content;\n    }\n\n    /**\n     * @param {Object} exchangeItems\n     * @param {Object} traderItemsData\n     * @returns {string}\n     */\n    createReceivingItemsBox(exchangeItems, traderItemsData)\n    {\n        let exchangeItemsUids = Object.keys(exchangeItems);\n        if(0 === exchangeItemsUids.length){\n            Logger.info('Undefined exchange items on receive trade-message-handler.', {message: this.message});\n            return '';\n        }\n        let content = '';\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeItem');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeItem\".');\n            return '';\n        }\n        for(let itemUid of exchangeItemsUids){\n            let qty = exchangeItems[itemUid];\n            let item = traderItemsData[itemUid];\n            content += this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n                key: item.key,\n                label: item.label,\n                description: item.description,\n                id: itemUid,\n                qty: item.qty,\n                hiddenClass: '',\n                tradeAction: '',\n                tradeActionKey: this.message.id,\n                tradeQuantityContent: qty\n            });\n        }\n        return content;\n    }\n\n    /**\n     * @param {Object} exchangeItems\n     * @param {Object} items\n     * @returns {boolean}\n     */\n    assignRemoveActions(exchangeItems, items)\n    {\n        let exchangeItemsUids = Object.keys(exchangeItems);\n        if(0 === exchangeItemsUids.length){\n            Logger.info('Undefined exchange items on remove trade-message-handler.', {message: this.message});\n            return false;\n        }\n        for(let itemUid of exchangeItemsUids){\n            let itemContainerSelector = '.pushed-to-trade .trade-item-'+itemUid;\n            let itemContainer = this.gameDom.getElement(itemContainerSelector);\n            if(!itemContainer){\n                Logger.error('Assign trade item \"'+itemUid+'\" container not found.');\n                continue;\n            }\n            let itemActionButton = this.gameDom.getElement(\n                '.pushed-to-trade .trade-item-'+itemUid+' .trade-action-remove'\n            );\n            if(!itemActionButton){\n                Logger.error('Assign trade item \"'+itemUid+'\" remove button not found.');\n                continue;\n            }\n            let item = items[itemUid];\n            itemActionButton.addEventListener('click', () => {\n                itemContainer.classList.remove('hidden');\n                let dataSend = {\n                    act: InventoryConst.ACTIONS.TRADE_ACTION,\n                    id: this.message.id,\n                    value: 'remove',\n                    itemId: itemUid,\n                    itemKey: item.key,\n                };\n                dataSend[ObjectsConst.TRADE_ACTIONS.SUB_ACTION] = ObjectsConst.TRADE_ACTIONS.REMOVE;\n                this.gameManager.activeRoomEvents.send(dataSend);\n            });\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} tradeItems\n     * @returns {string}\n     */\n    createTradeContainer(tradeItems)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradePlayerContainer');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeContainer\".');\n            return '';\n        }\n        let templateParams = {\n            tradeActionKey: this.message.id,\n            confirmLabel: this.gameManager.config.getWithoutLogs(\n                'client/trade/titles/confirmLabel',\n                this.gameManager.services.translator.t('items.trade.actions.confirm')\n            ),\n            disconfirmLabel: this.gameManager.config.getWithoutLogs(\n                'client/trade/titles/disconfirmLabel',\n                this.gameManager.services.translator.t('items.trade.actions.disconfirm')\n            ),\n            cancelLabel: this.gameManager.config.getWithoutLogs(\n                'client/trade/titles/cancelLabel',\n                this.gameManager.services.translator.t('items.trade.actions.cancel')\n            ),\n            myItems: tradeItems,\n            myItemsTitle: this.gameManager.config.getWithoutLogs('client/trade/titles/myItems', 'My Items:'),\n            pushedToTradeTitle: this.gameManager.config.getWithoutLogs(\n                'client/trade/titles/pushedToTradeTitle',\n                'Sending:'\n            ),\n            gotFromTradeTitle: this.gameManager.config.getWithoutLogs(\n                'client/trade/titles/gotFromTradeTitle',\n                'Receiving:'\n            ),\n            playerConfirmedLabel: this.playerConfirmedLabel(),\n        };\n        return this.gameManager.gameEngine.parseTemplate(messageTemplate, templateParams);\n    }\n\n    /**\n     * @returns {string}\n     */\n    playerConfirmedLabel()\n    {\n        if(!this.message.playerConfirmed){\n            return '';\n        }\n        return this.gameManager.config.getWithoutLogs(\n            'client/trade/titles/playerConfirmedLabel',\n            '%playerName CONFIRMED'\n        ).replace('%playerName', this.message.with);\n    }\n\n    /**\n     * @param {Object} item\n     * @param {number|boolean} exchangeDataItem\n     * @returns {string}\n     */\n    createTradeItemBox(item, exchangeDataItem)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeItem');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeItem\".');\n            return '';\n        }\n        let qtyTemplate = this.uiScene.cache.html.get('inventoryTradeItemQuantity');\n        if(!qtyTemplate){\n            Logger.error('Missing template \"inventoryTradeItemQuantity\".');\n            return '';\n        }\n        let qty = exchangeDataItem || 0;\n        return this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n            key: item.key,\n            label: item.label,\n            description: item.description,\n            id: item.getInventoryId(),\n            qty: item.qty,\n            hiddenClass: 0 < qty && item.qty === qty ? ' hidden' : '',\n            tradeAction: this.createTradeActionContent(item),\n            tradeActionKey: 'to-be-'+item.tradeAction,\n            tradeQuantityContent: this.gameManager.gameEngine.parseTemplate(qtyTemplate, {\n                quantityDisplay: item.quantityDisplay || 1,\n                quantityMaxDisplay: 0 < item.quantityMaxDisplay ? 'max=\"' + item.quantityMaxDisplay + '\"' : ''\n            })\n        });\n    }\n\n    /**\n     * @param {Object} item\n     * @param {string} tradeAction\n     * @returns {string}\n     */\n    createTradeActionContent(item, tradeAction)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeAction');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeAction\".');\n            return '';\n        }\n        return this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n            key: item.key,\n            id: item.getInventoryId(),\n            tradeAction: tradeAction || sc.get(item, 'tradeAction', '')\n        });\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {string}\n     */\n    createTradeActionRemove(item)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeActionRemove');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeActionRemove\".');\n            return '';\n        }\n        return this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n            key: item.key,\n            id: item.uid,\n            tradeAction: 'remove'\n        });\n    }\n\n    /**\n     * @param {Object<string, Object>} items\n     */\n    activateItemsBoxActions(items)\n    {\n        for(let i of Object.keys(items)){\n            let item = items[i];\n            let imageContainer = this.gameDom.getElement('.trade-item-'+item.uid+' .image-container');\n            if(!imageContainer){\n                Logger.error('Image container for item \"'+item.uid+'\" not found.');\n                continue;\n            }\n            imageContainer.addEventListener('click', () => {\n                let tradeActionsContainer = this.gameDom.getElement(\n                    '.trade-item-'+item.uid+' .actions-container.trade-actions'\n                );\n                tradeActionsContainer?.classList?.toggle('trade-actions-expanded');\n            });\n            let itemContainerSelector = '.trade-item-to-be-'+item.tradeAction+'.trade-item-'+item.uid\n                +' .trade-action-'+item.tradeAction;\n            let itemButtonSelector = itemContainerSelector+' button';\n            let itemActionButton = this.gameDom.getElement(itemButtonSelector);\n            if(!itemActionButton){\n                Logger.error('Activate trade item \"'+item.uid+'\" action button not found.');\n                continue;\n            }\n            itemActionButton.addEventListener('click', () => {\n                let qtySelector = this.gameDom.getElement('.trade-item-'+item.getInventoryId()+' .item-qty input');\n                let qtySelected = qtySelector?.value || 1;\n                let dataSend = {\n                    act: InventoryConst.ACTIONS.TRADE_ACTION,\n                    id: this.message.id,\n                    value: item.tradeAction,\n                    itemId: item.getInventoryId(),\n                    itemKey: item.key,\n                    qty: Number(qtySelected)\n                };\n                dataSend[ObjectsConst.TRADE_ACTIONS.SUB_ACTION] = ObjectsConst.TRADE_ACTIONS.ADD;\n                this.gameManager.activeRoomEvents.send(dataSend);\n            });\n        }\n    }\n\n}\n\nmodule.exports.TradeMessageHandler = TradeMessageHandler;\n"
  },
  {
    "path": "lib/inventory/client/trade-message-listener.js",
    "content": "/**\n *\n * Reldens - TradeMessageListener\n *\n * Listens for and processes trade-related messages from the server.\n * Delegates message handling to TradeMessageHandler.\n *\n */\n\nconst { TradeMessageHandler } = require('./trade-message-handler');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass TradeMessageListener\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean|void>}\n     */\n    async executeClientMessageActions(props)\n    {\n        let message = sc.get(props, 'message', false);\n        if(!message){\n            Logger.error('Missing message data on TradeMessageListener.', props);\n            return false;\n        }\n        let roomEvents = sc.get(props, 'roomEvents', false);\n        if(!roomEvents){\n            Logger.error('Missing RoomEvents on TradeMessageListener.', props);\n            return false;\n        }\n        let tradeMessageHandler = new TradeMessageHandler({roomEvents, message});\n        tradeMessageHandler.updateContents();\n        return true;\n    }\n\n}\n\nmodule.exports.TradeMessageListener = TradeMessageListener;\n"
  },
  {
    "path": "lib/inventory/constants.js",
    "content": "/**\n *\n * Reldens - InventoryConst\n *\n */\n\nlet prefix = 'ivp'\n\nmodule.exports.InventoryConst = {\n    INVENTORY_ITEMS: 'inventory-items',\n    INVENTORY_OPEN: 'inventory-open',\n    INVENTORY_CLOSE: 'inventory-close',\n    EQUIPMENT_ITEMS: 'equipment-items',\n    EQUIPMENT_CLOSE: 'equipment-close',\n    EQUIPMENT_OPEN: 'equipment-open',\n    ANIMATION_KEY_PREFIX: 'aK_',\n    GROUP_BUCKET: '/assets/custom/groups',\n    ACTIONS: {\n        PREFIX: prefix,\n        REMOVE: prefix+'Rm',\n        USE: prefix+'Use',\n        EQUIP: prefix+'Eqi',\n        TRADE_START: prefix+'tStart',\n        TRADE_ACCEPTED: prefix+'tAccepted',\n        TRADE_SHOW: prefix+'tShow',\n        TRADE_ACTION: prefix+'tAction'\n    },\n    MESSAGE: {\n        DATA_VALUES: {\n            NAMESPACE: 'items'\n        }\n    },\n};\n"
  },
  {
    "path": "lib/inventory/server/entities/items-group-entity-override.js",
    "content": "/**\n *\n * Reldens - ItemsGroupEntityOverride\n *\n * Admin panel configuration override for items_group entity.\n * Adds file upload support and hot-plug callbacks for live updates.\n *\n */\n\nconst { GroupHotPlugCallbacks } = require('../group-hot-plug-callbacks');\nconst { InventoryConst } = require('../../constants');\nconst { AllowedFileTypes } = require('../../../game/allowed-file-types');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { ItemsGroupEntity } = require('../../../../generated-entities/entities/items-group-entity');\nconst { sc } = require('@reldens/utils');\n\nclass ItemsGroupEntityOverride extends ItemsGroupEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @param {Object} projectConfig\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps, projectConfig)\n    {\n        let config = super.propertiesConfig(extraProps, projectConfig);\n        let bucket = FileHandler.joinPaths(projectConfig.bucketFullPath, 'assets', 'custom', 'groups');\n        let bucketPath = '/assets/custom/groups/';\n        let distFolder = FileHandler.joinPaths(projectConfig.distPath, 'assets', 'custom', 'groups');\n        config.properties['files_name'] = {\n            isRequired: false,\n            isArray: ',',\n            isUpload: true,\n            allowedTypes: AllowedFileTypes.IMAGE,\n            bucket,\n            bucketPath,\n            distFolder\n        };\n        config.listProperties = sc.removeFromArray(config.listProperties, ['items_limit', 'limit_per_item']);\n        config.bucketPath = '/' + InventoryConst.GROUP_BUCKET + '/';\n        config.bucket = bucket;\n        config.callbacks = {\n            // @NOTE: we use the update callback because that's when the file_name is updated with the upload plugin.\n            afterUpdate: GroupHotPlugCallbacks.afterUpdateCallback(projectConfig, bucket, distFolder),\n            beforeDelete: GroupHotPlugCallbacks.beforeDeleteCallback(projectConfig, bucket, distFolder)\n        };\n        return config;\n    }\n\n}\n\nmodule.exports.ItemsGroupEntityOverride = ItemsGroupEntityOverride;\n"
  },
  {
    "path": "lib/inventory/server/entities/items-inventory-entity-override.js",
    "content": "/**\n *\n * Reldens - ItemsInventoryEntityOverride\n *\n * Admin panel configuration override for items_inventory entity.\n * Adjusts navigation position in admin menu.\n *\n */\n\nconst { ItemsInventoryEntity } = require('../../../../generated-entities/entities/items-inventory-entity');\n\nclass ItemsInventoryEntityOverride extends ItemsInventoryEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 995;\n        return config;\n    }\n\n}\n\nmodule.exports.ItemsInventoryEntityOverride = ItemsInventoryEntityOverride;\n"
  },
  {
    "path": "lib/inventory/server/entities/items-item-entity-override.js",
    "content": "/**\n *\n * Reldens - ItemsItemEntityOverride\n *\n * Admin panel configuration override for items_item entity.\n * Removes verbose fields from list view and adjusts navigation position.\n *\n */\n\nconst { ItemsItemEntity } = require('../../../../generated-entities/entities/items-item-entity');\nconst { sc } = require('@reldens/utils');\n\nclass ItemsItemEntityOverride extends ItemsItemEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties = sc.removeFromArray(config.listProperties, [\n            'description',\n            'qty_limit',\n            'uses_limit',\n            'useTimeOut',\n            'execTimeOut'\n        ]);\n        config.navigationPosition = 300;\n        return config;\n    }\n\n}\n\nmodule.exports.ItemsItemEntityOverride = ItemsItemEntityOverride;\n"
  },
  {
    "path": "lib/inventory/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { ItemsInventoryEntityOverride } = require('./entities/items-inventory-entity-override');\nconst { ItemsItemEntityOverride } = require('./entities/items-item-entity-override');\nconst { ItemsGroupEntityOverride } = require('./entities/items-group-entity-override');\n\nmodule.exports.entitiesConfig = {\n    itemsInventory: ItemsInventoryEntityOverride,\n    itemsItem: ItemsItemEntityOverride,\n    itemsGroup: ItemsGroupEntityOverride\n};\n"
  },
  {
    "path": "lib/inventory/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        items_item: 'Items',\n        items_group: 'Groups',\n        items_inventory: 'Players Inventory',\n        items_item_modifiers: 'Modifiers',\n        items_types: 'Types',\n    }\n};\n"
  },
  {
    "path": "lib/inventory/server/exchange/player-processor.js",
    "content": "/**\n *\n * Reldens - PlayerProcessor\n *\n * Processes player-to-player exchange transactions.\n * Extends Processor with player-specific confirm/disconfirm operations.\n *\n */\n\nconst { Processor } = require('./processor');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass PlayerProcessor extends Processor\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    static async confirm(props)\n    {\n        let data = sc.get(props, 'data', false);\n        let transaction = sc.get(props, 'transaction', false);\n        let inventoryKey = sc.get(props, 'inventoryKey', false);\n        if(false === data || false === transaction || false === inventoryKey){\n            Logger.critical({'Missing data': {data, transaction, inventoryKey}});\n            return false;\n        }\n        await transaction.confirmExchange(inventoryKey);\n        return await transaction.finalizeExchange();\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    static async disconfirm(props)\n    {\n        let data = sc.get(props, 'data', false);\n        let transaction = sc.get(props, 'transaction', false);\n        let inventoryKey = sc.get(props, 'inventoryKey', false);\n        if(false === data || false === transaction || false === inventoryKey){\n            Logger.critical({'Missing data': {data, transaction, inventoryKey}});\n            return false;\n        }\n        return await transaction.disconfirmExchange(inventoryKey);\n    }\n\n}\n\nmodule.exports.PlayerProcessor = PlayerProcessor;\n"
  },
  {
    "path": "lib/inventory/server/exchange/processor.js",
    "content": "/**\n *\n * Reldens - Processor\n *\n * Processes exchange transactions between inventories.\n * Provides static methods for add, remove, and confirm operations.\n *\n */\n\nconst { ExchangePlatform } = require('@reldens/items-system');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass Processor\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<Object|boolean>}\n     */\n    static async init(props)\n    {\n        let data = sc.get(props, 'data', false);\n        let from = sc.get(props, 'from', false);\n        let to = sc.get(props, 'to', false);\n        if(false === data || false === from || false === to){\n            return false;\n        }\n        let exchangePlatform = new ExchangePlatform();\n        let exchangeParams = {\n            inventoryA: from,\n            inventoryB: to,\n            exchangeRequirementsA: sc.get(props, 'exchangeRequirementsA', []),\n            exchangeRewardsB: sc.get(props, 'exchangeRewardsB', []),\n            dropExchangeA: sc.get(props, 'dropExchangeA', false),\n            dropExchangeB: sc.get(props, 'dropExchangeB', false),\n            avoidExchangeDecreaseA: sc.get(props, 'avoidExchangeDecreaseA', false),\n            avoidExchangeDecreaseB: sc.get(props, 'avoidExchangeDecreaseB', false)\n        };\n        exchangePlatform.initializeExchangeBetween(exchangeParams);\n        return exchangePlatform;\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    static async add(props)\n    {\n        let data = sc.get(props, 'data', false);\n        let transaction = sc.get(props, 'transaction', false);\n        let inventoryKey = sc.get(props, 'inventoryKey', false);\n        if(false === data || false === transaction || false === inventoryKey){\n            Logger.critical({'Missing data': {data, transaction, inventoryKey}});\n            return false;\n        }\n        return await transaction.pushForExchange(data.itemId, data.qty, inventoryKey);\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    static async remove(props)\n    {\n        let data = sc.get(props, 'data', false);\n        let transaction = sc.get(props, 'transaction', false);\n        let inventoryKey = sc.get(props, 'inventoryKey', false);\n        if(false === data || false === transaction || false === inventoryKey){\n            Logger.critical({'Missing data': {data, transaction, inventoryKey}});\n            return false;\n        }\n        return await transaction.removeFromExchange(data.itemId, inventoryKey);\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    static async confirm(props)\n    {\n        let data = sc.get(props, 'data', false);\n        let transaction = sc.get(props, 'transaction', false);\n        let inventoryKey = sc.get(props, 'inventoryKey', false);\n        if(false === data || false === transaction || false === inventoryKey){\n            Logger.critical({'Missing data': {data, transaction, inventoryKey}});\n            return false;\n        }\n        await transaction.confirmExchange('A');\n        await transaction.confirmExchange('B');\n        return await transaction.finalizeExchange();\n    }\n\n}\n\nmodule.exports.Processor = Processor;\n"
  },
  {
    "path": "lib/inventory/server/group-hot-plug-callbacks.js",
    "content": "/**\n *\n * Reldens - GroupHotPlugCallbacks\n *\n * Provides hot-plug callbacks for inventory group management.\n * Handles create, update, and delete operations with live broadcast to connected rooms.\n *\n */\n\nconst { AdminDistHelper } = require('@reldens/cms/lib/admin-dist-helper');\nconst { GroupsDataGenerator } = require('@reldens/items-system');\nconst { GroupsDataRemover } = require('./groups-data-remover');\nconst { RoomsConst } = require('../../rooms/constants');\nconst { ItemsConst } = require('@reldens/items-system');\n\nclass GroupHotPlugCallbacks\n{\n\n    /**\n     * @param {Object} projectConfig\n     * @param {string} bucket\n     * @param {string} distFolder\n     * @returns {Function|boolean}\n     */\n    static beforeDeleteCallback(projectConfig, bucket, distFolder)\n    {\n        if(false === projectConfig.isHotPlugEnabled){\n            return false;\n        }\n        return async (model) => {\n            await AdminDistHelper.removeBucketAndDistFiles(\n                distFolder,\n                bucket,\n                model.files_name\n            );\n            let configProcessor = projectConfig.serverManager.configManager;\n            GroupsDataRemover.removeGroup(configProcessor, model);\n            return this.broadcastGroupsUpdate(projectConfig);\n        };\n    }\n\n    /**\n     * @param {Object} projectConfig\n     * @param {string} bucket\n     * @param {string} distFolder\n     * @returns {Function|boolean}\n     */\n    static afterUpdateCallback(projectConfig, bucket, distFolder)\n    {\n        if(false === projectConfig.isHotPlugEnabled){\n            return false;\n        }\n        return async (groupModel, id, preparedParams, params) => {\n            if(params.files_name){\n                await AdminDistHelper.copyBucketFilesToDist(bucket, groupModel.files_name, distFolder);\n            }\n            GroupsDataGenerator.appendGroup(\n                groupModel,\n                (projectConfig.serverManager.configManager.inventory.groups || {}),\n                (projectConfig.serverManager.configManager.getWithoutLogs('server/customClasses/inventory/groups', {}))\n            );\n            return this.broadcastGroupsUpdate(projectConfig);\n        };\n    }\n\n    /**\n     * @param {Object} projectConfig\n     * @returns {boolean}\n     */\n    static broadcastGroupsUpdate(projectConfig)\n    {\n        let roomsManager = projectConfig.serverManager.roomsManager;\n        let createdRooms = Object.keys(roomsManager.createdInstances);\n        if(0 === createdRooms.length){\n            return false;\n        }\n        for(let i of createdRooms){\n            let room = roomsManager.createdInstances[i];\n            if(RoomsConst.ROOM_TYPE_SCENE !== room.roomType){\n                continue;\n            }\n            let broadcastData = {\n                act: ItemsConst.ACTION_SET_GROUPS,\n                groups: room.config.getWithoutLogs('inventory/groups/groupBaseData', {})\n            };\n            room.broadcast('*', broadcastData);\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.GroupHotPlugCallbacks = GroupHotPlugCallbacks;\n"
  },
  {
    "path": "lib/inventory/server/groups-data-remover.js",
    "content": "/**\n *\n * Reldens - GroupsDataRemover\n *\n * Removes inventory group data from the configuration manager.\n * Provides static methods for removing groups by ID or from lists.\n *\n */\n\nclass GroupsDataRemover\n{\n\n    /**\n     * @param {Object} configProcessor\n     * @param {Array<Object>} groupModelsList\n     * @returns {boolean}\n     */\n    static removeGroupsList(configProcessor, groupModelsList)\n    {\n        if(0 === groupModelsList.length){\n            return false;\n        }\n        for(let groupModel of groupModelsList){\n            this.removeGroup(configProcessor, groupModel);\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} configProcessor\n     * @param {Object} groupModel\n     * @returns {boolean}\n     */\n    static removeGroup(configProcessor, groupModel)\n    {\n        if(!groupModel){\n            return false;\n        }\n        this.removeGroupById(configProcessor, groupModel);\n        delete configProcessor.inventory.groups.groupList[groupModel.key];\n        delete configProcessor.inventory.groups.groupBaseData[groupModel.key];\n        return true;\n    }\n\n    /**\n     * @param {Object} configProcessor\n     * @param {Object} groupModel\n     * @returns {Array<Object>}\n     */\n    static removeGroupById(configProcessor, groupModel)\n    {\n        let groupModels = configProcessor.inventory.groups.groupModels;\n        let remove = false;\n        for(let group of groupModels){\n            if(group.id === groupModel.id){\n                remove = groupModels.indexOf(group);\n                break;\n            }\n        }\n        if(false !== remove){\n            delete groupModels[remove];\n        }\n        return groupModels;\n    }\n\n}\n\nmodule.exports.GroupsDataRemover = GroupsDataRemover;\n"
  },
  {
    "path": "lib/inventory/server/items-factory.js",
    "content": "/**\n *\n * Reldens - ItemsFactory\n *\n * Factory for creating item instances from database models.\n * Handles item creation, modifier enrichment, and equipment status.\n *\n */\n\nconst { ItemsConst } = require('@reldens/items-system');\nconst { ModifierConst, Modifier } = require('@reldens/modifiers');\nconst { sc } = require('@reldens/utils');\n\nclass ItemsFactory\n{\n\n    /**\n     * @param {Array<Object>} itemsInventoryModels\n     * @param {Object} manager\n     * @returns {Promise<Object<string, Object>|boolean>}\n     */\n    static async fromModelsList(itemsInventoryModels, manager)\n    {\n        if(!itemsInventoryModels.length){\n            return false;\n        }\n        let itemsInstances = {};\n        for(let itemInventoryModel of itemsInventoryModels){\n            let itemObj = await this.fromModel(itemInventoryModel, manager);\n            itemsInstances[itemObj.getInventoryId()] = itemObj;\n        }\n        return itemsInstances;\n    }\n\n    /**\n     * @param {Object} itemInventoryModel\n     * @param {Object} manager\n     * @returns {Promise<Object>}\n     */\n    static async fromModel(itemInventoryModel, manager)\n    {\n        let itemClass = sc.get(\n            manager.itemClasses,\n            itemInventoryModel.related_items_item.key,\n            manager.types.classByTypeId(itemInventoryModel.related_items_item.type)\n        );\n        let itemProps = {\n            id: itemInventoryModel.id,\n            item_id: itemInventoryModel.related_items_item.id,\n            key: itemInventoryModel.related_items_item.key,\n            type: itemInventoryModel.related_items_item.type,\n            manager: manager,\n            label: itemInventoryModel.related_items_item.label,\n            description: itemInventoryModel.related_items_item.description,\n            qty: itemInventoryModel.qty,\n            remaining_uses: itemInventoryModel.remaining_uses,\n            is_active: itemInventoryModel.is_active,\n            group_id: itemInventoryModel.related_items_item.group_id,\n            qty_limit: itemInventoryModel.related_items_item.qty_limit,\n            uses_limit: itemInventoryModel.related_items_item.uses_limit,\n            useTimeOut: itemInventoryModel.related_items_item.useTimeOut,\n            execTimeOut: itemInventoryModel.related_items_item.execTimeOut,\n            customData: itemInventoryModel.related_items_item.customData\n        };\n        let itemObj = new itemClass(itemProps);\n        if(itemObj.isType(ItemsConst.TYPES.EQUIPMENT)){\n            itemObj.equipped = (1 === itemInventoryModel.is_active);\n        }\n        await this.enrichWithModifiers(itemInventoryModel, itemObj, manager);\n        return itemObj;\n    }\n\n    /**\n     * @param {Object} itemInventoryModel\n     * @param {Object} itemObj\n     * @param {Object} manager\n     * @returns {Promise<void>}\n     */\n    static async enrichWithModifiers(itemInventoryModel, itemObj, manager)\n    {\n        let loadedModifiers = itemInventoryModel.related_items_item?.related_items_item_modifiers;\n        if(!loadedModifiers || 0 === loadedModifiers.length){\n            return;\n        }\n        let modifiers = {};\n        for(let modifierData of loadedModifiers){\n            if(modifierData.operation !== ModifierConst.OPS.SET){\n                modifierData.value = Number(modifierData.value);\n            }\n            modifierData.target = manager.owner;\n            modifiers[modifierData.id] = new Modifier(modifierData);\n        }\n        itemObj.modifiers = modifiers;\n    }\n\n}\n\nmodule.exports.ItemsFactory = ItemsFactory;\n"
  },
  {
    "path": "lib/inventory/server/message-actions.js",
    "content": "/**\n *\n * Reldens - InventoryMessageActions\n *\n * Handles all inventory-related message actions from clients.\n * Processes trade requests, item usage, equipment, and inventory modifications.\n *\n */\n\nconst { PlayerProcessor } = require('./exchange/player-processor');\nconst { GameConst } = require('../../game/constants');\nconst { ObjectsConst } = require('../../objects/constants');\nconst { InventoryConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\nconst { ExchangePlatform } = require('@reldens/items-system');\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass InventoryMessageActions\n{\n\n    /**\n     * @param {Client} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean|void>}\n     */\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        if(!sc.hasOwn(data, 'act')){\n            return false;\n        }\n        if(GameConst.CLOSE_UI_ACTION === data.act){\n            if(!sc.hasOwn(data, 'id') || !data.id){\n                return false;\n            }\n            if(!sc.isFunction(data.id['indexOf']) || 0 !== data.id.indexOf('trade')){\n                return false;\n            }\n            return this.closeTradeAction(client, data, room, playerSchema);\n        }\n        if(0 !== data.act.indexOf(InventoryConst.ACTIONS.PREFIX)){\n            return false;\n        }\n        if(InventoryConst.ACTIONS.TRADE_START === data.act){\n            this.tryExchangeStart(client, data, room, playerSchema);\n            return true;\n        }\n        if(InventoryConst.ACTIONS.TRADE_ACCEPTED === data.act && '1' === data.value){\n            this.startExchange(client, data, room, playerSchema);\n            return true;\n        }\n        if(InventoryConst.ACTIONS.TRADE_ACTION === data.act){\n            await this.runTradeAction(client, data, room, playerSchema);\n            return true;\n        }\n        if(InventoryConst.ACTIONS.REMOVE === data.act){\n            playerSchema.inventory.manager.removeItem(data.idx);\n            return true;\n        }\n        if(InventoryConst.ACTIONS.USE === data.act){\n            if(!sc.hasOwn(playerSchema.inventory.manager.items, data.idx)){\n                Logger.info('Cannot use item, key not found: '+data.idx);\n                return false;\n            }\n            playerSchema.inventory.manager.items[data.idx].use();\n        }\n        if(InventoryConst.ACTIONS.EQUIP === data.act){\n            return await this.executeEquipAction(playerSchema, data);\n        }\n        return true;\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} data\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {boolean}\n     */\n    closeTradeAction(client, data, room, playerSchema)\n    {\n        let ownerA = playerSchema.tradeInProgress?.inventories['A']?.owner.sessionId;\n        let ownerB = playerSchema.tradeInProgress?.inventories['B']?.owner.sessionId;\n        this.sendCloseUIMessage(playerSchema, ownerA, ownerB, room);\n        playerSchema.tradeInProgress?.cancelExchange();\n        return true;\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @param {string} ownerA\n     * @param {string} ownerB\n     * @param {Object} room\n     */\n    sendCloseUIMessage(playerSchema, ownerA, ownerB, room)\n    {\n        let closeOnSessionId = playerSchema.sessionId === ownerA ? ownerB : ownerA;\n        if(!closeOnSessionId){\n            return;\n        }\n        let closeOnClient = this.fetchClientBySessionId(room, closeOnSessionId);\n        if(!closeOnClient){\n            return;\n        }\n        closeOnClient?.send('*', {act: GameConst.CLOSE_UI_ACTION, id: 'trade' + playerSchema.sessionId});\n    }\n\n    /**\n     * @param {Object} room\n     * @param {string} sessionId\n     * @returns {Client|undefined}\n     */\n    fetchClientBySessionId(room, sessionId)\n    {\n        return room.activePlayerBySessionId(sessionId, room.roomId)?.client;\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} data\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {boolean}\n     */\n    tryExchangeStart(client, data, room, playerSchema)\n    {\n        if(playerSchema.sessionId === data.id){\n            Logger.info('The player is trying to trade with himself.', playerSchema.sessionId, data);\n            return false;\n        }\n        if(playerSchema.tradeInProgress){\n            playerSchema.tradeInProgress.cancelExchange();\n        }\n        playerSchema.tradeInProgress = new ExchangePlatform({\n            events: room.events,\n            exchangeInitializerId: playerSchema.sessionId\n        });\n        let toPlayerClient = this.fetchClientBySessionId(room, data.id);\n        if(!toPlayerClient){\n            Logger.error('Player client not found.', toPlayerClient, data);\n            return false;\n        }\n        let sendData = {\n            act: InventoryConst.ACTIONS.TRADE_START,\n            listener: 'trade',\n            from: playerSchema.playerName,\n            id: playerSchema.sessionId,\n        };\n        let awaitTrade = room.config.get('client/trade/players/awaitTimeOut', true);\n        if(awaitTrade){\n            setTimeout(() => {\n                if(playerSchema.tradeInProgress?.inventories?.A && playerSchema.tradeInProgress?.inventories?.B){\n                    return true;\n                }\n                playerSchema.tradeInProgress.cancelExchange();\n                return false;\n            }, room.config.get('client/trade/players/timeOut', 5000));\n        }\n        toPlayerClient.send('*', sendData);\n        return true;\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @returns {boolean}\n     */\n    isMyTrade(playerSchema)\n    {\n        return playerSchema.tradeInProgress.exchangeInitializerId === playerSchema.sessionId;\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} data\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {boolean}\n     */\n    startExchange(client, data, room, playerSchema)\n    {\n        let exchangeStarterClient = this.fetchExchangeStarterClient(room, data);\n        if(!exchangeStarterClient){\n            Logger.warning('Missing starter client to start exchange. Session ID: '+data.id);\n            return false;\n        }\n        let exchangeStarterPlayer = room.playerBySessionIdFromState(data.id);\n        if(!exchangeStarterPlayer){\n            Logger.warning(\n                'Start exchange error, starter player is not in the room anymore. Session ID: '+data.id,\n                exchangeStarterPlayer\n            );\n            return false;\n        }\n        exchangeStarterPlayer.tradeInProgress.initializeExchangeBetween({\n            inventoryA: exchangeStarterPlayer.inventory.manager,\n            inventoryB: playerSchema.inventory.manager\n        });\n        // both players will use the same exchange platform instance, if one cancel the request the other will get it:\n        playerSchema.tradeInProgress = exchangeStarterPlayer.tradeInProgress;\n        // both players require the data:\n        this.sendExchangeUpdate(exchangeStarterPlayer, playerSchema, exchangeStarterClient);\n        this.sendExchangeUpdate(playerSchema, exchangeStarterPlayer, client);\n        return true;\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} data\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async runTradeAction(client, data, room, playerSchema)\n    {\n        let subActionParam = sc.get(data, ObjectsConst.TRADE_ACTIONS.SUB_ACTION, false);\n        let mappedSubAction = this.mapSubAction(subActionParam);\n        let functionExists = sc.isFunction(PlayerProcessor[mappedSubAction]);\n        if(false === mappedSubAction || !functionExists){\n            Logger.critical('Missing mapped sub-action: \"'+(mappedSubAction || 'false')+'\".', {functionExists});\n            return false;\n        }\n        let inventoryKey = this.isMyTrade(playerSchema) ? 'A' : 'B';\n        let subActionResult = await PlayerProcessor[mappedSubAction]({\n            transaction: playerSchema.tradeInProgress,\n            data,\n            inventoryKey\n        });\n        if(false === subActionResult && ObjectsConst.TRADE_ACTIONS.CONFIRM !== data.sub){\n            Logger.error('Exchange sub-action error.', playerSchema.tradeInProgress.lastError.message);\n            return false;\n        }\n        let exchangeStarterClient = this.fetchExchangeStarterClient(room, data);\n        if(!exchangeStarterClient){\n            Logger.error('Missing starter player client to run trade. Session ID: '+ data.id);\n            return false;\n        }\n        let exchangeStarterPlayer = room.playerBySessionIdFromState(data.id);\n        if(!exchangeStarterPlayer){\n            Logger.error(\n                'Run trade error, starter player is not in the room anymore. Session ID: '+ data.id,\n                exchangeStarterPlayer\n            );\n            return false;\n        }\n        this.sendExchangeUpdate(exchangeStarterPlayer, playerSchema, exchangeStarterClient);\n        this.sendExchangeUpdate(playerSchema, exchangeStarterPlayer, client);\n        return true;\n    }\n\n    /**\n     * @param {Object} room\n     * @param {Object} data\n     * @returns {Client|undefined}\n     */\n    fetchExchangeStarterClient(room, data)\n    {\n        return room.activePlayerBySessionId(data.id, room.roomId)?.client;\n    }\n\n    /**\n     * @param {string|boolean} subAction\n     * @returns {string|boolean}\n     */\n    mapSubAction(subAction)\n    {\n        if(false === subAction || '' === subAction){\n            return false;\n        }\n        let map = {};\n        map[ObjectsConst.TRADE_ACTIONS.ADD] = ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.ADD;\n        map[ObjectsConst.TRADE_ACTIONS.REMOVE] = ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.REMOVE;\n        map[ObjectsConst.TRADE_ACTIONS.CONFIRM] = ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.CONFIRM;\n        map[ObjectsConst.TRADE_ACTIONS.DISCONFIRM] = ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.DISCONFIRM;\n        return sc.get(map, subAction, false);\n    }\n\n    /**\n     * @param {Object} playerOwner\n     * @param {Object} playerTo\n     * @param {Client} playerToClient\n     * @returns {boolean}\n     */\n    sendExchangeUpdate(playerOwner, playerTo, playerToClient)\n    {\n        // @TODO - BETA - Refactor when include false conditions in the shortcuts and include a new property \"tradable\".\n        let fromInventoryItems = [\n            ...(playerOwner.inventory.manager.findItemsByPropertyValue('equipped', false) || []),\n            ...(playerOwner.inventory.manager.findItemsByPropertyValue('equipped', undefined) || [])\n        ];\n        // the exchange key required for the items list is the opposite of the player inventory:\n        let tradeInProgress = playerOwner.tradeInProgress;\n        if(!tradeInProgress){\n            Logger.critical('Trade not longer in progress.');\n            return false;\n        }\n        let ownerSessionId = tradeInProgress.inventories['A']?.owner?.sessionId;\n        if(!ownerSessionId){\n            Logger.critical('Trade owner unavailable.');\n            return false;\n        }\n        let playerToExchangeKey = ownerSessionId === playerTo.sessionId ? 'A' : 'B';\n        let traderItemsData = this.extractExchangeItemsDataFromInventory(\n            playerToExchangeKey,\n            tradeInProgress\n        );\n        let playerConfirmed = tradeInProgress.confirmations[playerToExchangeKey];\n        let myExchangeKey = 'A' === playerToExchangeKey ? 'B' : 'A';\n        let sendData = {\n            act: InventoryConst.ACTIONS.TRADE_SHOW, listener: 'trade',\n            with: playerTo.playerName,\n            id: playerTo.sessionId,\n            playerConfirmed: playerConfirmed,\n            myConfirmed: tradeInProgress.confirmations[myExchangeKey],\n            isTradeEnd: (tradeInProgress.confirmations['A'] && tradeInProgress.confirmations['B']),\n            playerToExchangeKey,\n            exchangeData: tradeInProgress.exchangeBetween,\n            items: playerOwner.inventory.client.extractItemsDataForSend(fromInventoryItems),\n            traderItemsData\n        };\n        playerToClient.send('*', sendData);\n        return true;\n    }\n\n    /**\n     * @param {string} playerToExchangeKey\n     * @param {Object} tradeInProgress\n     * @returns {Object<string, Object>}\n     */\n    extractExchangeItemsDataFromInventory(playerToExchangeKey, tradeInProgress)\n    {\n        let exchangeItems = tradeInProgress.exchangeBetween[playerToExchangeKey];\n        let exchangeItemsKeys = Object.keys(exchangeItems);\n        if(0 === exchangeItemsKeys.length){\n            return {};\n        }\n        let tradeItemsData = {};\n        let inventoryItems = tradeInProgress.inventories[playerToExchangeKey].items;\n        for(let i of exchangeItemsKeys){\n            let itemData = inventoryItems[i];\n            if(!itemData){\n                Logger.error('Missing item data on inventory.', i, Object.keys(inventoryItems));\n                continue;\n            }\n            tradeItemsData[i] = {\n                key: itemData.key,\n                label: itemData.label,\n                qty: itemData.qty,\n            };\n        }\n        return tradeItemsData;\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @param {Object} data\n     * @returns {Promise<boolean>}\n     */\n    async executeEquipAction(playerSchema, data)\n    {\n        // @TODO - BETA - This is temporal since for now we are only allowing one item per group. In the future\n        //   we will use inventory groups properly on the server side to validate if the item can be equipped\n        //   checking the group items limit (this also would help to avoid looping on all the items).\n        let item = playerSchema.inventory.manager.items[data.idx];\n        if(!item.equipped){\n            this.unEquipPrevious(item.group_id, playerSchema.inventory.manager.items);\n            await item.equip();\n            return true;\n        }\n        await item.unequip();\n        return true;\n    }\n\n    /**\n     * @param {number} groupId\n     * @param {Object<string, Object>} itemsList\n     */\n    unEquipPrevious(groupId, itemsList)\n    {\n        for(let i of Object.keys(itemsList)){\n            let item = itemsList[i];\n            if(item.group_id === groupId && item.equipped){\n                item.unequip();\n                break;\n            }\n        }\n    }\n\n}\n\nmodule.exports.InventoryMessageActions = InventoryMessageActions;\n"
  },
  {
    "path": "lib/inventory/server/models-manager.js",
    "content": "/**\n *\n * Reldens - ModelsManager\n *\n * This class contains all the Objection models examples, so we can have a single entry point for all of them and\n * additionally get shortcuts to process the information from the events and run the proper actions in the storage.\n *\n */\n\nconst { ItemsEvents } = require('@reldens/items-system');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\nclass ModelsManager\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        /** @type {BaseDriver|boolean} */\n        this.inventoryRepository = this.getEntity('itemsInventory');\n    }\n\n    /**\n     * @param {string} entityName\n     * @returns {BaseDriver|boolean}\n     */\n    getEntity(entityName)\n    {\n        if(!this.dataServer){\n            Logger.error('No dataServer found on inventory ModelsManager.');\n            return false;\n        }\n        return this.dataServer.entityManager.get(entityName);\n    }\n\n    /**\n     * @param {number} ownerId\n     * @returns {Promise<Array<Object>|boolean>}\n     */\n    async loadOwnerItems(ownerId)\n    {\n        if(!this.dataServer){\n            Logger.error('No dataServer found on inventory ModelsManager.');\n            return false;\n        }\n        return this.inventoryRepository.loadByWithRelations(\n            'owner_id',\n            ownerId,\n            ['related_items_item.related_items_item_modifiers']\n        );\n    }\n\n    /**\n     * @param {Object} inventory\n     * @param {Object} item\n     * @returns {Promise<Object>}\n     */\n    async saveNewItem(inventory, item)\n    {\n        let itemData = {\n            id: null, // id will be always null for new items since it's an auto-increment in the storage.\n            owner_id: inventory.getOwnerId(),\n            item_id: item.item_id,\n            qty: item.qty\n        };\n        if(sc.hasOwn(item, 'remaining_uses')){\n            itemData.remaining_uses = item.remaining_uses;\n        }\n        if(sc.hasOwn(item, 'is_active')){\n            itemData.is_active = item.is_active;\n        }\n        let itemModel = await this.inventoryRepository.create(itemData);\n        item.id = itemModel.id;\n        return item;\n    }\n\n    /**\n     * @param {Object} inventory\n     * @param {string} itemKey\n     * @returns {Promise<number>}\n     */\n    async deleteItem(inventory, itemKey)\n    {\n        return await this.inventoryRepository.deleteById(inventory.items[itemKey].id);\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {Promise<number>}\n     */\n    async updateItemQuantity(item)\n    {\n        return await this.inventoryRepository.updateById(item.id, {qty: item.qty});\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {Promise<number>}\n     */\n    async onEquipItem(item)\n    {\n        return await this.inventoryRepository.updateById(item.id, {is_active: 1});\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {Promise<number>}\n     */\n    async onUnequipItem(item)\n    {\n        return await this.inventoryRepository.updateById(item.id, {is_active: 0});\n    }\n\n    /**\n     * @param {Object} item\n     * @param {string} action\n     * @returns {Promise<Object|boolean>}\n     */\n    async onChangedModifiers(item, action)\n    {\n        // owners will persist their own data after the modifiers were applied:\n        return await item.manager.owner.persistData({act: action, item: item});\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {Promise<Object|boolean>}\n     */\n    async onExecutedItem(item)\n    {\n        if(item.uses === 0){\n            await this.inventoryRepository.deleteById(item.id);\n        }\n        return await item.manager.owner.persistData({act: ItemsEvents.EXECUTED_ITEM, item: item});\n    }\n\n}\n\nmodule.exports.ModelsManager = ModelsManager;\n"
  },
  {
    "path": "lib/inventory/server/plugin.js",
    "content": "/**\n *\n * Reldens - Inventory Server Plugin\n *\n * Server-side plugin for the inventory system.\n * Manages inventory initialization, player death item drops, and message actions.\n *\n */\n\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { InventoryMessageActions } = require('./message-actions');\nconst { PlayerSubscriber } = require('./subscribers/player-subscriber');\nconst { PlayerDeathSubscriber } = require('./subscribers/player-death-subscriber');\nconst { ServerSubscriber } = require('./subscribers/server-subscriber');\nconst { ModelsManager } = require('./models-manager');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('./models-manager').ModelsManager} ModelsManager\n * @typedef {import('./subscribers/player-death-subscriber').PlayerDeathSubscriber} PlayerDeathSubscriber\n */\nclass InventoryPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<void>}\n     */\n    async setup(props)\n    {\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        if(!this.config){\n            Logger.error('Config undefined in InventoryPlugin.');\n        }\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in InventoryPlugin.');\n        }\n        this.events.on('reldens.serverBeforeListen', async (event) => {\n            this.modelsManager = new ModelsManager({dataServer: event.serverManager.dataServer});\n            this.playerDeathSubscriber = new PlayerDeathSubscriber(this.modelsManager);\n        });\n        this.events.on('reldens.serverReady', async (event) => {\n            await ServerSubscriber.initializeInventory(event.serverManager.configManager, this.modelsManager);\n        });\n        this.events.on('reldens.createPlayerStatsAfter', async (client, userModel, currentPlayer, room) => {\n            await PlayerSubscriber.createPlayerInventory(client, currentPlayer, room, this.events, this.modelsManager);\n        });\n        // when the client sent a message to any room, it will be checked by all the global messages defined:\n        this.events.on('reldens.roomsMessageActionsGlobal', (roomMessageActions) => {\n            roomMessageActions.inventory = new InventoryMessageActions();\n        });\n        this.events.on('reldens.playerDeath', async (event) => {\n            try {\n                await this.playerDeathSubscriber.dropPlayerItems(\n                    event.targetClient,\n                    event.targetSchema,\n                    event.room,\n                    this.events,\n                    this.modelsManager\n                );\n            } catch (error) {\n                Logger.error('Error while dropping player items.', error);\n            }\n        });\n        this.events.on('reldens.beforeSuperInitialGameData', (superInitialGameData) => {\n            if(!this.config){\n                return;\n            }\n            superInitialGameData.availableItems = Object.keys(sc.get(this.config.inventory, 'items', {})).length;\n            superInitialGameData.equipmentGroups = sc.get(this.config.inventory.groups, 'groupModels', []).length;\n        });\n    }\n\n}\n\nmodule.exports.InventoryPlugin = InventoryPlugin;\n"
  },
  {
    "path": "lib/inventory/server/storage-observer.js",
    "content": "/**\n *\n * Reldens - StorageObserver\n *\n * This class listens for all the inventory actions and processes the information to persist it in the storage.\n * This implements the models manager to avoid having a specific driver call: the default models manager uses\n * Objection JS, but this could be changed for a different custom models manager.\n *\n */\n\nconst { ModelsManager } = require('./models-manager');\nconst { ItemsFactory } = require('./items-factory');\nconst { ItemsEvents } = require('@reldens/items-system');\nconst { ModifierConst } = require('@reldens/modifiers');\n\nclass StorageObserver\n{\n\n    /**\n     * @param {Object} manager\n     * @param {ModelsManager|boolean} modelsManager\n     */\n    constructor(manager, modelsManager = false)\n    {\n        /** @type {Object} */\n        this.manager = manager;\n        /** @type {ModelsManager} */\n        this.modelsManager = false !== modelsManager ? modelsManager : new ModelsManager();\n        if(false === this.modelsManager.dataServer.initialized){\n            this.modelsManager.dataServer.connect();\n        }\n    }\n\n    listenEvents()\n    {\n        let masterKey = this.manager.getOwnerEventKey();\n        this.manager.listenEvent(\n            ItemsEvents.ADD_ITEM_BEFORE,\n            this.saveNewItem.bind(this),\n            this.manager.getOwnerUniqueEventKey('addItemBeforeStore'),\n            masterKey\n        );\n        this.manager.listenEvent(\n            ItemsEvents.REMOVE_ITEM,\n            this.removeItem.bind(this),\n            this.manager.getOwnerUniqueEventKey('removeItemStore'),\n            masterKey\n        );\n        this.manager.listenEvent(\n            ItemsEvents.MODIFY_ITEM_QTY,\n            this.updateItemQuantity.bind(this),\n            this.manager.getOwnerUniqueEventKey('modifyItemStore'),\n            masterKey\n        );\n        this.manager.listenEvent(\n            ItemsEvents.EQUIP_ITEM,\n            this.saveEquippedItemAsActive.bind(this),\n            this.manager.getOwnerUniqueEventKey('equipItemStore'),\n            masterKey\n        );\n        this.manager.listenEvent(\n            ItemsEvents.UNEQUIP_ITEM,\n            this.saveUnequippedItemAsInactive.bind(this),\n            this.manager.getOwnerUniqueEventKey('unequipItemStore'),\n            masterKey\n        );\n        // @NOTE: check Item class changeModifiers method.\n        this.manager.listenEvent(\n            ItemsEvents.EQUIP+'AppliedModifiers',\n            this.updateAppliedModifiers.bind(this),\n            this.manager.getOwnerUniqueEventKey('modifiersAppliedStore'),\n            masterKey\n        );\n        this.manager.listenEvent(\n            ItemsEvents.EQUIP+'RevertedModifiers',\n            this.updateRevertedModifiers.bind(this),\n            this.manager.getOwnerUniqueEventKey('modifiersRevertedStore'),\n            masterKey\n        );\n        this.manager.listenEvent(\n            ItemsEvents.EXECUTED_ITEM,\n            this.processAndStoreItemExecutionData.bind(this),\n            this.manager.getOwnerUniqueEventKey('executedItemStore'),\n            masterKey\n        );\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {Promise<Object|boolean>}\n     */\n    async processAndStoreItemExecutionData(item)\n    {\n        return await this.modelsManager.onExecutedItem(item);\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {Promise<Object|boolean>}\n     */\n    async updateRevertedModifiers(item)\n    {\n        return await this.modelsManager.onChangedModifiers(item, ModifierConst.MOD_REVERTED);\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {Promise<Object|boolean>}\n     */\n    async updateAppliedModifiers(item)\n    {\n        return await this.modelsManager.onChangedModifiers(item, ModifierConst.MOD_APPLIED);\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {Promise<number>}\n     */\n    async saveUnequippedItemAsInactive(item)\n    {\n        return await this.modelsManager.onUnequipItem(item);\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {Promise<number>}\n     */\n    async saveEquippedItemAsActive(item)\n    {\n        return await this.modelsManager.onEquipItem(item);\n    }\n\n    /**\n     * @param {Object} item\n     * @param {Object} inventory\n     * @param {string} op\n     * @param {string} key\n     * @param {number} qty\n     * @returns {Promise<number>}\n     */\n    async updateItemQuantity(item, inventory, op, key, qty)\n    {\n        return await this.modelsManager.updateItemQuantity(item, inventory, op, key, qty);\n    }\n\n    /**\n     * @param {Object} inventory\n     * @param {string} itemKey\n     * @returns {Promise<number>}\n     */\n    async removeItem(inventory, itemKey)\n    {\n        return await this.modelsManager.deleteItem(inventory, itemKey);\n    }\n\n    /**\n     * @param {Object} inventory\n     * @param {Object} item\n     * @returns {Promise<Object>}\n     */\n    async saveNewItem(inventory, item)\n    {\n        return await this.modelsManager.saveNewItem(inventory, item);\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async loadOwnerItems()\n    {\n        let itemsModels = await this.modelsManager.loadOwnerItems(this.manager.getOwnerId());\n        if(0 === itemsModels.length){\n            return false;\n        }\n        let itemsInstances = await ItemsFactory.fromModelsList(itemsModels, this.manager);\n        if(false === itemsInstances){\n            return false;\n        }\n        await this.manager.fireEvent(ItemsEvents.LOADED_OWNER_ITEMS, this, itemsInstances, itemsModels);\n        await this.manager.setItems(itemsInstances);\n        return true;\n    }\n\n}\n\nmodule.exports.StorageObserver = StorageObserver;\n"
  },
  {
    "path": "lib/inventory/server/subscribers/player-death-subscriber.js",
    "content": "/**\n *\n * Reldens - PlayerDeathSubscriber\n *\n * Handles player death events and item drops.\n * Manages drop animations, positioning, and broadcasting to clients.\n *\n */\n\nconst { DropsAnimations } = require('../../../rewards/server/drops-animations');\nconst { WorldWalkableNodesAroundProvider } = require('../../../world/server/world-walkable-nodes-around-provider');\nconst { ObjectTypes } = require('../../../objects/server/object/object-types');\nconst { ObjectsConst } = require('../../../objects/constants');\nconst { GameConst } = require('../../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n * @typedef {import('../models-manager').ModelsManager} ModelsManager\n */\nclass PlayerDeathSubscriber\n{\n\n    /**\n     * @param {ModelsManager} modelsManager\n     */\n    constructor(modelsManager)\n    {\n        /** @type {ModelsManager} */\n        this.modelsManager = modelsManager;\n        /** @type {BaseDriver} */\n        this.dropsAnimationsRepository = this.modelsManager.getEntity('dropsAnimations');\n        /** @type {Object<string, Object>} */\n        this.loadedAnimations = {};\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} currentPlayer\n     * @param {Object} room\n     * @returns {Promise<void>}\n     */\n    async dropPlayerItems(client, currentPlayer, room)\n    {\n        let dropPercent = Number(\n            currentPlayer.getPrivate('dropPercent')\n            || room.config.getWithoutLogs('server/players/drop/percent', 0)\n        );\n        if(0 === dropPercent){\n            return;\n        }\n        if(sc.randomInteger(1, 100) > dropPercent){\n            return;\n        }\n        // the maximum number of items that can be dropped by the player\n        let dropQuantity = Number(\n            currentPlayer.getPrivate('dropQuantity')\n            || room.config.getWithoutLogs('server/players/drop/quantity', 0)\n        );\n        if(0 === dropQuantity){\n            return;\n        }\n        // @TODO - BETA - Move WorldWalkableNodesAroundProvider into the world so we can use it from room.roomWorld.\n        let closerWalkableNodes = WorldWalkableNodesAroundProvider.generateWalkableNodesAround(\n            currentPlayer.physicalBody,\n            room.roomWorld.pathFinder\n        );\n        if(0 === closerWalkableNodes.length){\n            Logger.error('No closer walkable nodes found for dropped items.');\n            return;\n        }\n        let droppedItems = await this.extractRandomDropItems(currentPlayer, dropQuantity);\n        if(0 === droppedItems.length){\n            return;\n        }\n        let dropsObjects = [];\n        let objectPosition = closerWalkableNodes.pop();\n        let nextDropPosition = objectPosition;\n        for(let droppedItem of droppedItems){\n            if(!nextDropPosition){\n                Logger.warning('No more walkable nodes available for dropped item with ID \"'+droppedItem.id+'\".');\n            }\n            let createdDropItem = await this.createDropItem(\n                objectPosition,\n                droppedItem,\n                currentPlayer.physicalBody,\n                room\n            );\n            if(!createdDropItem){\n                continue;\n            }\n            dropsObjects.push(createdDropItem);\n            nextDropPosition = closerWalkableNodes.pop();\n            if(nextDropPosition){\n                objectPosition = nextDropPosition;\n            }\n        }\n        room.disableAutoDispose();\n        let dropsMappedData = this.mapDropsData(dropsObjects, room);\n        // TODO - fix, check if data was already sent and only broadcast the keys and the new ones.\n        let eventResult = true;\n        await room.events.emit('reldens.afterProcessPlayerDropsBeforeBroadcast', dropsMappedData, eventResult);\n        if(!eventResult){\n            return;\n        }\n        room.broadcast('*', dropsMappedData);\n    }\n\n    /**\n     * @param {Array<Object>} dropsObjects\n     * @returns {Object}\n     */\n    mapDropsData(dropsObjects)\n    {\n        let messageData = {\n            [ObjectsConst.DROPS.KEY]: {}\n        };\n        for(let dropsObject of dropsObjects){\n            let animationData = this.loadedAnimations[dropsObject.itemId];\n            if(!animationData){\n                Logger.error('Animation data not found for item \"'+dropsObject.itemId+'\".');\n                continue;\n            }\n            messageData[ObjectsConst.DROPS.KEY][dropsObject.id] = {\n                [ObjectsConst.DROPS.TYPE]: animationData.assetType,\n                [ObjectsConst.DROPS.ASSET_KEY]: animationData.assetKey,\n                [ObjectsConst.DROPS.FILE]: animationData.file,\n                [ObjectsConst.DROPS.PARAMS]: animationData.extraParams,\n                x: dropsObject.animationData.x,\n                y: dropsObject.animationData.y\n            };\n        }\n        return messageData;\n    }\n\n    /**\n     * @param {Object} objectPosition\n     * @param {Object} droppedItem\n     * @param {Object} targetObjectBody\n     * @param {Object} room\n     * @returns {Promise<Object|boolean>}\n     */\n    async createDropItem(objectPosition, droppedItem, targetObjectBody, room)\n    {\n        let tileIndex = room?.roomWorld?.tileIndexByRowAndColumn(objectPosition.x, objectPosition.y);\n        if(!tileIndex){\n            return false;\n        }\n        let dropRandomId = 'drop-'+droppedItem.key+'-'+sc.randomChars(8);\n        let worldObjectData = {\n            layerName: dropRandomId,\n            tileIndex: tileIndex,\n            tileWidth: targetObjectBody?.worldTileWidth || room?.roomWorld?.mapJson?.tilewidth,\n            tileHeight: targetObjectBody?.worldTileHeight || room?.mapData?.mapJson?.tileheight,\n            x: objectPosition.x,\n            y: objectPosition.y\n        };\n        let dropObjectData = this.createDropObjectData(droppedItem, dropRandomId, tileIndex, room.roomId);\n        return await room.createDropObjectInRoom(dropObjectData, worldObjectData);\n    }\n\n    /**\n     * @param {Object} droppedItem\n     * @param {string} dropRandomId\n     * @param {number} tileIndex\n     * @param {string} roomId\n     * @returns {Object}\n     */\n    createDropObjectData(droppedItem, dropRandomId, tileIndex, roomId)\n    {\n        let animationData = sc.get(this.loadedAnimations, droppedItem.item_id, sc.get(droppedItem, 'animationData', {}));\n        let assetKey = sc.get(animationData, 'assetKey', droppedItem.key);\n        let extraParams = sc.get(animationData, 'extraParams', {});\n        return {\n            id: dropRandomId + tileIndex,\n            room_id: roomId,\n            layer_name: dropRandomId,\n            tile_index: tileIndex,\n            class_type: ObjectTypes.DROP,\n            object_class_key: ObjectsConst.TYPE_DROP,\n            client_key: dropRandomId + tileIndex,\n            itemInventoryId: droppedItem.id,\n            itemId: droppedItem.item_id,\n            asset_key: assetKey,\n            client_params: JSON.stringify({\n                frameStart: sc.get(extraParams, 'start', 0),\n                frameEnd: sc.get(extraParams, 'end', 0),\n                repeat: sc.get(extraParams, 'repeat', -1),\n                hideOnComplete: sc.get(extraParams, 'hideOnComplete', false),\n                autoStart: sc.get(extraParams, 'autoStart', true),\n                asset_key: assetKey,\n                yoyo: sc.get(extraParams, 'yoyo', false)\n            }),\n            enabled: 1,\n            objects_assets: [{\n                object_asset_id: null,\n                object_id: dropRandomId,\n                asset_type: sc.get(animationData, 'assetType', 'spritesheet'),\n                asset_key: assetKey,\n                asset_file: sc.get(animationData, 'file', assetKey+GameConst.FILES.EXTENSIONS.PNG),\n                extra_params: JSON.stringify({\n                    frameWidth: sc.get(extraParams, 'frameWidth', 64),\n                    frameHeight: sc.get(extraParams, 'frameHeight', 64),\n                })\n            }]\n        };\n    }\n\n    /**\n     * @param {Object} currentPlayer\n     * @param {number} dropQuantity\n     * @returns {Promise<Array<Object>>}\n     */\n    async extractRandomDropItems(currentPlayer, dropQuantity)\n    {\n        let playerInventory = currentPlayer.inventory.manager;\n        let droppableItems = await this.fetchDroppableItems(playerInventory.items);\n        let itemsKeys = Object.keys(droppableItems);\n        if(0 === itemsKeys.length){\n            return [];\n        }\n        let maxRemovable = Math.min(dropQuantity, itemsKeys.length);\n        let drops = [];\n        for(let i = 0; i < maxRemovable; i++){\n            let randomIndex = sc.randomInteger(0, itemsKeys.length - 1);\n            let itemKey = itemsKeys[randomIndex];\n            let item = playerInventory.items[itemKey];\n            if(!item){\n                Logger.warning('Item not found in player inventory.', {itemKey, itemsKeys});\n                continue;\n            }\n            if(!sc.hasOwn(this.loadedAnimations, item.item_id)){\n                let loadedModel = await this.dropsAnimationsRepository.loadOneBy('item_id', item.item_id);\n                this.loadedAnimations[item.item_id] = DropsAnimations.fromModel(loadedModel);\n            }\n            drops.push(item);\n            delete itemsKeys[randomIndex];\n            await playerInventory.removeItem(itemKey);\n        }\n        return drops;\n    }\n\n    /**\n     * @param {Object<string, Object>} items\n     * @returns {Promise<Object<string, Object>>}\n     */\n    async fetchDroppableItems(items)\n    {\n        let droppableItems = {};\n        for(let itemKey of Object.keys(items)){\n            let item = items[itemKey];\n            if(!sc.get(item, 'canBeDropped', false)){\n                continue;\n            }\n            let itemDropPercent = Number(sc.get(item, 'dropPercent', 100));\n            if(sc.randomInteger(1, 100) > itemDropPercent){\n                continue;\n            }\n            // @TODO - BETA - Make configurable to not drop equipped items.\n            if(item.equipped){\n                await item.unequip();\n            }\n            // @TODO - BETA - Remove this check if not needed.\n            let itemModelData = sc.get(item.manager?.itemsModelData, item.key, false);\n            if(!item.item_id && itemModelData?.data?.id){\n                item.item_id = itemModelData.data.id;\n            }\n            droppableItems[itemKey] = item;\n        }\n        return droppableItems;\n    }\n\n}\n\nmodule.exports.PlayerDeathSubscriber = PlayerDeathSubscriber;\n"
  },
  {
    "path": "lib/inventory/server/subscribers/player-subscriber.js",
    "content": "/**\n *\n * Reldens - PlayerSubscriber\n *\n * Manages player inventory initialization and setup.\n * Creates inventory server instances with persistence and storage observers.\n *\n */\n\nconst { ClientWrapper } = require('../../../game/server/client-wrapper');\nconst { StorageObserver } = require('../storage-observer');\nconst { ItemsConst, ItemsServer} = require('@reldens/items-system');\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../models-manager').ModelsManager} ModelsManager\n */\nclass PlayerSubscriber\n{\n\n    /**\n     * @param {Client} client\n     * @param {Object} currentPlayer\n     * @param {Object} room\n     * @param {EventsManager} events\n     * @param {ModelsManager} modelsManager\n     * @returns {Promise<void>}\n     */\n    static async createPlayerInventory(client, currentPlayer, room, events, modelsManager)\n    {\n        let serverProps = {\n            owner: currentPlayer,\n            client: new ClientWrapper({client, room}),\n            persistence: true,\n            ownerIdProperty: 'player_id',\n            eventsManager: events,\n            modelsManager: modelsManager,\n            itemClasses: room.config.getWithoutLogs('server/customClasses/inventory/items', {}),\n            groupClasses: room.config.getWithoutLogs('server/customClasses/inventory/groups', {}),\n            itemsModelData: room.config.inventory.items\n        };\n        // @TODO - BETA - Add new event here for the server properties.\n        let inventoryServer = new ItemsServer(serverProps);\n        inventoryServer.dataServer = new StorageObserver(inventoryServer.manager, modelsManager);\n        inventoryServer.dataServer.listenEvents();\n        // broadcast player sessionId to share animations:\n        inventoryServer.client.sendTargetProps.broadcast.push('sessionId');\n        // load all the items here and then create instances for later use:\n        await inventoryServer.dataServer.loadOwnerItems();\n        // create player inventory:\n        currentPlayer.inventory = inventoryServer;\n        // @NOTE: here we send the groups data to generate the player interface instead of set them in the current\n        // player inventory because for this specific implementation we don't need recursive groups lists in the\n        // server for each player.\n        let sendData = {\n            act: ItemsConst.ACTION_SET_GROUPS,\n            owner: currentPlayer.inventory.manager.getOwnerId(),\n            groups: room.config.getWithoutLogs('inventory/groups/groupBaseData', {})\n        };\n        // @TODO - BETA - Add new event here for the sendData.\n        client.send('*', sendData);\n    }\n\n}\n\nmodule.exports.PlayerSubscriber = PlayerSubscriber;\n"
  },
  {
    "path": "lib/inventory/server/subscribers/server-subscriber.js",
    "content": "/**\n *\n * Reldens - EventsSubscriber\n *\n * Initializes inventory system configuration on server startup.\n * Loads items and groups data from database and prepares configuration manager.\n *\n */\n\nconst { ItemsDataGenerator, GroupsDataGenerator } = require('@reldens/items-system');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('../models-manager').ModelsManager} ModelsManager\n */\nclass ServerSubscriber\n{\n\n    /**\n     * @param {ConfigManager} configProcessor\n     * @param {ModelsManager} inventoryModelsManager\n     * @returns {Promise<void>}\n     */\n    static async initializeInventory(configProcessor, inventoryModelsManager)\n    {\n        if(!sc.hasOwn(configProcessor, 'inventory')){\n            configProcessor.inventory = {};\n        }\n        if(!sc.hasOwn(configProcessor.inventory, 'groups')){\n            configProcessor.inventory.groups = {\n                groupModels: [],\n                groupList: {},\n                groupBaseData: {}\n            };\n        }\n        configProcessor.inventory.items = ItemsDataGenerator.itemsListMappedData(\n            (configProcessor.getWithoutLogs('server/customClasses/inventory/items', {})),\n            await inventoryModelsManager.getEntity('itemsItem').loadAllWithRelations()\n        );\n        let groupsMappedData = GroupsDataGenerator.groupsListMappedData(\n            (configProcessor.getWithoutLogs('server/customClasses/inventory/groups', {})),\n            await inventoryModelsManager.getEntity('itemsGroup').loadAll()\n        );\n        if(!groupsMappedData){\n            return;\n        }\n        Object.assign(configProcessor.inventory.groups, groupsMappedData);\n    }\n\n}\n\nmodule.exports.ServerSubscriber = ServerSubscriber;\n"
  },
  {
    "path": "lib/objects/client/animation-engine.js",
    "content": "/**\n *\n * Reldens - AnimationEngine\n *\n * Manages client-side animations for game objects.\n *\n * Objects flow:\n *\n * When you create an NpcObject this can/should be set as \"interactive\", after the validation\n * if(this.isInteractive){\n * This will activate the onpointerdown event, so when you click on the object, it will send the action\n * ObjectsConst.OBJECT_INTERACTION\n * Along with its own ID and type.\n * The server will pick up this information and validate it on the NpcObject.executeMessageActions method, and return\n * a UI message to open a UI dialog box, updated with the information coming in the message.\n * See RoomEvents.initUi method.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\nconst { ObjectsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager - CUSTOM DYNAMIC\n * @typedef {import('../../game/client/scene-dynamic').SceneDynamic} SceneDynamic\n * @typedef {import('../../game/client/scene-preloader').ScenePreloader} ScenePreloader\n *\n * @typedef {Object} AnimationEngineProps\n * @property {boolean} [enabled]\n * @property {string} key\n * @property {string|number} id\n * @property {string} [asset_key]\n * @property {string} [assetPath]\n * @property {string} [type]\n * @property {boolean} [ui]\n * @property {string} targetName\n * @property {number} [frameRate]\n * @property {number} [frameStart]\n * @property {number} [frameEnd]\n * @property {number} [x]\n * @property {number} [y]\n * @property {number} [repeat]\n * @property {boolean} [hideOnComplete]\n * @property {boolean} [destroyOnComplete]\n * @property {boolean|string} [autoStart]\n * @property {string} [layerName]\n * @property {Object} [positionFix]\n * @property {number} [zeroPad]\n * @property {string} [prefix]\n * @property {boolean} [isInteractive]\n * @property {boolean} [highlightOnOver]\n * @property {string} [highlightColor]\n * @property {number} [restartTime]\n * @property {Object} [animations]\n */\nclass AnimationEngine\n{\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {AnimationEngineProps} props\n     * @param {SceneDynamic|ScenePreloader} currentPreloader\n     */\n    constructor(gameManager, props, currentPreloader)\n    {\n        /** @type {SceneDynamic|ScenePreloader} */\n        this.currentPreloader = currentPreloader;\n        /** @type {Object|false} */\n        this.currentAnimation = false;\n        /** @type {GameManager} */\n        this.gameManager = gameManager;\n        /** @type {boolean} */\n        this.enabled = sc.get(props, 'enabled', false);\n        /** @type {string} */\n        this.key = props.key;\n        /** @type {string|number} */\n        this.id = props.id;\n        /** @type {string} */\n        this.asset_key = sc.get(props, 'asset_key', props.key);\n        /** @type {string} */\n        this.assetPath = sc.get(props, 'assetPath', '/assets/custom/sprites/');\n        /** @type {string|false} */\n        this.type = sc.get(props, 'type', false);\n        /** @type {boolean} */\n        this.ui = sc.get(props, 'ui', false);\n        /** @type {string} */\n        this.targetName = props.targetName;\n        // @TODO - BETA - Refactor to extract the default animation as part of the object animations.\n        this.frameRate = sc.get(props, 'frameRate', false);\n        this.frameStart = sc.get(props, 'frameStart', 0);\n        this.frameEnd = sc.get(props, 'frameEnd', 0);\n        this.x = sc.get(props, 'x', 0);\n        this.y = sc.get(props, 'y', 0);\n        this.repeat = isNaN(props.repeat) ? -1 : props.repeat;\n        this.hideOnComplete = sc.get(props, 'hideOnComplete', false);\n        if(!this.gameManager.createdAnimations){\n            this.gameManager.createdAnimations = {};\n        }\n        // @NOTE: you cannot combine destroyOnComplete with repeat = -1, because an animation with infinite\n        // repetitions will never trigger the complete event.\n        this.destroyOnComplete = sc.get(props, 'destroyOnComplete', false);\n        this.autoStart = sc.get(props, 'autoStart', false);\n        this.layerName = sc.get(props, 'layerName', false);\n        this.positionFix = sc.get(props, 'positionFix', false);\n        this.zeroPad = sc.get(props, 'zeroPad', false);\n        this.prefix = sc.get(props, 'prefix', false);\n        this.isInteractive = sc.get(props, 'isInteractive', false);\n        this.highlightOnOver = Boolean(sc.get(\n            props,\n            'highlightOnOver',\n            this.gameManager.config.getWithoutLogs('client/ui/animations/highlightOnOver', true)\n        ));\n        this.highlightColor = sc.get(\n            props,\n            'highlightColor',\n            this.gameManager.config.getWithoutLogs('client/ui/animations/highlightColor', '0x00ff00')\n        );\n        this.restartTime = sc.get(props, 'restartTime', false);\n        this.calculateAnimPosition();\n        // @NOTE: having this here we will get the animations generated for each object instance, so normally you would\n        // get duplicated animations for any respawn \"multiple\" object, BUT, at the same time, you could have an\n        // animation for a specific instance ID, we need to keep this here and check if the animation already exists on\n        // the preloader list to avoid generate it again.\n        if(sc.hasOwn(props, 'animations')){\n            this.createObjectAnimations(props.animations);\n        }\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     */\n    updateObjectAndSpritePositions(x, y)\n    {\n        this.sceneSprite.x = x;\n        this.sceneSprite.y = y;\n        this.x = x;\n        this.y = y;\n        this.calculateAnimPosition();\n    }\n\n    calculateAnimPosition()\n    {\n        this.animPos = {x: this.x, y: this.y};\n        if(!this.positionFix){\n            return;\n        }\n        if(sc.hasOwn(this.positionFix, 'x')){\n            this.animPos.x = this.x + this.positionFix.x;\n        }\n        if(sc.hasOwn(this.positionFix, 'y')){\n            this.animPos.y = this.y + this.positionFix.y;\n        }\n    }\n\n    /**\n     * @returns {number}\n     */\n    updateObjectDepth()\n    {\n        let objectNewDepth = this.y + this.sceneSprite.height;\n        this.sceneSprite.setDepth(objectNewDepth);\n        return objectNewDepth;\n    }\n\n    /**\n     * @returns {Object|boolean}\n     */\n    createAnimation()\n    {\n        if(!this.enabled){\n            Logger.error('Animation disabled: '+this.key);\n            return false;\n        }\n        let currentScene = this.gameManager.activeRoomEvents.getActiveScene();\n        if(!currentScene){\n            Logger.error('Active scene not found.');\n            return false;\n        }\n        let animationData = {start: this.frameStart, end: this.frameEnd};\n        if(this.prefix !== false){\n            animationData.prefix = this.prefix;\n        }\n        if(this.zeroPad !== false){\n            animationData.zeroPad = this.zeroPad;\n        }\n        if(!this.currentPreloader.anims.textureManager.list[this.asset_key]){\n            Logger.warning('Asset not found in preloader.', this.asset_key, animationData);\n            this.currentPreloader.load.spritesheet(this.asset_key, this.assetPath+this.asset_key, animationData);\n            this.currentPreloader.load.once('complete', async () => {\n                this.createAnimation();\n            });\n            return false;\n        }\n        let frameNumbers = this.currentPreloader.anims.generateFrameNumbers(this.asset_key, animationData);\n        let createData = {\n            key: this.key,\n            frames: frameNumbers,\n            frameRate: this.frameRate,\n            repeat: this.repeat,\n            hideOnComplete: this.hideOnComplete\n        };\n        this.currentAnimation = this.gameManager.createdAnimations[this.key];\n        if(!this.currentAnimation){\n            Logger.debug('Creating animation: '+this.key);\n            this.currentAnimation = this.currentPreloader.anims.create(createData);\n        }\n        this.currentPreloader.objectsAnimations[this.key] = this.currentAnimation;\n        this.gameManager.createdAnimations[this.key] = this.currentAnimation;\n        let spriteX = this.positionFix ? this.animPos.x : this.x;\n        let spriteY = this.positionFix ? this.animPos.y : this.y;\n        // this is where the animation is actually created and stored:\n        this.sceneSprite = currentScene.physics.add.sprite(spriteX, spriteY, this.asset_key);\n        this.enableInteraction(currentScene);\n        this.enableAutoRestart();\n        this.automaticDestroyOnComplete();\n        // @NOTE: sprites depth will be set according to their Y position, since the same was applied on the\n        // players sprites and updated as they move the depth is fixed automatically and the objects will get\n        // above or below the player.\n        this.sceneSprite.setDepth(this.y + this.sceneSprite.body.height);\n        currentScene.objectsAnimations[this.key] = this;\n        this.gameManager.events.emitSync('reldens.createAnimationAfter', {animationEngine: this});\n        this.autoPlayAnimation(frameNumbers);\n        return this.sceneSprite;\n    }\n\n    /**\n     * @param {Array<Object>} frameNumbers\n     */\n    autoPlayAnimation(frameNumbers)\n    {\n        if(!this.autoStart || 1 >= frameNumbers.length){\n            return;\n        }\n        // @NOTE: this will play the animation created above for the object using the \"client_params\" from the storage.\n        this.sceneSprite.anims.play(this.key, true);\n    }\n\n    automaticDestroyOnComplete()\n    {\n        if(!this.destroyOnComplete){\n            return;\n        }\n        this.sceneSprite.on('animationcomplete', () => {\n            this.currentAnimation?.destroy();\n            this.sceneSprite.destroy();\n        }, this);\n    }\n\n    enableAutoRestart()\n    {\n        if(!this.restartTime){\n            return;\n        }\n        this.sceneSprite.on('animationcomplete', () => {\n            setTimeout(() => {\n                // if the animation was used to change the scene, this won't be available to the user who runs it:\n                if(!this.sceneSprite.anims){\n                    return;\n                }\n                this.sceneSprite.anims.restart();\n                this.sceneSprite.anims.pause();\n            }, this.restartTime);\n        },\n        this);\n    }\n\n    /**\n     * @param {SceneDynamic} currentScene\n     */\n    enableInteraction(currentScene)\n    {\n        if(!this.isInteractive){\n            return;\n        }\n        this.sceneSprite.setInteractive({useHandCursor: true}).on('pointerdown', (e) => {\n            // @NOTE: we avoid running the object interactions while any UI element is open, if we click on the UI the\n            // elements in the background scene should not be executed.\n            if(GameConst.SELECTORS.CANVAS !== e.downElement.nodeName){\n                return false;\n            }\n            // @TODO - BETA - CHECK - TempId is a temporal fix for multiple objects case.\n            let tempId = (this.key === this.asset_key) ? this.id : this.key;\n            let dataSend = {\n                act: ObjectsConst.OBJECT_INTERACTION,\n                id: tempId,\n                type: this.type\n            };\n            this.gameManager.activeRoomEvents.send(dataSend);\n            if(!this.targetName){\n                return false;\n            }\n            let previousTarget = Object.assign({}, currentScene.player.currentTarget);\n            let thisTarget = {id: tempId, type: ObjectsConst.TYPE_OBJECT};\n            currentScene.player.currentTarget = thisTarget;\n            this.gameManager.gameEngine.showTarget(this.targetName, thisTarget, previousTarget);\n        });\n        if(this.highlightOnOver){\n            this.sceneSprite.on('pointerover', () => {\n                this.sceneSprite.setTint(this.highlightColor);\n            });\n            this.sceneSprite.on('pointerout', () => {\n                this.sceneSprite.clearTint();\n            });\n        }\n    }\n\n    runAnimation()\n    {\n        if(!this.sceneSprite){\n            Logger.error('Current animation not found: '+this.key);\n            return;\n        }\n        this.sceneSprite.anims.play(this.key, true);\n    }\n\n    /**\n     * @returns {Object}\n     */\n    getPosition()\n    {\n        // @TODO - BETA - Create position object.\n        return {x: this.x, y: this.y};\n    }\n\n    /**\n     * @param {Object} animations\n     */\n    createObjectAnimations(animations)\n    {\n        if(!animations){\n            return;\n        }\n        let animationsKeys = Object.keys(animations);\n        if(0 === animationsKeys.length){\n            return;\n        }\n        for(let i of animationsKeys){\n            if(this.gameManager.createdAnimations[i]){\n                this.currentPreloader.objectsAnimations[i] = this.gameManager.createdAnimations[i];\n                continue;\n            }\n            if(sc.hasOwn(this.currentPreloader.objectsAnimations, i)){\n                // @TODO - BETA - Clean up, can objectsAnimations be removed?\n                continue;\n            }\n            let animData = animations[i];\n            let frameNumbers = this.currentPreloader.anims.generateFrameNumbers(\n                (animData['asset_key'] || this.asset_key), {\n                    start: animData['start'] || this.frameStart,\n                    end: animData['end'] || this.frameEnd\n                }\n            );\n            let createData = {\n                key: i,\n                frames: frameNumbers,\n                frameRate: sc.get(animData, 'frameRate', this.frameRate),\n                repeat: sc.get(animData, 'repeat', this.repeat),\n                hideOnComplete: sc.get(animData, 'hideOnComplete', this.hideOnComplete),\n                asset_key: sc.get(animData, 'asset_key', this.asset_key)\n            };\n            this.currentPreloader.objectsAnimations[i] = this.currentPreloader.anims.create(createData);\n            this.gameManager.createdAnimations[i] = this.currentPreloader.objectsAnimations[i];\n        }\n    }\n\n}\n\nmodule.exports.AnimationEngine = AnimationEngine;\n"
  },
  {
    "path": "lib/objects/client/drops-message-listener.js",
    "content": "/**\n *\n * Reldens - DropsMessageListener\n *\n * Handles client-side drop object messages and animations.\n *\n */\n\nconst { ObjectsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass DropsMessageListener\n{\n\n    /**\n     * @param {Object} room\n     * @param {GameManager} gameManager\n     */\n    static listenMessages(room, gameManager)\n    {\n        room.onMessage('*', (message) => {\n            let drops = sc.get(message, ObjectsConst.DROPS.KEY, false);\n            if(drops){\n                this.loadObjects(drops, gameManager);\n            }\n            if(ObjectsConst.DROPS.REMOVE === message.act){\n                this.removeDropById(message.id, gameManager);\n            }\n        });\n    }\n\n    /**\n     * @param {Object} drops\n     * @param {GameManager} gameManager\n     * @returns {boolean}\n     */\n    static loadObjects(drops, gameManager)\n    {\n        let currentScene = gameManager.getActiveScene();\n        let gameConfig = gameManager.config;\n        let objectPlugin = gameManager.getFeature('objects');\n        let loader = currentScene.load;\n        if(!this.validateParams({currentScene, gameConfig, objectPlugin, loader})){\n            return false;\n        }\n        for(let [dropId, drop] of Object.entries(drops)){\n            this.loadSpritesheet(drop, loader, gameConfig);\n            loader.once('complete', async (event) => {\n                await this.createDropAnimation(objectPlugin, drop, dropId, currentScene);\n            });\n        }\n        loader.start();\n        return true;\n    }\n\n    /**\n     * @param {Object} objectsPlugin\n     * @param {Object} drop\n     * @param {string} dropId\n     * @param {Object} currentScene\n     * @returns {Promise<Object>}\n     */\n    static async createDropAnimation(objectsPlugin, drop, dropId, currentScene)\n    {\n        let dropAnimationData = {\n            type: ObjectsConst.DROPS.PICK_UP_ACT,\n            enabled: true,\n            ui: true,\n            frameStart: drop[ObjectsConst.DROPS.PARAMS]['start'],\n            frameEnd: drop[ObjectsConst.DROPS.PARAMS]['end'],\n            repeat: drop[ObjectsConst.DROPS.PARAMS]['repeat'],\n            autoStart: true,\n            key: dropId,\n            id: dropId,\n            targetName: '',\n            layerName: dropId,\n            isInteractive: true,\n            asset_key: drop[ObjectsConst.DROPS.ASSET_KEY],\n            x: drop.x,\n            y: drop.y,\n            yoyo: drop[ObjectsConst.DROPS.PARAMS]['yoyo']\n        };\n        return await objectsPlugin.createAnimationFromAnimData(dropAnimationData, currentScene);\n    }\n\n    /**\n     * @param {Object} drop\n     * @param {Object} loader\n     * @param {Object} gameConfig\n     */\n    static loadSpritesheet(drop, loader, gameConfig)\n    {\n        loader.spritesheet(\n            drop[ObjectsConst.DROPS.ASSET_KEY],\n            this.getSpritesheetPath(drop),\n            this.getRewardFrameConfig(drop[ObjectsConst.DROPS.PARAMS], gameConfig)\n        );\n    }\n\n    /**\n     * @param {Object} dropParams\n     * @param {Object} gameConfig\n     * @returns {Object}\n     */\n    static getRewardFrameConfig(dropParams, gameConfig)\n    {\n        // @TODO - BETA - Create FramesData class.\n        return {\n            frameWidth: sc.get(\n                dropParams,\n                'frameWidth',\n                gameConfig.getWithoutLogs('client/map/dropsTile/width', gameConfig.get('client/map/tileData/width'))\n            ),\n            frameHeight: sc.get(\n                dropParams,\n                'frameHeight',\n                gameConfig.getWithoutLogs('client/map/dropsTile/height', gameConfig.get('client/map/tileData/height'))\n            )\n        };\n    }\n\n    /**\n     * @param {Object} drop\n     * @returns {string}\n     */\n    static getSpritesheetPath(drop)\n    {\n        return ObjectsConst.DROPS.ASSETS_PATH + drop[ObjectsConst.DROPS.FILE];\n    }\n\n    /**\n     * @param {string} dropId\n     * @param {GameManager} gameManager\n     */\n    static removeDropById(dropId, gameManager)\n    {\n        if(!dropId){\n            return false;\n        }\n        let currentScene = gameManager.activeRoomEvents.getActiveScene();\n        let dropAnimation = sc.get(currentScene.objectsAnimations, dropId, false);\n        if(!dropAnimation){\n            return false;\n        }\n        dropAnimation.sceneSprite.destroy();\n        delete currentScene.objectsAnimations[dropId];\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {boolean}\n     */\n    static validateParams(props)\n    {\n        let isValid = true;\n        if(!sc.get(props, 'currentScene', false)){\n            Logger.error('Scene is undefined in Rewards Message Listener.');\n            isValid = false;\n        }\n        if(!sc.get(props, 'gameConfig', false)){\n            Logger.error('Game Config is undefined in Rewards Message Listener.');\n            isValid = false;\n        }\n        if(!sc.get(props, 'objectPlugin', false)){\n            Logger.error('Object Plugin is undefined in Rewards Message Listener.');\n            isValid = false;\n        }\n        if(!sc.get(props, 'loader', false)){\n            Logger.error('Loader is undefined in Rewards Message Listener.');\n            isValid = false;\n        }\n        return isValid;\n    }\n}\n\nmodule.exports.DropsMessageListener = DropsMessageListener;\n"
  },
  {
    "path": "lib/objects/client/objects-message-listener.js",
    "content": "/**\n *\n * Reldens - ObjectsMessageListener\n *\n * Handles client-side messages for object interactions.\n *\n */\n\nconst { TraderObjectUi } = require('./trader-object-ui');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/client/room-events').RoomEvents} RoomEvents\n *\n * @typedef {Object} MessageActionsProps\n * @property {Object} message\n * @property {RoomEvents} roomEvents\n */\nclass ObjectsMessageListener\n{\n\n    /**\n     * @param {MessageActionsProps} props\n     * @returns {Promise<boolean|undefined>}\n     */\n    async executeClientMessageActions(props)\n    {\n        let message = sc.get(props, 'message', false);\n        if(!message){\n            Logger.error('Missing message data on ObjectsMessageListener.', props);\n            return false;\n        }\n        let messageResult = sc.get(message, 'result', false);\n        if(!messageResult){\n            Logger.error('Missing result data on ObjectsMessageListener.', props);\n            return false;\n        }\n        let messageId = sc.get(message, 'id', false);\n        if(!messageId){\n            Logger.error('Missing Object ID on ObjectsMessageListener.', props);\n            return false;\n        }\n        let roomEvents = sc.get(props, 'roomEvents', false);\n        if(!roomEvents){\n            Logger.error('Missing RoomEvents on ObjectsMessageListener.', props);\n            return false;\n        }\n        // @TODO - BETA - Rename class to TraderObjectMessageHandler, split in several services.\n        let traderObjectUi = new TraderObjectUi({roomEvents, message});\n        if(!traderObjectUi.validate()){\n            return false;\n        }\n        traderObjectUi.updateContents();\n    }\n\n}\n\nmodule.exports.ObjectsMessageListener = ObjectsMessageListener;\n"
  },
  {
    "path": "lib/objects/client/plugin.js",
    "content": "/**\n *\n * Reldens - Objects Client Plugin\n *\n * Client-side plugin for handling game objects, animations, and interactions.\n *\n */\n\nconst { AnimationEngine } = require('../../objects/client/animation-engine');\nconst { ObjectsMessageListener } = require('./objects-message-listener');\nconst { DropsMessageListener } = require('./drops-message-listener');\nconst Translations = require('./snippets/en_US');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst { UserInterface } = require('../../game/client/user-interface');\nconst { ObjectsConst } = require('../constants');\nconst { ActionsConst } = require('../../actions/constants');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\nconst { RoomStateEntitiesManager } = require('../../game/client/communication/room-state-entities-manager');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager - CUSTOM DYNAMIC\n * @typedef {import('../../game/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('../../game/client/scene-dynamic').SceneDynamic} SceneDynamic\n */\nclass ObjectsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|false} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in InventoryPlugin.');\n            return false;\n        }\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in InventoryPlugin.');\n            return false;\n        }\n        /** @type {Function|false} */\n        this.bodyOnAddCallBack = false;\n        /** @type {Function|false} */\n        this.bodyOnRemoveCallBack = false;\n        /** @type {Object<string, Object>} */\n        this.bullets = {};\n        /** @type {boolean} */\n        this.changeBodyVisibilityOnInactiveState = this.gameManager.config.getWithoutLogs(\n            'client/objects/animations/changeBodyVisibilityOnInactiveState',\n            true\n        );\n        /** @type {number} */\n        this.missingSpritesTimeOut = this.gameManager.config.getWithoutLogs(\n            'client/general/animations/missingSpritesTimeOut',\n            200\n        );\n        /** @type {number} */\n        this.missingSpritesMaxRetries = this.gameManager.config.getWithoutLogs(\n            'client/general/animations/missingSpritesMaxRetries',\n            5\n        );\n        /** @type {number} */\n        this.missingSpriteRetry = 0;\n        this.listenEvents();\n        this.setTranslations();\n        this.setListener();\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setListener()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        this.gameManager.config.client.message.listeners['traderObject'] = new ObjectsMessageListener();\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setTranslations()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations, ObjectsConst.MESSAGE.DATA_VALUES);\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        // @NOTE: the prepareObjectsUi has to be created before the scenes, so we can use the scenes events before\n        // the events were called.\n        this.events.on('reldens.startEngineScene', async (roomEvents) => {\n            await this.prepareObjectsUi(roomEvents.gameManager, roomEvents.roomData.objectsAnimationsData, roomEvents);\n        });\n        this.events.on('reldens.afterSceneDynamicCreate', async (sceneDynamic) => {\n            await this.createDynamicAnimations(sceneDynamic);\n        });\n        this.events.on('reldens.joinedRoom', (room, gameManager) => {\n            // @TODO - BETA - Refactor.\n            this.listenMessages(room, gameManager);\n            DropsMessageListener.listenMessages(room, gameManager);\n        });\n        return true;\n    }\n\n    /**\n     * @param {Object} room\n     * @param {GameManager} gameManager\n     */\n    listenMessages(room, gameManager)\n    {\n        room.onMessage('*', (message) => {\n            this.startObjectAnimation(message, gameManager);\n            this.objectBattleEndAnimation(message, gameManager);\n        });\n        if(!room.state || !room.state.bodies){\n            room.onStateChange.once((state) => {\n                this.setAddBodyCallback(room, gameManager);\n                this.setRemoveBodyCallback(room);\n            });\n            return false;\n        }\n        this.setAddBodyCallback(room, gameManager);\n        this.setRemoveBodyCallback(room);\n    }\n\n    /**\n     * @param {Object} room\n     * @param {GameManager} gameManager\n     */\n    setAddBodyCallback(room, gameManager)\n    {\n        // @TODO - BETA - Refactor and extract Colyseus into a driver.\n        RoomStateEntitiesManager.onEntityAdd(room, 'bodies', (body, key) => {\n            this.setOnChangeBodyCallback(body, key, room, gameManager);\n            this.createBulletSprite(key, gameManager, body);\n        });\n    }\n\n    /**\n     * @param {string} key\n     * @param {GameManager} gameManager\n     * @param {Object} body\n     * @returns {boolean}\n     */\n    createBulletSprite(key, gameManager, body)\n    {\n        if(-1 === key.indexOf('bullet')){\n            return false;\n        }\n        let currentScene = gameManager.activeRoomEvents.getActiveScene();\n        let animKey = 'default_bullet';\n        let skillBullet = (body.key ? body.key + '_' : '') + 'bullet';\n        if(sc.hasOwn(gameManager.gameEngine.uiScene.directionalAnimations, skillBullet)){\n            skillBullet = skillBullet + '_' + body.dir;\n        }\n        if(sc.hasOwn(currentScene.anims.anims.entries, skillBullet)){\n            animKey = skillBullet;\n        }\n        let bulletSprite = currentScene?.physics?.add?.sprite(body.x, body.y, animKey);\n        if(!bulletSprite){\n            Logger.warning('Could not create bullet sprite.', currentScene);\n            return false;\n        }\n        bulletSprite.setDepth(11000);\n        this.bullets[key] = bulletSprite;\n        //Logger.debug({createdBulletSprite: skillBullet, shootFrom: body, bulletSprite});\n        return true;\n    }\n\n    /**\n     * @param {Object} body\n     * @param {string} key\n     * @param {Object} room\n     * @param {Object} gameManager\n     */\n    setOnChangeBodyCallback(body, key, room, gameManager)\n    {\n        // @TODO - BETA - Refactor and extract Colyseus into a driver.\n        let bodyManager = RoomStateEntitiesManager.createManager(room);\n        let bodyProperties = Object.keys(body);\n        for(let propertyKey of bodyProperties){\n            bodyManager.listen(body, propertyKey, async (newValue, previousValue) => {\n                //Logger.debug('Update body property \"'+propertyKey+'\": '+newValue);\n                await this.events.emit('reldens.objectBodyChange', {body, key, changes: {[propertyKey]: newValue}});\n                let currentScene = gameManager.activeRoomEvents.getActiveScene();\n                this.updateBodyProperties(propertyKey, body, newValue, currentScene, key);\n                if(!currentScene){\n                    return;\n                }\n                let isBullet = -1 !== key.indexOf('bullet');\n                let currentBody = isBullet ? this.bullets[key] : currentScene?.objectsAnimations[key];\n                this.setVisibility(currentBody, GameConst.STATUS.ACTIVE === body.inState);\n                this.logObjectBodyUpdate(key, propertyKey, newValue, currentBody);\n                let canInterpolate = GameConst.STATUS.AVOID_INTERPOLATION !== body.inState;\n                if(currentScene?.clientInterpolation && canInterpolate){\n                    currentScene.interpolateObjectsPositions[key] = body;\n                    return;\n                }\n                if(isBullet){\n                    return this.updateBulletBodyPosition(key, body);\n                }\n                return this.updateObjectsAnimations(key, body, currentScene);\n            });\n        }\n    }\n\n    /**\n     * @param {string} key\n     * @param {string} propertyKey\n     * @param {*} newValue\n     * @param {Object} currentBody\n     */\n    logObjectBodyUpdate(key, propertyKey, newValue, currentBody)\n    {\n        let logValues = {key, propertyKey, newValue};\n        if(('x' === propertyKey || 'y' === propertyKey) && currentBody && currentBody[propertyKey]){\n            logValues.currentValue = currentBody[propertyKey];\n        }\n        //Logger.debug(logValues);\n    }\n\n    /**\n     * @param {Object} currentBody\n     * @param {boolean} isActive\n     */\n    setVisibility(currentBody, isActive)\n    {\n        if(!currentBody || !currentBody.sceneSprite){\n            return;\n        }\n        currentBody.sceneSprite.setVisible(isActive);\n    }\n\n    /**\n     * @param {string} bodyProp\n     * @param {Object} body\n     * @param {*} value\n     * @param {Object} currentScene\n     * @param {string} key\n     */\n    updateBodyProperties(bodyProp, body, value, currentScene, key)\n    {\n        // @TODO - BETA - Remove hardcoded properties check.\n        //Logger.debug({update: body, key, animationData: currentScene.objectsAnimationsData[key], bodyProp, value});\n        if(currentScene.objectsAnimationsData[key] && ('x' === bodyProp || 'y' === bodyProp)){\n            // @TODO - BETA - Check why bullets keep receiving updates even after the objects animation was removed.\n            currentScene.objectsAnimationsData[key][bodyProp] = value;\n        }\n        body[bodyProp] = value;\n    }\n\n    /**\n     * @param {string} key\n     * @param {Object} body\n     */\n    updateBulletBodyPosition(key, body)\n    {\n        if(!this.bullets[key]){\n            return;\n        }\n        this.bullets[key].x = body.x;\n        this.bullets[key].y = body.y;\n        this.events.emit('reldens.objectBodyChanged', {body, key});\n    }\n\n    /**\n     * @param {string} key\n     * @param {Object} body\n     * @param {Object} currentScene\n     */\n    updateObjectsAnimations(key, body, currentScene)\n    {\n        let objectAnimation = sc.get(currentScene.objectsAnimations, key);\n        if(!objectAnimation || !sc.isFunction(objectAnimation.updateObjectAndSpritePositions)){\n            Logger.error('Object animation update failed.', key, objectAnimation);\n            return false;\n        }\n        objectAnimation.updateObjectAndSpritePositions(body.x, body.y);\n        this.events.emit('reldens.objectBodyChanged', {body, key});\n        let objectNewDepth = objectAnimation.updateObjectDepth();\n        objectAnimation.inState = body.inState;\n        let animToPlay = this.fetchAvailableAnimationKey(currentScene, objectAnimation, body);\n        if('' !== animToPlay){\n            objectAnimation.sceneSprite.anims.play(animToPlay, true);\n        }\n        this.moveSpritesObjects(objectAnimation, body.x, body.y, objectNewDepth);\n        if(body.mov){\n            return false;\n        }\n        objectAnimation.sceneSprite.anims.stop();\n        objectAnimation.sceneSprite.mov = body.mov;\n        if(!objectAnimation.autoStart){\n            return false;\n        }\n        objectAnimation.sceneSprite.anims.play(\n            this.determineAutoStartAnimation(objectAnimation, animToPlay)\n        );\n        return true;\n    }\n\n    /**\n     * @param {Object} objectAnimation\n     * @param {string} animToPlay\n     * @returns {string|false}\n     */\n    determineAutoStartAnimation(objectAnimation, animToPlay)\n    {\n        if(true === objectAnimation.autoStart){\n            return objectAnimation.key;\n        }\n        if(objectAnimation.autoStart === ObjectsConst.DYNAMIC_ANIMATION){\n            return animToPlay;\n        }\n        return objectAnimation.autoStart;\n    }\n\n    /**\n     * @param {Object} currentScene\n     * @param {Object} objectAnimation\n     * @param {Object} body\n     * @returns {string}\n     */\n    fetchAvailableAnimationKey(currentScene, objectAnimation, body)\n    {\n        return sc.getByPriority(currentScene.anims.anims.entries, [\n            objectAnimation.key + '_' + body.dir,\n            objectAnimation.layerName + '_' + objectAnimation.id + '_' + body.dir,\n            objectAnimation.key\n        ]) || '';\n    }\n\n    /**\n     * @param {Object} room\n     */\n    setRemoveBodyCallback(room)\n    {\n        // @TODO - BETA - Refactor and extract Colyseus into a driver.\n        RoomStateEntitiesManager.onEntityRemove(room, 'bodies', (body, key) => {\n            if(-1 === key.indexOf('bullet') || !sc.hasOwn(this.bullets, key)){\n                return false;\n            }\n            this.bullets[key].destroy();\n            delete this.bullets[key];\n        });\n    }\n\n    /**\n     * @param {Object} message\n     * @param {GameManager} gameManager\n     * @returns {boolean}\n     */\n    objectBattleEndAnimation(message, gameManager)\n    {\n        if(message.act !== ActionsConst.BATTLE_ENDED){\n            return false;\n        }\n        // @TODO - BETA - Replace all defaults by constants.\n        let deathKey = sc.get(gameManager.config.client.skills.animations, message.k + '_death', 'default_death');\n        let currentScene = gameManager.activeRoomEvents.getActiveScene();\n        try {\n            this.playDeathAnimation(deathKey, currentScene, message);\n        } catch (error) {\n            Logger.warning('Error on sprite \"'+deathKey+'\" not available.', error.message);\n        }\n        if(!sc.hasOwn(message, ActionsConst.DATA_OBJECT_KEY_TARGET)){\n            return false;\n        }\n        if(message[ActionsConst.DATA_OBJECT_KEY_TARGET] === currentScene.player.currentTarget?.id){\n            gameManager.gameEngine.clearTarget();\n        }\n        let hidePlayerSprite = sc.get(currentScene.player.players, message[ActionsConst.DATA_OBJECT_KEY_TARGET], false);\n        if(!hidePlayerSprite){\n            return false;\n        }\n        hidePlayerSprite.visible = false;\n        if(sc.hasOwn(hidePlayerSprite, 'nameSprite') && hidePlayerSprite.nameSprite){\n            hidePlayerSprite.nameSprite.visible = false;\n        }\n    }\n\n    /**\n     * @param {string} deathKey\n     * @param {Object} currentScene\n     * @param {Object} message\n     * @returns {boolean}\n     */\n    playDeathAnimation(deathKey, currentScene, message)\n    {\n        if(!currentScene.getAnimationByKey(deathKey)){\n            if(this.missingSpritesMaxRetries === this.missingSpriteRetry){\n                Logger.debug('Sprite \"'+deathKey+'\" not available.', deathKey);\n                return false;\n            }\n            this.missingSpriteRetry++;\n            setTimeout(\n                () => {\n                    return this.playDeathAnimation(deathKey, currentScene, message);\n                },\n                this.missingSpritesTimeOut\n            );\n            return false;\n        }\n        let skeletonSprite = currentScene.physics.add.sprite(message.x, message.y, deathKey);\n        skeletonSprite.setDepth(10500);\n        skeletonSprite.anims.play(deathKey, true).on('animationcomplete', () => {\n            skeletonSprite.destroy();\n        });\n        return true;\n    }\n\n    /**\n     * @param {Object} message\n     * @param {GameManager} gameManager\n     * @returns {boolean}\n     */\n    startObjectAnimation(message, gameManager)\n    {\n        if(message.act !== ObjectsConst.OBJECT_ANIMATION && message.act !== ObjectsConst.TYPE_ANIMATION){\n            return false;\n        }\n        let currentScene = gameManager.activeRoomEvents.getActiveScene();\n        if(!sc.hasOwn(currentScene.objectsAnimations, message.key)){\n            return false;\n        }\n        currentScene.objectsAnimations[message.key].runAnimation();\n    }\n\n    /**\n     * @param {Object} currentObj\n     * @param {number} x\n     * @param {number} y\n     * @param {number} objectNewDepth\n     */\n    moveSpritesObjects(currentObj, x, y, objectNewDepth)\n    {\n        if(!currentObj.moveSprites){\n            return;\n        }\n        let moveObjectsKeys = Object.keys(currentObj.moveSprites);\n        if(0 === moveObjectsKeys.length){\n            return;\n        }\n        for(let i of moveObjectsKeys){\n            let sprite = currentObj.moveSprites[i];\n            sprite.x = x;\n            sprite.y = y;\n            // by default moving sprites will be always below the player:\n            let depthByPlayer = sc.get(currentObj.animationData, 'depthByPlayer', '');\n            let spriteDepth = objectNewDepth + ((depthByPlayer === 'above') ? 1 : -0.1);\n            sprite.setDepth(spriteDepth);\n        }\n    }\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {object} objectsAnimationsData\n     * @param {RoomEvents} roomEvents\n     * @returns {Promise<void>}\n     */\n    async prepareObjectsUi(gameManager, objectsAnimationsData, roomEvents)\n    {\n        if(!objectsAnimationsData){\n            Logger.info('None objects animations data.');\n            return;\n        }\n        for(let i of Object.keys(objectsAnimationsData)){\n            let animProps = objectsAnimationsData[i];\n            if(!sc.hasOwn(animProps, 'ui')){\n                continue;\n            }\n            if(!animProps.id){\n                Logger.error(['Object ID not specified. Skipping registry:', animProps]);\n                continue;\n            }\n            let template = sc.get(animProps, 'template', '/assets/html/dialog-box.html');\n            roomEvents.objectsUi[animProps.id] = new UserInterface(gameManager, animProps, template, 'npcDialog');\n            await gameManager.events.emit('reldens.createdUserInterface', {\n                gameManager,\n                id: animProps.id,\n                userInterface: roomEvents.objectsUi[animProps.id],\n                ObjectsPlugin: this\n            });\n        }\n    }\n\n    /**\n     * @param {SceneDynamic} sceneDynamic\n     * @returns {Promise<void>}\n     */\n    async createDynamicAnimations(sceneDynamic)\n    {\n        if(!sceneDynamic.objectsAnimationsData){\n            Logger.info('None animations defined on this scene: '+sceneDynamic.key);\n            return;\n        }\n        await this.events.emit('reldens.createDynamicAnimationsBefore', this, sceneDynamic);\n        for(let i of Object.keys(sceneDynamic.objectsAnimationsData)){\n            let animProps = sceneDynamic.objectsAnimationsData[i];\n            await this.createAnimationFromAnimData(animProps, sceneDynamic);\n        }\n    }\n\n    /**\n     * @param {Object} animProps\n     * @param {SceneDynamic} sceneDynamic\n     * @returns {Promise<Object|false>}\n     */\n    async createAnimationFromAnimData(animProps, sceneDynamic)\n    {\n        if(!animProps.key){\n            Logger.error('Animation key not specified. Skipping registry.', animProps);\n            return false;\n        }\n        animProps.frameRate = sceneDynamic.configuredFrameRate;\n        let activeRoomEvents = sceneDynamic.gameManager.activeRoomEvents;\n        let existentBody = this.fetchExistentBody(sceneDynamic, activeRoomEvents, animProps);\n        this.updateAnimationPosition(existentBody, animProps);\n        await this.events.emit('reldens.createDynamicAnimation_'+animProps.key, this, animProps);\n        let classDefinition = sceneDynamic.gameManager.config.getWithoutLogs(\n            'client/customClasses/objects/'+animProps.key,\n            AnimationEngine\n        );\n        let animationEngine = new classDefinition(sceneDynamic.gameManager, animProps, sceneDynamic);\n        // @NOTE: this will populate the objectsAnimations property in the current scene, see scene-dynamic.\n        let sprite = animationEngine.createAnimation();\n        this.updateAnimationVisibility(existentBody, sprite);\n        return animationEngine;\n    }\n\n    /**\n     * @param {Object} existentBody\n     * @param {Object} animProps\n     */\n    updateAnimationPosition(existentBody, animProps)\n    {\n        // Logger.debug('Existent body:', {existentBody});\n        if(!existentBody){\n            // expected, not all animation objects may have a body:\n            return false;\n        }\n        // @NOTE: respawn objects would have the animProp position outdated since it comes from the roomData, which\n        // only contains the objects original initial position.\n        //Logger.debug('Existent body \"'+animProps.key+'\" position:', {x: existentBody.x, y: existentBody.y});\n        //Logger.debug('AnimProps \"'+animProps.key+'\" position:', {x: animProps.x, y: animProps.y});\n        if(animProps.x !== existentBody.x){\n            animProps.x = existentBody.x;\n        }\n        if(animProps.y !== existentBody.y){\n            animProps.y = existentBody.y;\n        }\n    }\n\n    /**\n     * @param {Object} existentBody\n     * @param {Object} sprite\n     */\n    updateAnimationVisibility(existentBody, sprite)\n    {\n        if(!existentBody){\n            // expected, not all animation objects may have a body:\n            return false;\n        }\n        if(GameConst.STATUS.DEATH !== existentBody.inState && GameConst.STATUS.DISABLED !== existentBody.inState){\n            return false;\n        }\n        sprite.visible = false;\n    }\n\n    /**\n     * @param {Object} sceneDynamic\n     * @param {Object} activeRoomEvents\n     * @param {Object} animProps\n     * @returns {Object|false}\n     */\n    fetchExistentBody(sceneDynamic, activeRoomEvents, animProps)\n    {\n        //Logger.debug('Scene key vs roomName: '+sceneDynamic.key+' / '+activeRoomEvents.roomName+'.');\n        if(sceneDynamic.key !== activeRoomEvents.roomName){\n            Logger.warning('Scene key and roomName miss match: '+sceneDynamic.key+' / '+activeRoomEvents.roomName+'.');\n            return false;\n        }\n        return activeRoomEvents.room.state.bodies.get(animProps?.key);\n    }\n}\n\nmodule.exports.ObjectsPlugin = ObjectsPlugin;\n"
  },
  {
    "path": "lib/objects/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    objects: {\n        npcInvalid: 'I do not understand.',\n        trader: {\n            content: 'Hi there! What would you like to do?',\n            options: {\n                buy: 'Buy',\n                sell: 'Sell'\n            },\n            buyConfirmed: 'Thanks for buying!',\n            sellConfirmed: 'Thanks for your products!'\n        }\n    },\n}\n"
  },
  {
    "path": "lib/objects/client/trader-object-ui.js",
    "content": "/**\n *\n * Reldens - TraderObjectUi\n *\n * Manages trader object UI rendering and interaction on the client side.\n *\n */\n\nconst { TradeItemsHelper } = require('../../inventory/client/trade-items-helper');\nconst { ObjectsConst } = require('../constants');\nconst { ItemsConst } = require('@reldens/items-system');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager - CUSTOM DYNAMIC\n * @typedef {import('../../game/client/game-dom').GameDom} GameDom\n * @typedef {import('@reldens/items-system').ItemsManager} ItemsManager\n * @typedef {import('../../game/client/user-interface').UserInterface} UserInterface\n *\n * @typedef {Object} TraderObjectUiProps\n * @property {RoomEvents} roomEvents\n * @property {Object} message\n */\nclass TraderObjectUi\n{\n\n    /**\n     * @param {TraderObjectUiProps} props\n     */\n    constructor(props)\n    {\n        // @TODO - BETA - Rename class to TraderObjectMessageHandler, split in several services.\n        /** @type {RoomEvents|false} */\n        this.roomEvents = sc.get(props, 'roomEvents', false);\n        /** @type {Object|false} */\n        this.message = sc.get(props, 'message', false);\n        /** @type {GameManager|undefined} */\n        this.gameManager = this.roomEvents?.gameManager;\n        /** @type {GameDom|undefined} */\n        this.gameDom = this.gameManager?.gameDom;\n        /** @type {Object|undefined} */\n        this.uiScene = this.gameManager?.gameEngine?.uiScene;\n        /** @type {ItemsManager|undefined} */\n        this.itemsManager = this.gameManager?.inventory?.manager;\n        /** @type {UserInterface|undefined} */\n        this.objectUi = this.roomEvents?.objectsUi[this.message?.id];\n        this.setConfirmMessages();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    validate()\n    {\n        if(!this.roomEvents){\n            Logger.error('Missing RoomEvents on TraderObjectUi.');\n            return false;\n        }\n        if(!this.message){\n            Logger.error('Missing message on TraderObjectUi.');\n            return false;\n        }\n        if(!this.gameManager){\n            Logger.error('Missing GameManager on TraderObjectUi.');\n            return false;\n        }\n        if(!this.uiScene){\n            Logger.error('Missing UiScene on TraderObjectUi.');\n            return false;\n        }\n        if(!this.itemsManager){\n            Logger.error('Missing ItemsManager on TraderObjectUi.');\n            return false;\n        }\n        if(!this.objectUi){\n            Logger.error('Missing objectUi on TraderObjectUi.');\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setConfirmMessages()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        this.confirmMessages = {\n            buy: this.gameManager.services.translator.t('objects.trader.buyConfirmed'),\n            sell: this.gameManager.services.translator.t('objects.trader.sellConfirmed')\n        };\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    updateContents()\n    {\n        let container = this.gameManager.gameDom.getElement('#box-'+this.objectUi.id+' .box-content');\n        if(!container){\n            Logger.error('Missing container: \"#box-'+this.objectUi.id+' .box-content\".');\n            return false;\n        }\n        let tradeAction = this.message.result.action;\n        if(ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.CONFIRM === this.message.result.subAction){\n            container.innerHTML = this.confirmMessages[tradeAction];\n            return true;\n        }\n        let items = sc.get(this.message.result, 'items', false);\n        let inventoryKey = this.mapInventoryKeyFromAction(tradeAction);\n        let exchangeData = sc.get(this.message.result, 'exchangeData', false);\n        let exchangeItems = sc.get(exchangeData, inventoryKey, false);\n        let exchangeRequirementsA = this.message.result.exchangeRequirementsA || [];\n        let exchangeRewardsB = this.message.result.exchangeRewardsB || [];\n        this.updateItemsList(items, tradeAction, exchangeRequirementsA, exchangeRewardsB, container, exchangeItems);\n        this.updateExchangeData(exchangeItems, tradeAction, exchangeRequirementsA, exchangeRewardsB, items);\n        return true;\n    }\n\n    /**\n     * @param {Object} items\n     * @param {string} tradeAction\n     * @param {Array<Object>} exchangeRequirementsA\n     * @param {Array<Object>} exchangeRewardsB\n     * @param {HTMLElement} container\n     * @param {Object|false} exchangeData\n     */\n    updateItemsList(items, tradeAction, exchangeRequirementsA, exchangeRewardsB, container, exchangeData)\n    {\n        if(!items){\n            //Logger.debug('Missing items for updateItemsList method.');\n            return false;\n        }\n        let tradeItems = '';\n        let tempItemsList = {};\n        for(let i of Object.keys(items)){\n            tempItemsList[i] = TradeItemsHelper.createItemInstance(items, i, this.itemsManager);\n            tempItemsList[i].tradeAction = tradeAction;\n            tempItemsList[i].exchangeRequirements = this.fetchItemRequirements(items[i].key, exchangeRequirementsA);\n            tempItemsList[i].exchangeRewards = this.fetchItemRewards(items[i].key, exchangeRewardsB);\n            tradeItems += this.createTradeItemBox(tempItemsList[i], sc.get(exchangeData, tempItemsList[i].uid, false));\n        }\n        container.innerHTML = this.createTradeContainer(tradeAction, tradeItems);\n        this.activateItemsBoxActions(tempItemsList);\n        this.activateConfirmButtonAction(tradeAction);\n    }\n\n    /**\n     * @param {string} tradeAction\n     */\n    activateConfirmButtonAction(tradeAction)\n    {\n        let confirmButton = this.gameManager.gameDom.getElement('.confirm-'+tradeAction);\n        let dataSend = {\n            act: ObjectsConst.OBJECT_INTERACTION,\n            id: this.message.id,\n            value: tradeAction,\n            sub: ObjectsConst.TRADE_ACTIONS.CONFIRM\n        };\n        confirmButton?.addEventListener('click', () => {\n            this.gameManager.activeRoomEvents.send(dataSend);\n        });\n    }\n\n    /**\n     * @param {Object|false} exchangeData\n     * @param {string} tradeAction\n     * @param {Array<Object>} exchangeRequirementsA\n     * @param {Array<Object>} exchangeRewardsB\n     * @param {Object} items\n     * @returns {boolean}\n     */\n    updateExchangeData(exchangeData, tradeAction, exchangeRequirementsA, exchangeRewardsB, items)\n    {\n        if(false === exchangeData){\n            return false;\n        }\n        let content = this.createConfirmItemsBox(exchangeData, items, tradeAction);\n        let itemsContainer = null;\n        if('buy' === tradeAction){\n            itemsContainer = this.gameDom.getElement('.trade-container-buy .trade-col.trade-col-2');\n        }\n        if('sell' === tradeAction){\n            itemsContainer = this.gameDom.getElement('.trade-container-sell .trade-col.trade-col-1');\n        }\n        if(null === itemsContainer){\n            Logger.error('Missing \"'+tradeAction+'\" items container.', {message: this.message});\n            return false;\n        }\n        itemsContainer.innerHTML = content;\n        this.assignRemoveActions(exchangeData, items, tradeAction);\n        return true;\n    }\n\n    /**\n     * @param {Object} exchangeItems\n     * @param {Object} items\n     * @param {string} tradeAction\n     * @returns {string}\n     */\n    createConfirmItemsBox(exchangeItems, items, tradeAction)\n    {\n        // @TODO - BETA - Since we are using one template \"inventoryTradeItem\", use only one \"createConfirmItemsBox\".\n        let exchangeItemsUids = Object.keys(exchangeItems);\n        if(0 === exchangeItemsUids.length){\n            // @NOTE: this will be the case if you don't have a required item.\n            if(!this.message.lastErrorMessage){\n                Logger.info('Undefined exchange items on confirmation trader-object-ui.', {message: this.message});\n            }\n            return '';\n        }\n        let content = '';\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeItem');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeItem\".');\n            return '';\n        }\n        for(let itemUid of exchangeItemsUids){\n            let qty = exchangeItems[itemUid];\n            let item = items[itemUid];\n            let isBuy = ItemsConst.TRADE_ACTIONS.BUY === tradeAction;\n            let isSell = ItemsConst.TRADE_ACTIONS.SELL === tradeAction;\n            content += this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n                key: item.key,\n                label: item.label,\n                description: item.description,\n                id: itemUid,\n                qty: item.qty,\n                hiddenClass: '',\n                tradeRequirements: isBuy ? this.createTradeRequirementsContent(item) : '',\n                tradeRewards: isSell ? this.createTradeRewardsContent(item) : '',\n                tradeAction: this.createTradeActionRemove(item),\n                tradeActionKey: tradeAction,\n                tradeQuantityContent: qty\n            });\n        }\n        return content;\n    }\n\n    /**\n     * @param {Object} exchangeItems\n     * @param {Object} items\n     * @param {string} tradeAction\n     * @returns {boolean}\n     */\n    assignRemoveActions(exchangeItems, items, tradeAction)\n    {\n        let exchangeItemsUids = Object.keys(exchangeItems);\n        if(0 === exchangeItemsUids.length){\n            // @NOTE: this will be the case if you don't have a required item.\n            if(!this.message.lastErrorMessage){\n                Logger.info('Undefined exchange items on remove trader-object-ui.', {message: this.message});\n            }\n            return false;\n        }\n        for(let itemUid of exchangeItemsUids){\n            let itemContainerSelector = '.trade-item-to-be-'+tradeAction+'.trade-item-'+itemUid;\n            let itemContainer = this.gameDom.getElement(itemContainerSelector);\n            if(!itemContainer){\n                Logger.error('Assign trade item \"'+itemUid+'\" container not found.', {message: this.message});\n                continue;\n            }\n            let itemActionButton = this.gameDom.getElement(\n                '.trade-item-'+tradeAction+'.trade-item-'+itemUid+' .trade-action-remove'\n            );\n            if(!itemActionButton){\n                Logger.error('Assign trade item \"'+itemUid+'\" remove button not found.', {message: this.message});\n                continue;\n            }\n            let item = items[itemUid];\n            itemActionButton.addEventListener('click', () => {\n                itemContainer.classList.remove('hidden');\n                let dataSend = {\n                    act: ObjectsConst.OBJECT_INTERACTION,\n                    id: this.message.id,\n                    value: tradeAction,\n                    itemId: itemUid,\n                    itemKey: item.key,\n                };\n                dataSend[ObjectsConst.TRADE_ACTIONS.SUB_ACTION] = ObjectsConst.TRADE_ACTIONS.REMOVE;\n                this.gameManager.activeRoomEvents.send(dataSend);\n            });\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} tradeActionKey\n     * @param {string} tradeItems\n     * @returns {string}\n     */\n    createTradeContainer(tradeActionKey, tradeItems)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeContainer');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeContainer\".');\n            return '';\n        }\n        // @TODO - BETA - Populate requirements totals.\n        let confirmRequirements = '';\n        let lastErrorData = this.message.result.lastErrorData;\n        if(lastErrorData?.itemUid){\n            lastErrorData.item = this.fetchItemLabelByUid(lastErrorData.itemUid);\n        }\n        if(lastErrorData?.requiredItemKey){\n            lastErrorData.requiredItem = this.fetchItemLabelByUid(lastErrorData.requiredItemKey);\n        }\n        let lastErrorMessage = this.gameManager.services.translator.t(\n            this.message.result.lastErrorMessage,\n            lastErrorData\n        );\n        let tradeItemsBuy = ItemsConst.TRADE_ACTIONS.BUY === tradeActionKey ? tradeItems : '';\n        let tradeItemsSell = ItemsConst.TRADE_ACTIONS.SELL === tradeActionKey ? tradeItems : '';\n        return this.gameManager.gameEngine.parseTemplate(\n            messageTemplate,\n            {\n                tradeActionKey,\n                confirmRequirements,\n                lastErrorMessage,\n                tradeActionLabel: ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.CONFIRM,\n                tradeItemsBuy,\n                tradeItemsSell\n            }\n        );\n    }\n\n    /**\n     * @param {string} itemUid\n     * @returns {string}\n     */\n    fetchItemLabelByUid(itemUid)\n    {\n        return this.gameManager?.inventory?.manager?.items[itemUid]?.label\n            || this.message?.result?.items[itemUid]?.label\n            || '';\n    }\n\n    /**\n     * @param {string} itemKey\n     * @param {Array<Object>} exchangeRequirements\n     * @returns {Object|false}\n     */\n    fetchItemRequirements(itemKey, exchangeRequirements)\n    {\n        if(0 === exchangeRequirements.length){\n            return false;\n        }\n        let itemExchangeRequirements = {};\n        for(let exchangeRequirement of exchangeRequirements){\n            if(itemKey !== exchangeRequirement.itemKey){\n                continue;\n            }\n            itemExchangeRequirements[exchangeRequirement.itemKey] = exchangeRequirement;\n        }\n        return itemExchangeRequirements;\n    }\n\n    /**\n     * @param {string} itemKey\n     * @param {Array<Object>} exchangeRewards\n     * @returns {Object|false}\n     */\n    fetchItemRewards(itemKey, exchangeRewards)\n    {\n        if(0 === exchangeRewards.length){\n            return false;\n        }\n        let itemExchangeRewards = {};\n        for(let exchangeReward of exchangeRewards){\n            if(itemKey !== exchangeReward.itemKey){\n                continue;\n            }\n            itemExchangeRewards[exchangeReward.itemKey] = exchangeReward;\n        }\n        return itemExchangeRewards;\n    }\n\n    /**\n     * @param {Object} item\n     * @param {number|undefined} exchangeDataItem\n     * @returns {string}\n     */\n    createTradeItemBox(item, exchangeDataItem)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeItem');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeItem\".');\n            return '';\n        }\n        let qtyTemplate = this.uiScene.cache.html.get('inventoryTradeItemQuantity');\n        if(!qtyTemplate){\n            Logger.error('Missing template \"inventoryTradeItemQuantity\".');\n            return '';\n        }\n        let isBuy = ItemsConst.TRADE_ACTIONS.BUY === item.tradeAction;\n        let isSell = ItemsConst.TRADE_ACTIONS.SELL === item.tradeAction;\n        let qty = exchangeDataItem || 0;\n        return this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n            key: item.key,\n            label: item.label,\n            description: item.description,\n            id: item.getInventoryId(),\n            qty: item.qty,\n            hiddenClass: 0 < qty && item.qty === qty ? ' hidden' : '',\n            tradeRequirements: isBuy ? this.createTradeRequirementsContent(item) : '',\n            tradeRewards: isSell ? this.createTradeRewardsContent(item) : '',\n            tradeAction: this.createTradeActionContent(item),\n            tradeActionKey: 'to-be-'+item.tradeAction,\n            tradeQuantityContent: this.gameManager.gameEngine.parseTemplate(qtyTemplate, {\n                quantityDisplay: item.quantityDisplay || 1,\n                quantityMaxDisplay: 0 < item.quantityMaxDisplay ? 'max=\"' + item.quantityMaxDisplay + '\"' : ''\n            })\n        });\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {string}\n     */\n    createTradeRequirementsContent(item)\n    {\n        if(!item.exchangeRequirements){\n            return '';\n        }\n        let requirementsKeys = Object.keys(item.exchangeRequirements);\n        if(0 === requirementsKeys.length){\n            return '';\n        }\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeRequirements');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeRequirements\".');\n            return '';\n        }\n        let content = '';\n        for(let i of requirementsKeys){\n            let requirement = item.exchangeRequirements[i];\n            content += this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n                itemKey: item.key,\n                requiredItemKey: requirement.requiredItemKey,\n                requiredQuantity: requirement.requiredQuantity\n            });\n        }\n        return content;\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {string}\n     */\n    createTradeRewardsContent(item)\n    {\n        if(!item.exchangeRewards){\n            return '';\n        }\n        let rewardsKeys = Object.keys(item.exchangeRewards);\n        if(0 === rewardsKeys.length){\n            return '';\n        }\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeRewards');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeRewards\".');\n            return '';\n        }\n        let content = '';\n        for(let i of rewardsKeys){\n            let reward = item.exchangeRewards[i];\n            content += this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n                itemKey: item.key,\n                rewardItemKey: reward.rewardItemKey,\n                rewardQuantity: reward.rewardQuantity\n            });\n        }\n        return content;\n    }\n\n    /**\n     * @param {Object} item\n     * @param {string} [tradeAction]\n     * @returns {string}\n     */\n    createTradeActionContent(item, tradeAction)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeAction');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeAction\".');\n            return '';\n        }\n        return this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n            key: item.key,\n            id: item.getInventoryId(),\n            tradeAction: tradeAction || sc.get(item, 'tradeAction', '')\n        });\n    }\n\n    /**\n     * @param {Object} item\n     * @returns {string}\n     */\n    createTradeActionRemove(item)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let messageTemplate = this.uiScene.cache.html.get('inventoryTradeActionRemove');\n        if(!messageTemplate){\n            Logger.error('Missing template \"inventoryTradeActionRemove\".');\n            return '';\n        }\n        return this.gameManager.gameEngine.parseTemplate(messageTemplate, {\n            key: item.key,\n            id: item.uid,\n            tradeAction: 'remove'\n        });\n    }\n\n    /**\n     * @param {Object} items\n     */\n    activateItemsBoxActions(items)\n    {\n        for(let i of Object.keys(items)){\n            let item = items[i];\n            let itemContainerSelector = '.trade-item-to-be-'+item.tradeAction+'.trade-item-'+item.uid\n                +' .trade-action-'+item.tradeAction;\n            let itemButtonSelector = itemContainerSelector+' button';\n            let itemActionButton = this.gameDom.getElement(itemButtonSelector);\n            if(!itemActionButton){\n                Logger.error('Activate trade item \"'+item.uid+'\" action button not found.');\n                continue;\n            }\n            itemActionButton.addEventListener('click', () => {\n                let qtySelector = this.gameDom.getElement('.trade-item-'+item.getInventoryId()+' .item-qty input');\n                let qtySelected = qtySelector?.value || 1;\n                let dataSend = {\n                    act: ObjectsConst.OBJECT_INTERACTION,\n                    id: this.message.id,\n                    value: item.tradeAction,\n                    itemId: item.getInventoryId(),\n                    itemKey: item.key,\n                    qty: Number(qtySelected)\n                };\n                dataSend[ObjectsConst.TRADE_ACTIONS.SUB_ACTION] = ObjectsConst.TRADE_ACTIONS.ADD;\n                this.gameManager.activeRoomEvents.send(dataSend);\n            });\n        }\n    }\n\n    /**\n     * @param {string} action\n     * @returns {string|false}\n     */\n    mapInventoryKeyFromAction(action)\n    {\n        return sc.get({buy: 'A', sell: 'B'}, action, false);\n    }\n\n}\n\nmodule.exports.TraderObjectUi = TraderObjectUi;\n"
  },
  {
    "path": "lib/objects/constants.js",
    "content": "/**\n *\n * Reldens - ObjectsConst\n *\n */\n\nlet snippetsPrefix = 'objects.';\n\nmodule.exports.ObjectsConst = {\n    OBJECT_ANIMATION: 'oa',\n    OBJECT_INTERACTION: 'oi',\n    TYPE_OBJECT: 'obj',\n    TYPE_ANIMATION: 'anim',\n    TYPE_NPC: 'npc',\n    TYPE_ENEMY: 'enemy',\n    TYPE_TRADER: 'trader',\n    TYPE_DROP: 'drop',\n    DYNAMIC_ANIMATION: 'dyn',\n    MESSAGE: {\n        DATA_VALUES: {\n            NAMESPACE: 'objects'\n        }\n    },\n    EVENT_PREFIX: {\n        BASE: 'bo',\n        ANIMATION: 'ao',\n        DROP: 'dep',\n        ENEMY: 'eo',\n        NPC: 'npc',\n        TRADER: 'tnpc'\n    },\n    SNIPPETS: {\n        PREFIX: snippetsPrefix,\n        NPC_INVALID: snippetsPrefix+'npcInvalid',\n        TRADER: {\n            CONTENT: snippetsPrefix+'trader.content',\n            OPTIONS: {\n                BUY: snippetsPrefix+'trader.options.buy',\n                SELL: snippetsPrefix+'trader.options.sell'\n            },\n            BUY_CONFIRMED: snippetsPrefix+'trader.buyConfirmed',\n            SELL_CONFIRMED: snippetsPrefix+'trader.sellConfirmed'\n        }\n    },\n    DEFAULTS: {\n        BASE_OBJECT: {\n            CONTENT: '',\n            OPTIONS: {},\n        },\n        TRADER_OBJECT: {\n            INVENTORY_MAP: {\n                buy: 'A',\n                sell: 'B'\n            },\n            OPTIONS: {\n                BUY: 'buy',\n                SELL: 'sell'\n            }\n        },\n        TARGETS: {\n            OBJECT: 0,\n            PLAYER: 1\n        }\n    },\n    TRADE_ACTIONS_FUNCTION_NAME: {\n        ADD: 'add',\n        REMOVE: 'remove',\n        CONFIRM: 'confirm',\n        DISCONFIRM: 'disconfirm',\n        CANCEL: 'cancel'\n    },\n    TRADE_ACTIONS: {\n        SUB_ACTION: 'sub',\n        ADD: 'ta',\n        REMOVE: 'tr',\n        CONFIRM: 'tc',\n        DISCONFIRM: 'td'\n    },\n    DROPS: {\n        KEY: 'drp',\n        REMOVE: 'drmv',\n        PARAMS: 'drpp',\n        ASSET_KEY: 'dk',\n        PICK_UP_ACT: 'rpu',\n        ASSETS_PATH: '/assets/custom/sprites/',\n        FILE: 'df',\n        TYPE: 'dt'\n    }\n};\n"
  },
  {
    "path": "lib/objects/server/entities/objects-entity-override.js",
    "content": "/**\n *\n * Reldens - ObjectsEntityOverride\n *\n * Customizes the objects entity configuration for the admin panel.\n *\n */\n\nconst { ObjectsEntity } = require('../../../../generated-entities/entities/objects-entity');\n\nclass ObjectsEntityOverride extends ObjectsEntity\n{\n\n    /**\n     * @param {Object} [extraProps]\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 400;\n        return config;\n    }\n\n}\n\nmodule.exports.ObjectsEntityOverride = ObjectsEntityOverride;\n"
  },
  {
    "path": "lib/objects/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { ObjectsEntityOverride } = require('./entities/objects-entity-override');\n\nmodule.exports.entitiesConfig = {\n    objects: ObjectsEntityOverride\n};\n"
  },
  {
    "path": "lib/objects/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        objects: 'Objects',\n        objects_animations: 'Animations',\n        objects_assets: 'Assets',\n        objectsInventory: 'NPCs Inventories',\n        objects_items_requirements: 'Trade - Items Requirements',\n        objects_items_rewards: 'Trade - Items Rewards',\n        objects_skills: 'Objects - Skills',\n        objects_stats: 'Objects - Stats',\n        objects_types: 'Objects - Class Types',\n        target_options: 'Objects - Target Options'\n    }\n};\n"
  },
  {
    "path": "lib/objects/server/handler/objects-class-type.js",
    "content": "/**\n *\n * Reldens - ObjectsClassTypeHandler\n *\n * Handles loading and configuring object class types from the database.\n *\n */\n\nconst { ObjectTypesClasses } = require('../object/object-types-classes');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('@reldens/storage').BaseDriver } BaseDriver\n */\nclass ObjectsClassTypeHandler\n{\n\n    /**\n     * @param {BaseDataServer} dataServer\n     */\n    constructor(dataServer)\n    {\n        /** @type {BaseDataServer} */\n        this.dataServer = dataServer;\n        /** @type {BaseDriver|boolean} */\n        this.objectClassTypeRepository = false;\n        this.setupRepository();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setupRepository()\n    {\n        if(!this.dataServer){\n            return false;\n        }\n        this.objectClassTypeRepository = this.dataServer.getEntity('objectsTypes');\n        return true;\n    }\n\n    /**\n     * @param {Object} configProcessor\n     * @returns {Promise<boolean>}\n     */\n    async setOnConfig(configProcessor)\n    {\n        if(!configProcessor){\n            Logger.warning('Config value undefined for ObjectsClassTypeHandler.');\n            return false;\n        }\n        if(!configProcessor.configList.server.objectsClassTypes){\n            configProcessor.configList.server.objectsClassTypes = {};\n        }\n        let loadedModels = await this.loadObjectClassTypes();\n        for(let model of loadedModels){\n            configProcessor.configList.server.objectsClassTypes[model.id] = {\n                model,\n                classInstance: ObjectTypesClasses[model.id]\n            };\n        }\n        return true;\n    }\n\n    /**\n     * @returns {Promise<Array<Object>|false>}\n     */\n    async loadObjectClassTypes()\n    {\n        if(!this.objectClassTypeRepository){\n            return false;\n        }\n        return await this.objectClassTypeRepository.loadAll();\n    }\n}\n\nmodule.exports.ObjectsClassTypeHandler = ObjectsClassTypeHandler;\n"
  },
  {
    "path": "lib/objects/server/manager.js",
    "content": "/**\n *\n * Reldens - ObjectsManager\n *\n * Manages loading, generating, and lifecycle of game objects within a room.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n */\nclass ObjectsManager\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {ConfigManager} */\n        this.config = props.config;\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {number|string|false} */\n        this.roomId = sc.get(props, 'roomId', false);\n        /** @type {string|false} */\n        this.roomName = sc.get(props, 'roomName', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in ObjectsManager.');\n        }\n        /** @type {BaseDataServer|false} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in ObjectsManager.');\n        }\n        /** @type {Array<Object>|false} */\n        this.roomObjectsData = false;\n        /** @type {Object<string, Object>|false} */\n        this.roomObjects = false;\n        /** @type {Object<string, Object>} */\n        this.roomObjectsByLayer = {};\n        /** @type {Object<string, Object>} */\n        this.preloadAssets = {};\n        /** @type {Object<string, Object>} */\n        this.objectsAnimationsData = {};\n        /** @type {boolean} */\n        this.listenMessages = false;\n        /** @type {Object<string, Object>} */\n        this.listenMessagesObjects = {};\n    }\n\n    /**\n     * @param {number|string} roomId\n     * @returns {Promise<Array<Object>|false>}\n     */\n    async loadObjectsByRoomId(roomId)\n    {\n        if(this.roomObjectsData){\n            return this.roomObjectsData;\n        }\n        let objectsRepository = this.dataServer.getEntity('objects');\n        objectsRepository.sortBy = 'tile_index';\n        this.roomObjectsData = await objectsRepository.loadByWithRelations(\n            'room_id',\n            roomId,\n            [\n                'related_rooms',\n                'related_objects_assets',\n                'related_objects_animations',\n                'related_objects_stats.related_stats'\n            ]\n        );\n    }\n\n    /**\n     * @returns {Promise<Object<string, Object>|false>}\n     */\n    async generateObjects()\n    {\n        if(!this.roomObjectsData || 0 === this.roomObjectsData.length){\n            return this.roomObjects;\n        }\n        this.roomObjects = {};\n        // @NOTE: allow null index for multiple objects of the same type.\n        for(let objectData of this.roomObjectsData){\n            await this.generateObjectFromObjectData(objectData);\n        }\n    }\n\n    /**\n     * @param {Object} objectData\n     * @returns {Promise<Object|false>}\n     */\n    async generateObjectFromObjectData(objectData)\n    {\n        // @NOTE: these classes are coming from the theme/plugins/objects/server.js file.\n        let objClass = this.config.getWithoutLogs('server/customClasses/objects/'+objectData.object_class_key, false);\n        let objectClassTypes = this.config?.configList?.server?.objectsClassTypes;\n        if(!objClass && objectClassTypes && objectData.class_type){\n            let objClassData = sc.get(objectClassTypes, objectData.class_type, false);\n            if(objClassData){\n                objClass = objClassData.classInstance;\n            }\n        }\n        if(!objClass){\n            Logger.error('ObjectManager object class type not found.', objectData);\n            return false;\n        }\n        let objProps = Object.assign(\n            {config: this.config, events: this.events, dataServer: this.dataServer},\n            objectData\n        );\n        // @TODO - BETA - Create a memory cache for objects information and avoid the data reload and remap.\n        this.prepareInitialStats(objProps);\n        try {\n            let objectInstance = new objClass(objProps);\n            this.attachToAnimations(objectInstance);\n            if(objectInstance.multiple){\n                objectInstance.objProps = objProps;\n                let subObjClass = false;\n                if(objectClassTypes && objectInstance.childObjectType){\n                    let objClassData = sc.get(objectClassTypes, objectInstance.childObjectType, false);\n                    if(objClassData){\n                        subObjClass = objClassData.classInstance;\n                    }\n                }\n                if(objectInstance.childObjectType && !subObjClass){\n                    Logger.error('ObjectManager sub-object class type not found.', {\n                        objectClassKey: objectData.object_class_key,\n                        childObjectType: objectInstance.childObjectType\n                    });\n                    return false;\n                }\n                objectInstance.classInstance = subObjClass;\n            }\n            this.enrichWithMultipleAnimationsData(objectData, objectInstance);\n            this.attachToMessagesListeners(objectInstance, objectData);\n            this.prepareAssetsPreload(objectData);\n            await this.runAdditionalSetup(objectInstance, objectData);\n            this.events.emit('reldens.afterRunAdditionalSetup', {\n                objectInstance,\n                objectData,\n                objectsManager: this\n            });\n            this.roomObjects[objectInstance.objectIndex] = objectInstance;\n            if(!this.roomObjectsByLayer[objectData.layer_name]){\n                this.roomObjectsByLayer[objectData.layer_name] = {};\n            }\n            this.roomObjectsByLayer[objectData.layer_name][objectData.id] = objectInstance;\n            return objectInstance;\n        } catch (error) {\n            Logger.error('Error while generating object.', error, objectData);\n            return false;\n        }\n    }\n\n    /**\n     * @param {Object} objProps\n     */\n    prepareInitialStats(objProps)\n    {\n        //Logger.debug('Preparing initial stats:', objProps);\n        let stats = sc.get(objProps, 'related_objects_stats', []);\n        if(0 === stats.length){\n            return;\n        }\n        if(!objProps.initialStats){\n            objProps.initialStats = {};\n        }\n        for(let stat of stats){\n            objProps.initialStats[stat.related_stats.key] = stat.value;\n        }\n    }\n\n    /**\n     * @param {Object} objectInstance\n     * @param {Object} objectData\n     * @returns {Promise<boolean|undefined>}\n     */\n    async runAdditionalSetup(objectInstance, objectData)\n    {\n        if(!sc.isObjectFunction(objectInstance, 'runAdditionalSetup')){\n            return false;\n        }\n        objectInstance.runAdditionalSetup({objectsManager: this, objectData});\n    }\n\n    /**\n     * @param {Object} objectData\n     */\n    prepareAssetsPreload(objectData)\n    {\n        //Logger.debug('Preparing object assets preload:', objectData);\n        if(!objectData.related_objects_assets){\n            return false;\n        }\n        for(let asset of objectData.related_objects_assets){\n            // @NOTE: assets can be different types, sprite sheets, images, atlas, etc. We push them\n            // here to later send these to the client along with the sceneData.\n            this.preloadAssets[(asset.object_id || '')+(asset.object_asset_id || '')] = asset;\n        }\n    }\n\n    /**\n     * @param {Object} objectInstance\n     * @param {Object} objectData\n     */\n    attachToMessagesListeners(objectInstance, objectData)\n    {\n        // prepare an object for room messages:\n        if(!sc.hasOwn(objectInstance, 'listenMessages')){\n            return false;\n        }\n        this.listenMessages = true;\n        this.listenMessagesObjects[objectData.id] = objectInstance;\n    }\n\n    /**\n     * @param {Object} objectData\n     * @param {Object} objectInstance\n     */\n    enrichWithMultipleAnimationsData(objectData, objectInstance)\n    {\n        if(!objectData.related_objects_animations){\n            return false;\n        }\n        objectInstance.multipleAnimations = {};\n        for(let anim of objectData.related_objects_animations){\n            // @NOTE: assets can be different types, sprite sheets, images, atlas, etc.\n            // We push them here to later send these to the client along with the sceneData.\n            objectInstance.multipleAnimations[anim.animationKey] = sc.toJson(anim.animationData);\n        }\n    }\n\n    /**\n     * @param {Object} objectInstance\n     */\n    attachToAnimations(objectInstance)\n    {\n        // if the result is an animation instance, then we can include it in the list to send it to the client:\n        if(sc.hasOwn(objectInstance, 'isAnimation') || sc.hasOwn(objectInstance, 'hasAnimation')){\n            this.objectsAnimationsData[objectInstance.objectIndex] = objectInstance.clientParams;\n        }\n    }\n\n    /**\n     * The object instance is created when the world is created since we don't need to overload the server by creating\n     * every object defined if it is not going to be used.\n     *\n     * @param {string} objectIndex\n     * @returns {Object|false}\n     */\n    getObjectData(objectIndex)\n    {\n        if(sc.hasOwn(this.roomObjects, objectIndex)){\n            return this.roomObjects[objectIndex];\n        }\n        return false;\n    }\n\n    /**\n     * @param {Object} rewardObject\n     */\n    removeObjectData(rewardObject)\n    {\n        this.removeFromPreloadAssetsArray(rewardObject.objects_assets);\n        delete this.roomObjects[rewardObject.objectIndex];\n        delete this.objectsAnimationsData[rewardObject.objectIndex];\n    }\n\n    /**\n     * @param {Array<Object>} objectAssets\n     */\n    removeFromPreloadAssetsArray(objectAssets)\n    {\n        for(let objectAsset of objectAssets){\n            delete this.preloadAssets[(objectAsset.object_id || '')+(objectAsset.object_asset_id || '')];\n        }\n    }\n\n}\n\nmodule.exports.ObjectsManager = ObjectsManager;\n"
  },
  {
    "path": "lib/objects/server/object/object-types-classes.js",
    "content": "/**\n *\n * Reldens - ObjectTypesClasses\n *\n */\n\nconst { BaseObject } = require('./type/base-object');\nconst { AnimationObject } = require('./type/animation-object');\nconst { NpcObject } = require('./type/npc-object');\nconst { EnemyObject } = require('./type/enemy-object');\nconst { TraderObject } = require('./type/trader-object');\nconst { DropObject } = require('./type/drop-object');\nconst { MultipleObject } = require('./type/multiple-object');\nconst { ObjectTypes } = require('./object-types');\n\nmodule.exports.ObjectTypesClasses = {\n    [ObjectTypes.BASE]: BaseObject,\n    [ObjectTypes.ANIMATION]: AnimationObject,\n    [ObjectTypes.NPC]: NpcObject,\n    [ObjectTypes.ENEMY]: EnemyObject,\n    [ObjectTypes.TRADER]: TraderObject,\n    [ObjectTypes.DROP]: DropObject,\n    [ObjectTypes.MULTIPLE]: MultipleObject\n};\n"
  },
  {
    "path": "lib/objects/server/object/object-types.js",
    "content": "/**\n *\n * Reldens - ObjectTypes\n *\n */\n\nmodule.exports.ObjectTypes = {\n    BASE: 1,\n    ANIMATION: 2,\n    NPC: 3,\n    ENEMY: 4,\n    TRADER: 5,\n    DROP: 6,\n    MULTIPLE: 7\n};\n"
  },
  {
    "path": "lib/objects/server/object/type/animation-object.js",
    "content": "/**\n *\n * Reldens - AnimationObject\n *\n * Base class for objects with animation capabilities. Extends BaseObject to add animation broadcasting to clients.\n *\n */\n\nconst { BaseObject } = require('./base-object');\nconst { ObjectsConst } = require('../../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../../world/server/physical-body').PhysicalBody} PhysicalBody\n */\nclass AnimationObject extends BaseObject\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {string} */\n        this.type = ObjectsConst.TYPE_ANIMATION;\n        /** @type {boolean} */\n        this.isAnimation = true;\n        /** @type {string} */\n        this.eventsPrefix = this.uid+'.'+ObjectsConst.EVENT_PREFIX.ANIMATION;\n        // @TODO - BETA - Create a ClientParams class.\n        /** @type {Object} */\n        this.clientParams = {\n            type: this.type,\n            enabled: true,\n            ui: true,\n            // @NOTE: by default, we do not have any animations if these are not specified in the object.\n            frameStart: sc.get(props, 'frameStart', 0),\n            frameEnd: sc.get(props, 'frameEnd', 0),\n            repeat: sc.get(props, 'repeat', 0),\n            hideOnComplete: sc.get(props, 'hideOnComplete', false),\n            autoStart: sc.get(props, 'autoStart', false)\n        };\n        this.mapClientParams(props);\n        this.mapPrivateParams(props);\n    }\n\n    /**\n     * @returns {Object}\n     */\n    get animationData()\n    {\n        // @TODO - BETA - Create an AnimationsData class.\n        return {\n            act: this.type,\n            key: this.key,\n            clientParams: this.clientParams,\n            x: this.x,\n            y: this.y\n        };\n    }\n\n    /**\n     * @param {Object} props\n     */\n    onHit(props)\n    {\n        if(!this.runOnHit || !props.room){\n            return;\n        }\n        if(sc.isTrue(this, 'roomVisible')){\n            // run for everyone in the room:\n            props.room.broadcast('*', this.animationData);\n        }\n        if(sc.isTrue(this, 'playerVisible')){\n            let playerBody = sc.hasOwn(props.bodyA, 'playerId') ? props.bodyA : props.bodyB;\n            let client = props.room.getClientById(playerBody.playerId);\n            if(!client){\n                Logger.error('Object hit, client not found by playerId:', playerBody.playerId);\n                return;\n            }\n            client.send('*', this.animationData);\n        }\n    }\n\n    /**\n     * @param {Object} props\n     */\n    onAction(props)\n    {\n        if(!this.runOnAction || !props.room){\n            //Logger.debug('Disabled runOnAction or missing room.');\n            return;\n        }\n        // run for everyone in the room:\n        if(sc.isTrue(this, 'roomVisible')){\n            props.room.broadcast('*', this.animationData);\n        }\n        // run only for the client who executed the action:\n        if(!sc.isTrue(this, 'playerVisible')){\n            let playerId = sc.get(props.playerBody, 'playerId', false);\n            if(!playerId){\n                return;\n            }\n            let client = props.room.getClientById(playerId);\n            if(!client){\n                Logger.error('Object action, client not found by playerId: '+playerId);\n                return;\n            }\n            client.send('*', this.animationData);\n        }\n    }\n\n    /**\n     * @param {PhysicalBody} body\n     * @returns {boolean|undefined}\n     */\n    chaseBody(body)\n    {\n        if(!this.objectBody){\n            Logger.error('Missing object body on chase.', {chasingObjectKey: this.key});\n            return false;\n        }\n        if(!body){\n            Logger.error('Missing player body to chase.', {chasingObjectKey: this.key});\n            return false;\n        }\n        if(!this.objectBody.world){\n            Logger.error('Missing object body world.', this.objectBody.id);\n            return false;\n        }\n        if(!this.objectBody.world.pathFinder){\n            Logger.error('Missing object body world pathfinder.', this.objectBody.id);\n            return false;\n        }\n        this.objectBody.resetAuto();\n        if(this.objectBody.disableObjectsCollisionsOnChase){\n            this.objectBody.setShapesCollisionGroup(0);\n        }\n        body.updateCurrentPoints();\n        let toPoint = {column: body.currentCol, row: body.currentRow};\n        return this.objectBody.moveToPoint(toPoint);\n    }\n\n}\n\nmodule.exports.AnimationObject = AnimationObject;\n"
  },
  {
    "path": "lib/objects/server/object/type/base-object.js",
    "content": "/**\n *\n * Reldens - BaseObject\n *\n * Base class for all game objects with interaction area capabilities.\n *\n */\n\nconst { ObjectsConst } = require('../../../constants');\nconst { InteractionArea, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../../../world/server/physical-body').PhysicalBody} PhysicalBody\n */\nclass BaseObject extends InteractionArea\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super();\n        // assign all the properties from the storage automatically as part of this object:\n        Object.assign(this, props);\n        /** @type {EventsManager} */\n        this.events;\n        if(!this.events){\n            Logger.error('EventsManager undefined in BaseObject.');\n        }\n        /** @type {Object} */\n        this.config;\n        if(!this.config){\n            Logger.error('Config undefined in BaseObject.');\n        }\n        /** @type {BaseDataServer} */\n        this.dataServer;\n        if(!this.dataServer){\n            Logger.error('Data Server undefined in BaseObject.');\n        }\n        /** @type {number|string} */\n        this.appendIndex = sc.get(props, 'tile_index', props.id);\n        /** @type {string} */\n        this.objectIndex = props.layer_name + (this.appendIndex || '-idx-1');\n        /** @type {string} */\n        this.key = props.client_key;\n        /** @type {string} */\n        this.uid = this.key +'-'+ Date.now();\n        /** @type {string} */\n        this.eventsPrefix = this.uid+'.'+ObjectsConst.EVENT_PREFIX.BASE;\n        this.setDefaultProperties();\n        this.mapClientParams(props);\n        this.mapPrivateParams(props);\n    }\n\n    /**\n     * @param {string} [suffix]\n     * @returns {string}\n     */\n    eventUniqueKey(suffix)\n    {\n        return this.eventsPrefix+'.'+(new Date()).getTime()+(suffix ? '.'+suffix : '');\n    }\n\n    setDefaultProperties()\n    {\n        /** @type {boolean} */\n        this.runOnHit = false;\n        /** @type {PhysicalBody|false} */\n        this.objectBody = false;\n        /** @type {boolean} */\n        this.runOnAction = false;\n        /** @type {boolean} */\n        this.playerVisible = false;\n        /** @type {boolean} */\n        this.roomVisible = false;\n        /** @type {Object} */\n        this.clientParams = {};\n    }\n\n    /**\n     * @param {Object} props\n     */\n    mapPrivateParams(props)\n    {\n        // @NOTE: private params will override the object properties:\n        this.privateParamsRaw = props.private_params;\n        let privateParamsObject = sc.toJson(this.privateParamsRaw, {});\n        Object.assign(this, privateParamsObject);\n    }\n\n    /**\n     * @param {Object} props\n     */\n    mapClientParams(props)\n    {\n        // in this specific object type we will use the public params as JSON, this is coming from the storage:\n        let clientParamsObject = sc.toJson(props.client_params, {});\n        Object.assign(this.clientParams, clientParamsObject);\n        this.content = sc.get(this.clientParams, 'content', ObjectsConst.DEFAULTS.BASE_OBJECT.CONTENT);\n        this.options = sc.get(this.clientParams, 'options', ObjectsConst.DEFAULTS.BASE_OBJECT.OPTIONS);\n        this.clientParams.key = this.key;\n        this.clientParams.id = this.id;\n        this.clientParams.targetName = this.title;\n        // @NOTE: we need to send the layer name for later calculate the animation depth and show the animation over\n        // the proper layer.\n        this.clientParams.layerName = props.layer_name;\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async runAdditionalSetup()\n    {\n        // @NOTE: implement what you need here.\n        Logger.info('Method not implemented \"runAdditionalSetup\" on: '+this.key);\n    }\n\n}\n\nmodule.exports.BaseObject = BaseObject;\n"
  },
  {
    "path": "lib/objects/server/object/type/drop-object.js",
    "content": "/**\n *\n * Reldens - DropObject\n *\n * Represents a droppable object/loot that players can pick up.\n *\n */\n\nconst { PickUpObject } = require('../../../../rewards/server/pick-up-object');\nconst { TargetDeterminer } = require('../../../../rewards/server/target-determiner');\nconst { AnimationObject } = require('./animation-object');\nconst { ObjectsConst } = require('../../../constants');\n\nclass DropObject extends AnimationObject\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {string} */\n        this.type = ObjectsConst.DROPS.PICK_UP_ACT;\n        /** @type {string} */\n        this.eventsPrefix = this.uid+'.'+ObjectsConst.EVENT_PREFIX.DROP;\n        /** @type {boolean} */\n        this.listenMessages = true;\n        /** @type {string} */\n        this.clientParams.type = ObjectsConst.DROPS.PICK_UP_ACT;\n        /** @type {boolean} */\n        this.clientParams.isInteractive = true;\n        /** @type {number} */\n        this.interactionArea = this.config.getWithoutLogs(\n            'server/objects/drops/interactionsDistance',\n            this.config.getWithoutLogs('server/objects/actions/interactionsDistance', 40)\n        );\n        /** @type {boolean} */\n        this.autoPickUpOnHit = false;\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<Object|undefined>}\n     */\n    async onHit(props)\n    {\n        super.onHit(props);\n        let playerBody = props.bodyA?.playerId ? props.bodyA : props.bodyB;\n        if(!props.room || !playerBody.playerId){\n            return;\n        }\n        if(!this.autoPickUpOnHit && !this.config.getWithoutLogs('server/objects/drops/autoPickUpOnHit', false)){\n            return;\n        }\n        let playerSchema = props.room.playerBySessionIdFromState(playerBody.playerId);\n        if(!playerSchema){\n            return;\n        }\n        let targetDeterminer = new TargetDeterminer(props.room.featuresManager?.featuresList?.teams.package);\n        return await PickUpObject.execute(this, props.room, playerSchema, targetDeterminer);\n    }\n\n}\n\nmodule.exports.DropObject = DropObject;\n"
  },
  {
    "path": "lib/objects/server/object/type/enemy-object.js",
    "content": "/**\n *\n * Reldens - EnemyObject\n *\n * Enemy NPC with combat abilities, AI behavior, skills, and respawn mechanics.\n *\n */\n\nconst { NpcObject } = require('./npc-object');\nconst { Pve } = require('../../../../actions/server/pve');\nconst { SkillsExtraDataMapper } = require('../../../../actions/server/skills-extra-data-mapper');\nconst { ObjectsConst } = require('../../../constants');\nconst { GameConst } = require('../../../../game/constants');\nconst { SkillConst } = require('@reldens/skills');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../../rooms/server/scene').RoomScene} RoomScene\n */\nclass EnemyObject extends NpcObject\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        this.hasState = true;\n        let configStats = sc.get(props, 'initialStats', this.config.get('server/enemies/initialStats'));\n        this.initialStats = Object.assign({}, configStats);\n        this.stats = Object.assign({}, configStats);\n        this.statsBase = Object.assign({}, configStats);\n        this.type = ObjectsConst.TYPE_ENEMY;\n        this.eventsPrefix = this.uid+'.'+ObjectsConst.EVENT_PREFIX.ENEMY;\n        // @NOTE: we could run different actions and enemies reactions based on the player action.\n        // this.runOnAction = true;\n        // run on hit will make the enemy aggressive when the player enters the enemy-object interactive area.\n        this.runOnHit = sc.get(props, 'runOnHit', true);\n        this.roomVisible = sc.get(props, 'roomVisible', true);\n        this.randomMovement = sc.get(props, 'randomMovement', true);\n        this.startBattleOnHit = sc.get(props, 'startBattleOnHit', true);\n        this.isAggressive = sc.get(props, 'isAggressive', false);\n        this.interactionRadio = sc.get(props, 'interactionRadio', 0);\n        this.updateInitialPosition = sc.get(\n            props,\n            'updateInitialPosition',\n            this.config.getWithoutLogs('server/enemies/updateInitialPosition', true)\n        );\n        this.battle = new Pve({\n            battleTimeOff: sc.get(props, 'battleTimeOff', 20000),\n            chaseMultiple: sc.get(props, 'chaseMultiple', false),\n            events: this.events\n        });\n        // enemy created, setting broadcastKey:\n        this.broadcastKey = this.client_key;\n        this.battle.setTargetObject(this);\n        this.actionsKeys = [];\n        this.actionsTargets = {};\n        this.actions = {};\n        this.enemiesDefaults = this.config.getWithoutLogs('server/enemies/default', {});\n        this.defaultSkillKey = sc.get(props, 'defaultSkillKey', sc.get(this.enemiesDefaults, 'skillKey', ''));\n        this.defaultSkillTarget = sc.get(\n            props,\n            'defaultSkillTarget',\n            sc.get(this.enemiesDefaults, 'skillTarget', ObjectsConst.DEFAULTS.TARGETS.PLAYER)\n        );\n        this.defaultAffectedProperty = sc.get(\n            props,\n            'defaultAffectedProperty',\n            sc.get(this.enemiesDefaults, 'affectedProperty', '')\n        );\n        this.setupDefaultAction();\n        this.respawnTime = false;\n        this.respawnTimer = false;\n        this.respawnTimerInterval = false;\n        this.respawnStateTime = sc.get(props, 'battleTimeOff', 1000);\n        this.respawnStateTimer = false;\n        this.respawnLayer = false;\n        this.postBroadPhaseListener = [];\n        this.mapClientParams(props);\n        this.mapPrivateParams(props);\n        this.skillsExtraDataMapper = new SkillsExtraDataMapper();\n    }\n    /**\n     * @returns {Promise<void>}\n     */\n    async runAdditionalRespawnSetup()\n    {\n        // @NOTE: this will load the object skills every time the instance is created, it can be refactored for\n        // performance, but at the same time it could make easier to hot-plug new skills on an object.\n        await this.setupActions();\n        this.setupAggressiveBehavior();\n        this.events.onWithKey(\n            this.getBattleEndEvent(),\n            await this.onBattleEnd.bind(this),\n            this.eventUniqueKey('battleEnd'),\n            // @NOTE: objects use their uid as a master key for the event listeners.\n            this.uid\n        );\n    }\n\n    setupAggressiveBehavior()\n    {\n        if(!this.isAggressive){\n            return;\n        }\n        this.events.onWithKey(\n            'reldens.sceneRoomOnCreate',\n            this.attachAggressiveBehaviorEvent.bind(this),\n            this.eventUniqueKey('attachAggressiveBehavior'),\n            // @NOTE: objects use their uid as a master key for the event listeners.\n            this.uid\n        );\n    }\n\n    /**\n     * @param {RoomScene} room\n     */\n    attachAggressiveBehaviorEvent(room)\n    {\n        let newPostBroadPhaseListener = (event) => {\n            if(0 === Object.keys(this.battle.inBattleWithPlayers).length){\n                this.waitForPlayersToEnterRespawnArea(event, room);\n            }\n        };\n        this.postBroadPhaseListener.push(newPostBroadPhaseListener);\n        room.roomWorld.on('postBroadphase', newPostBroadPhaseListener);\n    }\n\n    /**\n     * @param {Object} event\n     * @param {RoomScene} room\n     */\n    waitForPlayersToEnterRespawnArea(event, room)\n    {\n        if(0 === event.target.bodies.length){\n            return;\n        }\n        for(let body of event.target.bodies){\n            if(!body.playerId){\n                continue;\n            }\n            if(!body.world){\n                Logger.error('Body world is null.', body.id);\n                continue;\n            }\n            if(!body.world.respawnAreas){\n                // none respawn areas in the current world:\n                continue;\n            }\n            let respawnArea = sc.get(body.world.respawnAreas, this.respawnLayer);\n            if(!respawnArea){\n                continue;\n            }\n            let {currentCol, currentRow} = body.positionToTiles(body.position[0], body.position[1]);\n            let tileIndex = currentRow * body.worldWidth + currentCol;\n            if(!sc.hasOwn(respawnArea.respawnTilesData, tileIndex)){\n                // tile is not part of the respawn area:\n                continue;\n            }\n            if(!this.playerIsOnInteractionArea(body.position)){\n                // the interaction area is active and the distance to the player is too long:\n                continue;\n            }\n            this.startBattleWithPlayer({bodyA: body, room: room});\n        }\n    }\n\n    /**\n     * @param {Array<number>} playerPosition\n     * @returns {boolean}\n     */\n    playerIsOnInteractionArea(playerPosition)\n    {\n        if(!playerPosition[0] || !playerPosition[1]){\n            // if player position is invalid then we don't start the battle:\n            return false;\n        }\n        if(0 === this.interactionRadio){\n            // if none interaction radio was specified, we allow the battle to start:\n            return true;\n        }\n        if(!this.objectBody || !this.objectBody?.position){\n            // if the objectBody is not present, then we allow the battle to start:\n            return true;\n        }\n        let distX = playerPosition[0] - this.objectBody?.position[0];\n        let distY = playerPosition[1] - this.objectBody?.position[1];\n        let distance = Math.sqrt(distX * distX + distY * distY);\n        // check if the distance is less than or equal to the interactionRadio:\n        return distance <= this.interactionRadio;\n    }\n\n    setupDefaultAction()\n    {\n        if('' === this.defaultSkillKey){\n            return;\n        }\n        this.addSkillByKey(this.defaultSkillKey, this.defaultSkillTarget);\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async setupActions()\n    {\n        let objectSkills = await this.dataServer.getEntity('objectsSkills').loadByWithRelations(\n            'object_id',\n            this.id,\n            ['related_skills_skill']\n        );\n        if(!objectSkills){\n            return;\n        }\n        for(let objectSkill of objectSkills){\n            if(!objectSkill.related_skills_skill?.key){\n                Logger.error('Object skill not found.', objectSkill);\n                continue;\n            }\n            let addSkillResult = this.addSkillByKey(objectSkill.related_skills_skill.key, objectSkill.target);\n            if(false === addSkillResult){\n                Logger.error('Could not add a \"'+objectSkill.related_skills_skill.key+'\" skill to object id: '+this.id);\n            }\n        }\n        await this.events.emit('reldens.setupActions', {enemyObject: this});\n    }\n\n    /**\n     * @param {Object} target\n     * @param {Object} executedSkill\n     * @returns {Promise<boolean|undefined>}\n     */\n    async executePhysicalSkill(target, executedSkill)\n    {\n        let targetBody = target.physicalBody || target.objectBody;\n        if(!targetBody){\n            Logger.info('Target body is missing or do not have a body to be hit by a physical object.');\n            return false;\n        }\n        if(!targetBody.world){\n            Logger.error('Target body world is missing. Body ID: '+ targetBody.id);\n            return false;\n        }\n        let thisWorldKey = this.objectBody?.world?.worldKey;\n        let targetWorldKey = targetBody?.world?.worldKey;\n        let enemyObjectUid = this.uid;\n        if(thisWorldKey && targetWorldKey && thisWorldKey !== targetWorldKey){\n            Logger.critical('Garbage enemy instance found.', {\n                enemyObjectUid,\n                thisWorldKey,\n                targetWorldKey\n            });\n            return false;\n        }\n        let messageData = Object.assign({skillKey: executedSkill.key}, executedSkill.owner.getPosition());\n        if(sc.isObjectFunction(executedSkill.owner, 'getSkillExtraData')){\n            let params = {skill: executedSkill, target};\n            Object.assign(messageData, {extraData: executedSkill.owner.getSkillExtraData(params)});\n        }\n        await target.skillsServer.client.runBehaviors(\n            messageData,\n            SkillConst.ACTION_SKILL_AFTER_CAST,\n            SkillConst.BEHAVIOR_BROADCAST,\n            target.player_id\n        );\n        let from = this.getPosition();\n        executedSkill.initialPosition = from;\n        let to = {x: target.state.x, y: target.state.y};\n        let animData = sc.get(this.config.client.skills.animations, executedSkill.key+'_bullet', false);\n        if(animData){\n            executedSkill.animDir = sc.get(animData.animationData, 'dir', false);\n        }\n        targetBody.world.shootBullet(from, to, executedSkill);\n    }\n\n    /**\n     * @param {Object} params\n     * @returns {Object}\n     */\n    getSkillExtraData(params)\n    {\n        return this.skillsExtraDataMapper.extractSkillExtraData(params);\n    }\n\n    /**\n     * @param {string} skillKey\n     * @param {string} skillTarget\n     * @returns {boolean}\n     */\n    addSkillByKey(skillKey, skillTarget)\n    {\n        let skillData = this.config.skills.skillsList[skillKey];\n        if(!skillData){\n            return false;\n        }\n        let skillOwnerData = Object.assign({\n            owner: this,\n            ownerIdProperty: 'uid',\n            eventsPrefix: this.eventsPrefix,\n            affectedProperty: this.defaultAffectedProperty,\n            events: this.events\n        }, skillData['data']);\n        let skillInstance = new skillData['class'](skillOwnerData);\n        this.actionsKeys.push(skillKey);\n        this.actions[skillKey] = skillInstance;\n        this.actionsTargets[skillKey] = skillTarget;\n        return true;\n    }\n\n    /**\n     * @returns {string}\n     */\n    getBattleEndEvent()\n    {\n        return this.eventUniqueKey()+'emittedBattleEnded';\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @returns {Promise<Object|undefined>}\n     */\n    async respawn(room)\n    {\n        // @TODO - BETA - Add respawn to the other object types as well, we could have normal NPCs with respawn.\n        // @NOTE: here we move the body to some place where it can't be reach so it doesn't collide with anything, this\n        // will also make it invisible because the update in the client will move the sprite outside the view.\n        this.objectBody.resetAuto();\n        this.objectBody.stopMove();\n        this.objectBody.collisionResponse = false;\n        this.originalType = this.objectBody.type;\n        this.objectBody.type = this.objectBody.world.bodyTypes.STATIC;\n        if(this.respawnTime){\n            return this.restoreOnTimeOut(room);\n        }\n        return await this.restoreObject(room);\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @returns {number}\n     */\n    restoreOnTimeOut(room)\n    {\n        // let respawnStartTime = Date.now();\n        let intervalId = this.respawnTimerInterval =  setInterval(async () => {\n            /*\n            let elapsedTime = Date.now() - respawnStartTime;\n            let remainingTime = Math.max(0, (this.respawnTime - elapsedTime) / 1000);\n            Logger.debug('Respawn object \"'+this.uid+'\" in: '+remainingTime.toFixed(2)+' seconds.');\n            */\n        }, 1000);\n        this.respawnTimer = setTimeout(async () => {\n            //Logger.debug('Clearing respawn object \"'+this.uid+'\" interval.');\n            clearInterval(intervalId);\n            await this.restoreObject(room);\n        }, this.respawnTime);\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @returns {Promise<void>}\n     */\n    async restoreObject(room)\n    {\n        this.objectBody.collisionResponse = true;\n        this.objectBody.type = this.originalType || this.objectBody.world.bodyTypes.DYNAMIC;\n        this.stats = Object.assign({}, this.initialStats);\n        if(!this.objectBody.world){\n            Logger.warning('Expected on server shutdown, Object world is null on restoreObject method.', this.uid);\n            return;\n        }\n        let interpolationStatus = GameConst.STATUS.AVOID_INTERPOLATION;\n        this.objectBody.bodyState.inState = interpolationStatus;\n        if(interpolationStatus !== this.battle.targetObject.objectBody.bodyState.inState){\n            Logger.warning('Battle target object state miss match, set it to avoid interpolation.');\n            this.battle.targetObject.objectBody.bodyState.inState = interpolationStatus;\n        }\n        if(interpolationStatus !== room.objectsManager.roomObjects[this.objectIndex].objectBody.bodyState.inState){\n            Logger.warning('Objects Manager room object state miss match, set it to avoid interpolation.');\n            room.objectsManager.roomObjects[this.objectIndex].objectBody.bodyState.inState = interpolationStatus;\n        }\n        let respawnArea = this.objectBody.world.respawnAreas[this.respawnLayer];\n        delete respawnArea.usedTiles[this.randomTileIndex];\n        let {randomTileIndex, tileData} = respawnArea.getRandomTile(this.objectIndex);\n        this.randomTileIndex = randomTileIndex;\n        Object.assign(this, tileData);\n        let { x, y } = tileData;\n        this.objectBody.position = [x, y];\n        this.objectBody.bodyState.x = x;\n        this.objectBody.bodyState.y = y;\n        this.updateBodyPositionInitialData(room, x, y);\n        let {currentCol, currentRow} = this.objectBody.positionToTiles(x, y);\n        this.objectBody.originalCol = currentCol;\n        this.objectBody.originalRow = currentRow;\n        await this.events.emit('reldens.restoreObjectAfter', {enemyObject: this, room});\n        //Logger.debug('Respawn: '+this.uid+ ' - Time: '+(this.respawnTime || 1000)+' - Position x/y: '+x+' / '+y);\n        if(0 === this.respawnStateTime){\n            this.setActiveObjectState(room);\n            return;\n        }\n        this.respawnStateTimer = setTimeout(() => {\n            this.setActiveObjectState(room);\n        }, this.respawnStateTime);\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @param {number} x\n     * @param {number} y\n     */\n    updateBodyPositionInitialData(room, x, y)\n    {\n        if(!this.updateInitialPosition){\n            return;\n        }\n        if(!room.state.roomData?.objectsAnimationsData){\n            //Logger.debug('Missing sceneData.objectsAnimationsData: '+this.objectIndex, room.state.roomData);\n            return false;\n        }\n        if(!room.state.roomData.objectsAnimationsData[this.objectIndex]){\n            //Logger.debug('Body not found by ID: '+this.objectIndex);\n            return false;\n        }\n        room.state.roomData.objectsAnimationsData[this.objectIndex].x = x;\n        room.state.roomData.objectsAnimationsData[this.objectIndex].y = y;\n        room.state.mapRoomData();\n    }\n\n    /**\n     * @param {RoomScene} room\n     */\n    setActiveObjectState(room)\n    {\n        try {\n            //Logger.debug('Activated object after respawn: '+this.uid);\n            let activeStatus = GameConst.STATUS.ACTIVE;\n            this.objectBody.bodyState.inState = activeStatus;\n            if(this.battle.targetObject && activeStatus !== this.battle.targetObject.objectBody?.bodyState?.inState){\n                Logger.warning('Battle target object state miss match, set it to active.');\n                this.battle.targetObject.objectBody.bodyState.inState = activeStatus;\n            }\n            if(\n                room?.objectsManager?.roomObjects\n                && room.objectsManager.roomObjects[this.objectIndex]\n                && room.objectsManager.roomObjects[this.objectIndex].objectBody.bodyState\n                && activeStatus !== room.objectsManager.roomObjects[this.objectIndex].objectBody.bodyState.inState\n            ){\n                Logger.warning('Objects Manager room object state miss match, set it to active.');\n                room.objectsManager.roomObjects[this.objectIndex].objectBody.bodyState.inState = activeStatus;\n            }\n        } catch (error) {\n            Logger.debug('Expected if users disconnects while in battle.');\n        }\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>|boolean}\n     */\n    onHit(props)\n    {\n        if(!this.startBattleOnHit){\n            return false;\n        }\n        return this.startBattleWithPlayer(props);\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<Object>|boolean}\n     */\n    startBattleWithPlayer(props)\n    {\n        let room = props.room;\n        if(!room){\n            Logger.error('Required room not found to start battle in Object \"'+this.uid+'\".');\n            return false;\n        }\n        let playerBody = sc.hasOwn(props.bodyA, 'playerId') ? props.bodyA : props.bodyB;\n        if(!playerBody){\n            // expected when an object hits object on CollisionsManager, if a player wasn't hit don't start the battle:\n            return false;\n        }\n        let playerSchema = room.playerBySessionIdFromState(playerBody.playerId);\n        if(!playerSchema){\n            return false;\n        }\n        let affectedProperty = room.config.get('client/actions/skills/affectedProperty', this.defaultAffectedProperty);\n        if(0 === this.stats[affectedProperty]){\n            //Logger.debug('Object is death, do not run battle.', this.uid);\n            // do not start the battle if the object is death:\n            return false;\n        }\n        return this.battle.startBattleWith(playerSchema, props.room).catch((error) => {\n            Logger.error(error);\n        });\n    }\n\n    /**\n     * @returns {Object}\n     */\n    getPosition()\n    {\n        // @TODO - BETA - Check if we need to update and return this.x, this.y or these are just the initial position.\n        return {\n            x: this.state.x,\n            y: this.state.y\n        };\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async onBattleEnd()\n    {\n        Logger.notice('BattleEnd method not implemented for EnemyObject.', this.uid, this.title);\n    }\n\n}\n\nmodule.exports.EnemyObject = EnemyObject;\n"
  },
  {
    "path": "lib/objects/server/object/type/multiple-object.js",
    "content": "/**\n *\n * Reldens - MultipleObject\n *\n * Represents a multiple/respawn object type that can spawn multiple instances.\n *\n */\n\nconst { BaseObject } = require('./base-object');\n\nclass MultipleObject extends BaseObject\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {boolean} */\n        this.multiple = true;\n        /** @type {Function|false} */\n        this.classInstance = false;\n    }\n\n}\n\nmodule.exports.MultipleObject = MultipleObject;\n"
  },
  {
    "path": "lib/objects/server/object/type/npc-object.js",
    "content": "/**\n *\n * Reldens - NpcObject\n *\n * Non-Player Character object with interactive capabilities (dialogs, options).\n *\n */\n\nconst { AnimationObject } = require('./animation-object');\nconst { GameConst } = require('../../../../game/constants');\nconst { ObjectsConst } = require('../../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass NpcObject extends AnimationObject\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        // this is a hardcoded property for this specific object type:\n        this.type = ObjectsConst.TYPE_NPC;\n        this.hasAnimation = true;\n        this.collisionResponse = true;\n        this.eventsPrefix = this.uid+'.'+ObjectsConst.EVENT_PREFIX.NPC;\n        this.listenMessages = true;\n        // interactive objects will react on click:\n        this.clientParams.type = ObjectsConst.TYPE_NPC;\n        this.clientParams.isInteractive = true;\n        // @NOTE: interaction area is how far the player can be from the object to validate the actions on click, this\n        // area will be the valid-margin surrounding the object.\n        this.interactionArea = this.config.get('server/objects/actions/interactionsDistance');\n        this.closeInteractionOnOutOfReach = this.config.getWithoutLogs(\n            'server/objects/actions/closeInteractionOnOutOfReach',\n            true\n        );\n        this.sendInvalidOptionMessage = false;\n        this.invalidOptionMessage = ObjectsConst.SNIPPETS.NPC_INVALID;\n        this.mapClientParams(props);\n        this.mapPrivateParams(props);\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean|undefined>}\n     */\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        // validate for object interaction, object id and interaction area:\n        if(false === this.isValidId(data)){\n            return false;\n        }\n        let isObjectOptionInteractionMessage = this.isObjectOptionInteractionMessage(data);\n        if(false === this.isObjectInteractionMessage(data) && false === isObjectOptionInteractionMessage){\n            return false;\n        }\n        if(true === isObjectOptionInteractionMessage && false === this.isValidOptionIndexValue(data.value, client)){\n            Logger.error('Object \"'+this.key+'\" invalid option \"'+data.value+'\" from client \"'+client.sessionId+'\"');\n            return false;\n        }\n        if(false === this.isValidInteraction(playerSchema.state.x, playerSchema.state.y)){\n            this.outOfReachClose(client);\n            return false;\n        }\n        let activationData = {act: GameConst.UI, id: this.id};\n        if(this.title){\n            activationData.title = this.title;\n        }\n        if(this.content){\n            activationData.content = this.content;\n        }\n        if(0 < Object.keys(this.options).length){\n            // @TODO - BETA - Extend feature to generate different flows, this will help on easily create quests, for\n            //   example we could request confirmation about a choice.\n            activationData.options = this.options;\n        }\n        client.send('*', activationData);\n    }\n\n    /**\n     * @param {Object} client\n     */\n    outOfReachClose(client)\n    {\n        if(!this.closeInteractionOnOutOfReach){\n            return false;\n        }\n        client.send('*', {act: GameConst.CLOSE_UI_ACTION, id: this.id});\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {boolean}\n     */\n    isValidId(data)\n    {\n        return Number(this.id) === Number(sc.get(data, 'id', false));\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {boolean}\n     */\n    isObjectInteractionMessage(data)\n    {\n        return (ObjectsConst.OBJECT_INTERACTION).toString() === (sc.get(data, 'act', '')).toString();\n    }\n\n    /**\n     * @param {Object} data\n     * @returns {boolean}\n     */\n    isObjectOptionInteractionMessage(data)\n    {\n        return (GameConst.BUTTON_OPTION).toString() === (sc.get(data, 'act', '')).toString();\n    }\n\n    /**\n     * @param {string} optionIdx\n     * @param {Object} client\n     * @returns {boolean}\n     */\n    isValidOptionIndexValue(optionIdx, client)\n    {\n        if(sc.hasOwn(this.options, optionIdx)){\n            return true;\n        }\n        if(this.sendInvalidOptionMessage){\n            client.send('*', {act: GameConst.UI, id: this.id, content: this.invalidOptionMessage});\n        }\n        return false;\n    }\n\n}\n\nmodule.exports.NpcObject = NpcObject;\n"
  },
  {
    "path": "lib/objects/server/object/type/trader-object.js",
    "content": "/**\n *\n * Reldens - TraderObject\n *\n * Trading NPC with inventory that can buy and sell items to players.\n *\n */\n\nconst { NpcObject } = require('./npc-object');\nconst { ObjectsConst } = require('../../../constants');\nconst { Processor } = require('../../../../inventory/server/exchange/processor');\nconst { GameConst } = require('../../../../game/constants');\nconst { ItemsFactory } = require('../../../../inventory/server/items-factory');\nconst {\n    ItemsManager,\n    ItemsEvents,\n    RequirementsCollection,\n    RewardsCollection,\n    ItemsConst\n} = require('@reldens/items-system');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../../users/server/player').Player} Player\n */\nclass TraderObject extends NpcObject\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        this.type = ObjectsConst.TYPE_TRADER;\n        this.eventsPrefix = this.uid+'.'+ObjectsConst.EVENT_PREFIX.TRADER;\n        this.clientParams.type = ObjectsConst.TYPE_TRADER;\n        this.sendInvalidOptionMessage = true;\n        this.inventory = false;\n        this.exchangeRequirementsA = new RequirementsCollection();\n        this.exchangeRewardsB = new RewardsCollection();\n        this.tradesInProgress = {};\n        this.configuredItemClasses = this.config.getWithoutLogs('server/customClasses/inventory/items', {});\n        this.configuredGroupClasses = this.config.getWithoutLogs('server/customClasses/inventory/groups', {});\n        this.dataServer = false;\n        this.content = sc.get(this.clientParams, 'content', ObjectsConst.SNIPPETS.TRADER.CONTENT);\n        this.options = sc.get(this.clientParams, 'options', {\n            buy: {\n                label: ObjectsConst.SNIPPETS.TRADER.OPTIONS.BUY,\n                value: ObjectsConst.DEFAULTS.TRADER_OBJECT.OPTIONS.BUY\n            },\n            sell: {\n                label: ObjectsConst.SNIPPETS.TRADER.OPTIONS.SELL,\n                value: ObjectsConst.DEFAULTS.TRADER_OBJECT.OPTIONS.SELL\n            }\n        });\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<void>}\n     */\n    async runAdditionalSetup(props)\n    {\n        this.dataServer = sc.get(props.objectsManager, 'dataServer', false);\n        if(false === this.dataServer){\n            Logger.error('Data Server was not specified.');\n            return;\n        }\n        await this.createObjectInventory();\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async createObjectInventory()\n    {\n        let objectsInventoryRepository = this.dataServer.getEntity('objectsItemsInventory');\n        let itemsModelsList = await objectsInventoryRepository.loadByWithRelations(\n            'owner_id',\n            this.id,\n            ['related_items_item.related_items_item_modifiers']\n        );\n        if(0 === itemsModelsList.length){\n            Logger.error('Object does not have any items assigned.');\n            return;\n        }\n        await this.enrichWithLoadedRequirements();\n        await this.enrichWithLoadedRewards();\n        // @NOTE: here we create an ItemsManager and not an ItemsServer because the object is not connected to any\n        // specific client, so we need to send the object items \"manually\" to the current client on each message.\n        this.inventory = new ItemsManager({\n            owner: this,\n            eventsManager: this.events,\n            itemClasses: this.configuredItemClasses,\n            groupClasses: this.configuredGroupClasses,\n            itemsModelData: this.config.inventory.items\n        });\n        let itemsInstances = await ItemsFactory.fromModelsList(itemsModelsList, this.inventory);\n        if(false === itemsInstances){\n            Logger.error('Item instances could not be created.');\n            return;\n        }\n        await this.inventory.fireEvent(ItemsEvents.LOADED_OWNER_ITEMS, this, itemsInstances, itemsModelsList);\n        await this.inventory.setItems(itemsInstances);\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async enrichWithLoadedRequirements()\n    {\n        let objectsItemsRequirementsRepository = this.dataServer.getEntity('objectsItemsRequirements');\n        let exchangeRequirementsModelsList = await objectsItemsRequirementsRepository.loadBy('object_id', this.id);\n        if(0 === exchangeRequirementsModelsList.length){\n            return;\n        }\n        for(let exchangeRequirement of exchangeRequirementsModelsList){\n            this.exchangeRequirementsA.add(\n                // @Note: uid is used for the requirement key but for our \"buy\" process we don't need different items\n                // with the same key for different requirements.\n                exchangeRequirement.item_key,\n                exchangeRequirement.item_key,\n                exchangeRequirement.required_item_key,\n                exchangeRequirement.required_quantity,\n                exchangeRequirement.auto_remove_requirement\n            );\n        }\n    }\n\n    /**\n     * @returns {Promise<void>}\n     */\n    async enrichWithLoadedRewards()\n    {\n        let objectsItemsRewardsRepository = this.dataServer.getEntity('objectsItemsRewards');\n        let exchangeRewardsModelsList = await objectsItemsRewardsRepository.loadBy('object_id', this.id);\n        if(0 === exchangeRewardsModelsList.length){\n            return;\n        }\n        for(let exchangeReward of exchangeRewardsModelsList){\n            this.exchangeRewardsB.add(\n                // @Note: uid is used for the reward key but for our \"sell\" process we don't need different items with\n                // the same key for different rewards.\n                exchangeReward.item_key,\n                exchangeReward.item_key,\n                exchangeReward.reward_item_key,\n                exchangeReward.reward_quantity,\n                exchangeReward.reward_item_is_required\n            );\n        }\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {Object} room\n     * @param {Player} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        let tradeKey = playerSchema.player_id;\n        if(this.shouldCancelExchange(data, tradeKey)){\n            this.tradesInProgress[tradeKey].cancelExchange();\n            return false;\n        }\n        let superResult = await super.executeMessageActions(client, data, room, playerSchema);\n        if(false === superResult){\n            return false;\n        }\n        let tradeAction = sc.get(data, 'value', 'init');\n        let inventoryKey = this.mapInventoryKeyFromAction(tradeAction);\n        if(false === inventoryKey){\n            if('init' !== tradeAction){\n                Logger.error('Undefined inventory key for action: \"'+tradeAction+'\".');\n            }\n            return false;\n        }\n        let subActionParam = sc.get(data, ObjectsConst.TRADE_ACTIONS.SUB_ACTION, false);\n        let mappedSubAction = this.mapSubAction(subActionParam);\n        if(false !== mappedSubAction && sc.isFunction(Processor[mappedSubAction])){\n            return await this.processSubAction(mappedSubAction, tradeKey, data, playerSchema, inventoryKey, tradeAction, client);\n        }\n        return await this.initializeTransaction(tradeKey, data, playerSchema, inventoryKey, tradeAction, client);\n    }\n\n    /**\n     * @param {string|number} tradeKey\n     * @param {Object} data\n     * @param {Player} playerSchema\n     * @param {string} inventoryKey\n     * @param {string} tradeAction\n     * @param {Object} client\n     * @returns {Promise<boolean>}\n     */\n    async initializeTransaction(tradeKey, data, playerSchema, inventoryKey, tradeAction, client)\n    {\n        let exchangeRequirementsA = sc.get(this, 'exchangeRequirementsA', new RequirementsCollection());\n        let exchangeRewardsB = sc.get(this, 'exchangeRewardsB', new RewardsCollection());\n        // @TODO - BETA - Transaction initialization and requirements could be sent only once to each client.\n        let params = {\n            data,\n            from: this.inventory,\n            to: playerSchema.inventory.manager,\n            exchangeRequirementsA,\n            exchangeRewardsB\n        };\n        params['dropExchangeA'] = true;\n        if(ItemsConst.TRADE_ACTIONS.BUY === tradeAction){\n            params['avoidExchangeDecreaseA'] = true;\n        }\n        this.tradesInProgress[tradeKey] = await Processor.init(params);\n        if(false === this.tradesInProgress[tradeKey]){\n            return this.transactionError(playerSchema, 'Transaction could not be initialized.');\n        }\n        // on \"sell\" we will send the items of the player, on \"buy\" we will send this object items:\n        let inventory = this.tradesInProgress[tradeKey].inventories[inventoryKey];\n        let inventoryItems = inventory.items;\n        // @TODO - BETA - Refactor when include false conditions in the shortcuts.\n        if(ItemsConst.TRADE_ACTIONS.SELL === tradeAction){\n            inventoryItems = [\n                ...(inventory.findItemsByPropertyValue('equipped', false) || []),\n                ...(inventory.findItemsByPropertyValue('equipped', undefined) || [])];\n        }\n        let sendData = {\n            act: GameConst.UI,\n            id: this.id,\n            result: {\n                action: tradeAction,\n                items: playerSchema.inventory.client.extractItemsDataForSend(inventoryItems),\n                exchangeRequirementsA: exchangeRequirementsA.requirements,\n                exchangeRewardsB: exchangeRewardsB.rewards\n            },\n            listener: 'traderObject'\n        };\n        client.send('*', sendData);\n        return true;\n    }\n\n    /**\n     * @param {string} mappedSubAction\n     * @param {string|number} tradeKey\n     * @param {Object} data\n     * @param {Player} playerSchema\n     * @param {string} inventoryKey\n     * @param {string} tradeAction\n     * @param {Object} client\n     * @returns {Promise<boolean>}\n     */\n    async processSubAction(mappedSubAction, tradeKey, data, playerSchema, inventoryKey, tradeAction, client)\n    {\n        if(false === sc.get(this.tradesInProgress, tradeKey, false)){\n            let result = await this.initializeTransaction(\n                tradeKey,\n                data,\n                playerSchema,\n                inventoryKey,\n                tradeAction,\n                client\n            );\n            if(false === result){\n                Logger.error(\n                    'Transaction could not be initialized on sub-action process.',\n                    data,\n                    tradeKey,\n                    tradeAction\n                );\n                return false;\n            }\n        }\n        let subActionResult = await Processor[mappedSubAction]({\n            transaction: this.tradesInProgress[tradeKey],\n            data,\n            inventoryKey\n        });\n        let inventory = this.tradesInProgress[tradeKey].inventories[inventoryKey];\n        let inventoryItems = inventory.items;\n        // @TODO - BETA - Refactor when include false conditions in the shortcuts and a new property \"canBeTraded\".\n        if(ItemsConst.TRADE_ACTIONS.SELL === tradeAction){\n            inventoryItems = [\n                ...(inventory.findItemsByPropertyValue('equipped', false) || []),\n                ...(inventory.findItemsByPropertyValue('equipped', undefined) || [])\n            ];\n        }\n        let sendData = {\n            act: GameConst.UI,\n            id: this.id,\n            result: {\n                action: tradeAction,\n                subAction: mappedSubAction,\n                subActionResult: Boolean(subActionResult),\n                lastErrorMessage: this.tradesInProgress[tradeKey].lastError.code,\n                lastErrorData: this.tradesInProgress[tradeKey].lastError.data,\n                exchangeData: this.tradesInProgress[tradeKey].exchangeBetween,\n                items: playerSchema.inventory.client.extractItemsDataForSend(inventoryItems),\n                exchangeRequirementsA: this.exchangeRequirementsA?.requirements || [],\n                exchangeRewardsB: this.exchangeRewardsB?.rewards || []\n            },\n            listener: 'traderObject'\n        };\n        client.send('*', sendData);\n        if(true === subActionResult && ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.CONFIRM === mappedSubAction){\n            delete this.tradesInProgress[tradeKey];\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} data\n     * @param {string|number} tradeKey\n     * @returns {boolean}\n     */\n    shouldCancelExchange(data, tradeKey)\n    {\n        return GameConst.CLOSE_UI_ACTION === data.act\n            && this.id === data.id\n            && this.tradesInProgress[tradeKey];\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {string} message\n     * @returns {boolean}\n     */\n    transactionError(playerSchema, message)\n    {\n        Logger.error(message, {\n            'Player ID': sc.get(playerSchema, 'player_id', 'Undefined'),\n            'Trade in progress': sc.get(this.tradesInProgress, playerSchema.player_id, 'None')\n        });\n        return false;\n    }\n\n    /**\n     * @param {string} action\n     * @returns {string|false}\n     */\n    mapInventoryKeyFromAction(action)\n    {\n        return sc.get(ObjectsConst.DEFAULTS.TRADER_OBJECT.INVENTORY_MAP, action, false);\n    }\n\n    /**\n     * @param {string|false} subAction\n     * @returns {string|false}\n     */\n    mapSubAction(subAction)\n    {\n        if(false === subAction || '' === subAction){\n            return false;\n        }\n        let map = {\n            [ObjectsConst.TRADE_ACTIONS.ADD]: ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.ADD,\n            [ObjectsConst.TRADE_ACTIONS.REMOVE]: ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.REMOVE,\n            [ObjectsConst.TRADE_ACTIONS.CONFIRM]: ObjectsConst.TRADE_ACTIONS_FUNCTION_NAME.CONFIRM\n        }\n        return sc.get(map, subAction, false);\n    }\n\n}\n\nmodule.exports.TraderObject = TraderObject;\n"
  },
  {
    "path": "lib/objects/server/plugin.js",
    "content": "/**\n *\n * Reldens - Objects Server Plugin\n *\n * Server-side plugin for managing game objects configuration and class types.\n *\n */\n\nconst { ObjectsClassTypeHandler } = require('./handler/objects-class-type');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { ErrorManager, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass ObjectsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    setup(props)\n    {\n        /** @type {ObjectsClassTypeHandler|false} */\n        this.objectsClassTypeHandler = false;\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            ErrorManager.error('EventsManager undefined in RewardsPlugin.');\n        }\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        this.events.on('reldens.serverConfigFeaturesReady', async (event) => {\n            this.objectsClassTypeHandler = new ObjectsClassTypeHandler(event.configProcessor.dataServer);\n            await this.objectsClassTypeHandler.setOnConfig(event.configProcessor);\n        });\n        return true;\n    }\n\n}\n\nmodule.exports.ObjectsPlugin = ObjectsPlugin;\n"
  },
  {
    "path": "lib/prediction/client/player-engine-prediction.js",
    "content": "/**\n *\n * Reldens - PlayerEnginePrediction\n *\n * Extends PlayerEngine with client-side movement prediction and server reconciliation.\n * Predicts player position locally before receiving server confirmation, then reconciles\n * any discrepancies. Reduces perceived input lag by immediately showing movement locally\n * while waiting for authoritative server updates.\n *\n */\n\nconst { PlayerEngine } = require('../../users/client/player-engine');\nconst { GameConst } = require('../../game/constants');\n\n/**\n * @typedef {import('../../users/client/player-engine').PlayerEngine} PlayerEngine\n */\nclass PlayerEnginePrediction extends PlayerEngine\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super(props);\n        /** @type {Object|boolean} */\n        this.predictionBody = false;\n        /** @type {Object|boolean} */\n        this.positionFromServer = false;\n        let reconciliationTimeOutMs = this.gameManager.config.get('client/players/reconciliation/timeOutMs');\n        /** @type {number} */\n        this.reconciliationTimeOutMs = (false === reconciliationTimeOutMs) ? 1000 : Number(reconciliationTimeOutMs);\n    }\n\n    left()\n    {\n        if('pressed' === this.lastKeyState[GameConst.LEFT]){\n            return;\n        }\n        let sendData = {dir: GameConst.LEFT};\n        this.lastKeyState[GameConst.LEFT] = 'pressed';\n        if(this.predictionBody){\n            sendData.time = this.scene.worldPredictionTimer.currentTime;\n            this.predictionBody.initMove(GameConst.LEFT, true);\n        }\n        this.roomEvents.send(sendData);\n    }\n\n    right()\n    {\n        if('pressed' === this.lastKeyState[GameConst.RIGHT]){\n            return;\n        }\n        this.lastKeyState[GameConst.RIGHT] = 'pressed';\n        let sendData = {dir: GameConst.RIGHT};\n        if(this.predictionBody){\n            sendData.time = this.scene.worldPredictionTimer.currentTime;\n            this.predictionBody.initMove(GameConst.RIGHT, true);\n        }\n        this.roomEvents.send(sendData);\n    }\n\n    up()\n    {\n        if('pressed' === this.lastKeyState[GameConst.UP]){\n            return;\n        }\n        this.lastKeyState[GameConst.UP] = 'pressed';\n        let sendData = {dir: GameConst.UP};\n        if(this.predictionBody){\n            sendData.time = this.scene.worldPredictionTimer.currentTime;\n            this.predictionBody.initMove(GameConst.UP, true);\n        }\n        this.roomEvents.send(sendData);\n    }\n\n    down()\n    {\n        if('pressed' === this.lastKeyState[GameConst.DOWN]){\n            return;\n        }\n        this.lastKeyState[GameConst.DOWN] = 'pressed';\n        let sendData = {dir: GameConst.DOWN};\n        if(this.predictionBody){\n            sendData.time = this.scene.worldPredictionTimer.currentTime;\n            this.predictionBody.initMove(GameConst.DOWN, true);\n        }\n        this.roomEvents.send(sendData);\n    }\n\n    stop()\n    {\n        this.lastKeyState[GameConst.LEFT] = '';\n        this.lastKeyState[GameConst.RIGHT] = '';\n        this.lastKeyState[GameConst.UP] = '';\n        this.lastKeyState[GameConst.DOWN] = '';\n        let sendData = {act: GameConst.STOP};\n        if(this.predictionBody){\n            sendData.time = this.scene.worldPredictionTimer.currentTime;\n            this.reconcilePosition();\n        }\n        this.roomEvents.send(sendData);\n    }\n\n    reconcilePosition()\n    {\n        if(!this.predictionBody || !this.positionFromServer){\n            return;\n        }\n        this.predictionBody.stopFull();\n        setTimeout(() => {\n            this.predictionBody.position[0] = this.positionFromServer.state.x;\n            this.predictionBody.position[1] = this.positionFromServer.state.y;\n            this.predictionBody.dir = this.positionFromServer.state.dir;\n            this.updatePlayer(this.playerId, this.positionFromServer);\n        }, this.reconciliationByTimeOutMs());\n    }\n\n    reconciliationTimeOutCallBack()\n    {\n        return false;\n    }\n\n    /**\n     * @returns {number}\n     */\n    reconciliationByTimeOutMs()\n    {\n        let callbackResult = this.reconciliationTimeOutCallBack();\n        return Number(false !== callbackResult ? callbackResult : this.reconciliationTimeOutMs);\n    }\n\n    /**\n     * @param {Object} pointer\n     */\n    moveToPointer(pointer)\n    {\n        this.lastKeyState[GameConst.LEFT] = '';\n        this.lastKeyState[GameConst.RIGHT] = '';\n        this.lastKeyState[GameConst.UP] = '';\n        this.lastKeyState[GameConst.DOWN] = '';\n        let data = {\n            act: GameConst.POINTER,\n            column: pointer.worldColumn,\n            row: pointer.worldRow,\n            x: pointer.worldX - this.leftOff,\n            y: pointer.worldY - this.topOff\n        };\n        if(this.predictionBody && this.pointsValidator){\n            this.reconcilePosition();\n            let predictionData = Object.assign({}, data);\n            predictionData = this.pointsValidator.makeValidPoints(predictionData);\n            this.predictionBody.moveToPoint(predictionData);\n        }\n        this.roomEvents.send(data);\n    }\n}\n\nmodule.exports.PlayerEnginePrediction = PlayerEnginePrediction;\n"
  },
  {
    "path": "lib/prediction/client/plugin.js",
    "content": "/**\n *\n * Reldens - Prediction Client Plugin\n *\n * Client-side plugin that enables experimental client prediction feature. Hooks into game\n * initialization to override RoomEvents methods and create prediction physics worlds,\n * reducing perceived input latency by predicting movement locally before server confirmation.\n *\n */\n\nconst { PredictionWorldCreator } = require('./prediction-world-creator');\nconst { RoomEventsOverride } = require('./room-events-override');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n *\n * @typedef {Object} PredictionPluginProps\n * @property {GameManager} gameManager\n * @property {EventsManager} events\n */\nclass PredictionPlugin extends PluginInterface\n{\n\n    /**\n     * @param {PredictionPluginProps} props\n     * @returns {Promise<void>}\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {PredictionWorldCreator} */\n        this.predictionWorldCreator = new PredictionWorldCreator();\n        /** @type {RoomEventsOverride} */\n        this.roomEventsOverride = new RoomEventsOverride();\n        if(this.validateProperties()){\n            this.listenEvents();\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    validateProperties()\n    {\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in PredictionPlugin.');\n            return false;\n        }\n        if(!this.events){\n            Logger.error('EventsManager undefined in PredictionPlugin.');\n            return false;\n        }\n        return true;\n    }\n\n    listenEvents()\n    {\n        this.events.on('reldens.createEngineSceneDone', async (event) => {\n            await this.predictionWorldCreator.createSceneWorld(event.currentScene);\n        });\n        this.events.on('reldens.createdRoomsEventsInstance', (joinedFirstRoom, gameManager) => {\n            this.roomEventsOverride.createCurrentPlayerOverride(gameManager.activeRoomEvents);\n            this.roomEventsOverride.playerOnChangeOverride(gameManager.activeRoomEvents);\n            this.roomEventsOverride.createPlayerEngineInstanceOverride(gameManager.activeRoomEvents);\n            this.roomEventsOverride.createSceneInstanceOverride(gameManager.activeRoomEvents);\n        });\n    }\n\n}\n\nmodule.exports.PredictionPlugin = PredictionPlugin;\n"
  },
  {
    "path": "lib/prediction/client/prediction-world-creator.js",
    "content": "/**\n *\n * Reldens - Prediction World Creator\n *\n * Creates a client-side physics world for movement prediction. Replicates the server's\n * P2 physics world on the client, enabling immediate local movement simulation while\n * waiting for server confirmation. Handles collision layers, player bodies, and world step timing.\n *\n */\n\nconst { CollisionsManager } = require('../../world/server/collisions-manager');\nconst { P2world } = require('../../world/server/p2world');\nconst { WorldPointsValidator } = require('../../world/world-points-validator');\nconst { WorldTimer } = require('../../world/world-timer');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/scene-dynamic').SceneDynamic} SceneDynamic\n */\nclass PredictionWorldCreator\n{\n\n    /**\n     * @param {SceneDynamic} scene\n     * @returns {Promise<void>}\n     */\n    async createSceneWorld(scene)\n    {\n        if(!scene.experimentalClientPrediction){\n            return;\n        }\n        let validLayers = this.findValidLayers(scene);\n        let mapJson = this.cloneMapJson(scene, validLayers);\n        let worldData = {\n            sceneName: scene.key,\n            roomId: scene.params.roomId,\n            roomMap: scene.params.roomMap,\n            mapJson,\n            config: scene.configManager,\n            events: scene.eventsManager,\n            allowSimultaneous: scene.configManager.get('client/general/controls/allowSimultaneousKeys', true),\n            worldConfig: scene.gameManager.activeRoomEvents.roomData?.worldConfig || scene.worldConfig\n        };\n        scene.worldPrediction = this.createWorldInstance(worldData);\n        scene.worldPrediction.createLimits();\n        await scene.worldPrediction.createWorldContent({});\n        let currentPlayer = scene.gameManager.getCurrentPlayer();\n        if(!currentPlayer){\n            Logger.error('Current player not present for prediction.');\n            return;\n        }\n        let playerData = {\n            id: currentPlayer.playerId,\n            width: scene.configManager.get('client/players/physicalBody/width'),\n            height: scene.configManager.get('client/players/physicalBody/height'),\n            bodyState: currentPlayer.state\n            // @TODO - BETA - Check speed is required here.\n        };\n        let predictionBody = scene.worldPrediction.createPlayerBody(playerData);\n        predictionBody.updateBodyState = this.updateBodyStateOverride(predictionBody, currentPlayer);\n        currentPlayer.predictionBody = predictionBody;\n        scene.worldPredictionTimer = new WorldTimer({\n            callbacks: [() => {\n                if(!scene.worldPrediction){\n                    Logger.error('Scene World not longer exists.', scene.roomWorld);\n                    return;\n                }\n                scene.worldPrediction.removeBodiesFromWorld();\n            }]\n        });\n        scene.worldPredictionTimer.startWorldSteps(scene.worldPrediction);\n        scene.collisionsManager = new CollisionsManager({roomWorld: scene.worldPrediction});\n        currentPlayer.pointsValidator = new WorldPointsValidator(mapJson.width, mapJson.height);\n    }\n\n    /**\n     * @param {SceneDynamic} scene\n     * @param {Array<Object>} validLayers\n     * @returns {Object}\n     */\n    cloneMapJson(scene, validLayers)\n    {\n        return Object.assign(\n            {},\n            (scene.cache?.tilemap?.entries?.entries[scene.tileset.name]?.data || {}),\n            {layers: validLayers}\n        );\n    }\n\n    /**\n     * @param {SceneDynamic} scene\n     * @returns {Array<Object>}\n     */\n    findValidLayers(scene)\n    {\n        let validLayers = [];\n        for(let layer of scene.cache.tilemap.entries.entries[scene.tileset.name].data.layers){\n            if(-1 !== layer.name.indexOf('collision')){\n                validLayers.push(layer);\n            }\n        }\n        return validLayers;\n    }\n\n    /**\n     * @param {Object} predictionBody\n     * @param {Object} currentPlayer\n     * @returns {Function}\n     */\n    updateBodyStateOverride(predictionBody, currentPlayer)\n    {\n        return () => {\n            if(!sc.hasOwn(predictionBody.bodyState, 'x') || !sc.hasOwn(predictionBody.bodyState, 'y')){\n                return;\n            }\n            if(!predictionBody.position[0] || !predictionBody.position[1]){\n                return;\n            }\n            // only update the body if it moves:\n            if(predictionBody.isNotMoving()){\n                predictionBody.bodyState.mov = false;\n                return;\n            }\n            // update position:\n            if(predictionBody.bodyState.x !== predictionBody.position[0]){\n                predictionBody.bodyState.x = predictionBody.position[0];\n            }\n            if(predictionBody.bodyState.y !== predictionBody.position[1]){\n                predictionBody.bodyState.y = predictionBody.position[1];\n            }\n            // start or stop animation:\n            let newStateMov = 0 !== Number(Number(predictionBody.velocity[0]).toFixed(2))\n                || 0 !== Number(predictionBody.velocity[1].toFixed(2));\n            if(predictionBody.bodyState.mov !== newStateMov){\n                predictionBody.bodyState.mov = newStateMov;\n            }\n            let state = {\n                x: predictionBody.position[0],\n                y: predictionBody.position[1],\n                dir: predictionBody.bodyState.dir\n            };\n            currentPlayer.updatePlayer(currentPlayer.playerId, {state});\n        };\n    }\n\n    /**\n     * @param {Object} worldData\n     * @returns {P2world}\n     */\n    createWorldInstance(worldData)\n    {\n        return new P2world(worldData);\n    }\n}\n\nmodule.exports.PredictionWorldCreator = PredictionWorldCreator;\n"
  },
  {
    "path": "lib/prediction/client/room-events-override.js",
    "content": "/**\n *\n * Reldens - Room Events Override\n *\n * Overrides core RoomEvents methods to enable client-side prediction functionality.\n * Modifies player creation, position updates, scene instantiation, and player engine initialization\n * to support experimental prediction features for reduced perceived latency.\n *\n */\n\nconst { PlayerEnginePrediction} = require('./player-engine-prediction');\nconst { SceneDynamic } = require('../../game/client/scene-dynamic');\n\n/**\n * @typedef {import('../../game/client/room-events').RoomEvents} RoomEvents\n */\nclass RoomEventsOverride\n{\n\n    /**\n     * @param {RoomEvents} roomEvents\n     */\n    createCurrentPlayerOverride(roomEvents)\n    {\n        roomEvents.createCurrentPlayer = async (player, previousScene, key) => {\n            roomEvents.engineStarted = true;\n            await roomEvents.startEngineScene(player, roomEvents.room, previousScene);\n            let currentScene = roomEvents.getActiveScene();\n            if(!roomEvents.isValidScene(currentScene, player)){\n                return false;\n            }\n            // process players queue after player was created:\n            await roomEvents.events.emit('reldens.playersQueueBefore', player, key, previousScene, roomEvents);\n            for(let i of Object.keys(roomEvents.playersQueue)){\n                currentScene.player.addPlayer(i, roomEvents.playersQueue[i]);\n            }\n            if(currentScene.experimentalClientPrediction){\n                currentScene.player.positionFromServer = player;\n            }\n            let eventData = {player, key, previousScene, roomEvents: roomEvents};\n            await roomEvents.events.emit('reldens.createCurrentPlayer', eventData);\n            return eventData;\n        };\n    }\n\n    /**\n     * @param {RoomEvents} roomEvents\n     */\n    playerOnChangeOverride(roomEvents)\n    {\n        roomEvents.playersOnChange = (player, key, from) => {\n            // do not move the player if it is changing the scene:\n            if(player.state.scene !== roomEvents.roomName){\n                return;\n            }\n            let currentScene = roomEvents.getActiveScene();\n            if(!roomEvents.playerExists(currentScene, key)){\n                return;\n            }\n            if(currentScene.experimentalClientPrediction && roomEvents.isCurrentPlayer(key)){\n                currentScene.player.positionFromServer = player;\n                return;\n            }\n            currentScene.player.updatePlayer(key, player);\n        };\n    }\n\n    /**\n     * @param {RoomEvents} roomEvents\n     */\n    createSceneInstanceOverride(roomEvents)\n    {\n        roomEvents.createSceneInstance = (sceneName, sceneData, gameManager) => {\n            let newSceneDynamic = new SceneDynamic(sceneName, sceneData, gameManager);\n            newSceneDynamic.experimentalClientPrediction = gameManager.config.get(\n                'client/general/engine/experimentalClientPrediction'\n            );\n            newSceneDynamic.worldPrediction = false;\n            return newSceneDynamic;\n        }\n    }\n\n    /**\n     * @param {RoomEvents} roomEvents\n     */\n    createPlayerEngineInstanceOverride(roomEvents)\n    {\n        roomEvents.createPlayerEngineInstance = (currentScene, player, gameManager, room) => {\n            return new PlayerEnginePrediction({scene: currentScene, playerData: player, gameManager, room});\n        };\n    }\n}\n\nmodule.exports.RoomEventsOverride = RoomEventsOverride;\n"
  },
  {
    "path": "lib/respawn/server/entities/respawn-entity-override.js",
    "content": "/**\n *\n * Reldens - RespawnEntityOverride\n *\n * Overrides the base respawn entity configuration for admin panel display customization.\n *\n */\n\nconst { RespawnEntity } = require('../../../../generated-entities/entities/respawn-entity');\n\nclass RespawnEntityOverride extends RespawnEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.titleProperty = 'layer';\n        config.navigationPosition = 500;\n        return config;\n    }\n\n}\n\nmodule.exports.RespawnEntityOverride = RespawnEntityOverride;\n"
  },
  {
    "path": "lib/respawn/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { RespawnEntityOverride } = require('./entities/respawn-entity-override');\n\nlet entitiesConfig = {\n    respawn: RespawnEntityOverride\n};\n\nmodule.exports.entitiesConfig = entitiesConfig;\n"
  },
  {
    "path": "lib/respawn/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        respawn: 'Respawn Areas'\n    }\n};\n"
  },
  {
    "path": "lib/respawn/server/plugin.js",
    "content": "/**\n *\n * Reldens - Respawn Server Plugin\n *\n * Server plugin that handles respawn area initialization, listens to map parsing events, and manages object instance creation in room states.\n *\n */\n\nconst { RoomRespawn } = require('./room-respawn');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n *\n * @typedef {Object} RespawnPluginSetupProps\n * @property {EventsManager} events\n * @property {ConfigManager} config\n * @property {BaseDataServer} dataServer\n */\nclass RespawnPlugin extends PluginInterface\n{\n\n    /**\n     * @param {RespawnPluginSetupProps} props\n     * @returns {Promise<void>}\n     */\n    async setup(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in RespawnPlugin.');\n        }\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        if(!this.config){\n            Logger.error('Config undefined in RespawnPlugin.');\n        }\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in RespawnPlugin.');\n        }\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.critical('Undefined events on RespawnPlugin.');\n            return false;\n        }\n        this.events.on('reldens.parsingMapLayersAfterBodiesQueue', async (eventData = {}) => {\n            let {layer, world} = eventData;\n            if(!layer || !layer.name){\n                Logger.error('Undefined layer data.', layer, layer.name);\n                return;\n            }\n            if(!world){\n                Logger.error('Undefined world data.', world);\n                return;\n            }\n            await this.createRoomRespawnArea(layer, world);\n        });\n        this.events.on('reldens.sceneRoomOnCreate', this.createRespawnAreasObjectsInstances.bind(this));\n    }\n\n    /**\n     * @param {Object} room\n     * @returns {boolean}\n     */\n    createRespawnAreasObjectsInstances(room)\n    {\n        // @TODO - BETA - Improve.\n        // append all the room objects body state to the room state:\n        if(!room.roomWorld || !room.roomWorld.respawnAreas){\n            return false;\n        }\n        let respawnAreasKeys = Object.keys(room.roomWorld.respawnAreas);\n        if(0 === respawnAreasKeys.length){\n            return;\n        }\n        for(let a of respawnAreasKeys){\n            let area = room.roomWorld.respawnAreas[a];\n            // @NOTE: the instancesCreated are each respawn definition for each enemy type for the specified\n            // layer in the storage.\n            this.createRespawnObjectsInstances(area, room);\n        }\n    }\n\n    /**\n     * @param {Object} area\n     * @param {Object} room\n     */\n    createRespawnObjectsInstances(area, room)\n    {\n        for(let i of Object.keys(area.instancesCreated)){\n            let instanceObjects = area.instancesCreated[i];\n            // each instance is an array of objects:\n            this.createRespawnObjectsInstancesInState(instanceObjects, room);\n        }\n    }\n\n    /**\n     * @param {Array<Object>} instanceObjects\n     * @param {Object} room\n     */\n    createRespawnObjectsInstancesInState(instanceObjects, room)\n    {\n        for(let objInstance of instanceObjects){\n            // @NOTE: for these objects we associate the state to get the position automatically\n            // updated on the client.\n            if(!objInstance.hasState){\n                continue;\n            }\n            room.state.addBodyToState(objInstance.state, objInstance.client_key);\n        }\n    }\n\n    /**\n     * @param {Object} layer\n     * @param {Object} world\n     * @returns {Promise<void>}\n     */\n    async createRoomRespawnArea(layer, world)\n    {\n        if(-1 === layer.name.indexOf('respawn-area')){\n            Logger.debug('None respawn area for layer \"'+layer.name+'\".');\n            return;\n        }\n        if(!world.respawnAreas){\n            world.respawnAreas = {};\n        }\n        let respawnArea = new RoomRespawn({\n            layer,\n            world,\n            events: this.events,\n            dataServer: this.dataServer,\n            config: this.config\n        });\n        await respawnArea.activateObjectsRespawn();\n        world.respawnAreas[layer.name] = respawnArea;\n    }\n}\n\nmodule.exports.RespawnPlugin = RespawnPlugin;\n"
  },
  {
    "path": "lib/respawn/server/room-respawn.js",
    "content": "/**\n *\n * Reldens - RoomRespawn\n *\n * Manages respawn areas within a room, handling dynamic object instance creation and tile-based positioning for NPCs and enemies.\n *\n */\n\nconst { PathFinder } = require('../../world/server/path-finder');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('../../world/server/p2world').P2world} P2world\n *\n * @typedef {Object} RoomRespawnProps\n * @property {EventsManager} events\n * @property {ConfigManager} config\n * @property {BaseDataServer} dataServer\n * @property {Object} layer\n * @property {P2world} world\n */\nclass RoomRespawn\n{\n\n    /**\n     * @param {RoomRespawnProps} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in RoomRespawn.');\n        }\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        if(!this.config){\n            Logger.error('Config undefined in RespawnPlugin.');\n        }\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in RoomRespawn.');\n        }\n        /** @type {Object} */\n        this.layer = props.layer;\n        /** @type {P2world} */\n        this.world = props.world;\n        /** @type {PathFinder|boolean} */\n        this.pathFinder = false;\n        if(props.world.pathFinder){\n            this.pathFinder = new PathFinder();\n            this.pathFinder.world = this.world;\n            this.pathFinder.grid = props.world.pathFinder.grid.clone();\n        }\n        /** @type {Object<string, Array<Object>>} */\n        this.instancesCreated = {};\n        /** @type {Array<string>} */\n        this.usedTiles = [];\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async activateObjectsRespawn()\n    {\n        this.parseMapForRespawnTiles();\n        /** @type {Object|boolean} - CUSTOM DYNAMIC */\n        this.layerObjects = this.world.objectsManager.roomObjectsByLayer[this.layer.name];\n        if(!this.layerObjects){\n            Logger.warning('Layer \"'+this.layer.name+'\" objects not found.');\n            return false;\n        }\n        let layerObjectKeys = Object.keys(this.layerObjects);\n        //Logger.debug('Layer \"'+this.layer.name+'\" objects: '+(layerObjectKeys.join(', ')));\n        let {tilewidth, tileheight } = this.world.mapJson;\n        // NOTE: this is because a single layer could have multiple respawn definitions for each enemy type.\n        /** @type {Array<Object>} - CUSTOM DYNAMIC */\n        this.respawnDefinitions = await this.dataServer.getEntity('respawn').load({\n            layer: this.layer.name,\n            object_id: {operator: 'IN', value: layerObjectKeys}\n        });\n        for(let i of Object.keys(this.respawnDefinitions)){\n            let respawnArea = this.respawnDefinitions[i];\n            if(!sc.hasOwn(this.layerObjects, respawnArea.object_id)){\n                Logger.warning('Object \"'+respawnArea.object_id+'\" not present in layerObjects.');\n                continue;\n            }\n            if(!sc.hasOwn(this.layerObjects[respawnArea.object_id], 'shouldRespawn')){\n                Logger.warning('Object \"'+respawnArea.object_id+'\" missing property \"shouldRespawn\".');\n                continue;\n            }\n            let multipleObj = this.layerObjects[respawnArea.object_id];\n            if(!multipleObj.objProps.enabled){\n                Logger.warning('Respawn object \"'+respawnArea.object_id+'\" is disabled.');\n                continue;\n            }\n            let objClass = multipleObj.classInstance;\n            if(!objClass){\n                Logger.warning('Object Class not specified.', respawnArea, multipleObj);\n                continue;\n            }\n            for(let qty=0; qty < respawnArea.instances_limit; qty++){\n                await this.createNewObjectInstance(respawnArea, multipleObj, objClass, tilewidth, tileheight, qty);\n            }\n        }\n    }\n\n    /**\n     * @param {Object} respawnArea\n     * @param {Object} multipleObj\n     * @param {function} objClass\n     * @param {number} tilewidth\n     * @param {number} tileheight\n     * @param {number} qty\n     * @returns {Promise<void>}\n     */\n    async createNewObjectInstance(respawnArea, multipleObj, objClass, tilewidth, tileheight, qty)\n    {\n        if(!sc.hasOwn(this.instancesCreated, respawnArea.id)){\n            this.instancesCreated[respawnArea.id] = [];\n        }\n        let objectIndex = this.generateObjectIndex(respawnArea);\n        let clonedObjProps = Object.assign({}, multipleObj.objProps);\n        clonedObjProps.client_key = objectIndex;\n        clonedObjProps.events = this.events;\n        let {randomTileIndex, tileData} = this.getRandomTile(objectIndex);\n        // add tile data to the object and create object instance:\n        Object.assign(clonedObjProps, tileData);\n        let objInstance = new objClass(clonedObjProps);\n        if(sc.isObjectFunction(objInstance, 'runAdditionalRespawnSetup')){\n            await objInstance.runAdditionalRespawnSetup();\n        }\n        this.events.emit('reldens.afterRunAdditionalRespawnSetup', {\n            objInstance,\n            clonedObjProps,\n            respawnArea,\n            multipleObj,\n            objClass,\n            objectIndex,\n            roomRespawn: this\n        });\n        let assetsArr = this.getObjectAssets(multipleObj);\n        // @TODO - BETA - Objects could have multiple assets, need to implement and test the case.\n        objInstance.clientParams.asset_key = assetsArr[0];\n        objInstance.clientParams.enabled = true;\n        if(sc.hasOwn(multipleObj, 'multipleAnimations')){\n            objInstance.clientParams.animations = multipleObj.multipleAnimations;\n        }\n        this.world.objectsManager.objectsAnimationsData[objectIndex] = objInstance.clientParams;\n        this.world.objectsManager.roomObjects[objectIndex] = objInstance;\n        await this.world.createWorldObject(\n            objInstance,\n            objectIndex,\n            tilewidth,\n            tileheight,\n            tileData.x,\n            tileData.y,\n            this.pathFinder\n        );\n        objInstance.respawnTime = respawnArea.respawn_time;\n        objInstance.respawnLayer = this.layer.name;\n        objInstance.objectIndex = objectIndex;\n        objInstance.randomTileIndex = randomTileIndex;\n        this.instancesCreated[respawnArea.id].push(objInstance);\n        //Logger.debug({respawnWorldObject: objInstance.uid, number: (qty + 1)+' / '+respawnArea.instances_limit});\n    }\n\n    /**\n     * @param {Object} multipleObj\n     * @returns {Array<string>}\n     */\n    getObjectAssets(multipleObj)\n    {\n        let assetsArr = [];\n        for(let assetData of multipleObj.objProps.related_objects_assets){\n            assetsArr.push(assetData.asset_key);\n        }\n        return assetsArr;\n    }\n\n    /**\n     * @param {Object} respawnArea\n     * @returns {string}\n     */\n    generateObjectIndex(respawnArea)\n    {\n        let newIndex = this.instancesCreated[respawnArea.id].length;\n        //Logger.debug('Generate new object index.', {layer: this.layer.name, respawnAreaId: respawnArea.id, newIndex});\n        return this.layer.name+'_'+respawnArea.id+'_'+newIndex;\n    }\n\n    /**\n     * @param {string} objectIndex\n     * @returns {Object}\n     */\n    getRandomTile(objectIndex)\n    {\n        let randomIndex = Math.floor(Math.random() * this.respawnTiles.length);\n        let randomTileIndex = this.respawnTiles[randomIndex];\n        if(sc.hasOwn(this.usedTiles, randomTileIndex)){\n            return this.getRandomTile(objectIndex);\n        }\n        this.removeObjectPreviousUsedTile(objectIndex);\n        this.usedTiles[randomTileIndex] = objectIndex;\n        return {randomTileIndex, tileData: this.respawnTilesData[randomTileIndex]};\n    }\n\n    /**\n     * @param {string} objectIndex\n     */\n    removeObjectPreviousUsedTile(objectIndex)\n    {\n        for(let tileIndex of Object.keys(this.usedTiles)){\n            if(this.usedTiles[tileIndex] === objectIndex){\n                delete this.usedTiles[tileIndex];\n                break;\n            }\n        }\n    }\n\n    parseMapForRespawnTiles()\n    {\n        let layerData = this.layer.data;\n        /** @type {Array<number>} - CUSTOM DYNAMIC */\n        this.respawnTiles = [];\n        /** @type {Object<number, Object>} - CUSTOM DYNAMIC */\n        this.respawnTilesData = {};\n        let mapW = this.world.mapJson.width,\n            mapH = this.world.mapJson.height,\n            tileW = this.world.mapJson.tilewidth,\n            tileH = this.world.mapJson.tileheight;\n        let totalTiles = 0;\n        let totalRespawnTiles = 0;\n        for(let c = 0; c < mapW; c++){\n            let posX = c * tileW + (tileW/2);\n            for(let r = 0; r < mapH; r++){\n                totalTiles++;\n                // position in units:\n                let posY = r * tileH + (tileH/2);\n                let tileIndex = r * mapW + c;\n                let tile = Number(layerData[tileIndex]);\n                // if tile is not zero then it's available for respawn:\n                if(0 !== tile){\n                    totalRespawnTiles++;\n                    this.respawnTiles.push(tileIndex);\n                    this.respawnTilesData[tileIndex] = {\n                        x: posX,\n                        y: posY,\n                        tile: tile,\n                        tile_index: tileIndex,\n                        row: r,\n                        column: c\n                    };\n                }\n                if(0 === tile && this.pathFinder){\n                    this.pathFinder.grid.setWalkableAt(c, r, false);\n                }\n            }\n        }\n    }\n\n}\n\nmodule.exports.RoomRespawn = RoomRespawn;\n"
  },
  {
    "path": "lib/rewards/client/message-handler.js",
    "content": "/**\n *\n * Reldens - MessageHandler\n *\n * Handles client-side reward messages by creating UI elements, updating display, and managing user interactions.\n *\n */\n\nconst { UserInterface } = require('../../game/client/user-interface');\nconst { RewardsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('../../game/client/game-dom').GameDom} GameDom\n * @typedef {import('../../config/client/config-manager').ConfigManager} ConfigManager\n * @typedef {import('../../snippets/translator').Translator} Translator\n * @typedef {import('phaser').Scene} Scene\n */\nclass MessageHandler\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        // @TODO - BETA - Fix every single undefined case.\n        /** @type {RoomEvents|false} */\n        this.roomEvents = sc.get(props, 'roomEvents', false);\n        /** @type {object|false} */\n        this.message = sc.get(props, 'message', false);\n        /** @type {GameManager|undefined} */\n        this.gameManager = this.roomEvents?.gameManager;\n        /** @type {GameDom|undefined} */\n        this.gameDom = this.gameManager?.gameDom;\n        /** @type {ConfigManager|undefined} */\n        this.config = this.gameManager?.config;\n        /** @type {Translator|undefined} */\n        this.translator = this.gameManager?.services?.translator;\n        /** @type {Scene|undefined} */\n        this.uiScene = this.gameManager?.gameEngine?.uiScene;\n    }\n\n    /**\n     * @returns {boolean|Scene}\n     */\n    validate()\n    {\n        if(!this.roomEvents){\n            Logger.info('Missing RoomEvents on RewardsMessageHandler.');\n            return false;\n        }\n        if(!this.message){\n            Logger.info('Missing message on RewardsMessageHandler.');\n            return false;\n        }\n        if(!this.gameManager){\n            Logger.info('Missing GameManager on RewardsMessageHandler.');\n            return false;\n        }\n        // @NOTE: the message could arrive before the uiScene gets ready.\n        // if(!this.uiScene){\n        //     Logger.info('Missing UI Scene on MessageHandler.');\n        // }\n        return this.uiScene;\n    }\n\n    /**\n     * @param {string} createUiWithKey\n     * @returns {Object|boolean}\n     */\n    createRewardsUi(createUiWithKey)\n    {\n        let rewardsUi = sc.get(this.uiScene.userInterfaces, createUiWithKey);\n        if(rewardsUi){\n            return rewardsUi;\n        }\n        if(!this.uiScene.userInterfaces){\n            this.uiScene.userInterfaces = {};\n        }\n        let uiRewards = new UserInterface(\n            this.gameManager,\n            {id: createUiWithKey, type: createUiWithKey, defaultOpen: true, defaultClose: true},\n            '/assets/features/rewards/templates/ui-rewards.html',\n            createUiWithKey\n        );\n        uiRewards.createUiElement(this.uiScene, createUiWithKey);\n        uiRewards.closeButton.addEventListener('click', () => {\n            this.gameDom.emptyElement('.accepted-reward');\n        });\n        // @TODO - BETA - Check if this can be moved inside the createUiElement.\n        let uiBox = this.uiScene.elementsUi[createUiWithKey];\n        if(!uiBox){\n            Logger.error('Scores UI box not found.', {uiRewards, uiBox});\n            return false;\n        }\n        let title = this.translator.t(\n            this.config.getWithoutLogs('client/rewards/labels/title', RewardsConst.SNIPPETS.TITLE)\n        );\n        this.roomEvents.uiSetTitleAndContent(uiBox, {title}, this.uiScene);\n        this.uiScene.userInterfaces[createUiWithKey] = uiRewards;\n        return this.uiScene.userInterfaces[createUiWithKey];\n    }\n\n    updateRewardsBox()\n    {\n        this.createRewardsUi(RewardsConst.KEY);\n        let rewards = sc.get(this.message, 'rewards', false);\n        if(!rewards){\n            Logger.debug('Missing rewards data on message.');\n            return false;\n        }\n        this.enrichForDisplay(rewards);\n        this.uiScene.rewards = rewards;\n        this.roomEvents.uiSetContent(\n            this.uiScene.elementsUi[RewardsConst.KEY],\n            {content: this.createUpdateContent()},\n            this.uiScene\n        );\n        this.showRewardsNotificationBalloon();\n        this.activateRewardsAction();\n        return false;\n    }\n\n    showAcceptedReward()\n    {\n        this.createRewardsUi(RewardsConst.KEY);\n        let acceptedReward = sc.get(this.message, 'acceptedReward', false);\n        if(!acceptedReward){\n            Logger.debug('Missing rewards on update message.');\n            return false;\n        }\n        this.enrichForDisplay([acceptedReward]);\n        this.uiScene.acceptedReward = acceptedReward;\n        this.roomEvents.uiSetContent(\n            this.uiScene.elementsUi[RewardsConst.KEY],\n            {content: this.createUpdateContent()},\n            this.uiScene\n        );\n        return true;\n    }\n\n    /**\n     * @returns {string}\n     */\n    createUpdateContent()\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let templateContent = this.uiScene.cache.html.get(RewardsConst.TEMPLATES.REWARDS_LIST);\n        if(!templateContent){\n            Logger.error('Missing template \"' + RewardsConst.TEMPLATES.REWARDS_LIST + '\".');\n            return '';\n        }\n        let acceptedReward = this.uiScene.acceptedReward;\n        let acceptedRewardMessage = acceptedReward\n            ? this.translator.t(\n                this.config.getWithoutLogs(\n                    'client/rewards/labels/acceptedReward',\n                    RewardsConst.SNIPPETS.ACCEPTED_REWARD\n                ),\n                {rewardLabel: acceptedReward.translated.label}\n            )\n            : '';\n        let templateParams = {rewards: this.uiScene.rewards, acceptedReward, acceptedRewardMessage};\n        return this.gameManager.gameEngine.parseTemplate(templateContent, templateParams);\n    }\n\n    /**\n     * @param {Array<Object>} rewards\n     * @returns {Array<Object>}\n     */\n    enrichForDisplay(rewards)\n    {\n        for(let reward of rewards){\n            let description = this.translator.t(\n                reward[RewardsConst.MESSAGE.DATA.DESCRIPTION] || '',\n                {loginCount: (reward[RewardsConst.MESSAGE.DATA.EVENT_DATA]?.days || '')}\n            );\n            if(this.config.getWithoutLogs('client/rewards/labels/includeItemsDescription', true)){\n                description += this.mapItemsText(reward);\n            }\n            let label = this.translator.t(\n                reward[RewardsConst.MESSAGE.DATA.LABEL] || '',\n                {loginCount: (reward[RewardsConst.MESSAGE.DATA.EVENT_DATA]?.days || '')}\n            );\n            reward.translated = {label, description};\n            let rewardStateData = reward[RewardsConst.MESSAGE.DATA.STATE_DATA];\n            reward.activeClass = rewardStateData?.ready && !rewardStateData?.complete ? 'active' : 'inactive';\n            reward.showRewardImage = reward[RewardsConst.MESSAGE.DATA.SHOW_REWARD_IMAGE] || '';\n            reward.rewardImage = reward[RewardsConst.MESSAGE.DATA.REWARD_IMAGE] || '';\n            reward.rewardImagePath = reward[RewardsConst.MESSAGE.DATA.REWARD_IMAGE_PATH] || '';\n        }\n        return rewards;\n    }\n\n    /**\n     * @param {Object} reward\n     * @returns {string}\n     */\n    mapItemsText(reward)\n    {\n        // @TODO - BETA - Add items template to show icons and description.\n        let itemsSeparator = this.config.getWithoutLogs('client/rewards/labels/itemsSeparator', '<br/>');\n        let itemsTemplate = this.config.getWithoutLogs('client/rewards/labels/itemsTemplate', '%label (%quantity)');\n        return itemsSeparator + reward[RewardsConst.MESSAGE.DATA.ITEMS_DATA]?.map(\n            (item) => {\n                itemsTemplate = itemsTemplate.replace('%label', item[RewardsConst.MESSAGE.DATA.ITEM_LABEL]);\n                itemsTemplate = itemsTemplate.replace('%quantity', item[RewardsConst.MESSAGE.DATA.ITEM_QUANTITY]);\n                return itemsTemplate;\n            }\n        ).join(itemsSeparator);\n    }\n\n    showRewardsNotificationBalloon()\n    {\n        let balloon = this.gameDom.getElement('#rewards-notification-balloon');\n        let activeRewards = this.gameDom.getElements('.reward-active');\n        if(balloon && activeRewards && 0 < activeRewards.label){\n            balloon.classList.remove('hidden');\n            return;\n        }\n        balloon.classList.add('hidden');\n    }\n\n    activateRewardsAction()\n    {\n        let rewardsElements = this.gameDom.getElements('.reward-active');\n        for(let rewardElement of rewardsElements){\n            rewardElement.addEventListener('click', () => {\n                this.gameManager.activeRoomEvents.send({\n                    [GameConst.ACTION_KEY]: RewardsConst.ACTIONS.ACCEPT_REWARD,\n                    id: rewardElement.dataset.rewardId\n                });\n            });\n        }\n    }\n\n}\n\nmodule.exports.MessageHandler = MessageHandler;\n"
  },
  {
    "path": "lib/rewards/client/message-listener.js",
    "content": "/**\n *\n * Reldens - MessageListener\n *\n * Listens for rewards-related client messages and routes them to the appropriate message handler.\n *\n */\n\nconst { MessageHandler } = require('./message-handler');\nconst { RewardsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass MessageListener\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async executeClientMessageActions(props)\n    {\n        let message = sc.get(props, 'message', false);\n        if(!message){\n            Logger.error('Missing message data on RewardsMessageListener.', props);\n            return false;\n        }\n        let roomEvents = sc.get(props, 'roomEvents', false);\n        if(!roomEvents){\n            Logger.error('Missing RoomEvents on RewardsMessageListener.', props);\n            return false;\n        }\n        if(!this.isRewardsMessage(message)){\n            return false;\n        }\n        let messageHandler = new MessageHandler({roomEvents, message});\n        if(!messageHandler.validate()){\n            if(!roomEvents.rewardsMessagesQueue){\n                roomEvents.rewardsMessagesQueue = [];\n            }\n            roomEvents.rewardsMessagesQueue.push(message);\n            return true;\n        }\n        return this.handleRewardsMessage(message, messageHandler);\n    }\n\n    /**\n     * @param {Object} message\n     * @param {MessageHandler} messageHandler\n     * @returns {boolean}\n     */\n    handleRewardsMessage(message, messageHandler)\n    {\n        if(RewardsConst.ACTIONS.UPDATE === message.act){\n            return messageHandler.updateRewardsBox();\n        }\n        if(RewardsConst.ACTIONS.ACCEPTED_REWARD === message.act){\n            return messageHandler.showAcceptedReward();\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {boolean}\n     */\n    isRewardsMessage(message)\n    {\n        return 0 === message.act?.indexOf(RewardsConst.PREFIX);\n    }\n}\n\nmodule.exports.MessageListener = MessageListener;\n"
  },
  {
    "path": "lib/rewards/client/messages-processor.js",
    "content": "/**\n *\n * Reldens - MessagesProcessor\n *\n * Processes queued rewards messages that arrived before the UI was ready.\n *\n */\n\nconst { MessageHandler } = require('./message-handler');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass MessagesProcessor\n{\n\n    /**\n     * @param {Object} event\n     * @param {Object} rewardsPlugin\n     * @returns {boolean}\n     */\n    static processRewardsMessagesQueue(event, rewardsPlugin)\n    {\n        // @TODO - BETA - All event listeners should return the mutated event.\n        let roomEvents = event?.roomEvents;\n        if(!roomEvents){\n            Logger.critical('RoomEvents undefined for process Rewards messages queue on RewardsPlugin.', event);\n            return false;\n        }\n        if(!sc.isArray(roomEvents.rewardsMessagesQueue)){\n            return false;\n        }\n        if(0 === roomEvents.rewardsMessagesQueue.length){\n            return false;\n        }\n        for(let message of roomEvents.rewardsMessagesQueue){\n            rewardsPlugin.messageListener?.handleRewardsMessage(message, new MessageHandler({roomEvents, message}));\n        }\n        roomEvents.rewardsMessagesQueue = [];\n        return true;\n    }\n\n}\n\nmodule.exports.MessageProcessor = MessagesProcessor;\n"
  },
  {
    "path": "lib/rewards/client/plugin.js",
    "content": "/**\n *\n * Reldens - Rewards Client Plugin\n *\n * Integrates the rewards system into the client by preloading templates, listening to messages, and managing UI updates.\n *\n */\n\nconst { PreloaderHandler } = require('./preloader-handler');\nconst { MessageListener } = require('./message-listener');\nconst { MessageProcessor } = require('./messages-processor');\nconst { RewardsConst } = require('../constants');\nconst Translations = require('./snippets/en_US');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass RewardsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {PreloaderHandler} */\n        this.preloaderHandler = new PreloaderHandler();\n        /** @type {MessageListener} */\n        this.messageListener = new MessageListener();\n        if(this.validateProperties()){\n            this.setTranslations();\n            this.listenEvents();\n            this.listenMessages();\n            Logger.debug('Plugin READY: Rewards');\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    validateProperties()\n    {\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in RewardsPlugin.');\n            return false;\n        }\n        if(!this.events){\n            Logger.error('EventsManager undefined in RewardsPlugin.');\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setTranslations()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations, RewardsConst.MESSAGE.DATA_VALUES);\n    }\n\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager undefined in RewardsPlugin for \"listenEvents\".');\n            return;\n        }\n        this.events.on('reldens.preloadUiScene', (preloadScene) => {\n            this.preloaderHandler.loadContents(preloadScene);\n        });\n        this.events.on('reldens.createEngineSceneDone', (event) => {\n            MessageProcessor.processRewardsMessagesQueue(event, this);\n        });\n    }\n\n    listenMessages()\n    {\n        if(!this.gameManager || !this.events){\n            Logger.error('Game Manager or EventsManager undefined in RewardsPlugin for \"listenMessages\".');\n            return;\n        }\n        this.gameManager.config.client.message.listeners[RewardsConst.KEY] = this.messageListener;\n    }\n\n}\n\nmodule.exports.RewardsPlugin = RewardsPlugin;\n"
  },
  {
    "path": "lib/rewards/client/preloader-handler.js",
    "content": "/**\n *\n * Reldens - PreloaderHandler\n *\n * Handles preloading of rewards UI templates in the client.\n *\n */\n\nconst { RewardsConst } = require('../constants');\n\nclass PreloaderHandler\n{\n\n    /**\n     * @param {Object} uiScene\n     */\n    loadContents(uiScene)\n    {\n        let rewardsTemplatePath = '/assets/features/rewards/templates/';\n        uiScene.load.html(RewardsConst.KEY, rewardsTemplatePath+'ui-rewards.html');\n        uiScene.load.html(RewardsConst.TEMPLATES.REWARDS_LIST, rewardsTemplatePath+'ui-rewards-list.html');\n    }\n\n}\n\nmodule.exports.PreloaderHandler = PreloaderHandler;\n"
  },
  {
    "path": "lib/rewards/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    rewards: {\n        title: 'Rewards',\n        dailyLogin: 'Daily Login',\n        dailyDescription: 'Login every day and claim your reward',\n        straightDaysLogin: '%loginCount Days Login',\n        straightDaysDescription: 'Login every day for %loginCount days and claim your reward',\n        acceptedReward: 'You accepted the \"%rewardLabel\" reward!'\n    }\n}\n"
  },
  {
    "path": "lib/rewards/constants.js",
    "content": "/**\n *\n * Reldens - RewardsConst\n *\n */\n\nlet prefix = 'rwd';\nlet snippetsPrefix = 'rewards.';\n\nmodule.exports.RewardsConst = {\n    KEY: 'rewards',\n    PREFIX: prefix,\n    ACTIONS: {\n        INITIALIZE: prefix+'Ini',\n        UPDATE: prefix+'Up',\n        ACCEPT_REWARD: prefix+'Acpt',\n        ACCEPTED_REWARD: prefix+'Acpted'\n    },\n    SPLIT_EXPERIENCE: {\n        ALL: 0,\n        PROPORTIONAL_BY_LEVEL: 1\n    },\n    SPLIT_MODIFIER: {\n        ALL: 0,\n        RANDOM: 1\n    },\n    SPLIT_ITEMS: {\n        DROP_KEEPS: 0,\n        RANDOM: 1\n    },\n    MESSAGE: {\n        DATA: {\n            LABEL: 'rlbl',\n            DESCRIPTION: 'rdes',\n            POSITION: 'rpos',\n            SHOW_REWARD_IMAGE: 'srimg',\n            REWARD_IMAGE: 'rimg',\n            REWARD_IMAGE_PATH: 'rimgp',\n            EVENT_DATA: 'redt',\n            STATE_DATA: 'resd',\n            ITEMS_DATA: 'rmid',\n            ITEM_KEY: 'rikey',\n            ITEM_LABEL: 'rilbl',\n            ITEM_DESCRIPTION: 'rides',\n            ITEM_QUANTITY: 'riqty'\n        },\n        DATA_VALUES: {\n            NAMESPACE: 'rewards'\n        }\n    },\n    TEMPLATES: {\n        REWARDS_LIST: 'rewardsList'\n    },\n    SNIPPETS: {\n        PREFIX: snippetsPrefix,\n        TITLE: snippetsPrefix+'title',\n        ACCEPTED_REWARD: snippetsPrefix+'acceptedReward'\n    }\n};\n"
  },
  {
    "path": "lib/rewards/server/actions/give-reward-action.js",
    "content": "/**\n *\n * Reldens - GiveRewardAction\n *\n * Executes the action of giving a reward item to a player by creating an item instance and adding it to their inventory.\n *\n */\n\nclass GiveRewardAction\n{\n\n    /**\n     * @param {Object} playerSchema\n     * @param {string} itemKey\n     * @param {number} itemQuantity\n     * @returns {Promise<Object>}\n     */\n    async execute(playerSchema, itemKey, itemQuantity)\n    {\n        let rewardItem = playerSchema.inventory.manager.createItemInstance(itemKey, itemQuantity);\n        return await playerSchema.inventory.manager.addItem(rewardItem);\n    }\n\n}\n\nmodule.exports.GiveRewardAction = GiveRewardAction;\n"
  },
  {
    "path": "lib/rewards/server/add-item-to-inventory.js",
    "content": "/**\n *\n * Reldens - AddItemToInventory\n *\n * Helper class for adding items to player inventories, exported as a singleton.\n *\n */\n\nclass AddItemToInventory\n{\n\n    /**\n     * @param {Object} itemModel\n     * @param {Object} playerSchema\n     * @returns {Promise<Object>}\n     */\n    async byItemModelOnPlayer(itemModel, playerSchema)\n    {\n        let itemInstance = playerSchema.inventory.manager.createItemInstance(itemModel.key);\n        return await playerSchema.inventory.manager.addItem(itemInstance);\n    }\n\n}\n\nmodule.exports.AddItemToInventory = new AddItemToInventory();\n"
  },
  {
    "path": "lib/rewards/server/drops-animations.js",
    "content": "/**\n *\n * Reldens - DropsAnimations\n *\n * Represents animation data for dropped items in the game world, including sprite sheets and asset information.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} DropsAnimationsProps\n * @property {number} id\n * @property {number} itemId\n * @property {string} assetType\n * @property {string} assetKey\n * @property {string} file\n * @property {object} extraParams\n */\nclass DropsAnimations\n{\n\n    /**\n     * @param {DropsAnimationsProps} props\n     */\n    constructor(props)\n    {\n        /** @type {number} */\n        this.id = sc.get(props, 'id', 0);\n        /** @type {number} */\n        this.itemId = sc.get(props, 'itemId', 0);\n        /** @type {string} */\n        this.assetType = sc.get(props, 'assetType', 'spritesheet');\n        /** @type {string} */\n        this.assetKey = sc.get(props, 'assetKey', '');\n        /** @type {string} */\n        this.file = sc.get(props, 'file', '');\n        /** @type {object} */\n        this.extraParams = sc.get(props, 'extraParams', {});\n    }\n\n    /**\n     * @param {Object} model\n     * @returns {DropsAnimations|null}\n     */\n    static fromModel(model)\n    {\n        if(!model){\n            return null;\n        }\n        return new DropsAnimations({\n            id: model.id,\n            itemId: model.item_id,\n            assetType: model.asset_type || 'spritesheet',\n            assetKey: model.asset_key,\n            file: model.file,\n            extraParams: sc.toJson(model.extra_params, {}),\n        });\n    }\n\n}\n\nmodule.exports.DropsAnimations = DropsAnimations;\n"
  },
  {
    "path": "lib/rewards/server/entities/drops-animations-entity-override.js",
    "content": "/**\n *\n * Reldens - DropsAnimationsEntityOverride\n *\n * Overrides the drops animations entity configuration for admin panel display with file upload settings for sprite assets.\n *\n */\n\nconst { AllowedFileTypes } = require('../../../game/allowed-file-types');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { DropsAnimationsEntity } = require('../../../../generated-entities/entities/drops-animations-entity');\n\nclass DropsAnimationsEntityOverride extends DropsAnimationsEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @param {Object} projectConfig\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps, projectConfig)\n    {\n        let config = super.propertiesConfig(extraProps);\n        let bucket = FileHandler.joinPaths(projectConfig.bucketFullPath, 'assets', 'custom', 'sprites');\n        let bucketPath = '/assets/custom/sprites/';\n        let distFolder = FileHandler.joinPaths(projectConfig.distPath, 'assets', 'custom', 'sprites');\n        config.properties.file = {\n            isRequired: true,\n            isUpload: true,\n            allowedTypes: AllowedFileTypes.IMAGE,\n            bucket,\n            bucketPath,\n            distFolder\n        };\n        config.bucket = bucket;\n        config.bucketPath = bucketPath;\n        return config;\n    }\n\n}\n\nmodule.exports.DropsAnimationsEntityOverride = DropsAnimationsEntityOverride;\n"
  },
  {
    "path": "lib/rewards/server/entities/rewards-entity-override.js",
    "content": "/**\n *\n * Reldens - RewardsEntityOverride\n *\n * Overrides the rewards entity configuration for admin panel display with custom navigation positioning.\n *\n */\n\nconst { RewardsEntity } = require('../../../../generated-entities/entities/rewards-entity');\n\nclass RewardsEntityOverride extends RewardsEntity\n{\n\n    /**\n     * @param {object} extraProps\n     * @returns {object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 600;\n        return config;\n    }\n\n}\n\nmodule.exports.RewardsEntityOverride = RewardsEntityOverride;\n"
  },
  {
    "path": "lib/rewards/server/entities/rewards-events-entity-override.js",
    "content": "/**\n *\n * Reldens - RewardsEventsEntityOverride\n *\n * Overrides the rewards events entity configuration for admin panel display with custom title and list properties.\n *\n */\n\nconst { RewardsEventsEntity } = require('../../../../generated-entities/entities/rewards-events-entity');\n\nclass RewardsEventsEntityOverride extends RewardsEventsEntity\n{\n\n    /**\n     * @param {object} extraProps\n     * @returns {object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.titleProperty = 'event_key';\n        config.listProperties.splice(config.listProperties.indexOf('event_data'), 1);\n        return config;\n    }\n\n}\n\nmodule.exports.RewardsEventsEntityOverride = RewardsEventsEntityOverride;\n"
  },
  {
    "path": "lib/rewards/server/entities/rewards-modifiers-entity-override.js",
    "content": "/**\n *\n * Reldens - RewardsModifiersEntityOverride\n *\n * Overrides the rewards modifiers entity configuration for admin panel display with custom title and filtered list properties.\n *\n */\n\nconst { RewardsModifiersEntity } = require('../../../../generated-entities/entities/rewards-modifiers-entity');\nconst { sc } = require('@reldens/utils');\n\nclass RewardsModifiersEntityOverride extends RewardsModifiersEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.titleProperty = 'key';\n        config.listProperties = sc.removeFromArray(config.listProperties, [\n            'minValue',\n            'maxValue',\n            'minProperty',\n            'maxProperty'\n        ]);\n        return config;\n    }\n\n}\n\nmodule.exports.RewardsModifiersEntityOverride = RewardsModifiersEntityOverride;\n"
  },
  {
    "path": "lib/rewards/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Rewards Entities Config\n *\n */\n\nconst { DropsAnimationsEntityOverride } = require('./entities/drops-animations-entity-override');\nconst { RewardsEntityOverride } = require('./entities/rewards-entity-override');\nconst { RewardsEventsEntityOverride } = require('./entities/rewards-events-entity-override');\nconst { RewardsModifiersEntityOverride } = require('./entities/rewards-modifiers-entity-override');\n\nmodule.exports.entitiesConfig = {\n    dropsAnimations: DropsAnimationsEntityOverride,\n    rewards: RewardsEntityOverride,\n    rewardsEvents: RewardsEventsEntityOverride,\n    rewardsModifiers: RewardsModifiersEntityOverride\n};\n"
  },
  {
    "path": "lib/rewards/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Rewards Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        rewards: 'Rewards',\n        rewardsModifiers: 'Rewards - Modifiers',\n        rewardsEvents: 'Rewards - Events',\n        rewardsEventsState: 'Rewards - Events State',\n        dropsAnimations: 'Drops - Animations'\n    }\n};\n"
  },
  {
    "path": "lib/rewards/server/event-handlers/event-handler.js",
    "content": "/**\n *\n * Reldens - EventHandler\n *\n * Base class for reward event handlers, providing a template method for updating event state.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\nclass EventHandler\n{\n\n    // @Note: handler will be bind to the RewardsEventsHandler.\n    updateEventState()\n    {\n        Logger.warning('Update event state undefined.');\n    }\n\n}\n\nmodule.exports.EventHandler = EventHandler;\n"
  },
  {
    "path": "lib/rewards/server/event-handlers/login-state-handler.js",
    "content": "/**\n *\n * Reldens - LoginStateHandler\n *\n * Handles reward state updates for login-based reward events, including daily login and consecutive days login tracking.\n *\n */\n\nconst { EventHandler } = require('./event-handler');\nconst { JoinedSceneRoomEvent } = require('../../../rooms/server/events/joined-scene-room-event');\nconst { RewardsEventsDataSender } = require('../rewards-events-data-sender');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../rewards-events-provider').RewardsEventsProvider} RewardsEventsProvider\n * @typedef {import('../rewards-events-updater').RewardsEventsUpdater} RewardsEventsUpdater\n * @typedef {import('../../../config/server/config').ConfigManager} ConfigManager\n */\nclass LoginStateHandler extends EventHandler\n{\n\n    /**\n     * @param {Object} props\n     * @param {RewardsEventsProvider} props.rewardsProvider\n     * @param {RewardsEventsUpdater} props.rewardsEventsUpdater\n     * @param {ConfigManager} props.config\n     */\n    constructor(props)\n    {\n        super();\n        /** @type {RewardsEventsProvider} */\n        this.rewardsProvider = props.rewardsProvider;\n        /** @type {RewardsEventsUpdater} */\n        this.rewardsEventsUpdater = props.rewardsEventsUpdater;\n        /** @type {ConfigManager} */\n        this.config = props.config;\n        if(!this.rewardsProvider){\n            Logger.warning('RewardsProvider undefined in LoginStateHandler.');\n        }\n        if(!this.rewardsEventsUpdater){\n            Logger.warning('RewardsEventsUpdater undefined in LoginStateHandler.');\n        }\n        if(!this.config){\n            Logger.warning('Configuration undefined in LoginStateHandler.');\n        }\n        /** @type {RewardsEventsDataSender} */\n        this.rewardsEventsDataSender = new RewardsEventsDataSender();\n        /** @type {boolean} - CUSTOM DYNAMIC */\n        this.avoidGuestRewardsOnLogin = this.config.getWithoutLogs('server/rewards/avoidGuestRewardsOnLogin', true);\n    }\n\n    /**\n     * @param {Object} reward\n     * @param {Array} args\n     * @returns {Promise<boolean>}\n     */\n    async updateEventState(reward, args)\n    {\n        if(!this.rewardsProvider || !this.rewardsEventsUpdater){\n            return false;\n        }\n        let rewardAction = sc.get(reward?.eventData, 'action', '');\n        if('' === rewardAction){\n            Logger.warning('Missing reward action.', reward);\n            return false;\n        }\n        let event = args[0] || {};\n        if(!(event instanceof JoinedSceneRoomEvent)){\n            Logger.warning('Event missed match, expected \"JoinedSceneRoomEvent\".');\n            return false;\n        }\n        if(this.avoidGuestRewardsOnLogin && event.isGuest){\n            //Logger.debug('Guests rewards on login are disabled by configuration.');\n            return false;\n        }\n        let rewardState = await this.rewardsProvider.fetchPlayerRewardsStateByIdWithMappedData(\n            event.loggedPlayer?.player_id,\n            reward.id\n        );\n        let today = sc.formatDate(new Date(), 'Y-m-d');\n        let lastClaimedDate = rewardState?.mappedState?.date;\n        if(true === rewardState?.mappedState?.complete && lastClaimedDate === today){\n            //Logger.debug('Reward already claimed.', {playerId: event.loggedPlayer?.player_id, rewardId: reward.id});\n            return true;\n        }\n        if('dailyLogin' === rewardAction){\n            await this.processDailyLogin(reward, rewardState, event, today);\n        }\n        if('straightDaysLogin' === rewardAction){\n            await this.processStraightDaysLogin(reward, rewardState, event, today, lastClaimedDate);\n        }\n        if(event.roomScene && event.loggedPlayer){\n            this.rewardsEventsDataSender.sendUpdates(\n                event.roomScene,\n                event.loggedPlayer,\n                await this.rewardsProvider.fetchPlayerActiveRewards(event.loggedPlayer.player_id)\n            );\n        }\n    }\n\n    /**\n     * @param {Object} reward\n     * @param {Object} rewardState\n     * @param {JoinedSceneRoomEvent} event\n     * @param {string} today\n     * @returns {Promise<boolean>}\n     */\n    async processDailyLogin(reward, rewardState, event, today)\n    {\n        let logins = this.byLatestPerDay(sc.arraySort(event.userModel.related_users_login, 'login_date', 'desc'));\n        if(!logins || 0 === logins.length){\n            //Logger.debug('No login present on user.', event.userModel, rewardState);\n            return false;\n        }\n        let lastLoginDate = sc.formatDate(new Date(logins.shift().login_date), 'Y-m-d');\n        //Logger.debug('Process daily login: ', logins, lastLoginDate, today);\n        if(lastLoginDate !== today){\n            return false;\n        }\n        return await this.resetRewardState(rewardState, true, today, reward, event);\n    }\n\n    /**\n     * @param {Object} reward\n     * @param {Object} rewardState\n     * @param {JoinedSceneRoomEvent} event\n     * @param {string} today\n     * @param {string} lastClaimedDate\n     * @returns {Promise<boolean>}\n     */\n    async processStraightDaysLogin(reward, rewardState, event, today, lastClaimedDate)\n    {\n        let requiredLogins = reward.eventData.days;\n        let logins = this.byLatestPerDay(sc.arraySort(event.userModel.related_users_login, 'login_date', 'desc'))\n            .slice(0, requiredLogins);\n        if(lastClaimedDate){\n            let lastDate = new Date(lastClaimedDate);\n            lastDate.setDate(lastDate.getDate() + 1);\n            logins = logins.filter((item) => {\n                return item.login_date > lastDate;\n            });\n        }\n        //Logger.debug('Process straight days login: ', logins, requiredLogins, lastClaimedDate);\n        if(!logins || requiredLogins > logins.length){\n            //Logger.debug('Not enough login records.', {userEmail: event.userModel.email, rewardState});\n            await this.resetRewardState(rewardState, false, false, reward, event);\n            return false;\n        }\n        let consecutiveDays = 0;\n        let todayDate = new Date();\n        for(let i = 0; i < requiredLogins; i++){\n            let expectedDate = new Date(todayDate);\n            expectedDate.setDate(todayDate.getDate() - i);\n            let expectedDateString = sc.formatDate(expectedDate, 'Y-m-d');\n            let login = logins.find(login => sc.formatDate(new Date(login.login_date), 'Y-m-d') === expectedDateString);\n            if(!login){\n                break;\n            }\n            consecutiveDays++;\n        }\n        if(requiredLogins > consecutiveDays){\n            //Logger.debug('Logged '+consecutiveDays+'/'+requiredLogins+' ('+rewardState.id+') '+event.userModel.id);\n            return false;\n        }\n        return await this.resetRewardState(rewardState, true, today, reward, event);\n    }\n\n    /**\n     * @param {Object} rewardState\n     * @param {boolean} isReady\n     * @param {string|boolean} today\n     * @param {Object} reward\n     * @param {JoinedSceneRoomEvent} event\n     * @returns {Promise<boolean>}\n     */\n    async resetRewardState(rewardState, isReady, today, reward, event)\n    {\n        let currentState = sc.toJson(rewardState?.state, {});\n        currentState.ready = isReady;\n        if(today){\n            currentState.date = today;\n        }\n        currentState.complete = false;\n        //Logger.debug('Update reward state', reward.id, currentState);\n        return await this.rewardsEventsUpdater.updateStateById(\n            rewardState?.id,\n            JSON.stringify(currentState),\n            reward.id,\n            event.loggedPlayer?.player_id\n        );\n    }\n\n    /**\n     * @param {Array<Object>} datesList\n     * @returns {Array<Object>}\n     */\n    byLatestPerDay(datesList)\n    {\n        let indexMap = {};\n        let result = [];\n        let count = 0;\n        for(let item of datesList){\n            let dateObj = item.login_date;\n            if(!dateObj){\n                continue;\n            }\n            let month = String(dateObj.getMonth() + 1).padStart(2, '0');\n            let day = String(dateObj.getDate()).padStart(2, '0');\n            let dayKey = dateObj.getFullYear()+'-'+month+'-'+day;\n            if(!sc.hasOwn(indexMap, dayKey)){\n                indexMap[dayKey] = count;\n                result.push(item);\n                count++;\n                continue;\n            }\n            let index = indexMap[dayKey];\n            let existing = result[index];\n            let existingDate = existing.login_date;\n            if(dateObj > existingDate){\n                result[index] = item;\n            }\n        }\n        return result;\n    }\n\n}\n\nmodule.exports.LoginStateHandler = LoginStateHandler;\n"
  },
  {
    "path": "lib/rewards/server/mappers/rewards-events-mapper.js",
    "content": "/**\n *\n * Reldens - RewardsEventsMapper\n *\n * Maps reward events with player-specific state data, combining event definitions and player progress.\n *\n */\n\nconst { Logger } = require('@reldens/utils');\n\nclass RewardsEventsMapper\n{\n\n    /**\n     * @param {Array<Object>|boolean} rewardsEventsCollection\n     * @param {Array<Object>} playerRewardsEventsStateCollection\n     * @returns {Array<Object>}\n     */\n    withPlayerRewardsEventsState(rewardsEventsCollection, playerRewardsEventsStateCollection)\n    {\n        if(!playerRewardsEventsStateCollection){\n            return rewardsEventsCollection;\n        }\n        let mappedStates = {};\n        for(let state of playerRewardsEventsStateCollection){\n            mappedStates[state['rewards_events_id']] = state;\n        }\n        if(!rewardsEventsCollection){\n            Logger.error('Missing RewardsEventsCollection');\n            return [];\n        }\n        return rewardsEventsCollection.map((rewardsEvents) => {\n            let state = mappedStates[rewardsEvents.id];\n            if(state){\n                rewardsEvents.eventState = state;\n            }\n            return rewardsEvents;\n        });\n    }\n\n}\n\nmodule.exports.RewardsEventsMapper = RewardsEventsMapper;\n"
  },
  {
    "path": "lib/rewards/server/mappers/rewards-to-actions-mapper.js",
    "content": "/**\n *\n * Reldens - RewardsToActionsMapper\n *\n * Maps reward data to client-ready action message format, reducing data size by including only required fields.\n *\n */\n\nconst { RewardsConst } = require('../../constants');\n\nclass RewardsToActionsMapper\n{\n\n    /**\n     * @param {Array<object>} rewards\n     * @returns {Array<object>}\n     */\n    map(rewards)\n    {\n        // reduce the amount of data sent to the client by sending only the required fields:\n        return rewards.map((reward) => {\n            return this.mapSingle(reward);\n        });\n    }\n\n    /**\n     * @param {object} reward\n     * @returns {object}\n     */\n    mapSingle(reward)\n    {\n        let rewardData = {\n            id: reward.id,\n            [RewardsConst.MESSAGE.DATA.LABEL]: reward.label,\n            [RewardsConst.MESSAGE.DATA.DESCRIPTION]: reward.description,\n            [RewardsConst.MESSAGE.DATA.POSITION]: reward.position,\n        };\n        this.mapRewardImageData(reward, rewardData);\n        this.mapRewardEventData(reward, rewardData);\n        this.mapRewardEventStateData(reward, rewardData);\n        return rewardData;\n    }\n\n    /**\n     * @param {object} reward\n     * @param {object} rewardData\n     * @returns {object}\n     */\n    mapRewardEventStateData(reward, rewardData)\n    {\n        if(!reward.eventState || 0 === Object.keys(reward.eventState).length){\n            return rewardData;\n        }\n        rewardData[RewardsConst.MESSAGE.DATA.STATE_DATA] = reward.eventState.mappedState;\n        return rewardData;\n    }\n\n    /**\n     * @param {object} reward\n     * @param {object} rewardData\n     * @returns {object}\n     */\n    mapRewardEventData(reward, rewardData)\n    {\n        if(!reward.eventData || 0 === Object.keys(reward.eventData).length){\n            return rewardData;\n        }\n        rewardData[RewardsConst.MESSAGE.DATA.EVENT_DATA] = reward.eventData;\n        this.mapRewardItemsData(reward, rewardData);\n        return rewardData;\n    }\n\n    /**\n     * @param {object} reward\n     * @param {object} rewardData\n     * @returns {object}\n     */\n    mapRewardImageData(reward, rewardData)\n    {\n        if(!reward.showRewardImage || !reward.rewardImage){\n            return rewardData;\n        }\n        rewardData[RewardsConst.MESSAGE.DATA.SHOW_REWARD_IMAGE] = reward.showRewardImage;\n        rewardData[RewardsConst.MESSAGE.DATA.REWARD_IMAGE] = reward.rewardImage;\n        if(reward.rewardImagePath){\n            rewardData[RewardsConst.MESSAGE.DATA.REWARD_IMAGE_PATH] = reward.rewardImagePath;\n        }\n        return rewardData;\n    }\n\n    /**\n     * @param {object} reward\n     * @param {object} rewardData\n     * @returns {object}\n     */\n    mapRewardItemsData(reward, rewardData)\n    {\n        if(!reward.itemsData){\n            return rewardData;\n        }\n        let itemsIds = Object.keys(reward.itemsData);\n        let mappedItemsData = [];\n        for(let itemId of itemsIds){\n            let item = reward.itemsData[itemId];\n            mappedItemsData.push({\n                id: itemId,\n                [RewardsConst.MESSAGE.DATA.ITEM_LABEL]: item.label,\n                [RewardsConst.MESSAGE.DATA.ITEM_DESCRIPTION]: item.description,\n                [RewardsConst.MESSAGE.DATA.ITEM_KEY]: item.key,\n                [RewardsConst.MESSAGE.DATA.ITEM_QUANTITY]: item.rewardQuantity,\n            });\n        }\n        rewardData[RewardsConst.MESSAGE.DATA.ITEMS_DATA] = mappedItemsData;\n        delete rewardData[RewardsConst.MESSAGE.DATA.EVENT_DATA].items;\n        return rewardData;\n    }\n}\n\nmodule.exports.RewardsToActionsMapper = RewardsToActionsMapper;\n"
  },
  {
    "path": "lib/rewards/server/pick-up-object.js",
    "content": "/**\n *\n * Reldens - PickUpObject\n *\n * Handles picking up item objects from the game world, determining target players based on team/split configuration, and adding items to inventory.\n *\n */\n\nconst { RewardsConst } = require('../constants');\nconst { AddItemToInventory } = require('./add-item-to-inventory');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass PickUpObject\n{\n\n    /**\n     * @param {Object} roomObject\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @param {Object} targetDeterminer\n     * @returns {Promise<boolean>}\n     */\n    async execute(roomObject, room, playerSchema, targetDeterminer)\n    {\n        let splitConfig = room.config.getWithoutLogs('client/rewards/general/splitItems', false);\n        let rewardTargets = RewardsConst.SPLIT_ITEMS.DROP_KEEPS === splitConfig || !targetDeterminer\n            ? {[playerSchema.player_id]: playerSchema}\n            : targetDeterminer.forReward(playerSchema);\n        let playersKeys = Object.keys(rewardTargets);\n        let randomIndex = sc.randomInteger(0, (playersKeys.length -1));\n        let randomTarget = rewardTargets[playersKeys[randomIndex]];\n        if(!roomObject.itemId){\n            Logger.warning('Object with ID \"'+roomObject.id+'\" has no item ID.');\n            return false;\n        }\n        let itemModel = await room.dataServer.getEntity('itemsItem').loadById(roomObject.itemId);\n        if(!itemModel){\n            Logger.warning('Object with ID \"'+roomObject.id+'\" not found.');\n            return false;\n        }\n        await AddItemToInventory.byItemModelOnPlayer(itemModel, randomTarget);\n        room.removeObject(roomObject);\n        return true;\n    }\n\n}\n\nmodule.exports.PickUpObject = new PickUpObject();\n"
  },
  {
    "path": "lib/rewards/server/plugin.js",
    "content": "/**\n *\n * Reldens - Rewards Server Plugin\n *\n * Integrates the rewards system into the game by registering event listeners and coordinating reward distribution and events.\n *\n */\n\nconst { ObjectSubscriber } = require('./subscribers/object-subscriber');\nconst { RewardsSubscriber } = require('./subscribers/rewards-subscriber');\nconst { RewardMessageActions } = require('./reward-message-actions');\nconst { RewardsDropsProcessor } = require('./rewards-drops-processor');\nconst { RewardsEventsHandler } = require('./rewards-events-handler');\nconst { TargetDeterminer } = require('./target-determiner');\nconst { RewardsEventsProvider } = require('./rewards-events-provider');\nconst { RewardsEventsMessageActions } = require('./rewards-events-message-actions');\nconst { RewardsEventsDataSender } = require('./rewards-events-data-sender');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass RewardsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    async setup(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {RewardsEventsHandler} */\n        this.rewardsEventsHandler = new RewardsEventsHandler(props);\n        /** @type {RewardsEventsProvider} */\n        this.rewardsProvider = new RewardsEventsProvider(props);\n        await this.rewardsProvider.fetchActiveRewardsWithMappedData();\n        /** @type {RewardsEventsMessageActions} */\n        this.rewardsEvents = new RewardsEventsMessageActions(props);\n        /** @type {RewardsEventsDataSender} */\n        this.rewardsEventsDataSender = new RewardsEventsDataSender();\n        this.listenEvents();\n        await this.rewardsEventsHandler.activateRewardsEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.critical('EventsManager undefined in RewardsPlugin.');\n            return false;\n        }\n        this.events.on('reldens.featuresManagerLoadFeaturesAfter', this.appendPluginClasses.bind(this));\n        this.events.on('reldens.joinRoomEnd', this.sendPlayerRewardsData.bind(this));\n        this.events.on('reldens.afterRunAdditionalRespawnSetup', this.enrichObjectWithRewards.bind(this));\n        this.events.on('reldens.battleEnded', this.battleEndedGiveRewards.bind(this));\n        this.events.on('reldens.sceneRoomOnCreate', this.attachGiveRewardsEvent.bind(this));\n        this.events.on('reldens.roomsMessageActionsGlobal', this.attachRewardMessageActions.bind(this));\n    }\n\n    /**\n     * @param {Object} event\n     */\n    async appendPluginClasses(event)\n    {\n        /** @type {RewardsSubscriber} - CUSTOM DYNAMIC */\n        this.rewardsSubscriber = new RewardsSubscriber(event);\n        /** @type {TargetDeterminer} - CUSTOM DYNAMIC */\n        this.targetDeterminer = new TargetDeterminer(event?.featuresManager?.featuresList?.teams.package);\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<boolean>}\n     */\n    async sendPlayerRewardsData(event)\n    {\n        return this.rewardsEventsDataSender.sendUpdates(\n            event.roomScene,\n            event.loggedPlayer,\n            await this.rewardsProvider.fetchPlayerActiveRewards(event.loggedPlayer.playerId)\n        );\n    }\n\n    /**\n     * @param {Object} event\n     */\n    async enrichObjectWithRewards(event)\n    {\n        await ObjectSubscriber.enrichWithRewards(event.objInstance);\n    }\n\n    /**\n     * @param {Object} event\n     */\n    async battleEndedGiveRewards(event)\n    {\n        await this.rewardsSubscriber.giveRewards(event.playerSchema, event.pve?.targetObject, this.events);\n    }\n\n    /**\n     * @param {Object} roomScene\n     */\n    async attachGiveRewardsEvent(roomScene)\n    {\n        this.events.onWithKey(\n            'reldens.afterGiveRewards',\n            this.processRewardsDrops.bind(this, roomScene),\n            roomScene.roomName+'-'+roomScene.roomId+'-afterGiveRewards-'+sc.getTime(),\n            roomScene.roomName+'-'+roomScene.roomId\n        );\n    }\n\n    /**\n     * @param {Object} roomMessageActions\n     */\n    attachRewardMessageActions(roomMessageActions)\n    {\n        roomMessageActions.rewards = new RewardMessageActions(this.targetDeterminer);\n        roomMessageActions.rewardsEvents = this.rewardsEvents;\n    }\n\n    /**\n     * @param {Object} roomScene\n     * @param {Object} rewardEventData\n     */\n    async processRewardsDrops(roomScene, rewardEventData)\n    {\n        await RewardsDropsProcessor.processRewardsDrops(roomScene, rewardEventData);\n    }\n\n}\n\nmodule.exports.RewardsPlugin = RewardsPlugin;\n"
  },
  {
    "path": "lib/rewards/server/repositories-extension.js",
    "content": "/**\n *\n * Reldens - RepositoriesExtension\n *\n * Provides common repository assignment functionality for rewards-related database operations.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\nclass RepositoriesExtension\n{\n\n    /**\n     * @param {Object} props\n     * @returns {boolean}\n     */\n    assignRepositories(props)\n    {\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('Undefined DataServer on \"RepositoriesExtension\" class.');\n            return false;\n        }\n        /** @type {BaseDriver} */\n        this.rewardsEventsRepository = this.dataServer.getEntity('rewardsEvents');\n        if(!this.rewardsEventsRepository){\n            Logger.error('Undefined \"rewardsEventsRepository\" in DataServer on \"RepositoriesExtension\".');\n            return false;\n        }\n        /** @type {BaseDriver} */\n        this.rewardsEventsStateRepository = this.dataServer.getEntity('rewardsEventsState');\n        if(!this.rewardsEventsStateRepository){\n            Logger.error('Undefined \"rewardsEventsStateRepository\" in DataServer on \"RepositoriesExtension\".');\n            return false;\n        }\n        /** @type {BaseDriver} */\n        this.itemsRepository = this.dataServer.getEntity('itemsItem');\n        if(!this.itemsRepository){\n            Logger.error('Undefined \"itemsRepository\" in DataServer on \"RepositoriesExtension\".');\n            return false;\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.RepositoriesExtension = RepositoriesExtension;\n"
  },
  {
    "path": "lib/rewards/server/reward-message-actions.js",
    "content": "/**\n *\n * Reldens - RewardMessageActions\n *\n * Handles client messages for picking up dropped reward items, validating player state and object interactions.\n *\n */\n\nconst { ObjectsConst } = require('../../objects/constants');\nconst { PickUpObject } = require('./pick-up-object');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./target-determiner').TargetDeterminer} TargetDeterminer\n */\nclass RewardMessageActions\n{\n\n    /**\n     * @param {TargetDeterminer} targetDeterminer\n     */\n    constructor(targetDeterminer)\n    {\n        /** @type {TargetDeterminer} */\n        this.targetDeterminer = targetDeterminer;\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} message\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async executeMessageActions(client, message, room, playerSchema)\n    {\n        if(!sc.hasOwn(message, 'act') || !sc.hasOwn(message, 'type')){\n            return false;\n        }\n        if(ObjectsConst.OBJECT_INTERACTION !== message.act || ObjectsConst.DROPS.PICK_UP_ACT !== message.type){\n            return false;\n        }\n        if(playerSchema.isDeath() || playerSchema.isDisabled()){\n            return false;\n        }\n        let objectId = sc.get(message, 'id', false);\n        if(!objectId){\n            Logger.warning('A drop type message was received but without id.', message);\n            return false;\n        }\n        let roomObject = sc.get(room.roomWorld.objectsManager.roomObjects, objectId, false);\n        if(!roomObject){\n            Logger.warning('Could not found object with ID \"'+objectId+'\" on roomObjects.', message);\n            room.broadcast('*', {act: ObjectsConst.DROPS.REMOVE, id: objectId});\n            return false;\n        }\n        if(!roomObject.isValidInteraction(playerSchema.state.x, playerSchema.state.y)){\n            return false;\n        }\n        let eventData = {roomObject, client, room, playerSchema, continueEvent: true};\n        await room.events.emit('reldens.beforeRemovingDroppedReward', eventData);\n        if(!eventData.continueEvent){\n            return false;\n        }\n        return await PickUpObject.execute(roomObject, room, playerSchema, this.targetDeterminer);\n    }\n\n}\n\nmodule.exports.RewardMessageActions = RewardMessageActions;\n"
  },
  {
    "path": "lib/rewards/server/reward.js",
    "content": "/**\n *\n * Reldens - Reward\n *\n * Represents a reward that can be dropped from objects or given through events, supporting items, experience, and modifiers with drop rate mechanics.\n *\n */\n\nconst { DropsAnimations } = require('./drops-animations');\nconst { ObjectTypes } = require('../../objects/server/object/object-types');\nconst { ObjectsConst } = require('../../objects/constants');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} RewardParams\n * @property {number} id\n * @property {number} objectId\n * @property {number|null} itemId\n * @property {number|null} modifierId\n * @property {number} experience\n * @property {number} dropRate\n * @property {number} dropQuantity\n * @property {number} isUnique\n * @property {number} wasGiven\n * @property {number} hasDropBody\n * @property {DropsAnimations|null} animationData\n * @property {object|null} item\n * @property {object|null} modifier\n */\nclass Reward\n{\n\n    /**\n     * @param {RewardParams} param\n     */\n    constructor(param)\n    {\n        /** @type {number} */\n        this.id = sc.get(param, 'id', 0);\n        /** @type {number} */\n        this.objectId = sc.get(param, 'objectId', 0);\n        /** @type {number|null} */\n        this.itemId = sc.get(param, 'itemId', null);\n        /** @type {number|null} */\n        this.modifierId = sc.get(param, 'modifierId', null);\n        /** @type {number} */\n        this.experience = sc.get(param, 'experience', 0);\n        /** @type {number} */\n        this.dropRate = sc.get(param, 'dropRate', 0);\n        /** @type {number} */\n        this.dropQuantity = sc.get(param, 'dropQuantity', 0);\n        /** @type {boolean} */\n        this.isUnique = 1 === sc.get(param,'isUnique', 0);\n        /** @type {boolean} */\n        this.wasGiven = 1 === sc.get(param,'wasGiven', 0);\n        /** @type {boolean} */\n        this.hasDropBody = 1 === sc.get(param,'hasDropBody', 0);\n        /** @type {DropsAnimations|null} */\n        this.animationData = sc.get(param, 'animationData', null);\n        /** @type {object|null} */\n        this.item = sc.get(param, 'item', null);\n        /** @type {object|null} */\n        this.modifier = sc.get(param, 'modifier', null);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isWinningReward()\n    {\n        if(0 === this.dropRate){\n            return false;\n        }\n        return Math.floor(Math.random() * 100) <= this.dropRate;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isValidReward()\n    {\n        if(0 === this.dropQuantity){\n            return false;\n        }\n        if(this.isUnique && this.wasGiven){\n            return false;\n        }\n        return !(!this.isItemType() && !this.isModifierType() && !this.hasExperienceSet());\n    }\n\n    /**\n     * @returns {number|null}\n     */\n    isItemType()\n    {\n        return this.itemId;\n    }\n\n    /**\n     * @returns {number|null}\n     */\n    isModifierType()\n    {\n        return this.modifierId;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    hasExperienceSet()\n    {\n        return 0 < this.experience;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isDroppable()\n    {\n        return this.hasDropBody && sc.get(this, 'animationData', false);\n    }\n\n    /**\n     * @param {Array<Reward>} rewards\n     * @returns {boolean}\n     */\n    static areValidRewards(rewards)\n    {\n        return 0 < (rewards?.length || 0);\n    }\n\n    /**\n     * @param {Array<Reward>} rewards\n     * @returns {Array<Reward>}\n     */\n    static getRewardsBag(rewards)\n    {\n        let itemRangeArray = [];\n        for(let reward of rewards){\n            let itemRangeCount = itemRangeArray.length;\n            for(let i = 0; i < reward.dropRate; i++){\n                itemRangeArray[itemRangeCount + i] = reward;\n            }\n        }\n        return itemRangeArray;\n    }\n\n    /**\n     * @param {Object} rewardModel\n     * @returns {Reward|null}\n     */\n    static fromModel(rewardModel)\n    {\n        if(!rewardModel){\n            return null;\n        }\n        return new Reward({\n            id: rewardModel.id,\n            objectId: rewardModel.object_id,\n            itemId: rewardModel.item_id,\n            modifierId: rewardModel.modifier_id,\n            experience: rewardModel.experience,\n            dropRate: rewardModel.drop_rate,\n            dropQuantity: rewardModel.drop_quantity,\n            isUnique: rewardModel.is_unique,\n            wasGiven: rewardModel.was_given,\n            hasDropBody: rewardModel.has_drop_body,\n            animationData: DropsAnimations.fromModel(rewardModel.related_items_item?.related_drops_animations),\n            item: rewardModel.related_items_item,\n            modifier: rewardModel.modifier\n        });\n    }\n\n    /**\n     * @param {Object} reward\n     * @param {number} roomId\n     * @returns {Object}\n     */\n    static createDropObjectData(reward, roomId)\n    {\n        return {\n            id: reward.randomObjectId + reward.tileIndex,\n            room_id: roomId,\n            layer_name: reward.randomObjectId,\n            tile_index: reward.tileIndex,\n            class_type: ObjectTypes.DROP,\n            object_class_key: ObjectsConst.TYPE_DROP,\n            client_key: reward.randomObjectId + reward.tileIndex,\n            itemId: reward.itemId,\n            asset_key: reward.animationData.assetKey,\n            client_params: JSON.stringify({\n                frameStart: reward.animationData.extraParams.start,\n                frameEnd: reward.animationData.extraParams.end,\n                repeat: sc.get(reward.animationData.extraParams, 'repeat', -1),\n                hideOnComplete: sc.get(reward.animationData.extraParams, 'hideOnComplete', false),\n                autoStart: sc.get(reward.animationData.extraParams, 'autoStart', true),\n                asset_key: reward.animationData.assetKey,\n                yoyo: sc.get(reward.animationData.extraParams, 'yoyo', false)\n            }),\n            enabled: 1,\n            objects_assets: [{\n                object_asset_id: null,\n                object_id: reward.randomObjectId,\n                asset_type: reward.animationData.assetType,\n                asset_key: reward.animationData.assetKey,\n                asset_file: reward.animationData.file,\n                extra_params: JSON.stringify({\n                    frameWidth: reward.animationData.extraParams.frameWidth,\n                    frameHeight: reward.animationData.extraParams.frameHeight\n                })\n            }]\n        };\n    }\n\n}\n\nmodule.exports.Reward = Reward;\n"
  },
  {
    "path": "lib/rewards/server/rewards-drops-mapper.js",
    "content": "/**\n *\n * Reldens - RewardsDropsMapper\n *\n * Maps reward objects to client-ready drop message data format for network transmission.\n *\n */\n\nconst { ObjectsConst } = require('../../objects/constants');\nconst { Logger } = require('@reldens/utils');\n\nclass RewardsDropsMapper\n{\n\n    /**\n     * @param {Array<Object>} rewards\n     * @returns {Object}\n     */\n    static mapDropsData(rewards)\n    {\n        let messageData = {\n            [ObjectsConst.DROPS.KEY]: {}\n        };\n        for(let reward of rewards){\n            if(!reward.randomObjectId){\n                Logger.debug('Reward does not have an object ID.', reward);\n                continue;\n            }\n            messageData[ObjectsConst.DROPS.KEY][reward.randomObjectId + reward.tileIndex] = {\n                [ObjectsConst.DROPS.TYPE]: reward.animationData.assetType,\n                [ObjectsConst.DROPS.ASSET_KEY]: reward.animationData.assetKey,\n                [ObjectsConst.DROPS.FILE]: reward.animationData.file,\n                [ObjectsConst.DROPS.PARAMS]: reward.animationData.extraParams,\n                x: reward.objectPosition.x,\n                y: reward.objectPosition.y\n            };\n        }\n        return messageData;\n    }\n\n}\n\nmodule.exports.RewardsDropsMapper = RewardsDropsMapper;\n"
  },
  {
    "path": "lib/rewards/server/rewards-drops-processor.js",
    "content": "/**\n *\n * Reldens - RewardsDropsProcessor\n *\n * Processes reward drops by validating parameters, creating drop objects in the world, and broadcasting drop data to clients.\n *\n */\n\nconst { WorldDropHandler } = require('./world-drop-handler');\nconst { RewardsDropsMapper } = require('./rewards-drops-mapper');\nconst { RewardDropValidator } = require('./validator/reward-drop-validator');\n// const { Logger } = require('@reldens/utils');\n\nclass RewardsDropsProcessor\n{\n\n    /**\n     * @param {Object} roomScene\n     * @param {Object} rewardEventData\n     * @returns {Promise<boolean>}\n     */\n    static async processRewardsDrops(roomScene, rewardEventData)\n    {\n        let roomIdFromEvent = roomScene?.roomData?.roomId;\n        let roomIdFromObject = rewardEventData?.targetObject?.room_id;\n        if(!roomIdFromEvent || !roomIdFromObject || roomIdFromEvent !== roomIdFromObject){\n            // Logger.debug('Expected, the event listener is not specific enough.', roomIdFromEvent, roomIdFromObject);\n            return false;\n        }\n        let params = RewardDropValidator.fetchValidParams({roomScene, rewardEventData});\n        if(!params){\n            return false;\n        }\n        let { targetObjectBody, itemRewards } = params;\n        // let targetObjectString = 'TargetObject (ID: '+targetObjectBody.id+')';\n        if(targetObjectBody.isDropping){\n            // Logger.debug(targetObjectString+' is already dropping items.');\n            return false;\n        }\n        // Logger.debug(targetObjectString+' is dropping: '+itemRewards.length);\n        targetObjectBody.isDropping = true;\n        let rewards = await WorldDropHandler.createRewardItemObjectsOnRoom(targetObjectBody, itemRewards, roomScene);\n        if(!rewards){\n            return false;\n        }\n        roomScene.disableAutoDispose();\n        let dropsMappedData = RewardsDropsMapper.mapDropsData(rewards, roomScene);\n        let eventResult = true;\n        await roomScene.events.emit('reldens.afterProcessRewardsDropsBeforeBroadcast', dropsMappedData, eventResult);\n        if(!eventResult){\n            return false;\n        }\n        roomScene.broadcast('*', dropsMappedData);\n        targetObjectBody.isDropping = false;\n        return true;\n    }\n\n}\n\nmodule.exports.RewardsDropsProcessor = RewardsDropsProcessor;\n"
  },
  {
    "path": "lib/rewards/server/rewards-events-data-sender.js",
    "content": "/**\n *\n * Reldens - RewardsEventsDataSender\n *\n * Sends reward event updates and accepted reward notifications to players via websocket messages.\n *\n */\n\nconst { RewardsToActionsMapper } = require('./mappers/rewards-to-actions-mapper');\nconst { RewardsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger } = require('@reldens/utils');\n\nclass RewardsEventsDataSender\n{\n\n    constructor()\n    {\n        /** @type {RewardsToActionsMapper} */\n        this.rewardsActionsMapper = new RewardsToActionsMapper();\n    }\n\n    /**\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @param {Array<Object>} rewards\n     * @returns {boolean}\n     */\n    sendUpdates(room, playerSchema, rewards)\n    {\n        let client = this.fetchPlayerClient(playerSchema, room);\n        if(!client){\n            Logger.error('Player missing client for \"sendUpdates\".', playerSchema?.player_id);\n            return false;\n        }\n        if(!rewards){\n            Logger.warning('Missing new total rewards data.');\n            return false;\n        }\n        client.send('*', {\n            [GameConst.ACTION_KEY]: RewardsConst.ACTIONS.UPDATE,\n            rewards: this.rewardsActionsMapper.map(rewards),\n            listener: RewardsConst.KEY\n        });\n        return true;\n    }\n\n    /**\n     * @param {Object} room\n     * @param {Object} rewardState\n     * @param {Object} playerSchema\n     * @returns {boolean}\n     */\n    sendAcceptedRewardUpdate(room, rewardState, playerSchema)\n    {\n        let client = this.fetchPlayerClient(playerSchema, room);\n        if(!client){\n            Logger.error('Player missing client for \"sendAcceptedRewardUpdate\".', playerSchema?.player_id);\n            return false;\n        }\n        if(!rewardState){\n            Logger.warning('Missing rewardState data.');\n            return false;\n        }\n        let acceptedReward = this.rewardsActionsMapper.mapSingle(rewardState.reward);\n        client.send('*', {\n            [GameConst.ACTION_KEY]: RewardsConst.ACTIONS.ACCEPTED_REWARD,\n            acceptedReward,\n            listener: RewardsConst.KEY\n        });\n        return true;\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @param {Object} room\n     * @returns {Object|boolean}\n     */\n    fetchPlayerClient(playerSchema, room)\n    {\n        if(!playerSchema){\n            Logger.debug('Missing playerSchema on RewardsEventsDataSender.');\n            return false;\n        }\n        if(!room){\n            Logger.debug('Missing room on RewardsEventsDataSender.');\n            return false;\n        }\n        return room.activePlayerBySessionId(playerSchema.sessionId, room.roomId)?.client;\n    }\n\n}\n\nmodule.exports.RewardsEventsDataSender = RewardsEventsDataSender;\n"
  },
  {
    "path": "lib/rewards/server/rewards-events-handler.js",
    "content": "/**\n *\n * Reldens - RewardsEventsHandler\n *\n * Manages reward event handlers by activating rewards and binding event listeners to their corresponding handlers.\n *\n */\n\nconst { LoginStateHandler } = require('./event-handlers/login-state-handler');\nconst { RewardsEventsProvider } = require('./rewards-events-provider');\nconst { RewardsEventsUpdater } = require('./rewards-events-updater');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManagerSingleton} EventsManager\n * @typedef {import('../../config/server/config').ConfigManager} ConfigManager\n */\nclass RewardsEventsHandler\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        /** @type {RewardsEventsProvider} */\n        this.rewardsProvider = new RewardsEventsProvider(props);\n        /** @type {RewardsEventsUpdater} */\n        this.rewardsEventsUpdater = new RewardsEventsUpdater(props);\n        /** @type {Object<string, LoginStateHandler>} */\n        this.handlers = {\n            login: new LoginStateHandler({\n                rewardsProvider: this.rewardsProvider,\n                rewardsEventsUpdater: this.rewardsEventsUpdater,\n                config: this.config\n            })\n        };\n    }\n\n    /**\n     * @returns {Promise<boolean>}\n     */\n    async activateRewardsEvents()\n    {\n        if(!this.events){\n            Logger.critical('EventsManager undefined in RewardsEventsHandler.');\n            return false;\n        }\n        /** @type {Array<Object>|boolean} - CUSTOM DYNAMIC */\n        this.activeRewards = await this.rewardsProvider.fetchActiveRewardsWithMappedData();\n        for(let reward of this.activeRewards){\n            let handlerKey = sc.get(reward, 'handler_key', '');\n            if('' === handlerKey){\n                Logger.error('Missing handler key to process event reward.', reward);\n                continue;\n            }\n            if(reward.event_key && 0 < Object.keys(reward.eventData).length){\n                let handler = sc.get(this.handlers, handlerKey, false);\n                if(!handler){\n                    Logger.warning('Unknown handler key to process event reward.', handlerKey, reward);\n                    continue;\n                }\n                //Logger.debug('Reward Event handler assigned to event.', reward.id, reward.label, handlerKey);\n                this.events.on(reward.event_key, this.updateEventState.bind(this, reward, handler));\n            }\n        }\n    }\n\n    /**\n     * @param {Object} reward\n     * @param {Object} handler\n     * @param {...*} args\n     */\n    async updateEventState(reward, handler, ...args)\n    {\n        await handler.updateEventState(reward, args);\n    }\n\n}\n\nmodule.exports.RewardsEventsHandler = RewardsEventsHandler;\n"
  },
  {
    "path": "lib/rewards/server/rewards-events-message-actions.js",
    "content": "/**\n *\n * Reldens - RewardsEventsMessageActions\n *\n * Handles client messages for accepting reward events, processing reward state updates, and distributing reward items.\n *\n */\n\nconst { GiveRewardAction } = require('./actions/give-reward-action');\nconst { RewardsEventsProvider } = require('./rewards-events-provider');\nconst { RewardsEventsUpdater } = require('./rewards-events-updater');\nconst { RewardsEventsDataSender } = require('./rewards-events-data-sender');\nconst { RewardsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass RewardsEventsMessageActions\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManager|false} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {RewardsEventsProvider} */\n        this.rewardsProvider = new RewardsEventsProvider(props);\n        /** @type {RewardsEventsUpdater} */\n        this.rewardsEventsUpdater = new RewardsEventsUpdater(props);\n        /** @type {RewardsEventsDataSender} */\n        this.rewardsEventsDataSender = new RewardsEventsDataSender();\n        /** @type {GiveRewardAction} */\n        this.giveRewardAction = new GiveRewardAction();\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} message\n     * @param {Object} room\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async executeMessageActions(client, message, room, playerSchema)\n    {\n        let messageAction = sc.get(message, GameConst.ACTION_KEY, '');\n        if(-1 === messageAction.indexOf(RewardsConst.PREFIX)){\n            return false;\n        }\n        if(RewardsConst.ACTIONS.ACCEPT_REWARD === messageAction){\n            return await this.processAcceptRewardMessage(playerSchema, message, room);\n        }\n        return false;\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @param {Object} message\n     * @param {Object} room\n     * @returns {Promise<boolean>}\n     */\n    async processAcceptRewardMessage(playerSchema, message, room)\n    {\n        let rewardState = await this.rewardsProvider.fetchPlayerRewardStateWithRewardMappedData(\n            playerSchema.player_id,\n            message.id\n        );\n        if(!await this.updateRewardState(rewardState, playerSchema, message)){\n            return false;\n        }\n        this.rewardsEventsDataSender.sendAcceptedRewardUpdate(room, rewardState, playerSchema);\n        return this.rewardsEventsDataSender.sendUpdates(\n            room,\n            playerSchema,\n            await this.rewardsProvider.fetchPlayerActiveRewards(playerSchema.player_id)\n        );\n    }\n\n    /**\n     * @param {Object} rewardState\n     * @param {Object} playerSchema\n     * @param {Object} message\n     * @returns {Promise<boolean>}\n     */\n    async updateRewardState(rewardState, playerSchema, message)\n    {\n        if(!rewardState){\n            return true;\n        }\n        if(rewardState.mappedState.complete){\n            return false;\n        }\n        let giveResult = await this.giveRewardItems(rewardState.reward, playerSchema);\n        if(!giveResult){\n            return true;\n        }\n        rewardState.mappedState.complete = true;\n        return await this.rewardsEventsUpdater.updateStateById(\n            rewardState.id,\n            JSON.stringify(rewardState.mappedState),\n            message.id,\n            playerSchema.player_id\n        );\n    }\n\n    /**\n     * @param {Object} reward\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async giveRewardItems(reward, playerSchema)\n    {\n        if(!sc.isObject(reward.eventData.items)){\n            return true;\n        }\n        try {\n            let itemsKeys = Object.keys(reward.eventData.items);\n            for(let itemKey of itemsKeys){\n                let quantity = reward.eventData.items[itemKey];\n                await this.giveRewardAction.execute(playerSchema, itemKey, quantity);\n            }\n        } catch (error) {\n            Logger.error('There was an error while giving reward items.', error);\n            return false;\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.RewardsEventsMessageActions = RewardsEventsMessageActions;\n"
  },
  {
    "path": "lib/rewards/server/rewards-events-provider.js",
    "content": "/**\n *\n * Reldens - RewardsEventsProvider\n *\n * Provides reward events data by fetching, filtering, and mapping rewards from the database with player-specific state.\n *\n */\n\nconst { RewardsEventsMapper } = require('./mappers/rewards-events-mapper');\nconst { RepositoriesExtension } = require('./repositories-extension');\nconst { sc } = require('@reldens/utils');\n\nclass RewardsEventsProvider extends RepositoriesExtension\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super();\n        /** @type {RewardsEventsMapper} */\n        this.rewardsEventsMapper = new RewardsEventsMapper();\n        /** @type {boolean} */\n        this.isReady = this.assignRepositories(props);\n        let config = props?.config?.getWithoutLogs('client/rewards') || {};\n        /** @type {boolean} */\n        this.showRewardImage = sc.get(config, 'showRewardImage', true);\n        /** @type {string} */\n        this.defaultRewardImage = sc.get(config, 'defaultRewardImage', 'default-reward.png');\n        /** @type {string} */\n        this.defaultRewardImagePath = sc.get(config, 'showRewardImage', '/assets/custom/rewards/');\n        /** @type {Array<Object>|boolean} */\n        this.activeRewardsEvents = false;\n        /** @type {Array<Object>|boolean} */\n        this.activeRewardsEventsMappedData = false;\n    }\n\n    /**\n     * @param {number} playerId\n     * @returns {Promise<Object|boolean>}\n     */\n    async fetchPlayerActiveRewards(playerId)\n    {\n        if(!this.rewardsEventsRepository){\n            return false;\n        }\n        return this.rewardsEventsMapper.withPlayerRewardsEventsState(\n            await this.fetchActiveRewardsWithMappedData(),\n            await this.fetchPlayerActiveRewardsStateWithMappedData(playerId)\n        );\n    }\n\n    /**\n     * @returns {Promise<Array<Object>|boolean>}\n     */\n    async fetchActiveRewardsWithMappedData()\n    {\n        if(!this.activeRewardsEventsMappedData && this.isReady){\n            this.rewardsEventsRepository.sortBy = 'position';\n            let activeRewards = this.filterActiveRewardsByDates(await this.fetchActiveRewardsEvents());\n            this.rewardsEventsRepository.sortBy = false;\n            for(let rewardEvent of activeRewards){\n                await this.mapRewardDataFromModel(rewardEvent, true);\n            }\n            this.activeRewardsEventsMappedData = activeRewards;\n        }\n        return this.activeRewardsEventsMappedData;\n    }\n\n    /**\n     * @returns {Promise<Array<Object>|boolean>}\n     */\n    async fetchActiveRewardsEvents()\n    {\n        if(!this.activeRewardsEvents && this.isReady){\n            this.activeRewardsEvents = await this.rewardsEventsRepository.load({enabled: 1});\n        }\n        return this.activeRewardsEvents;\n    }\n\n    /**\n     * @param {Object} rewardEvent\n     * @param {boolean} withItems\n     * @returns {Promise<Object>}\n     */\n    async mapRewardDataFromModel(rewardEvent, withItems = false)\n    {\n        //Logger.debug('Map reward data from model:', rewardEvent);\n        rewardEvent.eventData = sc.toJson(rewardEvent.event_data, {});\n        rewardEvent.showRewardImage = sc.get(rewardEvent.eventData, 'showRewardImage', this.showRewardImage);\n        rewardEvent.rewardImage = sc.get(rewardEvent.eventData, 'rewardImage', this.defaultRewardImage);\n        rewardEvent.rewardImagePath = sc.get(rewardEvent.eventData, 'rewardImagePath', this.defaultRewardImagePath);\n        if(withItems && rewardEvent.eventData.items){\n            rewardEvent.itemsData = await this.fetchRewardItemsData(rewardEvent.eventData.items);\n        }\n        return rewardEvent;\n    }\n\n    /**\n     * @param {number} playerId\n     * @param {number} rewardId\n     * @returns {Promise<Object|boolean>}\n     */\n    async fetchPlayerRewardStateWithRewardMappedData(playerId, rewardId)\n    {\n        let rewardState = await this.rewardsEventsStateRepository.loadOneWithRelations(\n            {rewards_events_id: rewardId, player_id: playerId},\n            ['related_rewards_events']\n        );\n        if(!rewardState){\n            return false;\n        }\n        rewardState.mappedState = sc.toJson(rewardState.state, {});\n        rewardState.reward = await this.mapRewardDataFromModel(rewardState.related_rewards_events, false);\n        return rewardState;\n    }\n\n    /**\n     * @param {number} playerId\n     * @param {number} rewardId\n     * @returns {Promise<Array<Object>>}\n     */\n    async fetchPlayerActiveRewardsStateWithMappedData(playerId, rewardId)\n    {\n        if(!playerId){\n            return [];\n        }\n        let filters = {player_id: playerId};\n        if(rewardId){\n            filters.rewards_events_id = rewardId;\n        }\n        let playerEventState = await this.rewardsEventsStateRepository.load(filters);\n        //Logger.debug('Fetch player active rewards state:', filters, playerEventState);\n        if(!playerEventState){\n            return [];\n        }\n        for(let eventState of playerEventState){\n            eventState.mappedState = sc.toJson(eventState.state, {});\n        }\n        return playerEventState;\n    }\n\n    /**\n     * @param {number} playerId\n     * @param {number} rewardId\n     * @returns {Promise<Object|undefined>}\n     */\n    async fetchPlayerRewardsStateByIdWithMappedData(playerId, rewardId)\n    {\n        let playerEventState = await this.fetchPlayerActiveRewardsStateWithMappedData(playerId, rewardId);\n        return playerEventState?.shift();\n    }\n\n    /**\n     * @param {Object<string, number>} rewardItemsData\n     * @returns {Promise<Object<number, Object>>}\n     */\n    async fetchRewardItemsData(rewardItemsData)\n    {\n        let itemKeys = Object.keys(rewardItemsData);\n        let keysFilter = {key: {operator: 'IN', value: itemKeys}};\n        let items = await this.itemsRepository.load(keysFilter);\n        let itemsMappedById = {};\n        for(let item of items){\n            item.rewardQuantity = rewardItemsData[item.key];\n            itemsMappedById[item.id] = item;\n        }\n        return itemsMappedById;\n    }\n\n    /**\n     * @param {Array<Object>} rewards\n     * @returns {Array<Object>}\n     */\n    filterActiveRewardsByDates(rewards)\n    {\n        return rewards.filter((reward) => {\n            if(!reward.active_from && !reward.active_to){\n                return true;\n            }\n            let currentDate = new Date();\n            if(reward.active_from){\n                let activeFrom = new Date(reward.active_from);\n                if(activeFrom > currentDate){\n                    return false;\n                }\n            }\n            if(reward.active_to){\n                let activeTo = new Date(reward.active_to);\n                if(activeTo < currentDate){\n                    return false;\n                }\n            }\n            return true;\n        });\n    }\n}\n\nmodule.exports.RewardsEventsProvider = RewardsEventsProvider;\n"
  },
  {
    "path": "lib/rewards/server/rewards-events-updater.js",
    "content": "/**\n *\n * Reldens - RewardsEventsUpdater\n *\n * Updates reward event state in the database, creating new records or updating existing ones based on player progress.\n *\n */\n\nconst { RepositoriesExtension } = require('./repositories-extension');\nconst { Logger } = require('@reldens/utils');\n\nclass RewardsEventsUpdater extends RepositoriesExtension\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super();\n        /** @type {boolean} */\n        this.isReady = this.assignRepositories(props);\n    }\n\n    /**\n     * @param {number|boolean} rewardEventStateId\n     * @param {string} state\n     * @param {number} rewardEventId\n     * @param {number} playerId\n     * @returns {Promise<Object|boolean>}\n     */\n    async updateStateById(rewardEventStateId, state, rewardEventId, playerId)\n    {\n        if(!this.rewardsEventsStateRepository){\n            return false;\n        }\n        if(!rewardEventStateId){\n            return await this.rewardsEventsStateRepository.create({\n                rewards_events_id: rewardEventId,\n                player_id: playerId,\n                state\n            });\n        }\n        let rewardsSaveResult = await this.rewardsEventsStateRepository.updateById(rewardEventStateId, {state});\n        if(!rewardsSaveResult){\n            Logger.error('State could not be saved.', rewardEventStateId, state);\n            return false;\n        }\n        return rewardsSaveResult;\n    }\n\n}\n\nmodule.exports.RewardsEventsUpdater = RewardsEventsUpdater;\n"
  },
  {
    "path": "lib/rewards/server/rewards-mapper.js",
    "content": "/**\n *\n * Reldens - RewardsMapper\n *\n * Maps database reward models to Reward class instances.\n *\n */\n\nconst { Reward } = require('./reward');\n\nclass RewardsMapper\n{\n\n    /**\n     * @param {Array<Object>} rewardsModels\n     * @returns {Array<Reward>}\n     */\n    static fromModels(rewardsModels)\n    {\n        if(0 === rewardsModels.length){\n            return [];\n        }\n        let mapped = [];\n        for(let rewardModel of rewardsModels){\n            mapped.push(Reward.fromModel(rewardModel));\n        }\n        return mapped;\n    }\n\n}\n\nmodule.exports.RewardsMapper = RewardsMapper;\n"
  },
  {
    "path": "lib/rewards/server/subscribers/object-subscriber.js",
    "content": "/**\n *\n * Reldens - ObjectSubscriber\n *\n * Enriches object instances with their associated rewards data fetched from the database.\n *\n */\n\nconst { RewardsMapper } = require('../rewards-mapper');\n\nclass ObjectSubscriber\n{\n\n    /**\n     * @param {Object} objectInstance\n     */\n    static async enrichWithRewards(objectInstance)\n    {\n        if(!objectInstance){\n            return;\n        }\n        objectInstance['rewards'] = RewardsMapper.fromModels(\n            await objectInstance.dataServer.getEntity('rewards').loadByWithRelations(\n                'object_id',\n                objectInstance.id,\n                ['related_items_item.related_drops_animations', 'related_rewards_modifiers']\n            )\n        );\n    }\n\n}\n\nmodule.exports.ObjectSubscriber = ObjectSubscriber;\n"
  },
  {
    "path": "lib/rewards/server/subscribers/rewards-subscriber.js",
    "content": "/**\n *\n * Reldens - RewardsSubscriber\n *\n * Processes reward distribution to players, handling items, modifiers, and experience rewards with configurable split rules.\n *\n */\n\nconst { TargetDeterminer } = require('../target-determiner');\nconst { Reward } = require('../reward');\nconst { RewardsConst } = require('../../constants');\nconst { Modifier, ModifierConst } = require('@reldens/modifiers');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManagerSingleton} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../../teams/server/plugin').TeamsPlugin} TeamsPlugin\n */\nclass RewardsSubscriber\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        // @TODO - BETA - Handle undefined cases.\n        /** @type {TeamsPlugin|undefined} */\n        this.teamsPlugin = props?.featuresManager?.featuresList?.teams.package;\n        /** @type {object} */\n        this.rewardsConfig = props.featuresManager?.config?.getWithoutLogs('client/rewards/general', {}) ?? {};\n        /** @type {number} */\n        this.splitExperience = sc.get(this.rewardsConfig, 'splitExperience', 0);\n        /** @type {number} */\n        this.splitModifier = sc.get(this.rewardsConfig, 'splitModifier', 0);\n        /** @type {TargetDeterminer} */\n        this.targetDeterminer = new TargetDeterminer(this.teamsPlugin);\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @param {Object} targetObject\n     * @param {EventsManager} eventsManager\n     */\n    async giveRewards(playerSchema, targetObject, eventsManager)\n    {\n        if(!targetObject){\n            return;\n        }\n        let eventDrop = {playerSchema, targetObject, continueEvent: true};\n        await eventsManager.emit('reldens.beforeGiveRewards', eventDrop);\n        if(!eventDrop.continueEvent){\n            return;\n        }\n        let rewards = sc.get(targetObject, 'rewards', false);\n        let winningRewards = this.getWinningRewards(rewards);\n        // Logger.debug('Player won rewards.', rewards, {playerId: playerSchema.player_id, objectId: targetObject.id});\n        if(0 === winningRewards.length){\n            return;\n        }\n        let itemRewards = [];\n        for(let winningReward of winningRewards){\n            let giveRewardErrors = await this.giveReward(winningReward, playerSchema, itemRewards);\n            if(0 < giveRewardErrors.length){\n                Logger.error(\n                    'There was an error on the reward ID \"'+winningReward.id+'\".',\n                    winningReward,\n                    playerSchema.username+' (Player ID: '+playerSchema.player_id+')',\n                    giveRewardErrors\n                );\n            }\n        }\n        // @TODO - BETA - Verify if we can update the unique reward if there was any errors.\n        await this.updateUniqueRewards(winningRewards, targetObject.dataServer);\n        if(0 === itemRewards.length){\n            return;\n        }\n        await eventsManager.emit('reldens.afterGiveRewards', {itemRewards, playerSchema, targetObject, winningRewards});\n    }\n\n    /**\n     * @param {Reward} reward\n     * @param {Object} playerSchema\n     * @param {Array<Object>} itemRewards\n     * @returns {Promise<Array<Object>>}\n     */\n    async giveReward(reward, playerSchema, itemRewards)\n    {\n        // @TODO - BETA - Make optional give full records or partial ones.\n        // give by record will give a single reward model all the options to the same player (exp, item, modifier):\n        // let giveByRecord = this.config.get('rewards/general/giveByRecord');\n        let rewardTargets = this.targetDeterminer.forReward(playerSchema);\n        let errors = [];\n        if(reward.isItemType()){\n            let result = await this.applyItemReward(reward, rewardTargets, itemRewards);\n            if(!result.isSuccess){\n                errors.push(result);\n            }\n        }\n        if(reward.isModifierType()){\n            let result = await this.applyModifierReward(reward, rewardTargets);\n            if(!result.isSuccess){\n                errors.push(result);\n            }\n        }\n        if(reward.hasExperienceSet()){\n            let result = await this.applyExperienceReward(reward, rewardTargets);\n            if(!result.isSuccess){\n                errors.push(result);\n            }\n        }\n        return errors;\n    }\n\n    /**\n     * @param {Reward} reward\n     * @param {Object<number, Object>} rewardTargets\n     * @param {Array<Object>} itemRewards\n     * @returns {Promise<Object>}\n     */\n    async applyItemReward(reward, rewardTargets, itemRewards)\n    {\n        if(!reward.item){\n            return this.createRewardResult(false, 'The item with id \"'+reward.itemId+'\" was not found.');\n        }\n        let playersKeys = Object.keys(rewardTargets);\n        let randomIndex = sc.randomInteger(0, (playersKeys.length -1));\n        let randomTarget = rewardTargets[playersKeys[randomIndex]];\n        if(reward.isDroppable()){\n            itemRewards.push(reward);\n            return this.createRewardResult(true);\n        }\n        let addItemsResult = await this.addItemToPlayerInventory(randomTarget, reward.item, reward.dropQuantity);\n        if(!addItemsResult){\n            return this.createRewardResult(\n                false,\n                'Could not add item to Players Inventory - Reward ' + reward.id + ' - Item Id = ' + reward.itemId\n            );\n        }\n        return this.createRewardResult(true);\n    }\n\n    /**\n     * @param {Reward} reward\n     * @param {Object<number, Object>} rewardTargets\n     * @returns {Promise<Object>}\n     */\n    async applyModifierReward(reward, rewardTargets)\n    {\n        let rewardModifierModel = reward.modifier;\n        if(!rewardModifierModel){\n            return this.createRewardResult(false, 'The modifier with id ' + reward.modifierId + ' was not found.');\n        }\n        let playersKeys = Object.keys(rewardTargets);\n        let randomIndex = sc.randomInteger(0, playersKeys.length);\n        let randomTarget = rewardTargets[randomIndex];\n        let configuredTargets = RewardsConst.SPLIT_MODIFIER.ALL === this.splitModifier\n            ? rewardTargets\n            : {[randomTarget.player_id]: randomTarget};\n        for(let i of Object.keys(configuredTargets)){\n            let modifier = new Modifier(rewardModifierModel);\n            modifier.apply(configuredTargets[i]);\n            if(ModifierConst.MOD_APPLIED !== modifier.state){\n                return this.createRewardResult(\n                    false,\n                    'Could not add modifier to Player - Reward ' + reward.id + ' - Modifier Id = ' + reward.modifierId\n                );\n            }\n        }\n        return this.createRewardResult(true);\n    }\n\n    /**\n     * @param {Reward} reward\n     * @param {Object<number, Object>} rewardTargets\n     * @returns {Promise<Object>}\n     */\n    async applyExperienceReward(reward, rewardTargets)\n    {\n        let playersKeys = Object.keys(rewardTargets);\n        if(RewardsConst.SPLIT_EXPERIENCE.ALL === this.splitExperience){\n            for(let i of playersKeys){\n                let experiencePerPlayer = Number(reward.experience) / Number(playersKeys.length);\n                let rewardTargetClassPath = rewardTargets[i].skillsServer.classPath;\n                await rewardTargetClassPath.addExperience(experiencePerPlayer);\n            }\n        }\n        if(RewardsConst.SPLIT_EXPERIENCE.PROPORTIONAL_BY_LEVEL === this.splitExperience){\n            let levelsTotal = this.targetsLevelsTotal(playersKeys, rewardTargets);\n            for(let i of playersKeys){\n                let rewardTargetClassPath = rewardTargets[i].skillsServer.classPath;\n                let playerLevelProportion = (rewardTargetClassPath.currentLevel * 100) / levelsTotal;\n                let experiencePerPlayer = (playerLevelProportion * Number(reward.experience)) / 100 ;\n                await rewardTargetClassPath.addExperience(experiencePerPlayer);\n            }\n        }\n        return this.createRewardResult(true);\n    }\n\n    /**\n     * @param {Array<string>} playersKeys\n     * @param {Object<number, Object>} rewardTargets\n     * @returns {number}\n     */\n    targetsLevelsTotal(playersKeys, rewardTargets)\n    {\n        let levelsTotal = 0;\n        for(let i of playersKeys){\n            levelsTotal += Number(rewardTargets[i].skillsServer.classPath.currentLevel);\n        }\n        return levelsTotal;\n    }\n\n    /**\n     * @param {boolean} isSuccess\n     * @param {string} message\n     * @returns {Object}\n     */\n    createRewardResult(isSuccess, message = '')\n    {\n        return { isSuccess, message };\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @param {Object} item\n     * @param {number} quantity\n     * @returns {Promise<boolean>}\n     */\n    async addItemToPlayerInventory(playerSchema, item, quantity)\n    {\n        let rewardItem = playerSchema.inventory.manager.createItemInstance(item.key, quantity);\n        if(!rewardItem){\n            Logger.error(`Couldn't create item instance with key ${item.key}`);\n            return false;\n        }\n        return await playerSchema.inventory.manager.addItem(rewardItem);\n    }\n\n    /**\n     * @param {Array<Reward>|boolean} rewards\n     * @param {boolean} usesRewardBag\n     * @returns {Array<Reward>}\n     */\n    getWinningRewards(rewards, usesRewardBag = false)\n    {\n        let rewardAwarded = [];\n        if(!Reward.areValidRewards(rewards)){\n            return rewardAwarded;\n        }\n        if(usesRewardBag){\n            let rewardsBag = Reward.getRewardsBag(rewards);\n            let reward = rewardsBag[Math.floor(Math.random() * rewardsBag.length)];\n            if(reward.isValidReward()){\n                rewardAwarded.push(reward);\n            }\n            return rewardAwarded;\n        }\n        for(let reward of rewards){\n            if(!reward.isWinningReward() || !reward.isValidReward()){\n                continue;\n            }\n            rewardAwarded.push(reward);\n        }\n        return rewardAwarded;\n    }\n\n    /**\n     * @param {Array<Reward>} rewards\n     * @param {BaseDataServer} dataServer\n     */\n    async updateUniqueRewards(rewards, dataServer)\n    {\n        let rewardsRepository = dataServer.getEntity('rewards');\n        for(let reward of rewards){\n            if(reward.isUnique && !reward.was_given){\n                await rewardsRepository.updateById(reward.id, { was_given: 1 });\n            }\n        }\n    }\n\n}\n\nmodule.exports.RewardsSubscriber = RewardsSubscriber;\n"
  },
  {
    "path": "lib/rewards/server/target-determiner.js",
    "content": "/**\n *\n * Reldens - TargetDeterminer\n *\n * Determines reward distribution targets based on team membership, returning either a single player or all team members.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../teams/server/plugin').TeamsPlugin} TeamsPlugin\n */\nclass TargetDeterminer\n{\n\n    /**\n     * @param {TeamsPlugin} teamsPlugin\n     */\n    constructor(teamsPlugin)\n    {\n        /** @type {TeamsPlugin} */\n        this.teamsPlugin = teamsPlugin;\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @returns {Object<string, Object>}\n     */\n    forReward(playerSchema)\n    {\n        let singleTarget = {[playerSchema.player_id]: playerSchema};\n        if(!playerSchema.currentTeam){\n            return singleTarget;\n        }\n        if(!this.teamsPlugin){\n            Logger.error('TeamsPlugin undefined on RewardsSubscriber.');\n            return singleTarget;\n        }\n        let playerTeam = sc.get(this.teamsPlugin.teams, playerSchema.currentTeam, false);\n        if(!playerTeam){\n            Logger.error('Defined team ID on player not found.', {\n                currentTeam: playerSchema.currentTeam,\n                playerId: playerSchema.player_id,\n                teamsPlugin: this.teamsPlugin\n            });\n            return singleTarget;\n        }\n        return 1 < Object.keys(playerTeam.players).length ? playerTeam.players : singleTarget;\n    }\n\n}\n\nmodule.exports.TargetDeterminer = TargetDeterminer;\n"
  },
  {
    "path": "lib/rewards/server/validator/reward-drop-validator.js",
    "content": "/**\n *\n * Reldens - RewardDropValidator\n *\n * Validates and extracts required parameters for reward drop handling in the world.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\nclass RewardDropValidator\n{\n\n    /**\n     * @param {Object} params\n     * @returns {Object|boolean}\n     */\n    static fetchValidParams(params)\n    {\n        let rewardEventData = sc.get(params, 'rewardEventData', false);\n        if(!rewardEventData){\n            Logger.critical('RewardEventData not found on WorldDropHandler.');\n            return false;\n        }\n        let roomScene = sc.get(params, 'roomScene', false);\n        if(!roomScene){\n            Logger.critical('RoomScene not found on WorldDropHandler.');\n            return false;\n        }\n        let targetObjectBody = sc.get(rewardEventData.targetObject, 'objectBody', false);\n        if(!targetObjectBody){\n            Logger.critical('Target object \"objectBody\" not found on reward event data.');\n            return false;\n        }\n        let itemRewards = sc.get(rewardEventData, 'itemRewards', []);\n        if(0 === itemRewards.length){\n            Logger.critical('Items rewards not found on WorldDropHandler.');\n            return false;\n        }\n        return {roomScene, itemRewards, targetObjectBody};\n    }\n\n}\n\nmodule.exports.RewardDropValidator = RewardDropValidator;"
  },
  {
    "path": "lib/rewards/server/world-drop-handler.js",
    "content": "/**\n *\n * Reldens - WorldDropHandler\n *\n * Handles the creation of dropped item objects in the game world, finding walkable positions and spawning drop\n * instances.\n *\n */\n\nconst { Reward } = require('./reward');\nconst { WorldWalkableNodesAroundProvider } = require('../../world/server/world-walkable-nodes-around-provider');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass WorldDropHandler\n{\n\n    /**\n     * @param {Object} targetObjectBody\n     * @param {Array<Object>} itemRewards\n     * @param {Object} roomScene\n     * @returns {Promise<Array<Object>>}\n     */\n    static async createRewardItemObjectsOnRoom(targetObjectBody, itemRewards, roomScene)\n    {\n        let closerWalkableNodes = WorldWalkableNodesAroundProvider.generateWalkableNodesAround(targetObjectBody);\n        let objectPosition = {x: 0, y: 0};\n        let rewards = [];\n        for(let itemReward of itemRewards){\n            await this.createDropItems(\n                itemReward,\n                closerWalkableNodes,\n                objectPosition,\n                targetObjectBody,\n                roomScene,\n                rewards\n            );\n        }\n        return rewards;\n    }\n\n    /**\n     * @param {Object} itemReward\n     * @param {Array<Object>} closerWalkableNodes\n     * @param {Object} objectPosition\n     * @param {Object} targetObjectBody\n     * @param {Object} roomScene\n     * @param {Array<Object>} rewards\n     * @returns {Promise<Array<Object>>}\n     */\n    static async createDropItems(itemReward, closerWalkableNodes, objectPosition, targetObjectBody, roomScene, rewards)\n    {\n        let itemKey = itemReward.item?.key || 'no-key';\n        Logger.debug('Create drop item ID \"'+itemReward.id+'\" ('+ itemKey+'): '+itemReward.dropQuantity);\n        //Logger.debug('Item reward:', itemReward);\n        for(let i = 0; i < (itemReward.dropQuantity || 1); i++){\n            if(0 < closerWalkableNodes.length){\n                objectPosition = closerWalkableNodes.pop();\n            }\n            if(!objectPosition){\n                Logger.error('No closer walkable nodes found for reward ID \"'+itemReward.id+'\".');\n                return rewards;\n            }\n            rewards.push(await this.createDropItem(\n                objectPosition,\n                itemReward,\n                targetObjectBody,\n                roomScene,\n                'drop-' + itemKey + '-' + sc.randomChars(8)\n            ));\n        }\n        return rewards;\n    }\n\n    /**\n     * @param {Object} objectPosition\n     * @param {Object} itemReward\n     * @param {Object} targetObjectBody\n     * @param {Object} roomScene\n     * @param {string} randomObjectId\n     * @returns {Promise<Object|boolean>}\n     */\n    static async createDropItem(objectPosition, itemReward, targetObjectBody, roomScene, randomObjectId)\n    {\n        let tileIndex = targetObjectBody.world.tileIndexByRowAndColumn(objectPosition.x, objectPosition.y);\n        let newReward = sc.deepMergeProperties({objectPosition, tileIndex, randomObjectId}, itemReward);\n        let worldObjectData = {\n            layerName: newReward.randomObjectId,\n            tileIndex: newReward.tileIndex,\n            tileWidth: targetObjectBody.worldTileWidth,\n            tileHeight: targetObjectBody.worldTileHeight,\n            x: newReward.objectPosition.x,\n            y: newReward.objectPosition.y\n        };\n        let dropObjectInstance = await roomScene.createDropObjectInRoom(\n            Reward.createDropObjectData(newReward, roomScene.roomId),\n            worldObjectData\n        );\n        if(!dropObjectInstance){\n            return false;\n        }\n        newReward['dropObjectInstance'] = dropObjectInstance;\n        return newReward;\n    }\n\n}\n\nmodule.exports.WorldDropHandler = WorldDropHandler;\n"
  },
  {
    "path": "lib/rooms/client/plugin.js",
    "content": "/**\n *\n * Reldens - RoomsPlugin\n *\n * Client-side plugin for managing room selection and scene selector UI.\n *\n */\n\nconst { ActionsConst } = require('../../actions/constants');\nconst { RoomsConst } = require('../constants');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass RoomsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in RoomsPlugin.');\n        }\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in RoomsPlugin.');\n        }\n        this.events.on('reldens.beforeCreateEngine', (initialGameData, gameManager) => {\n            let isRoomSelectionDisabled = gameManager.config.get('client/rooms/selection/allowOnLogin', false);\n            if(isRoomSelectionDisabled && initialGameData.roomSelection){\n                this.populateSceneSelector(initialGameData.roomSelection, gameManager);\n            }\n        });\n        this.events.on('reldens.onPrepareSinglePlayerSelectorFormSubmit', (event) => {\n            this.appendSelectedScene(event.gameManager, event.form);\n        });\n        this.events.on('reldens.onPreparePlayerSelectorFormSubmit', (event) => {\n            this.appendSelectedScene(event.gameManager, event.form);\n        });\n        this.events.on('reldens.onPreparePlayerCreationFormSubmit', (event) => {\n            this.appendSelectedScene(event.gameManager, event.form);\n        });\n    }\n\n    /**\n     * @param {Array<Object>} roomSelection\n     * @param {GameManager} gameManager\n     * @returns {boolean|void}\n     */\n    populateSceneSelector(roomSelection, gameManager)\n    {\n        let playerCreationAdditional = gameManager.gameDom.getElement(\n            ActionsConst.SELECTORS.PLAYER_CREATION_ADDITIONAL_INFO\n        );\n        let playerSelectionAdditional = gameManager.gameDom.getElement(\n            ActionsConst.SELECTORS.PLAYER_SELECTION_ADDITIONAL_INFO\n        );\n        if(!playerCreationAdditional && !playerSelectionAdditional){\n            Logger.warning('Missing element.', {playerCreationAdditional, playerSelectionAdditional});\n            return false;\n        }\n        if(playerCreationAdditional){\n            let creationSelection = this.filterCreationRooms(roomSelection);\n            let div = this.createSelectorElements(gameManager, creationSelection, 'creation');\n            playerCreationAdditional.append(div);\n        }\n        if(playerSelectionAdditional){\n            let div = this.createSelectorElements(gameManager, roomSelection, 'selection');\n            playerSelectionAdditional.append(div);\n        }\n    }\n\n    /**\n     * @param {Array<Object>} roomSelection\n     * @returns {Array<Object>}\n     */\n    filterCreationRooms(roomSelection)\n    {\n        let creationSelection = [];\n        for(let optionData of roomSelection){\n            if(optionData.name === RoomsConst.ROOM_LAST_LOCATION_KEY){\n                continue;\n            }\n            creationSelection.push(optionData);\n        }\n        return creationSelection;\n    }\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {HTMLFormElement} form\n     */\n    appendSelectedScene(gameManager, form)\n    {\n        let singleScene = gameManager.gameDom.getElement('.scene-select-single', form);\n        if(singleScene){\n            gameManager.initialGameData.selectedScene = singleScene.value;\n            return;\n        }\n        let sceneSelect = gameManager.gameDom.getElement('.scene-select', form);\n        if(!sceneSelect){\n            //Logger.debug('Scene selector not found by \".scene-select\".', form);\n            return;\n        }\n        let selectedScene = sceneSelect.options[sceneSelect.selectedIndex]?.value;\n        if(!selectedScene){\n            //Logger.debug('Selected scene not found.', sceneSelect, selectedScene.selectedIndex, form);\n            return;\n        }\n        gameManager.initialGameData.selectedScene = selectedScene;\n    }\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {Array<Object>} roomSelection\n     * @param {string} key\n     * @returns {HTMLElement}\n     */\n    createSelectorElements(gameManager, roomSelection, key)\n    {\n        let elementKey = key+'SelectedScene';\n        if(1 === roomSelection.length){\n            let input = gameManager.gameDom.createElement('input');\n            input.type = 'hidden';\n            input.name = elementKey;\n            input.id = elementKey;\n            input.classList.add('scene-select-single');\n            input.value = roomSelection.shift().name;\n            return input;\n        }\n        let div = gameManager.gameDom.createElement('div');\n        div.classList.add('input-box');\n        let label = gameManager.gameDom.createElement('label');\n        label.htmlFor = elementKey;\n        label.innerText = this.gameManager.services.translator.t('game.pleaseSelectScene');\n        let select = gameManager.gameDom.createElement('select');\n        select.name = elementKey;\n        select.id = elementKey;\n        select.classList.add('select-element');\n        select.classList.add('scene-select');\n        for(let roomData of roomSelection){\n            let option = new Option(roomData.title, roomData.name);\n            select.append(option);\n        }\n        div.append(label);\n        div.append(select);\n        return div;\n    }\n}\n\nmodule.exports.RoomsPlugin = RoomsPlugin;\n"
  },
  {
    "path": "lib/rooms/constants.js",
    "content": "/**\n *\n * Reldens - rooms/constants\n *\n */\n\nmodule.exports.RoomsConst = {\n    ROOM_TYPE_SCENE: 'scene',\n    ROOM_TYPE_LOGIN: 'login',\n    ROOM_TYPE_GAME: 'game',\n    TILE_INDEX: 'i',\n    NEXT_SCENE: 'n',\n    MAPS_BUCKET: '/assets/maps/',\n    ROOM_LAST_LOCATION_KEY: '@lastLocation',\n    RETURN_POINT_KEYS: {\n        DIRECTION: 'd',\n        X: 'x',\n        Y: 'y',\n        DEFAULT: 'de',\n        PREVIOUS: 'p'\n    },\n    ERRORS: {\n        CREATING_ROOM_AWAIT: 'CREATING-ROOM-AWAIT'\n    }\n};\n"
  },
  {
    "path": "lib/rooms/server/entities/rooms-entity-override.js",
    "content": "/**\n *\n * Reldens - RoomsEntityOverride\n *\n * Extend rooms entity with custom properties for map file uploads and admin panel configuration.\n *\n */\n\nconst { RoomsConst } = require('../../constants');\nconst { AllowedFileTypes } = require('../../../game/allowed-file-types');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { RoomsEntity } = require('../../../../generated-entities/entities/rooms-entity');\n\nclass RoomsEntityOverride extends RoomsEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @param {Object} projectConfig\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps, projectConfig)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.titleProperty = 'name';\n        let bucket = FileHandler.joinPaths(projectConfig.bucketFullPath, 'assets', 'maps');\n        let bucketPath = RoomsConst.MAPS_BUCKET;\n        let distFolder = FileHandler.joinPaths(projectConfig.distPath, 'assets', 'maps');\n        config.properties.map_filename = {\n            isRequired: true,\n            isUpload: true,\n            allowedTypes: AllowedFileTypes.TEXT,\n            bucket,\n            bucketPath,\n            distFolder\n        };\n        config.properties.scene_images = {\n            isRequired: true,\n            isArray: ',',\n            isUpload: true,\n            allowedTypes: AllowedFileTypes.IMAGE,\n            bucket,\n            bucketPath,\n            distFolder\n        };\n        config.bucket = bucket;\n        config.bucketPath = bucketPath;\n        config.navigationPosition = 700;\n        return config;\n    }\n\n}\n\nmodule.exports.RoomsEntityOverride = RoomsEntityOverride;\n"
  },
  {
    "path": "lib/rooms/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { RoomsEntityOverride } = require('./entities/rooms-entity-override');\n\nmodule.exports.entitiesConfig = {\n    rooms: RoomsEntityOverride\n};\n"
  },
  {
    "path": "lib/rooms/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        rooms: 'Rooms',\n        rooms_change_points: 'Change Points',\n        rooms_return_points: 'Return Points'\n    }\n};\n"
  },
  {
    "path": "lib/rooms/server/events/joined-scene-room-event.js",
    "content": "/**\n *\n * Reldens - JoinedSceneRoomEvent\n *\n * Event data container for player joining a scene room.\n *\n */\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('../scene').RoomScene} RoomScene\n * @typedef {import('../../../users/server/player').Player} Player\n * @typedef {import('../../../../generated-entities/models/objection-js/users-model').UsersModel} UsersModel\n */\nclass JoinedSceneRoomEvent\n{\n\n    /**\n     * @param {RoomScene} roomScene\n     * @param {Client} client\n     * @param {Object} options\n     * @param {UsersModel} userModel\n     * @param {Player} loggedPlayer\n     * @param {boolean} isGuest\n     */\n    constructor(roomScene, client, options, userModel, loggedPlayer, isGuest)\n    {\n        /** @type {RoomScene} */\n        this.roomScene = roomScene;\n        /** @type {Client} */\n        this.client = client;\n        /** @type {Object} */\n        this.options = options;\n        /** @type {UsersModel} */\n        this.userModel = userModel;\n        /** @type {Player} */\n        this.loggedPlayer = loggedPlayer;\n        /** @type {boolean} */\n        this.isGuest = isGuest;\n    }\n\n}\n\nmodule.exports.JoinedSceneRoomEvent = JoinedSceneRoomEvent;\n"
  },
  {
    "path": "lib/rooms/server/game.js",
    "content": "/**\n *\n * Reldens - RoomGame\n *\n * Game lobby room that holds all logged users before joining scenes.\n *\n */\n\nconst { RoomLogin } = require('./login');\nconst { RoomsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('../../../generated-entities/models/objection-js/users-model').UsersModel} UsersModel\n */\nclass RoomGame extends RoomLogin\n{\n\n    /**\n     * @param {Object} props\n     */\n    onCreate(props)\n    {\n        super.onCreate(props);\n        this.roomType = RoomsConst.ROOM_TYPE_GAME;\n        Logger.notice('Created RoomGame: '+this.roomName+' ('+this.roomId+')');\n        delete props.roomsManager.creatingInstances[this.roomName];\n        this.loginManager.activePlayers.gameRoomInstanceId = this.roomId;\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} options\n     * @param {UsersModel} userModel\n     * @returns {Promise<boolean|void>}\n     */\n    async onJoin(client, options, userModel)\n    {\n        await this.events.emit('reldens.onJoinRoomGame', client, options, userModel, this);\n        let loggedUser = this.activePlayerByUserName(userModel.username, this.roomId, false);\n        if(loggedUser){\n            //Logger.debug('Disconnecting already logged user: \"'+userModel.username+'\".');\n            // check if user is already logged and disconnect from the all the previous rooms:\n            await this.disconnectUserFromEveryOtherRoom(userModel);\n        }\n        if(!await this.loginManager.updateLastLogin(userModel)){\n            //Logger.debug('Last login update error on user: \"'+userModel.username+'\".');\n            client.send('*', {[GameConst.ACTION_KEY]: GameConst.LOGIN_UPDATE_ERROR});\n            return false;\n        }\n        this.loginManager.activePlayers.add(userModel, client, this);\n        // we need to send the engine and all the general and client configurations from the storage:\n        let storedClientConfig = {client: this.config.client};\n        let clientFullConfig = Object.assign({}, this.config.gameEngine, storedClientConfig);\n        // @TODO - BETA - Reduce superInitialGameData by passing the data on the initial request.\n        let superInitialGameData = {\n            [GameConst.ACTION_KEY]: GameConst.START_GAME,\n            sessionId: client.sessionId,\n            players: userModel.related_players,\n            // @NOTE: if multiplayer is disabled then we will use the first one as default:\n            player: 0 < sc.length(userModel.related_players) ? userModel.related_players[0] : false,\n            gameConfig: clientFullConfig,\n            features: this.config.availableFeaturesList,\n            userName: userModel.username,\n            guestPassword: options.password\n        };\n        await this.events.emit('reldens.beforeSuperInitialGameData', superInitialGameData, this, client, userModel);\n        client.send('*', superInitialGameData);\n    }\n\n    /**\n     * @param {Client} client\n     * @param {boolean} consented\n     * @returns {Promise<void>}\n     */\n    async onLeave(client, consented)\n    {\n        let activePlayer = this.activePlayerBySessionId(client.sessionId, this.roomId, false);\n        this.loginManager.activePlayers.removeAllByUserId(activePlayer.userId);\n    }\n\n    /**\n     * @param {UsersModel} userModel\n     * @returns {Promise<Object>}\n     */\n    async disconnectUserFromEveryOtherRoom(userModel)\n    {\n        return await this.loginManager.disconnectUserFromEveryRoom(userModel, true);\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} message\n     * @returns {Promise<void>}\n     */\n    async handleReceivedMessage(client, message)\n    {\n        if(!sc.hasOwn(message, 'act') || message.act !== GameConst.CREATE_PLAYER){\n            return;\n        }\n        message.formData.user_id = client.auth.id;\n        let result = await this.loginManager.createNewPlayer(message.formData);\n        result.act = GameConst.CREATE_PLAYER_RESULT;\n        return client.send('*', result);\n    }\n\n}\n\nmodule.exports.RoomGame = RoomGame;\n"
  },
  {
    "path": "lib/rooms/server/login.js",
    "content": "/**\n *\n * Reldens - RoomLogin\n *\n * Base authenticated room that handles login, authentication, and user validation.\n *\n */\n\nconst { Room } = require('@colyseus/core');\nconst { RoomsConst } = require('../constants');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('../../game/server/login-manager').LoginManager} LoginManager\n * @typedef {import('../../features/server/manager').FeaturesManager} FeaturesManager\n */\nclass RoomLogin extends Room\n{\n\n    /**\n     * @param {Object} options\n     */\n    onCreate(options)\n    {\n        if(options.roomsManager.creatingInstances[this.roomName]){\n            ErrorManager.error(RoomsConst.ERRORS.CREATING_ROOM_AWAIT);\n        }\n        if(!this.isValidRoomOnServer(options)){\n            ErrorManager.error('Invalid server room: '+this.roomName+' ('+this.roomId+').');\n        }\n        options.roomsManager.creatingInstances[this.roomName] = true;\n        /** @type {string} */\n        this.roomType = RoomsConst.ROOM_TYPE_LOGIN;\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(options, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in RoomLogin.');\n        }\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(options, 'dataServer', false);\n        /** @type {ConfigManager} */\n        this.config = options.config;\n        /** @type {LoginManager} */\n        this.loginManager = options.loginManager;\n        /** @type {FeaturesManager} */\n        this.featuresManager = options.featuresManager;\n        /** @type {boolean} */\n        this.validateRoomData = false;\n        /** @type {string} */\n        this.guestEmailDomain = this.config.getWithoutLogs('server/players/guestsUser/emailDomain');\n        /** @type {boolean} */\n        this.validateRoomsOriginRequest = this.config.getWithoutLogs('server/rooms/validateRoomsOriginRequest', false);\n        this.events.emitSync('reldens.roomLoginOnCreate', {roomLogin: this, options});\n        this.onMessage('*', this.handleReceivedMessage.bind(this));\n        options.roomsManager.createdInstances[this.roomId] = this;\n        options.roomsManager.instanceIdByName[this.roomName] = this.roomId;\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} options\n     * @param {Object} request\n     * @returns {Promise<Object>}\n     */\n    async onAuth(client, options, request)\n    {\n        if(!options){\n            Logger.warning('Auth missing options.');\n            ErrorManager.error('Could not connect to the game.');\n        }\n        if(!this.isValidOriginRequest(request)){\n            Logger.warning('Auth invalid origin request.');\n            ErrorManager.error('Could not connect to the game.');\n        }\n        let activeUser = this.activePlayerByUserName(options.username, this.roomId);\n        if(activeUser?.userModel){\n            return await this.disconnectFromOtherServers(activeUser?.userModel, options);\n        }\n        let loginResult = await this.loginManager.processUserRequest(options);\n        if(sc.hasOwn(loginResult, 'error')){\n            // @TODO - BETA - Improve login errors, use send message with type and here just return false.\n            ErrorManager.error(loginResult.error);\n        }\n        if(sc.hasOwn(options, 'selectedPlayer')){\n            loginResult.selectedPlayer = options.selectedPlayer;\n            loginResult.user.player = this.getPlayerByIdFromArray(loginResult.user.related_players, options.selectedPlayer);\n        }\n        let result = {confirm: true};\n        await this.events.emitSync('reldens.roomLoginOnAuth', {\n            roomLogin: this,\n            result,\n            loginResult,\n            client,\n            options,\n            request\n        });\n        if(!result.confirm){\n            Logger.warning('Connection denied on event result.');\n            ErrorManager.error('Could not connect to the game.');\n        }\n        return await this.disconnectFromOtherServers(loginResult.user, options);\n    }\n\n    /**\n     * @param {Object} options\n     * @returns {boolean}\n     */\n    isValidRoomOnServer(options)\n    {\n        this.validateRoomOnServer = options?.config?.getWithoutLogs('server/rooms/validateRoomOnServer', true);\n        if(!this.validateRoomOnServer){\n            return true;\n        }\n        let currentServerBaseUrl = options?.config?.getWithoutLogs('server/baseUrl', '');\n        if(!currentServerBaseUrl){\n            return true;\n        }\n        let roomServerUrl = options?.roomData?.serverUrl;\n        if(!roomServerUrl){\n            return true;\n        }\n        return roomServerUrl === currentServerBaseUrl;\n    }\n\n    /**\n     * @param {Object} request\n     * @returns {boolean}\n     */\n    isValidOriginRequest(request)\n    {\n        if(!this.validateRoomsOriginRequest){\n            return true;\n        }\n        let roomServerUrl = this.roomData?.serverUrl;\n        if(!roomServerUrl){\n            return true;\n        }\n        return roomServerUrl === request.headers.origin || roomServerUrl === request.headers.host;\n    }\n\n    /**\n     * @param {Object} userModel\n     * @param {Object} options\n     * @returns {Promise<Object>}\n     */\n    async disconnectFromOtherServers(userModel, options)\n    {\n        let disconnectResult = await this.loginManager.broadcastDisconnectionMessage(userModel, options);\n        if(!disconnectResult){\n            Logger.warning('Disconnection error on activeUser.', options, disconnectResult);\n            ErrorManager.error('Could not connect to the game.');\n        }\n        return userModel;\n    }\n\n    /**\n     * @param {string} userName\n     * @param {string} roomId\n     * @param {boolean} [withPlayer]\n     * @returns {Object|boolean}\n     */\n    activePlayerByUserName(userName, roomId, withPlayer = true)\n    {\n        return this.loginManager.activePlayers.fetchByRoomAndUserName(userName, roomId, withPlayer);\n    }\n\n    /**\n     * @param {string} sessionId\n     * @param {string} roomId\n     * @param {boolean} [withPlayer]\n     * @returns {Object|boolean}\n     */\n    activePlayerBySessionId(sessionId, roomId, withPlayer = true)\n    {\n        return this.loginManager.activePlayers.fetchByRoomAndSessionId(sessionId, roomId, withPlayer);\n    }\n\n    /**\n     * @param {number} playerId\n     * @param {string} roomId\n     * @param {boolean} [withPlayer]\n     * @returns {Object|boolean}\n     */\n    activePlayerByPlayerId(playerId, roomId, withPlayer = true)\n    {\n        return this.loginManager.activePlayers.fetchByRoomAndPlayerId(playerId, roomId, withPlayer);\n    }\n\n    /**\n     * @param {string} playerName\n     * @param {string} roomId\n     * @param {boolean} [withPlayer]\n     * @returns {Object|boolean}\n     */\n    activePlayerByPlayerName(playerName, roomId, withPlayer = true)\n    {\n        return this.loginManager.activePlayers.fetchByRoomAndPlayerName(playerName, roomId, withPlayer);\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {Client} client\n     * @param {boolean} isChangingScene\n     */\n    removeActivePlayer(playerSchema, client, isChangingScene)\n    {\n        if(playerSchema.sessionId !== client.sessionId){\n            Logger.error(\n                'Player session ID and client session ID are different.',\n                playerSchema.sessionId,\n                client.sessionId\n            );\n        }\n        if(!isChangingScene){\n            this.loginManager.activePlayers.removeAllByUserId(playerSchema.userId);\n        }\n        this.loginManager.activePlayers.removeByRoomAndSessionId(playerSchema.sessionId, this.roomId);\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} message\n     * @returns {Promise<void>}\n     */\n    async handleReceivedMessage(client, message)\n    {\n        Logger.debug('Missing messages handler function.', message);\n    }\n\n    /**\n     * @param {Array<Object>} players\n     * @param {number} playerId\n     * @returns {Object|boolean}\n     */\n    getPlayerByIdFromArray(players, playerId)\n    {\n        if(!sc.isArray(players) || 0 === players.length){\n            return false;\n        }\n        for(let player of players){\n            if(player.id === playerId){\n                return player;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @param {string} playerRoomName\n     * @param {boolean} isGuest\n     * @param {boolean} isChangePointHit\n     * @returns {boolean}\n     */\n    validateRoom(playerRoomName, isGuest, isChangePointHit = false)\n    {\n        if(\n            this.config.server.rooms.validation.enabled\n            && !this.config.client.rooms.selection.allowOnRegistration\n            && !this.config.client.rooms.selection.allowOnLogin\n            && !isChangePointHit\n        ){\n            this.validRooms = this.config.server.rooms.validation.valid.split(',');\n            if(-1 === this.validRooms.indexOf(this.roomName) && playerRoomName !== this.roomName){\n                Logger.error('Invalid player room: '+playerRoomName +'. Current room: '+this.roomName);\n                return false;\n            }\n        }\n        if(isGuest){\n            for(let i of Object.keys(this.loginManager.roomsManager.availableRoomsGuest)){\n                let room = this.loginManager.roomsManager.availableRoomsGuest[i];\n                if(room?.roomName === playerRoomName){\n                    return true;\n                }\n            }\n            Logger.error(\n                'Invalid room for guest: '+playerRoomName +'. Current room: '+this.roomName,\n                Object.keys(this.loginManager.roomsManager.availableRoomsGuest)\n            );\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @returns {Promise<Object>}\n     */\n    onDispose()\n    {\n        return new Promise((resolve, reject) => {\n            let result = {confirm: true};\n            let event = {roomName: this.roomName, roomId: this.roomId, result};\n            try {\n                this.events.emitSync('reldens.onRoomDispose', event);\n                Logger.info('Disposed RoomLogin \"'+this.roomName+'\" (ID: '+this.roomId+').');\n            } catch (error) {\n                result.confirm = false;\n                event.error = error;\n            }\n            if(result.confirm){\n                return resolve(event);\n            }\n            return reject(event);\n        });\n    }\n\n}\n\nmodule.exports.RoomLogin = RoomLogin;\n"
  },
  {
    "path": "lib/rooms/server/manager.js",
    "content": "/**\n *\n * Reldens - RoomsManager\n *\n * Manages room definitions, configurations, and lifecycle for the game server.\n *\n */\n\nconst { RoomGame } = require('./game');\nconst { RoomScene } = require('./scene');\nconst { RoomsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('@colyseus/core').Server} Server\n * @typedef {import('../../../generated-entities/models/objection-js/rooms-model').RoomsModel} RoomsModel\n */\nclass RoomsManager\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in RoomsManager.');\n        }\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in RoomsManager.');\n        }\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        if(!this.config){\n            Logger.error('Config undefined in RoomsManager.');\n        }\n        /** @type {Array<Object>|boolean} */\n        this.loadedRooms = false;\n        /** @type {Object<number, Object>|boolean} */\n        this.loadedRoomsById = false;\n        /** @type {Object<string, Object>|boolean} */\n        this.loadedRoomsByName = false;\n        /** @type {Array<Object>} */\n        this.defineExtraRooms = [];\n        /** @type {Object<string, Object>} */\n        this.definedRooms = {};\n        /** @type {Object<string, boolean>} */\n        this.creatingInstances = {};\n        /** @type {Object<string, Object>} */\n        this.createdInstances = {};\n        /** @type {Object<string, string>} */\n        this.instanceIdByName = {};\n        /** @type {Object<string, Object>} */\n        this.availableRoomsGuest = {};\n        /** @type {Array<Object>} */\n        this.registrationAvailableRooms = {};\n        /** @type {Array<Object>} */\n        this.registrationAvailableRoomsGuest = {};\n        /** @type {Array<Object>} */\n        this.loginAvailableRooms = {};\n        /** @type {Array<Object>} */\n        this.loginAvailableRoomsGuest = {};\n        this.setupConfiguration();\n    }\n\n    /**\n     * @returns {boolean|void}\n     */\n    setupConfiguration()\n    {\n        if(!this.config){\n            return false;\n        }\n        this.selectionConfig = this.config.get('client/rooms/selection', {});\n        this.allowGuestOnRooms = this.config.getWithoutLogs('server/players/guestUser/allowOnRooms', true);\n    }\n\n    /**\n     * @param {Server} gameServer\n     * @param {Object} props\n     * @returns {Promise<Object>}\n     */\n    async defineRoomsInGameServer(gameServer, props)\n    {\n        await this.events.emit('reldens.roomsDefinition', this.defineExtraRooms);\n        if(!this.defineExtraRooms.length){\n            Logger.info('None extra rooms to be defined.');\n        }\n        // dispatch event to get the global message actions (that will be listened by every room):\n        let globalMessageActions = {};\n        await this.events.emit('reldens.roomsMessageActionsGlobal', globalMessageActions);\n        // lobby room:\n        await this.defineRoom(gameServer, GameConst.ROOM_GAME, RoomGame, props, globalMessageActions);\n        Logger.info('Loaded game room using stored configuration.');\n        let counter = await this.defineExtraRoomsInGameServer(gameServer, props, globalMessageActions);\n        let rooms = await this.loadRooms();\n        // register room-scenes from storage:\n        counter = await this.defineRoomsFromModels(rooms, props, gameServer, globalMessageActions, counter);\n        Logger.info('Total rooms loaded: '+counter);\n        // save rooms lists data for clients:\n        if(this.config.client?.rooms?.selection){\n            this.config.client.rooms.selection.availableRooms = {\n                registration: this.registrationAvailableRooms,\n                registrationGuest: this.registrationAvailableRoomsGuest,\n                login: this.loginAvailableRooms,\n                loginGuest: this.loginAvailableRoomsGuest\n            };\n        }\n        await this.events.emit('reldens.defineRoomsInGameServerDone', this);\n        return this.definedRooms;\n    }\n\n    /**\n     * @param {Array<Object>} rooms\n     * @param {Object} props\n     * @param {Server} gameServer\n     * @param {Object} globalMessageActions\n     * @param {number} counter\n     * @returns {Promise<number>}\n     */\n    async defineRoomsFromModels(rooms, props, gameServer, globalMessageActions, counter)\n    {\n        if(0 === rooms.length){\n            return counter;\n        }\n        for(let roomModel of rooms){\n            let roomClass = RoomScene;\n            if(roomModel.roomClassPath){\n                let roomClassDefinition = props.config.get('server/customClasses/roomsClass/'+roomModel.roomClassPath);\n                if(!roomClassDefinition){\n                    Logger.error('Custom room class not found for room ID \"'+roomModel.roomId+'\".');\n                    continue;\n                }\n                roomClass = roomClassDefinition;\n            }\n            await this.defineRoom(gameServer, roomModel.roomName, roomClass, props, globalMessageActions, roomModel);\n            counter++;\n            Logger.info('Loaded room: '+roomModel.roomName);\n        }\n        return counter;\n    }\n\n    /**\n     * @param {Server} gameServer\n     * @param {Object} props\n     * @param {Object} globalMessageActions\n     * @returns {Promise<number>}\n     */\n    async defineExtraRoomsInGameServer(gameServer, props, globalMessageActions)\n    {\n        if(0 === this.defineExtraRooms.length){\n            return 0;\n        }\n        let counter = 0;\n        for(let roomData of this.defineExtraRooms){\n            await this.defineRoom(gameServer, roomData.roomName, roomData.room, props, globalMessageActions);\n            counter++;\n            Logger.info('Loaded extra room: '+roomData.roomName+(roomData.serverUrl ? '('+roomData.serverUrl+')' : ''));\n        }\n        return counter;\n    }\n\n    /**\n     * @param {Server} gameServer\n     * @param {string} roomName\n     * @param {Function} roomClass\n     * @param {Object} props\n     * @param {Object} globalMessageActions\n     * @param {Object|boolean} [roomModel]\n     * @returns {Promise<void>}\n     */\n    async defineRoom(gameServer, roomName, roomClass, props, globalMessageActions, roomModel = false)\n    {\n        let roomMessageActions = Object.assign({}, globalMessageActions);\n        // run message actions event for each room:\n        await this.events.emit('reldens.roomsMessageActionsByRoom', roomMessageActions, roomName);\n        let roomProps = {\n            loginManager: props.loginManager,\n            config: props.config,\n            messageActions: roomMessageActions,\n            events: this.events,\n            roomsManager: this,\n            dataServer: this.dataServer,\n            featuresManager: props.featuresManager\n        };\n        if(roomModel){\n            roomProps.roomData = roomModel;\n        }\n        gameServer.define(roomName, roomClass, roomProps);\n        this.definedRooms[roomName] = {roomClass, roomProps};\n    }\n\n    /**\n     * @returns {Promise<Array<Object>>}\n     */\n    async loadRooms()\n    {\n        // @TODO - BETA - This will change when hot-plug is introduced.\n        if(this.loadedRooms){\n            return this.loadedRooms;\n        }\n        let roomsModels = await this.dataServer.getEntity('rooms').loadAllWithRelations([\n            'related_rooms_change_points_room.related_rooms_next_room',\n            'related_rooms_return_points_room.related_rooms_from_room'\n        ]);\n        if(!roomsModels){\n            ErrorManager.error('None rooms found in the database. A room is required to run.');\n        }\n        let rooms = [];\n        let roomsById = {};\n        let roomsByName = {};\n        for(let room of roomsModels){\n            let roomModel = this.generateRoomModel(room);\n            if(!roomModel){\n                Logger.error('Room model could not be generated.', room);\n                continue;\n            }\n            rooms.push(roomModel);\n            roomsById[room.id] = roomModel;\n            roomsByName[room.name] = roomModel;\n        }\n        this.loadedRooms = rooms;\n        this.loadedRoomsById = roomsById;\n        this.loadedRoomsByName = roomsByName;\n        this.availableRoomsGuest = this.filterGuestRooms(roomsByName);\n        let registrationRooms = this.filterRooms(true);\n        this.registrationAvailableRooms = this.extractRoomDataForSelector(registrationRooms);\n        this.registrationAvailableRoomsGuest = this.extractRoomDataForSelector(this.fetchGuestRooms(registrationRooms));\n        let loginRooms = this.filterRooms(false);\n        this.loginAvailableRooms = this.extractRoomDataForSelector(loginRooms);\n        this.loginAvailableRoomsGuest = this.extractRoomDataForSelector(this.fetchGuestRooms(loginRooms));\n        return this.loadedRooms;\n    }\n\n    /**\n     * @param {number} roomId\n     * @returns {Promise<Object|boolean>}\n     */\n    async loadRoomById(roomId)\n    {\n        return this.loadRoomBy('id', roomId);\n    }\n\n    /**\n     * @param {string} roomName\n     * @returns {Promise<Object|boolean>}\n     */\n    async loadRoomByName(roomName)\n    {\n        return this.loadRoomBy('name', roomName);\n    }\n\n    /**\n     * @param {string} property\n     * @param {string|number} value\n     * @returns {Promise<Object|boolean>}\n     */\n    async loadRoomBy(property, value)\n    {\n        try {\n            let propertyLabel = property.charAt(0).toUpperCase()+property.slice(1);\n            //Logger.debug('Load rooms by: '+propertyLabel);\n            let managerProperty = 'loadedRoomsBy'+propertyLabel; // see this.loadedById and this.loadedByName\n            // first try to fetch a loaded room from the loadedRoomsBy properties:\n            if(this[managerProperty][value]){\n                return this[managerProperty][value];\n            }\n            // if the room was not preloaded when it was defined, then reloaded here:\n            let room = await this.dataServer.getEntity('rooms').loadBy(property, value);\n            if(!room){\n                Logger.critical('Load room by \"'+property+'\" with value \"'+value+'\", not found.');\n                return false;\n            }\n            let roomModel = this.generateRoomModel(room);\n            if(!roomModel){\n                Logger.critical('Loading room by \"'+property+'\" with value \"'+value+'\", model could not be generated.');\n                return false;\n            }\n            this.loadedRooms.push(roomModel);\n            this.loadedRoomsById[room.id] = roomModel;\n            this.loadedRoomsByName[room.name] = roomModel;\n            // @TODO - BETA - When moving rooms selection config to rooms.customData include new rooms (\"roomModel\") in:\n            //    - registrationAvailableRooms\n            //    - registrationAvailableRoomsGuest\n            //    - loginAvailableRooms\n            //    - loginAvailableRoomsGuest\n            return roomModel;\n        } catch (error) {\n            Logger.critical('Load room by \"'+property+'\" with value \"'+value+'\" failed.', error);\n        }\n        return false;\n    }\n\n    /**\n     * @param {RoomsModel} room\n     * @returns {Object|boolean}\n     */\n    generateRoomModel(room)\n    {\n        if(!sc.isObject(room) || 0 === Object.keys(room).length){\n            Logger.critical('Room not available.', room);\n            return false;\n        }\n        let roomDataModel = {\n            roomId: room.id,\n            roomName: room.name,\n            roomTitle: room.title,\n            serverUrl: room.server_url,\n            // @NOTE: the roomMap is the map file name without the extension (the extension is only used in the admin).\n            roomMap: (room?.map_filename || '').toString().replace(/^.*[\\\\/]/, '').replace(/\\.[^.]*$/, ''),\n            sceneImages: room.scene_images.split(','),\n            changePoints: [],\n            returnPoints: [],\n            roomClassPath: room.room_class_key,\n            returnPointDefault: false,\n            customData: sc.toJson(room.customData, {})\n        };\n        for(let changePoint of room.related_rooms_change_points_room){\n            let changePointData = {};\n            changePointData[RoomsConst.TILE_INDEX] = changePoint.tile_index;\n            changePointData[RoomsConst.NEXT_SCENE] = changePoint.related_rooms_next_room.name;\n            roomDataModel.changePoints.push(changePointData);\n        }\n        for(let returnPosition of room.related_rooms_return_points_room){\n            let fromRoom = returnPosition.related_rooms_from_room\n                ? returnPosition.related_rooms_from_room.name\n                : false;\n            let position = {\n                [RoomsConst.RETURN_POINT_KEYS.DIRECTION]: returnPosition.direction,\n                [RoomsConst.RETURN_POINT_KEYS.X]: returnPosition.x,\n                [RoomsConst.RETURN_POINT_KEYS.Y]: returnPosition.y,\n                [RoomsConst.RETURN_POINT_KEYS.PREVIOUS]: fromRoom\n            };\n            if(sc.hasOwn(returnPosition, 'is_default') && returnPosition.is_default){\n                position[RoomsConst.RETURN_POINT_KEYS.DEFAULT] = returnPosition.is_default;\n                roomDataModel.returnPointDefault = position;\n            }\n            roomDataModel.returnPoints.push(position);\n        }\n        if(0 === roomDataModel.returnPoints.length){\n            Logger.warning('Return points found for room: '+roomDataModel.roomName+'. Room ID: '+roomDataModel.roomId);\n        }\n        if(!roomDataModel.returnPointDefault){\n            roomDataModel.returnPointDefault = roomDataModel.returnPoints[0];\n        }\n        return roomDataModel;\n    }\n\n    /**\n     * @param {boolean} forRegistration\n     * @returns {Object<string, Object>|Array<Object>}\n     */\n    filterRooms(forRegistration)\n    {\n        // @TODO - BETA - Move rooms selection configuration to rooms.customData.\n        let configuredRooms = this.fetchConfiguredRoomsList(forRegistration);\n        if('*' === configuredRooms){\n            return this.loadedRoomsByName;\n        }\n        return this.filterValidRooms(configuredRooms.split(','), this.loadedRoomsByName);\n    }\n\n    /**\n     * @param {boolean} forRegistration\n     * @returns {string}\n     */\n    fetchConfiguredRoomsList(forRegistration)\n    {\n        if(forRegistration){\n            return this.selectionConfig.registrationAvailableRooms;\n        }\n        return this.selectionConfig.loginAvailableRooms;\n    }\n\n    /**\n     * @param {Array<string>} configuredRooms\n     * @param {Object<string, Object>} createdRooms\n     * @returns {Array<Object>}\n     */\n    filterValidRooms(configuredRooms, createdRooms)\n    {\n        let validRooms = [];\n        for(let roomName of configuredRooms){\n            if(sc.hasOwn(createdRooms, roomName)){\n                validRooms.push(configuredRooms[roomName]);\n            }\n        }\n        return validRooms;\n    }\n\n    /**\n     * @param {Object<string, Object>|Array<Object>} availableRooms\n     * @returns {Object<string, Object>|Array<Object>}\n     */\n    fetchGuestRooms(availableRooms)\n    {\n        if(this.allowGuestOnRooms){\n            return availableRooms;\n        }\n        return this.filterGuestRooms(availableRooms);\n    }\n\n    /**\n     * @param {Object<string, Object>} availableRooms\n     * @returns {Object<string, Object>}\n     */\n    filterGuestRooms(availableRooms)\n    {\n        if(!sc.isObject(availableRooms)){\n            Logger.debug('The provided \"availableRooms\" is not an object.', availableRooms);\n            return {};\n        }\n        let validRooms = {};\n        for(let i of Object.keys(availableRooms)){\n            let room = availableRooms[i];\n            let customData = room.customData || {};\n            if(sc.get(customData, 'allowGuest')){\n                validRooms[room.roomName] = room;\n            }\n        }\n        return validRooms;\n    }\n\n    /**\n     * @param {Object<string, Object>|Array<Object>} availableRooms\n     * @returns {Array<Object>}\n     */\n    extractRoomDataForSelector(availableRooms)\n    {\n        let titles = [];\n        for(let i of Object.keys(availableRooms)){\n            titles.push({name: availableRooms[i].roomName, title: availableRooms[i].roomTitle});\n        }\n        return titles;\n    }\n\n}\n\nmodule.exports.RoomsManager = RoomsManager;\n"
  },
  {
    "path": "lib/rooms/server/plugin.js",
    "content": "/**\n *\n * Reldens - Rooms Server Plugin\n *\n * Server-side plugin managing room selection, instances, and disposal.\n *\n */\n\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { RoomsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('./game').RoomGame} RoomGame\n * @typedef {import('../../../generated-entities/models/objection-js/users-model').UsersModel} UsersModel\n */\nclass RoomsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    async setup(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in RoomsPlugin.');\n        }\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        if(!this.config){\n            Logger.error('Config undefined in RoomsPlugin.');\n        }\n        this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        this.events.on('reldens.serverBeforeListen', this.attachRoomsManager.bind(this));\n        this.events.on('reldens.beforeSuperInitialGameData', this.attachRoomSelectionAndInstancesRemoval.bind(this));\n        this.events.on('reldens.onRoomDispose', this.removeRoomCreatedInstanceFromManager.bind(this));\n    }\n\n    /**\n     * @param {Object} event\n     */\n    attachRoomsManager(event)\n    {\n        this.roomsManager = event?.serverManager?.roomsManager;\n        if(!this.roomsManager){\n            Logger.error('RoomsManager undefined in RoomsPlugin.');\n        }\n    }\n\n    /**\n     * @param {Object} superInitialGameData\n     * @param {RoomGame} roomGame\n     * @param {Client} client\n     * @param {UsersModel} userModel\n     * @returns {Promise<boolean|void>}\n     */\n    async attachRoomSelectionAndInstancesRemoval(superInitialGameData, roomGame, client, userModel)\n    {\n        if(!this.roomsManager){\n            Logger.critical('Missing RoomsManager on RoomsPlugin.');\n            return false;\n        }\n        if(!this.roomsManager.selectionConfig){\n            Logger.error('Missing configuration on RoomsManager for RoomsPlugin.');\n            return false;\n        }\n        if(!this.roomsManager.selectionConfig.allowOnRegistration && !this.roomsManager.selectionConfig.allowOnLogin){\n            return false;\n        }\n        // @NOTE: we keep isGuest and isRegistration because these refer to the \"user type\" and the \"action\".\n        // By \"action\", we refer to the first login or following ones. In future releases if a guest keeps a \"login\"\n        // with minimal data, that could be used as \"test period\".\n        let isRegistration = (!superInitialGameData.players || 0 === superInitialGameData.players.length);\n        let isGuest = -1 !== userModel.email.indexOf(roomGame.guestEmailDomain);\n        let availableRoomsForSelector = this.getAvailableRoomsForUserAndAction(isGuest, isRegistration);\n        if(!availableRoomsForSelector){\n            Logger.error('Not available rooms for user action.', {isGuest, isRegistration});\n            return false;\n        }\n        if(this.roomsManager.selectionConfig.loginLastLocation && !isRegistration){\n            availableRoomsForSelector = [\n                {\n                    name: RoomsConst.ROOM_LAST_LOCATION_KEY,\n                    title: this.roomsManager.selectionConfig.loginLastLocationLabel\n                },\n                ...availableRoomsForSelector\n            ];\n        }\n        superInitialGameData.roomSelection = availableRoomsForSelector;\n    }\n\n    /**\n     * @param {boolean} isGuest\n     * @param {boolean} isRegistration\n     * @returns {Array<Object>}\n     */\n    getAvailableRoomsForUserAndAction(isGuest, isRegistration)\n    {\n        if(isRegistration){\n            if(isGuest){\n                return this.roomsManager.registrationAvailableRoomsGuest;\n            }\n            return this.roomsManager.registrationAvailableRooms;\n        }\n        if(isGuest){\n            return this.roomsManager.loginAvailableRoomsGuest;\n        }\n        return this.roomsManager.loginAvailableRooms;\n    }\n\n    /**\n     * @param {Object} roomData\n     */\n    removeRoomCreatedInstanceFromManager(roomData)\n    {\n        delete this.roomsManager.createdInstances[roomData.roomId];\n    }\n\n}\n\nmodule.exports.RoomsPlugin = RoomsPlugin;\n"
  },
  {
    "path": "lib/rooms/server/random-player-state.js",
    "content": "/**\n *\n * Reldens - RandomPlayerState\n *\n * Handles random player spawn positioning within walkable room areas.\n *\n */\n\nconst { WorldPositionCalculator } = require('../../world/world-position-calculator');\nconst { RoomsConst } = require('../constants');\n\n/**\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('pathfinding').Grid} Grid\n * @typedef {import('./scene').RoomScene} RoomScene\n */\nclass RandomPlayerState\n{\n\n    /**\n     * @param {RoomScene} room\n     */\n    constructor(room)\n    {\n        /** @type {number} */\n        this.tileWidth = room.roomWorld.mapJson.tilewidth;\n        /** @type {number} */\n        this.tileHeight = room.roomWorld.mapJson.tileheight;\n        /** @type {Grid} */\n        this.grid = room.roomWorld.pathFinder.grid;\n        /** @type {boolean} */\n        this.alwaysRandom = room.joinInRandomPlaceAlways;\n        /** @type {boolean} */\n        this.alwaysRandomGuest = room.joinInRandomPlaceGuestAlways;\n        /** @type {number} */\n        this.initialPositionThreshold = 50;\n        /** @type {Object} */\n        this.roomInitialPoint = {\n            x: room.roomData.returnPointDefault[RoomsConst.RETURN_POINT_KEYS.X],\n            y: room.roomData.returnPointDefault[RoomsConst.RETURN_POINT_KEYS.Y]\n        };\n        /** @type {Array<Object>} */\n        this.walkableNodes = [];\n        for(let y = 0; y < this.grid.nodes.length; y++){\n            for(let x = 0; x < this.grid.nodes[y].length; x++){\n                let node = this.grid.nodes[y][x];\n                if(node.walkable){\n                    this.walkableNodes.push(node);\n                }\n            }\n        }\n    }\n\n    /**\n     * @param {Player} currentPlayer\n     * @param {boolean} isGuest\n     * @returns {boolean|void}\n     */\n    randomizeLocation(currentPlayer, isGuest)\n    {\n        if(0 === this.walkableNodes.length){\n            return false;\n        }\n        if(\n            ((!this.alwaysRandom && !isGuest) || (!this.alwaysRandomGuest && isGuest))\n            && this.playerPositionIsRoomStartingPoint(currentPlayer)\n        ){\n            return false;\n        }\n        let randomIndex = Math.floor(Math.random() * this.walkableNodes.length);\n        let randomNode = this.walkableNodes[randomIndex];\n        let position = WorldPositionCalculator.forNode(randomNode, this.tileWidth, this.tileHeight);\n        if(!position){\n            return false;\n        }\n        currentPlayer.state.x = position.x;\n        currentPlayer.state.y = position.y;\n    }\n\n    /**\n     * @param {Player} currentPlayer\n     * @returns {boolean}\n     */\n    playerPositionIsRoomStartingPoint(currentPlayer)\n    {\n        let roomMaxX = this.roomInitialPoint.x + this.initialPositionThreshold;\n        let roomMinX = this.roomInitialPoint.x - this.initialPositionThreshold;\n        let roomMaxY = this.roomInitialPoint.y + this.initialPositionThreshold;\n        let roomMinY = this.roomInitialPoint.y - this.initialPositionThreshold;\n        return currentPlayer.state.x < roomMaxX\n            && currentPlayer.state.y < roomMaxY\n            && currentPlayer.state.x > roomMinX\n            && currentPlayer.state.y > roomMinY;\n    }\n}\n\nmodule.exports.RandomPlayerState = RandomPlayerState;\n"
  },
  {
    "path": "lib/rooms/server/scene-data-filter.js",
    "content": "/**\n *\n * Reldens - SceneDataFilter\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../config/server/manager').ConfigManager} ConfigManager\n *\n * @typedef {Object} SceneDataFilterProps\n * @property {ConfigManager} config\n *\n * @typedef {Object} AssetData\n * @property {string} asset_type\n * @property {string} asset_key\n * @property {string} asset_file\n * @property {Object} extra_params\n *\n * @typedef {Object} AnimationData\n * @property {string} key\n * @property {string} asset_key\n * @property {number} [start]\n * @property {number} [end]\n * @property {number} [frameRate]\n * @property {number} [repeat]\n * @property {boolean} [yoyo]\n *\n * @typedef {Object} OptimizedResult\n * @property {Object<string, Object>} data\n * @property {Object<string, Object>} defaults\n *\n * @typedef {Object} GroupedItem\n * @property {string} key\n * @property {Object} data\n */\nclass SceneDataFilter\n{\n\n    /**\n     * @param {SceneDataFilterProps} props\n     */\n    constructor(props)\n    {\n        /** @type {ConfigManager|false} */\n        this.config = false;\n        /** @type {boolean} */\n        this.sendAll = false;\n        /** @type {Object|false} */\n        this.customProcessor = false;\n        this.initialize(props);\n    }\n\n    /**\n     * @param {SceneDataFilterProps} props\n     * @returns {boolean|void}\n     */\n    initialize(props)\n    {\n        if(!sc.isObject(props)){\n            Logger.error('Props undefined in SceneDataFilter.');\n            return false;\n        }\n        this.config = sc.get(props, 'config', false);\n        if(!this.config){\n            Logger.error('Config undefined in SceneDataFilter.');\n            return false;\n        }\n        this.sendAll = this.config.getWithoutLogs('server/rooms/data/sendAll', false);\n        this.customProcessor = this.config.getWithoutLogs('server/customClasses/sceneDataProcessor', false);\n    }\n\n    /**\n     * @param {Object} roomData\n     * @returns {Object}\n     */\n    filterRoomData(roomData)\n    {\n        if(!sc.isObject(roomData)){\n            return {};\n        }\n        if(this.sendAll){\n            return Object.assign({}, roomData);\n        }\n        if(this.customProcessor && sc.isFunction(this.customProcessor.process)){\n            return this.customProcessor.process({roomData: roomData, filter: this});\n        }\n        return this.buildFilteredData(roomData);\n    }\n\n    /**\n     * @param {Object} roomData\n     * @returns {Object}\n     */\n    buildCompleteData(roomData)\n    {\n        return Object.assign({}, roomData);\n    }\n\n    /**\n     * @param {Object} roomData\n     * @returns {Object}\n     */\n    buildFilteredData(roomData)\n    {\n        let filteredData = Object.assign({}, roomData);\n        if(sc.hasOwn(roomData, 'preloadAssets')){\n            let optimized = this.optimizeData(roomData.preloadAssets, 'asset_type', 'spritesheet');\n            filteredData.preloadAssets = optimized.data;\n            filteredData.preloadAssetsDefaults = optimized.defaults;\n        }\n        if(sc.hasOwn(roomData, 'objectsAnimationsData')){\n            let optimized = this.optimizeData(roomData.objectsAnimationsData, 'asset_key', false);\n            filteredData.objectsAnimationsData = optimized.data;\n            filteredData.animationsDefaults = optimized.defaults;\n        }\n        return filteredData;\n    }\n\n    /**\n     * @param {Object<string, Object>} dataCollection\n     * @param {string} groupingField\n     * @param {string|boolean} filterValue\n     * @returns {OptimizedResult}\n     */\n    optimizeData(dataCollection, groupingField, filterValue)\n    {\n        if(!sc.isObject(dataCollection)){\n            return {data: {}, defaults: {}};\n        }\n        let grouped = {};\n        let dataKeys = Object.keys(dataCollection);\n        for(let key of dataKeys){\n            let item = dataCollection[key];\n            if(false !== filterValue){\n                if(filterValue !== sc.get(item, groupingField, '')){\n                    continue;\n                }\n            }\n            let groupValue = sc.get(item, groupingField, '');\n            if('' === groupValue){\n                groupValue = sc.get(item, 'key', '');\n            }\n            if('' === groupValue){\n                continue;\n            }\n            if(!sc.hasOwn(grouped, groupValue)){\n                grouped[groupValue] = [];\n            }\n            grouped[groupValue].push({key: key, data: item});\n        }\n        let defaults = {};\n        let optimizedData = {};\n        let groupKeys = Object.keys(grouped);\n        for(let groupKey of groupKeys){\n            let group = grouped[groupKey];\n            if(0 === group.length){\n                continue;\n            }\n            if(1 === group.length){\n                optimizedData[group[0].key] = group[0].data;\n                continue;\n            }\n            let identical = this.detectIdenticalProperties(group);\n            if(sc.hasOwn(identical, groupingField)){\n                delete identical[groupingField];\n            }\n            if(sc.hasOwn(identical, 'key')){\n                delete identical['key'];\n            }\n            if(0 < Object.keys(identical).length){\n                defaults[groupKey] = identical;\n            }\n            for(let item of group){\n                let unique = {};\n                let propKeys = Object.keys(item.data);\n                for(let prop of propKeys){\n                    if(sc.hasOwn(identical, prop)){\n                        continue;\n                    }\n                    unique[prop] = item.data[prop];\n                }\n                optimizedData[item.key] = unique;\n            }\n        }\n        return {data: optimizedData, defaults: defaults};\n    }\n\n    /**\n     * @param {Array<GroupedItem>} group\n     * @returns {Object}\n     */\n    detectIdenticalProperties(group)\n    {\n        if(0 === group.length){\n            return {};\n        }\n        let firstItem = group[0].data;\n        let identical = {};\n        let propKeys = Object.keys(firstItem);\n        for(let prop of propKeys){\n            let isIdentical = true;\n            let referenceValue = firstItem[prop];\n            for(let item of group){\n                if(!sc.hasOwn(item.data, prop)){\n                    isIdentical = false;\n                    break;\n                }\n                if(this.valuesAreDifferent(referenceValue, item.data[prop])){\n                    isIdentical = false;\n                    break;\n                }\n            }\n            if(isIdentical){\n                identical[prop] = referenceValue;\n            }\n        }\n        return identical;\n    }\n\n    /**\n     * @param {string|number|boolean|Object} value1\n     * @param {string|number|boolean|Object} value2\n     * @returns {boolean}\n     */\n    valuesAreDifferent(value1, value2)\n    {\n        if(sc.isObject(value1) && sc.isObject(value2)){\n            return JSON.stringify(value1) !== JSON.stringify(value2);\n        }\n        return value1 !== value2;\n    }\n\n}\n\nmodule.exports.SceneDataFilter = SceneDataFilter;\n"
  },
  {
    "path": "lib/rooms/server/scene.js",
    "content": "/**\n *\n * Reldens - RoomScene\n *\n * Main game scene room handling player physics, collisions, objects, and gameplay logic.\n *\n */\n\nconst { RoomLogin } = require('./login');\nconst { State } = require('./state');\nconst { WorldConfig } = require('./world-config');\nconst { P2world } = require('../../world/server/p2world');\nconst { CollisionsManager } = require('../../world/server/collisions-manager');\nconst { WorldPointsValidator } = require('../../world/world-points-validator');\nconst { WorldTimer } = require('../../world/world-timer');\nconst { ObjectsManager } = require('../../objects/server/manager');\nconst { DropObject } = require('../../objects/server/object/type/drop-object');\nconst { ObjectsConst } = require('../../objects/constants');\nconst { JoinedSceneRoomEvent } = require('./events/joined-scene-room-event');\nconst { RandomPlayerState } = require('./random-player-state');\nconst { RoomsConst } = require('../constants');\nconst { WorldConst } = require('../../world/constants');\nconst { GameConst } = require('../../game/constants');\nconst { SceneDataFilter } = require('./scene-data-filter');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('../../../generated-entities/models/objection-js/users-model').UsersModel} UsersModel\n */\nclass RoomScene extends RoomLogin\n{\n\n    /**\n     * @param {Object} options\n     * @returns {Promise<void>}\n     */\n    async onCreate(options)\n    {\n        super.onCreate(options);\n        Logger.notice('Creation process started for RoomScene \"'+this.roomName+'\" (ID: '+this.roomId+').');\n        this.autoDispose = sc.get(options.roomData, 'autoDispose', false);\n        this.disposeTimeoutMs = this.config.getWithoutLogs('server/rooms/disposeTimeout', 300000);\n        this.disposeTimeoutTimer = false;\n        this.roomWorld = {};\n        this.messageActions = {};\n        this.movementInterval = {};\n        this.playersLastStateTimers = {};\n        this.worldTimerCallback = false;\n        this.roomType = RoomsConst.ROOM_TYPE_SCENE;\n        this.validateRoomData = true;\n        this.sceneId = this.roomId;\n        // @NOTE: we create an instance of the objects manager for each room-scene, this is on purpose so all the\n        // related object instances will be removed when the room is disposed of.\n        let objectsManagerConfig = Object.assign(\n            {events: this.events, roomName: this.roomName, roomId: this.roomId},\n            options\n        );\n        this.objectsManager = new ObjectsManager(objectsManagerConfig);\n        await this.objectsManager.loadObjectsByRoomId(options.roomData.roomId);\n        if(this.objectsManager.roomObjectsData){\n            await this.objectsManager.generateObjects();\n            //Logger.debug('Generated objects keys: '+JSON.stringify((Object.keys(this.objectsManager.roomObjectsData))));\n        }\n        // append objects that will listen to messages:\n        if(this.objectsManager.listenMessages){\n            Object.assign(this.messageActions, this.objectsManager.listenMessagesObjects);\n        }\n        this.lastCallTime = Date.now() / 1000;\n        this.paused = false;\n        this.customData = options.roomData.customData || {};\n        this.joinInRandomPlace = Boolean(this.customData.joinInRandomPlace || false);\n        this.joinInRandomPlaceAlways = Boolean(this.customData.joinInRandomPlaceAlways || false);\n        this.joinInRandomPlaceGuestAlways = Boolean(this.customData.joinInRandomPlaceGuestAlways || false);\n        if(this.customData.patchRate){\n            //Logger.debug('Setting custom patch rate: '+this.customData.patchRate);\n            this.setPatchRate(this.customData.patchRate);\n        }\n        WorldConfig.mapWorldConfigValues(this, this.config);\n        this.allowSimultaneous = this.config.get('client/general/controls/allowSimultaneousKeys', true);\n        await this.createWorld(options.roomData, this.objectsManager);\n        this.applyPlayersLastStateHandler = Boolean(this.config.getWithoutLogs('server/players/stateHandler/enabled'));\n        this.applyStateOnZeroAffectedProperty = this.config.getWithoutLogs(\n            'server/players/state/forZeroAffectedProperty',\n            GameConst.STATUS.DEATH\n        );\n        this.playersAffectedProperty = this.config.get('client/actions/skills/affectedProperty');\n        this.playerBodyWidth = this.config.get('client/players/physicalBody/width');\n        this.playerBodyHeight = this.config.get('client/players/physicalBody/height');\n        this.playersStateHandlerTimeOut = Number(\n            this.config.getWithoutLogs('server/players/stateHandler/timeOut', 10000)\n        );\n        // the collisions manager has to be initialized after the world was created:\n        this.collisionsManager = new CollisionsManager(this);\n        // if the room has message actions, those are specified here in the room-scene:\n        if(options.messageActions){\n            Object.assign(this.messageActions, options.messageActions);\n        }\n        // @NOTE: as you can see, not all the scene information is being sent to the client, this is because we have\n        // hidden information to be discovered (hidden objects are only active on the server side).\n        this.roomData = options.roomData;\n        // append public objects to the room data:\n        this.roomData.preloadAssets = this.objectsManager.preloadAssets;\n        // append dynamic animations data to the room data:\n        this.roomData.objectsAnimationsData = this.objectsManager.objectsAnimationsData;\n        Object.assign(this.worldConfig, this.roomData.customData);\n        Object.assign(this.roomData, {worldConfig: this.worldConfig});\n        // scene data filter optimizes data sent to clients:\n        this.sceneDataFilter = new SceneDataFilter({config: this.config});\n        // room data is saved on the state:\n        let roomState = new State(this.roomData, this.sceneDataFilter);\n        // after we set the state, it will be automatically sync by the game-server:\n        this.setState(roomState);\n        this.randomPlayerState = this.joinInRandomPlace ? new RandomPlayerState(this) : false;\n        await this.events.emit('reldens.sceneRoomOnCreate', this);\n        Logger.notice(\n            'Created RoomScene: '+this.roomName+' ('+this.roomId+') - AutoDispose: '+(this.autoDispose ? 'Yes' : 'No')\n        );\n        delete options.roomsManager.creatingInstances[this.roomName];\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Object} options\n     * @param {UsersModel} userModel\n     * @returns {Promise<boolean|void>}\n     */\n    async onJoin(client, options, userModel)\n    {\n        if(this.disposeTimeoutTimer){\n            //Logger.debug('Cleared dispose timeout on room \"'+this.roomName+'\".');\n            clearTimeout(this.disposeTimeoutTimer);\n            this.disposeTimeoutTimer = false;\n        }\n        await this.events.emit('reldens.joinRoomStart', this, client, options, userModel);\n        if(sc.hasOwn(options, 'selectedPlayer')){\n            userModel.selectedPlayer = options.selectedPlayer;\n            userModel.player = this.getPlayerByIdFromArray(userModel.related_players, options.selectedPlayer);\n        }\n        let isGuest = -1 !== userModel.email.indexOf(this.guestEmailDomain);\n        if(this.validateRoomData){\n            // @NOTE: here we use userModel.player.state since it is the runtime dynamic data applied on the userModel.\n            if(!userModel.player.state){\n                Logger.warning('Missing user player state.', userModel);\n                return false;\n            }\n            if(!this.validateRoom(userModel.player.state.scene, isGuest)){\n                await this.events.emit('reldens.joinRoomInvalid', this, client, options, userModel, isGuest);\n                return false;\n            }\n        }\n        let loggedPlayer = await this.createPlayerOnScene(client, userModel, isGuest);\n        // we do not need to create a player entity since we only need the name for the chat:\n        this.loginManager.activePlayers.add(userModel, client, this);\n        await this.events.emit(\n            'reldens.joinRoomEnd',\n            new JoinedSceneRoomEvent(this, client, options, userModel, loggedPlayer, isGuest)\n        );\n    }\n\n    /**\n     * @param {string} sessionId\n     * @param {Client} client\n     * @param {UsersModel} userModel\n     * @returns {Promise<boolean>}\n     */\n    async disconnectBySessionId(sessionId, client, userModel)\n    {\n        let player = this.playerBySessionIdFromState(sessionId);\n        if(!player){\n            //Logger.debug('Player not found for disconnection by session ID \"'+sessionId+'\".');\n            return false;\n        }\n        await this.events.emit('reldens.disconnectLoggedBefore', {room: this, player, client, userModel});\n        await this.savePlayedTime(player);\n        let savedStats = await this.savePlayerStats(player);\n        let savedState = await this.savePlayerState(sessionId);\n        if(savedState && savedStats){\n            await this.removePlayer(sessionId);\n        }\n        return true;\n    }\n\n    playerBySessionIdFromState(sessionId)\n    {\n        // @TODO - BETA - Refactor and extract Colyseus into a driver.\n        return this.state.players.get(sessionId);\n    }\n\n    playerByPlayerIdFromState(playerId)\n    {\n        if(0 === this.playersCountInState()){\n            return false;\n        }\n        for(let i of this.playersKeysFromState()){\n            let tmp = this.playerBySessionIdFromState(i);\n            if(tmp.player_id === playerId){\n                return tmp;\n            }\n        }\n        return false;\n    }\n\n    playersCountInState()\n    {\n        // @TODO - BETA - Refactor and extract Colyseus into a driver.\n        return this.state.players.size;\n    }\n\n    playersKeysFromState()\n    {\n        // @TODO - BETA - Refactor and extract Colyseus into a driver.\n        return Array.from(this.state.players.keys());\n    }\n\n    /**\n     * @param {Client} client\n     * @param {UsersModel} userModel\n     * @param {boolean} isGuest\n     * @returns {Promise<Player>}\n     */\n    async createPlayerOnScene(client, userModel, isGuest)\n    {\n        await this.events.emit('reldens.createPlayerBefore', client, userModel, this);\n        let currentPlayer = this.state.createPlayerSchema(userModel, client.sessionId);\n        this.handlePlayerLastState(currentPlayer);\n        if(this.randomPlayerState){\n            this.randomPlayerState.randomizeLocation(currentPlayer, isGuest);\n        }\n        // @TODO - BETA - Remove this callbacks and provide a player container that will executed the required methods.\n        currentPlayer.persistData = async (params) => {\n            await this.events.emit('reldens.playerPersistDataBefore', client, userModel, currentPlayer, params, this);\n            await this.savePlayedTime(currentPlayer);\n            await this.savePlayerState(currentPlayer.sessionId);\n            await this.savePlayerStats(currentPlayer, client);\n            await this.events.emit('reldens.playerPersistDataAfter', client, userModel, currentPlayer, params, this);\n        };\n        await this.events.emit('reldens.createdPlayerSchema', client, userModel, currentPlayer, this);\n        currentPlayer.playStartTime = Date.now();\n        this.state.addPlayerToState(currentPlayer, client.sessionId);\n        // @TODO - BETA - Create player body using a new pack in the world package.\n        currentPlayer.physicalBody = this.roomWorld.createPlayerBody({\n            id: client.sessionId,\n            width: this.playerBodyWidth,\n            height: this.playerBodyHeight,\n            bodyState: currentPlayer.state,\n            speed: Number(currentPlayer.stats?.speed || 0)\n        });\n        await this.events.emit('reldens.createPlayerAfter', client, userModel, currentPlayer, this);\n        return currentPlayer;\n    }\n\n    /**\n     * @param {Player} currentPlayer\n     * @returns {boolean}\n     */\n    handlePlayerLastState(currentPlayer)\n    {\n        if(!this.applyPlayersLastStateHandler){\n            return false;\n        }\n        // @TODO - BETA - Include a timer and a configuration to avoid player been attacked automatically after login.\n        if(!this.playersAffectedProperty){\n            return false;\n        }\n        let hasLife = 0 < Number(sc.get(currentPlayer.stats, this.playersAffectedProperty, 0));\n        if(hasLife){\n            return false;\n        }\n        currentPlayer.state.inState = this.applyStateOnZeroAffectedProperty;\n        this.playersLastStateTimers[currentPlayer.player_id] = setTimeout(\n            () => {\n                currentPlayer.state.inState = GameConst.STATUS.ACTIVE;\n            },\n            this.playersStateHandlerTimeOut\n        );\n        return false;\n    }\n\n    /**\n     * @param {Client} client\n     * @param {boolean} consented\n     * @returns {Promise<void>}\n     */\n    async onLeave(client, consented)\n    {\n        let playerSchema = this.playerBySessionIdFromState(client.sessionId);\n        if(!playerSchema){\n            // this is expected when the player is automatically disconnected on the second login:\n            // Logger.info('Save error, schema not found for session ID: '+client.sessionId, client.auth.username);\n            return;\n        }\n        await this.savePlayedTime(playerSchema);\n        let savedStats = await this.savePlayerStats(playerSchema);\n        if(!savedStats){\n            Logger.error('Player save stats error.', playerSchema);\n        }\n        let savedState = await this.savePlayerState(client.sessionId);\n        if(!savedState){\n            Logger.error('Player save state error.', playerSchema);\n        }\n        let isChangingScene = playerSchema.physicalBody?.isChangingScene;\n        let removed = await this.removePlayer(client.sessionId);\n        if(!removed){\n            Logger.error('Player remove error.', playerSchema);\n        }\n        clearTimeout(this.playersLastStateTimers[playerSchema.player_id]);\n        this.removeActivePlayer(playerSchema, client, isChangingScene);\n        if(0 === this.clients.length){\n            //Logger.debug('Setting dispose timeout ('+this.disposeTimeoutMs+'ms) on room \"'+this.roomName+'\".');\n            this.disposeTimeoutTimer = setTimeout(() => {\n                this.disconnect();\n            }, this.disposeTimeoutMs);\n        }\n    }\n\n    async handleReceivedMessage(client, messageData)\n    {\n        if(!messageData){\n            Logger.error('Empty message data on room \"'+this.roomName+'\" ID \"'+this.roomId+'\".', client, messageData);\n            return;\n        }\n        // only process the message if the player exists and has a body:\n        let playerSchema = this.playerBySessionIdFromState(client.sessionId);\n        await this.executeSceneMessageActions(client, messageData, playerSchema);\n        await this.executeMovePlayerActions(playerSchema, messageData);\n        this.executePlayerStatsAction(messageData, client, playerSchema);\n    }\n\n    executePlayerStatsAction(messageData, client, playerSchema)\n    {\n        // @NOTE:\n        // - Player states must be requested since are private user data that we can share with other players\n        // or broadcast to the rooms.\n        // - Considering base value could be changed temporally by a skill or item modifier will be really hard to\n        // identify which calls and cases would require only the stat data or the statBase, so we will always send\n        // both values. This could be improved in the future but for now it doesn't have a considerable impact.\n        if(GameConst.PLAYER_STATS !== messageData.act){\n            return false;\n        }\n        client.send('*', {\n            act: GameConst.PLAYER_STATS,\n            stats: playerSchema.stats,\n            statsBase: playerSchema.statsBase\n        });\n    }\n\n    async executeMovePlayerActions(playerSchema, messageData)\n    {\n        let bodyToMove = sc.get(playerSchema, 'physicalBody', false);\n        if(!bodyToMove){\n            Logger.warning('Player ID \"'+playerSchema.player_id+'\" body not found.');\n            return false;\n        }\n        if(playerSchema.isDeath() || playerSchema.isDisabled()){\n            this.clearMovementIntervals(playerSchema.player_id);\n            bodyToMove.stopMove();\n            return false;\n        }\n        if(GameConst.STOP === messageData.act){\n            this.clearMovementIntervals(playerSchema.player_id);\n            bodyToMove.stopMove();\n        }\n        let bodyCanMove = !bodyToMove.isChangingScene && !bodyToMove.isBlocked;\n        if(!bodyCanMove){\n            return false;\n        }\n        if(sc.hasOwn(messageData, 'dir')){\n            // @TODO - BETA - Create a single class/point for setIntervals or timeOuts instances creation.\n            let playerMovementIntervalKey = playerSchema.player_id+'_'+messageData.dir;\n            if(!bodyToMove.world.timeStep){\n                return false;\n            }\n            this.movementInterval[playerMovementIntervalKey] = setInterval(\n                () => {\n                    bodyToMove.initMove(messageData.dir);\n                },\n                bodyToMove.world.timeStep\n            );\n            return true;\n        }\n        let isPointer = GameConst.POINTER === messageData.act && this.config.get('client/players/tapMovement/enabled');\n        let hasColumnAndRow = sc.hasOwn(messageData, 'column') && sc.hasOwn(messageData, 'row');\n        if(isPointer && hasColumnAndRow){\n            this.clearMovementIntervals(playerSchema.player_id);\n            bodyToMove.stopMove();\n            messageData = this.pointsValidator.makeValidPoints(messageData);\n            bodyToMove.moveToPoint(messageData);\n        }\n    }\n\n    activatePlayer(playerSchema, playerNewState)\n    {\n        //Logger.debug('Activate player \"'+playerSchema.player_id+'\".');\n        playerSchema.state.inState = playerNewState;\n        let bodyToMove = sc.get(playerSchema, 'physicalBody', false);\n        this.activateBody(bodyToMove, playerSchema.player_id, playerNewState);\n    }\n\n    activateBody(bodyToMove, playerId, playerNewState)\n    {\n        if(!bodyToMove){\n            //Logger.warning('Activate Player ID \"'+playerId+'\" body not found.');\n            return false;\n        }\n        bodyToMove.isBlocked = false;\n        bodyToMove.bodyState.inState = playerNewState;\n        return true;\n    }\n\n    deactivatePlayer(playerSchema, playerNewState)\n    {\n        Logger.debug('Deactivate player \"'+playerSchema.player_id+'\", new inState value \"'+playerNewState+'\".');\n        this.clearMovementIntervals(playerSchema.player_id);\n        playerSchema.state.inState = playerNewState;\n        this.deactivateBody(sc.get(playerSchema, 'physicalBody', false), playerSchema, playerNewState);\n    }\n\n    deactivateBody(bodyToMove, playerId, playerNewState)\n    {\n        if(!bodyToMove){\n            Logger.warning('Deactivate Player ID \"'+playerId+'\" body not found.');\n            return false;\n        }\n        bodyToMove.stopFull();\n        bodyToMove.resetAuto();\n        bodyToMove.isBlocked = true;\n        bodyToMove.bodyState.inState = playerNewState;\n        return true;\n    }\n\n    clearMovementIntervals(playerId)\n    {\n        let intervalKeys = Object.keys(this.movementInterval);\n        for(let i of intervalKeys){\n            if(playerId && 0 !== i.indexOf(playerId+'_')){\n                continue;\n            }\n            clearInterval(this.movementInterval[i]);\n            delete this.movementInterval[i];\n            // Logger.debug('Cleared movement interval: '+i);\n        }\n    }\n\n    async executeSceneMessageActions(client, messageData, playerSchema)\n    {\n        let event = {room: this, client, messageData, playerSchema, canContinue: true};\n        await this.events.emit('reldens.beforeSceneExecuteMessages', event);\n        if(!event.canContinue){\n            return;\n        }\n        let messageActionsKeys = Object.keys(this.messageActions);\n        if(0 === messageActionsKeys.length){\n            return;\n        }\n        if(!this.isAllowedAction(client, messageData, playerSchema)){\n            return;\n        }\n        for(let i of messageActionsKeys){\n            let messageObserver = this.messageActions[i];\n            if('function' !== typeof messageObserver.executeMessageActions){\n                Logger.warning('Invalid message observer.', messageObserver);\n                continue;\n            }\n            await messageObserver.executeMessageActions(client, messageData, this, playerSchema);\n        }\n    }\n\n    isAllowedAction(client, messageData, playerSchema)\n    {\n        if(this.customData.allActionsDisabled){\n            return false;\n        }\n        let disallowedActions = sc.get(this.customData, 'disallowedActions', {});\n        if(0 === Object.keys(disallowedActions).length){\n            return true;\n        }\n        if(sc.inArray(messageData['act'], disallowedActions)){\n            return false;\n        }\n        let playerSkill = playerSchema.skillsServer.classPath.currentSkills[messageData.type] || {};\n        let skillTypeClass = playerSkill?.constructor?.name;\n        if(skillTypeClass && sc.inArray(skillTypeClass, disallowedActions)){\n            return false;\n        }\n        let target = messageData.target?.type;\n        if(!target){\n            return true;\n        }\n        if(sc.inArray('target-'+target, disallowedActions)){\n            return false;\n        }\n        if(sc.inArray('target-'+target+'-'+messageData['act'], disallowedActions)){\n            return false;\n        }\n        return !sc.inArray('target-'+target+'-'+skillTypeClass, disallowedActions);\n    }\n\n    // @TODO - BETA - Extract all world or bodies creation functions into a new physics driver.\n    async createWorld(roomData, objectsManager)\n    {\n        await this.events.emit('reldens.createWorld', roomData, objectsManager, this);\n        this.roomWorld = this.createWorldInstance({\n            sceneName: this.roomName,\n            roomId: roomData.roomId,\n            roomMap: roomData.roomMap,\n            config: this.config,\n            objectsManager: objectsManager,\n            events: this.events,\n            allowSimultaneous: this.allowSimultaneous,\n            worldConfig: this.worldConfig\n        });\n        this.pointsValidator = new WorldPointsValidator(this.roomWorld.worldWidth, this.roomWorld.worldHeight);\n        this.roomWorld.createLimits();\n        this.validateWorldContents(roomData.roomMap);\n        await this.roomWorld.createWorldContent(roomData);\n        this.initializeWorldTimer();\n        Logger.info('World created in Room: ' + this.roomName);\n    }\n\n    validateWorldContents(roomMap)\n    {\n        if(!sc.get(this.config.server, 'validateMaps', true)){\n            return;\n        }\n        let mapJson = sc.get(this.config.server.maps, roomMap, false);\n        if(!mapJson){\n            Logger.critical('Undefined map JSON on config server maps: \"'+this.sceneTiledMapFile+'\"');\n            return;\n        }\n        let contentsLayers = Object.keys(this.objectsManager.roomObjectsByLayer);\n        let mapLayers = mapJson.layers.map((layer) => layer.name);\n        let missingLayers = contentsLayers.filter(layer => !mapLayers.includes(layer));\n        if(0 < missingLayers.length){\n            Logger.warning(\n                'There are objects assigned to the room but that contain invalid layer names.',\n                missingLayers\n            );\n            for(let missingLayer of missingLayers){\n                let layerObjectsIds = Object.keys(this.objectsManager.roomObjectsByLayer[missingLayers]);\n                Logger.warning('Layer \"'+missingLayer+'\" invalid objects ID(s): '+JSON.stringify(layerObjectsIds));\n            }\n        }\n    }\n\n    initializeWorldTimer()\n    {\n        this.worldTimerCallback = () => {\n            if(!this.roomWorld){\n                Logger.error('Room World not longer exists.', this.roomWorld);\n                return;\n            }\n            this.roomWorld.removeBodiesFromWorld();\n        };\n        this.worldTimer = new WorldTimer({\n            // @TODO - BETA - Create a single class/point for setIntervals or timeOuts instances creation.\n            // clockInstance: this.clock,\n            world: this.roomWorld,\n            callbacks: [this.worldTimerCallback]\n        });\n        this.worldTimer.startWorldSteps(this.roomWorld);\n    }\n\n    createWorldInstance(data)\n    {\n        return new P2world(data);\n    }\n\n    async nextSceneInitialPosition(client, data, playerBody)\n    {\n        let currentPlayer = this.playerBySessionIdFromState(client.sessionId);\n        if(!currentPlayer){\n            Logger.error('Player not found by session ID:' + client.sessionId);\n            return;\n        }\n        // @TODO - BETA - Avoid sending the player next scene to all the players.\n        this.broadcast('*', {\n            act: GameConst.CHANGING_SCENE,\n            id: client.sessionId,\n            scene: currentPlayer.state.scene,\n            prev: data.prev,\n        });\n        let nextRoom = await this.loginManager.roomsManager.loadRoomByName(data.next);\n        if(!nextRoom){\n            Logger.error('Player room change error. Next room not found: ' + data.next);\n            playerBody.isChangingScene = false;\n            return;\n        }\n        let newPosition = this.fetchNewPosition(nextRoom, data.prev);\n        if(!newPosition){\n            Logger.error('Can not find next room: '+nextRoom.roomName, {data, nextRoom, newPosition});\n            playerBody.isChangingScene = false;\n            return;\n        }\n        currentPlayer.state.scene = data.next;\n        currentPlayer.state.room_id = nextRoom.roomId;\n        currentPlayer.state.x = newPosition[RoomsConst.RETURN_POINT_KEYS.X];\n        currentPlayer.state.y = newPosition[RoomsConst.RETURN_POINT_KEYS.Y];\n        currentPlayer.state.dir = newPosition[RoomsConst.RETURN_POINT_KEYS.DIRECTION];\n        let stateSaved = await this.savePlayerState(client.sessionId);\n        if(!stateSaved){\n            Logger.error('Save state error: ' + client.sessionId);\n            playerBody.isChangingScene = false;\n            return;\n        }\n        this.broadcastSceneChange(client, currentPlayer, data);\n    }\n\n    fetchNewPosition(nextRoom, previousRoom)\n    {\n        if(0 === nextRoom.returnPoints.length){\n            Logger.warning('Next room \"'+nextRoom.roomName+'\" has no return points.', nextRoom);\n            return false;\n        }\n        for(let newPosition of nextRoom.returnPoints){\n            // @NOTE: P === false means there's only one room that would lead to this one. If there's more than one\n            // possible return point then validate the previous room.\n            // validate if previous room:\n            if(\n                newPosition[RoomsConst.RETURN_POINT_KEYS.PREVIOUS]\n                && newPosition[RoomsConst.RETURN_POINT_KEYS.PREVIOUS] !== previousRoom\n            ){\n                continue;\n            }\n            return newPosition;\n        }\n        return false;\n    }\n\n    broadcastSceneChange(client, currentPlayer, data)\n    {\n        // @NOTE: we need to broadcast the current player scene change to be removed or added in other players.\n        let showPlayedTimeConfig = this.config.getWithoutLogs(\n            'client/players/playedTime/show',\n            GameConst.SHOW_PLAYER_TIME.NONE\n        );\n        this.broadcast('*', {\n            act: GameConst.CHANGED_SCENE,\n            id: client.sessionId,\n            scene: currentPlayer.state.scene,\n            prev: data.prev,\n            x: currentPlayer.state.x,\n            y: currentPlayer.state.y,\n            dir: currentPlayer.state.dir,\n            playerName: currentPlayer.playerName,\n            playedTime: GameConst.SHOW_PLAYER_TIME.ALL_PLAYERS === showPlayedTimeConfig ? currentPlayer.playedTime : -1,\n            avatarKey: currentPlayer.avatarKey\n        });\n        let bodyToRemove = currentPlayer.physicalBody;\n        if(sc.isFunction(this.roomWorld.removeBody)){\n            this.roomWorld.removeBody(bodyToRemove);\n        }\n        // reconnect is to create the player in the new scene:\n        client.send('*', {act: GameConst.RECONNECT, player: currentPlayer, prev: data.prev});\n    }\n\n    async removePlayer(sessionId)\n    {\n        let playerSchema = this.playerBySessionIdFromState(sessionId);\n        let stateObject = {isRemoveReady: true};\n        await this.events.emit('reldens.removePlayerBefore', {\n            room: this,\n            playerSchema,\n            stateObject\n        });\n        if(playerSchema && stateObject.isRemoveReady){\n            this.removeAllPlayerReferences(playerSchema, sessionId);\n            Logger.debug('Removed player: '+playerSchema.playerName+' - Session ID: '+sessionId);\n            return playerSchema;\n        }\n        ErrorManager.error('Player not found, session ID: ' + sessionId);\n        return false;\n    }\n\n    removeAllPlayerReferences(playerSchema, sessionId)\n    {\n        this.events.offByMasterKey(playerSchema.eventsPrefix);\n        let bodyToRemove = playerSchema.physicalBody;\n        if(sc.isFunction(this.roomWorld.removeBody) && bodyToRemove){\n            this.roomWorld.removeBody(bodyToRemove);\n        }\n        playerSchema.physicalBody = null;\n        let itemsList = playerSchema?.inventory?.manager?.items || {};\n        let itemsKeys = Object.keys(itemsList);\n        if(0 < itemsKeys.length){\n            for(let i of itemsKeys){\n                let item = itemsList[i];\n                if(item.useTimer){\n                    clearTimeout(item.useTimer);\n                }\n                if(item.execTimer){\n                    clearTimeout(item.execTimer);\n                }\n            }\n        }\n        this.clearEntityActions(playerSchema);\n        // these contain references to the room:\n        delete playerSchema.skillsServer?.client;\n        delete playerSchema.inventory?.client;\n        playerSchema.executePhysicalSkill = null;\n        playerSchema.persistData = null;\n        playerSchema.skillsServer = null;\n        playerSchema.inventory = null;\n        let playerDeathTimer = playerSchema.getPrivate('playerDeathTimer');\n        if(playerDeathTimer){\n            clearTimeout(playerDeathTimer);\n        }\n        this.state.removePlayer(sessionId);\n    }\n\n    async savePlayerState(sessionId)\n    {\n        let playerSchema = this.playerBySessionIdFromState(sessionId);\n        let {room_id, x, y, dir} = playerSchema.state;\n        let playerId = playerSchema.player_id;\n        let updatePatch = {room_id, x: parseInt(x), y: parseInt(y), dir};\n        let updateReady = {continueUpdate: true};\n        this.events.emitSync('reldens.onSavePlayerStateBefore', {\n            room: this,\n            playerSchema,\n            playerId,\n            updatePatch,\n            updateReady\n        });\n        if(!updateReady.continueUpdate){\n            return playerSchema;\n        }\n        let updateResult = false;\n        let errorMessage = '';\n        try {\n            updateResult = await this.loginManager.usersManager.updateUserStateByPlayerId(playerId, updatePatch);\n        } catch (error) {\n            errorMessage = error.message;\n        }\n        if(!updateResult){\n            Logger.error('Player with ID \"'+playerId+'\" update error. ' + errorMessage);\n            return false;\n        }\n        return playerSchema;\n    }\n\n    async savePlayerStats(playerSchema, client)\n    {\n        // @TODO - BETA - For now we are always updating all the stats but this can be improved to save only the ones\n        //   that changed.\n        let objectState = {updateReady: true};\n        this.events.emitSync('reldens.onSavePlayerStatsBefore', {room: this, playerSchema, client, objectState});\n        if(!objectState.updateReady){\n            return false;\n        }\n        for(let i of Object.keys(playerSchema.stats)){\n            let statId = this.config.client.players.initialStats[i].id;\n            let statPatch = {\n                value: playerSchema.stats[i],\n                base_value: playerSchema.statsBase[i]\n            };\n            await this.loginManager.usersManager.updatePlayerStatByIds(playerSchema.player_id, statId, statPatch);\n        }\n        if(client){\n            // @TODO - BETA - Convert all events in constants and consolidate them in a single file with descriptions.\n            await this.events.emit('reldens.savePlayerStatsUpdateClient', client, playerSchema, this);\n            client.send('*', {\n                act: GameConst.PLAYER_STATS,\n                stats: playerSchema.stats,\n                statsBase: playerSchema.statsBase\n            });\n        }\n        return true;\n    }\n\n    async savePlayedTime(playerSchema)\n    {\n        return this.loginManager.usersManager.updatePlayedTimeAndLogoutDate(playerSchema);\n    }\n\n    getClientById(clientId)\n    {\n        let client = this.activePlayerBySessionId(clientId, this.roomId)?.client;\n        if(client){\n            return client;\n        }\n        Logger.debug('Fetching client \"'+clientId+'\" from RoomScene.clients.');\n        if(!this.clients){\n            return false;\n        }\n        for(let client of this.clients){\n            if(client.sessionId === clientId){\n                return client;\n            }\n        }\n        Logger.debug('Expected when disconnects, client \"'+clientId+'\" not found in RoomScene.clients.');\n        return false;\n    }\n\n    async createDropObjectInRoom(dropObjectData, worldObjectData)\n    {\n        let roomObject = await this.objectsManager.generateObjectFromObjectData(dropObjectData);\n        let { layerName, tileIndex, tileWidth, tileHeight, x, y } = worldObjectData;\n        await this.roomWorld.createRoomObjectBody({ name: layerName }, tileIndex, tileWidth, tileHeight, x, y);\n        if(!roomObject){\n            Logger.error('Object body could not be created.', {dropObjectData, worldObjectData});\n            return false;\n        }\n        this.addObjectStateSceneData(roomObject);\n        this.setObjectAutoDestroyTime(roomObject);\n        if(roomObject.objectBody){\n            Logger.debug('Creating drop object with body and collision group: \"'+WorldConst.COLLISIONS.DROP+'\".');\n            roomObject.objectBody.originalCollisionGroup = WorldConst.COLLISIONS.DROP;\n            for(let shape of roomObject.objectBody.shapes){\n                shape.collisionGroup = WorldConst.COLLISIONS.DROP;\n                shape.collisionMask = roomObject.objectBody.world.collisionsGroupsByType[WorldConst.COLLISIONS.DROP];\n            }\n        }\n        return roomObject;\n    }\n\n    setObjectAutoDestroyTime(roomObject)\n    {\n        let objectLifeTime = Number(this.config.getWithoutLogs('server/objects/drops/disappearTime', 0));\n        if(0 === objectLifeTime){\n            return false;\n        }\n        return setTimeout(() => {\n            if(!this.objectsManager){\n                return false;\n            }\n            if(!this.objectsManager.getObjectData(roomObject.objectIndex)){\n                return false;\n            }\n            this.removeObject(roomObject);\n        }, objectLifeTime);\n    }\n\n    removeObject(roomObject)\n    {\n        if(sc.isFunction(this.roomWorld.removeBody)){\n            this.roomWorld.removeBody(roomObject.objectBody);\n        }\n        this.objectsManager.removeObjectData(roomObject);\n        this.deleteObjectSceneData(roomObject);\n        if(!this.hasActiveDroppedObjects()){\n            this.enableAutoDispose();\n        }\n        this.broadcast('*', {act: ObjectsConst.DROPS.REMOVE, id: roomObject.objectIndex});\n    }\n\n    hasActiveDroppedObjects()\n    {\n        for(let roomObject of Object.values(this.objectsManager.roomObjects)){\n            if(roomObject instanceof DropObject){\n                return true\n            }\n        }\n        return false;\n    }\n\n    onDispose()\n    {\n        if(!this.loginManager){\n            // expected when a room throws a CREATING_ROOM_AWAIT error and the room can be disposed automatically:\n            Logger.debug('Expected, LoginManager was not set as the created instance.', this.roomName, this.roomId);\n            return false;\n        }\n        let createdRoomId = this.loginManager.roomsManager.instanceIdByName[this.roomName];\n        if(!createdRoomId){\n            Logger.warning('Room ID was not set on the created instances.', this.roomName, this.roomId);\n        }\n        if(createdRoomId && this.roomId !== createdRoomId){\n            Logger.debug('Avoiding dispose for awaiting room creation.', this.roomName, this.roomId)\n            return true;\n        }\n        return new Promise((resolve) => {\n            try {\n                Logger.info('Starting dispose of RoomScene \"'+this.roomName+'\" (ID: '+this.roomId+')');\n                this.logEventsData('before');\n                this.clearMovementIntervals();\n                this.clearWorldTimers();\n                this.cleanUpRoomWorld();\n                this.clearPlayersTimers();\n                // @TODO - BETA - Replace the following two methods to use a single master key related to the room ID.\n                this.handleRespawnOnRoomDispose();\n                this.handleObjectsManagerOnRoomDispose();\n                delete this.objectsManager;\n                delete this.roomWorld;\n                this.roomWorld = {};\n                this.events.offByMasterKey(this.roomName + '-' + this.roomId);\n                super.onDispose();\n                this.logEventsData('after');\n            } catch (error) {\n                resolve({confirm: false, error});\n            }\n            Logger.info('Disposed RoomScene \"'+this.roomName+'\" (ID: '+this.roomId+').');\n            resolve({confirm: true});\n        });\n    }\n\n    clearPlayersTimers()\n    {\n        if(0 === this.playersCountInState()){\n            return false;\n        }\n        for(let i of this.playersKeysFromState()){\n            let playerSchema = this.playerBySessionIdFromState(i);\n            clearTimeout(playerSchema?.actions?.pvp?.playerReviveTimer);\n        }\n    }\n\n    cleanUpRoomWorld()\n    {\n        this.roomWorld.removeBodies.push(this.objectBody);\n        this.roomWorld._listeners['postBroadphase'] = [];\n        this.roomWorld._listeners['preSolve'] = [];\n        this.roomWorld._listeners['beginContact'] = [];\n        this.roomWorld._listeners['endContact'] = [];\n        this.roomWorld.clear();\n    }\n\n    clearWorldTimers()\n    {\n        clearInterval(this.roomWorld.worldDateTimeInterval);\n        this.worldTimer.callbacks = [];\n        this.worldTimer.clockInstance ? this.worldTimer.worldTimer.clear() : clearInterval(this.worldTimer.worldTimer);\n        clearInterval(this.worldTimer.worldTimer);\n        delete this.worldTimerCallback;\n        this.worldTimerCallback = () => {\n            // this serves as notification in case the room didn't clear the timers or events correctly:\n            Logger.warning('World timer callback still executed for room \"'+this.roomName+'\".');\n        };\n        Logger.debug('Cleared world timer and world date time intervals.');\n        this.worldTimer.world = null;\n        this.worldTimer = null;\n        delete this.worldTimer;\n    }\n\n    handleObjectsManagerOnRoomDispose()\n    {\n        if(!this.objectsManager.roomObjects){\n            Logger.debug('None roomObjects defined for room: '+this.roomName);\n            return;\n        }\n        for(let i of Object.keys(this.objectsManager.roomObjects)){\n            let roomObject = this.objectsManager.roomObjects[i];\n            roomObject.postBroadPhaseListener = [];\n            this.clearEntityActions(roomObject);\n            if(roomObject.battle){\n                clearTimeout(roomObject.battle.battleTimer);\n                clearTimeout(roomObject.battle.respawnStateTimer);\n                roomObject.battle.targetObject = null;\n            }\n            clearTimeout(roomObject?.objectBody?.moveToOriginalPointTimer);\n            clearTimeout(roomObject.respawnTimer);\n            clearInterval(roomObject.respawnTimerInterval);\n            clearTimeout(roomObject.isCasting);\n            Logger.debug('Cleared timers for: ' + roomObject.key + ' / ' + i);\n            delete this.objectsManager.roomObjects[i];\n        }\n    }\n\n    clearEntityActions(entityInstance)\n    {\n        let actions = entityInstance?.actions || {};\n        let actionsKeys = Object.keys(actions);\n        if(0 === actionsKeys.length){\n            return;\n        }\n        for(let i of actionsKeys){\n            if(actions[i].room){\n                actions[i].room = null;\n            }\n        }\n    }\n\n    handleRespawnOnRoomDispose()\n    {\n        if(!this.roomWorld.respawnAreas){\n            Logger.debug('None respawn areas defined for room: '+this.roomName);\n            return;\n        }\n        this.removeRespawnObjectsSubscribers();\n        this.deleteRespawnObjectInstances();\n    }\n\n    deleteRespawnObjectInstances()\n    {\n        if(!this.roomWorld.respawnAreas){\n            return;\n        }\n        for(let rI of Object.keys(this.roomWorld.respawnAreas)){\n            let respawnInstancesCreated = this.roomWorld.respawnAreas[rI].instancesCreated;\n            for(let i of Object.keys(respawnInstancesCreated)){\n                delete respawnInstancesCreated[i];\n                Logger.debug('Deleted respawn instances created: ' + i);\n            }\n            delete this.roomWorld.respawnAreas[rI];\n            Logger.debug('Deleted respawn area created: ' + rI);\n        }\n        delete this.roomWorld.respawnAreas;\n        Logger.debug('Deleted respawn areas for room: ' + this.roomName);\n    }\n\n    removeRespawnObjectsSubscribers()\n    {\n        if(!this.roomWorld.respawnAreas){\n            return;\n        }\n        for(let rI of Object.keys(this.roomWorld.respawnAreas)){\n            let respawnInstancesCreated = this.roomWorld.respawnAreas[rI].instancesCreated;\n            for(let i of Object.keys(respawnInstancesCreated)){\n                let respawnInstance = respawnInstancesCreated[i];\n                for(let respawnObject of respawnInstance){\n                    Logger.debug('Setting \"battleEnd\" listener off: ' + respawnObject.uid);\n                    this.events.offByMasterKey(respawnObject.uid);\n                }\n            }\n        }\n    }\n\n    logEventsData(eventKey)\n    {\n        let endSubscribersCount = 0;\n        let keysData = {};\n        for(let i of Object.keys(this.events._events)){\n            endSubscribersCount += this.events._events[i].length;\n            keysData[i] = {keys: []};\n            for(let event of this.events._events[i]){\n                keysData[i].keys.push((event.fn.name || 'anonymous').replace('bound ', ''));\n            }\n            keysData[i].keys = keysData[i].keys.join(', ');\n        }\n        Logger.debug('Subscribers count '+eventKey+':', endSubscribersCount, keysData);\n    }\n\n    addObjectStateSceneData(object)\n    {\n        //Logger.debug('Add object scene data: ', object);\n        // @TODO - BETA - Refactor, remove scene.roomData or scene.state.roomData or rename.\n        let updateData = sc.get(this.state.roomData.objectsAnimationsData, object.objectIndex);\n        if(!updateData){\n            return;\n        }\n        this.state.roomData.objectsAnimationsData[object.objectIndex] = updateData;\n        if(object.objects_assets){\n            for(let objectAsset of object.objects_assets){\n                this.state.roomData.preloadAssets[this.objectAssetId(objectAsset)] = objectAsset;\n            }\n        }\n        this.state.mapRoomData();\n    }\n\n    deleteObjectSceneData(object)\n    {\n        //Logger.debug('Deleted object scene data: ', object);\n        // @TODO - BETA - Refactor, remove scene.roomData or scene.state.roomData or rename.\n        delete this.state.roomData.objectsAnimationsData[object.objectIndex];\n        if(object.objects_assets){\n            for(let objectAsset of object.objects_assets){\n                delete this.state.roomData.preloadAssets[this.objectAssetId(objectAsset)];\n            }\n        }\n        this.state.mapRoomData();\n    }\n\n    objectAssetId(objectAsset)\n    {\n        return (objectAsset.object_id || '') + (objectAsset.object_asset_id || '');\n    }\n\n    disableAutoDispose()\n    {\n        this.autoDispose = false;\n    }\n\n    enableAutoDispose()\n    {\n        this.autoDispose = true;\n    }\n}\n\nmodule.exports.RoomScene = RoomScene;\n"
  },
  {
    "path": "lib/rooms/server/state.js",
    "content": "/**\n *\n * Reldens - State\n *\n * Colyseus Schema for synchronizing room state between server and clients.\n *\n */\n\nconst { Schema, MapSchema, type } = require('@colyseus/schema');\nconst { Player } = require('../../users/server/player');\nconst { ObjectBodyState } = require('../../world/server/object-body-state');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/server/scene-data-filter').SceneDataFilter} SceneDataFilter\n */\nclass State extends Schema\n{\n\n    /**\n     * @param {Object} roomData\n     * @param {SceneDataFilter} sceneDataFilter\n     */\n    constructor(roomData, sceneDataFilter)\n    {\n        super();\n        /** @type {Object} */\n        this.roomData = roomData || {};\n        /** @type {SceneDataFilter|boolean} */\n        this.sceneDataFilter = sceneDataFilter || false;\n        this.mapRoomData();\n        /** @type {MapSchema<Player>} */\n        this.players = new MapSchema();\n        /** @type {MapSchema<ObjectBodyState>} */\n        this.bodies = new MapSchema();\n    }\n\n    /**\n     * @param {Object} [roomData]\n     */\n    mapRoomData(roomData)\n    {\n        if(!roomData){\n            roomData = this.roomData;\n        }\n        // @NOTE: this JSON is sent to the client as the initial data, here we could remove data we don't want to send.\n        // This will get updated in cases like respawn objects restore (where the initial position changes), or when\n        // drops are created.\n        if(this.sceneDataFilter && this.sceneDataFilter.filterRoomData){\n            roomData = this.sceneDataFilter.filterRoomData(roomData, false);\n        }\n        /** @type {string} */\n        this.sceneData = JSON.stringify(roomData);\n    }\n\n    /**\n     * @param {Object} playerData\n     * @param {string} sessionId\n     * @returns {Player}\n     */\n    createPlayerSchema(playerData, sessionId)\n    {\n        return new Player(playerData, sessionId);\n    }\n\n    /**\n     * @param {Player} playerSchema\n     * @param {string} id\n     * @returns {Player}\n     */\n    addPlayerToState(playerSchema, id)\n    {\n        this.players.set(id, playerSchema);\n        return this.players.get(id);\n    }\n\n    /**\n     * @param {string} id\n     * @param {Object} data\n     * @returns {boolean|void}\n     */\n    positionPlayer(id, data)\n    {\n        let player = this.players.get(id);\n        if(!player){\n            Logger.error('Player not found! ID: '+id);\n            return false;\n        }\n        player.state.mov = false;\n        player.state.x = data.x;\n        player.state.y = data.y;\n    }\n\n    /**\n     * @param {string} id\n     */\n    removePlayer(id)\n    {\n        this.players.delete(id);\n    }\n\n    /**\n     * @param {string} id\n     * @returns {ObjectBodyState|undefined}\n     */\n    fetchBody(id)\n    {\n        return this.bodies.get(id);\n    }\n\n    /**\n     * @param {ObjectBodyState} body\n     * @param {string} bodyId\n     * @returns {ObjectBodyState}\n     */\n    addBodyToState(body, bodyId)\n    {\n        this.bodies.set(bodyId, body);\n        return this.bodies.get(bodyId);\n    }\n\n    /**\n     * @param {string} id\n     * @returns {boolean}\n     */\n    removeBody(id)\n    {\n        if(!this.fetchBody(id)){\n            return false;\n        }\n        return this.bodies.delete(id);\n    }\n\n}\n\ntype('string')(State.prototype, 'sceneData');\ntype({map: Player})(State.prototype, 'players');\ntype({map: ObjectBodyState})(State.prototype, 'bodies');\n\nmodule.exports.State = State;\n"
  },
  {
    "path": "lib/rooms/server/world-config.js",
    "content": "/**\n *\n * Reldens - WorldConfig\n *\n * Configures physics world settings for rooms based on global and custom configuration.\n *\n */\n\nconst { WorldConst } = require('../../world/constants');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./scene').RoomScene} RoomScene\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n */\nclass WorldConfig\n{\n\n    /**\n     * @param {RoomScene} room\n     * @param {ConfigManager} config\n     */\n    static mapWorldConfigValues(room, config)\n    {\n        let globalWorldConfig = config.get('server/rooms/world');\n        let collisions = WorldConst.COLLISIONS;\n        let collideWithAll = collisions.PLAYER\n            | collisions.OBJECT\n            | collisions.WALL\n            | collisions.BULLET_PLAYER\n            | collisions.BULLET_OBJECT\n            | collisions.BULLET_OTHER\n            | collisions.DROP;\n        let collideExceptDrops = collisions.PLAYER\n            | collisions.OBJECT\n            | collisions.WALL\n            | collisions.BULLET_PLAYER\n            | collisions.BULLET_OBJECT\n            | collisions.BULLET_OTHER;\n        let collideExceptNonPlayerBullets = collisions.PLAYER\n            | collisions.OBJECT\n            | collisions.WALL\n            | collisions.BULLET_PLAYER;\n        let collideExceptObjectsAndNonPlayerBullets = collisions.PLAYER\n            | collisions.WALL\n            | collisions.BULLET_PLAYER;\n        let collideExceptObjectsAndObjectsBullets = collisions.PLAYER\n            | collisions.OBJECT\n            | collisions.WALL\n            | collisions.BULLET_PLAYER;\n        let collidePlayersAndWalls = collisions.PLAYER | collisions.WALL;\n        let globalConfig = {\n            applyGravity: sc.get(globalWorldConfig, 'applyGravity', false),\n            gravity: sc.get(globalWorldConfig, 'gravity', [0, 0]),\n            globalStiffness: sc.get(globalWorldConfig, 'globalStiffness', 1000000000),\n            globalRelaxation: sc.get(globalWorldConfig, 'globalRelaxation', 10),\n            useFixedWorldStep: sc.get(globalWorldConfig, 'useFixedWorldStep', null),\n            timeStep: sc.get(globalWorldConfig, 'timeStep', null),\n            maxSubSteps: sc.get(globalWorldConfig, 'maxSubSteps', null),\n            movementSpeed: sc.get(globalWorldConfig, 'movementSpeed', null),\n            allowPassWallsFromBelow: sc.get(globalWorldConfig, 'allowPassWallsFromBelow', null),\n            jumpSpeed: sc.get(globalWorldConfig, 'jumpSpeed', 540),\n            jumpTimeMs: sc.get(globalWorldConfig, 'jumpTimeMs', 180),\n            tryClosestPath: sc.get(globalWorldConfig, 'tryClosestPath'),\n            onlyWalkable: sc.get(globalWorldConfig, 'onlyWalkable'),\n            wallsMassValue: sc.get(globalWorldConfig, 'wallsMassValue', 1),\n            playerMassValue: sc.get(globalWorldConfig, 'playerMassValue', 1),\n            bulletsStopOnPlayer: sc.get(globalWorldConfig, 'bulletsStopOnPlayer', true),\n            bulletsStopOnObject: sc.get(globalWorldConfig, 'bulletsStopOnObject', false),\n            disableObjectsCollisionsOnChase: sc.get(globalWorldConfig, 'disableObjectsCollisionsOnChase', false),\n            disableObjectsCollisionsOnReturn: sc.get(globalWorldConfig, 'disableObjectsCollisionsOnReturn', true),\n            collisionsGroupsByType: sc.get(globalWorldConfig, 'collisionsGroupsByType', {\n                [collisions.PLAYER]: collideWithAll,\n                [collisions.OBJECT]: collideExceptNonPlayerBullets,\n                [collisions.WALL]: collideWithAll,\n                [collisions.BULLET_PLAYER]: collideExceptDrops,\n                [collisions.BULLET_OBJECT]: collideExceptObjectsAndNonPlayerBullets,\n                [collisions.BULLET_OTHER]: collideExceptObjectsAndObjectsBullets,\n                [collisions.DROP]: collidePlayersAndWalls\n            }),\n            groupWallsVertically: sc.get(globalWorldConfig, 'groupWallsVertically', false),\n            groupWallsHorizontally: sc.get(globalWorldConfig, 'groupWallsHorizontally', false)\n        };\n        let applyGravity = sc.get(room.customData, 'applyGravity', globalConfig.applyGravity);\n        let defaultsVariations = {\n            useFixedWorldStep: null !== globalConfig.useFixedWorldStep ? globalConfig.useFixedWorldStep : !applyGravity,\n            timeStep: applyGravity ? 0.012 : (null !== globalConfig.timeStep ? globalConfig.timeStep : 0.04),\n            maxSubSteps: applyGravity ? 2 : (null !== globalConfig.maxSubSteps ? globalConfig.maxSubSteps : 1),\n            movementSpeed: applyGravity ? 160 : (null !== globalConfig.movementSpeed ? globalConfig.movementSpeed : 180),\n            allowPassWallsFromBelow: null !== globalConfig.allowPassWallsFromBelow\n                ? globalConfig.allowPassWallsFromBelow\n                : false,\n        };\n        let worldConfig = {\n            applyGravity,\n            gravity: sc.get(room.customData, 'gravity', globalConfig.gravity),\n            globalStiffness: sc.get(room.customData, 'globalStiffness', globalConfig.globalStiffness),\n            globalRelaxation: sc.get(room.customData, 'globalRelaxation', globalConfig.globalRelaxation),\n            useFixedWorldStep: sc.get(room.customData, 'useFixedWorldStep', defaultsVariations.useFixedWorldStep),\n            timeStep: sc.get(room.customData, 'timeStep', defaultsVariations.timeStep),\n            maxSubSteps: sc.get(room.customData, 'maxSubSteps', defaultsVariations.maxSubSteps),\n            movementSpeed: sc.get(room.customData, 'movementSpeed', defaultsVariations.movementSpeed),\n            allowPassWallsFromBelow: sc.get(\n                room.customData,\n                'allowPassWallsFromBelow',\n                defaultsVariations.allowPassWallsFromBelow\n            ),\n            jumpSpeed: sc.get(room.customData, 'jumpSpeed', globalConfig.jumpSpeed),\n            jumpTimeMs: sc.get(room.customData, 'jumpTimeMs', globalConfig.jumpTimeMs),\n            tryClosestPath: sc.get(room.customData, 'tryClosestPath', globalConfig.tryClosestPath),\n            onlyWalkable: sc.get(room.customData, 'onlyWalkable', globalConfig.onlyWalkable),\n            wallsMassValue: sc.get(room.customData, 'wallsMassValue', globalConfig.wallsMassValue),\n            playerMassValue: sc.get(room.customData, 'playerMassValue', globalConfig.playerMassValue),\n            bulletsStopOnPlayer: sc.get(room.customData, 'bulletsStopOnPlayer', globalConfig.bulletsStopOnPlayer),\n            bulletsStopOnObject: sc.get(room.customData, 'bulletsStopOnObject', globalConfig.bulletsStopOnObject),\n            disableObjectsCollisionsOnChase: sc.get(\n                room.customData,\n                'disableObjectsCollisionsOnChase',\n                globalConfig.disableObjectsCollisionsOnChase\n            ),\n            disableObjectsCollisionsOnReturn: sc.get(\n                room.customData,\n                'disableObjectsCollisionsOnReturn',\n                globalConfig.disableObjectsCollisionsOnReturn\n            ),\n            collisionsGroupsByType: sc.get(\n                room.customData,\n                'collisionsGroupsByType',\n                globalConfig.collisionsGroupsByType\n            ),\n            groupWallsVertically: sc.get(room.customData, 'groupWallsVertically', globalConfig.groupWallsVertically),\n            groupWallsHorizontally: sc.get(\n                room.customData,\n                'groupWallsHorizontally',\n                globalConfig.groupWallsHorizontally\n            )\n        };\n        if(!room.worldConfig){\n            room.worldConfig = {};\n        }\n        Object.assign(room.worldConfig, worldConfig);\n    }\n\n}\n\nmodule.exports.WorldConfig = WorldConfig;\n"
  },
  {
    "path": "lib/scores/client/messages-processor.js",
    "content": "/**\n *\n * Reldens - MessagesProcessor\n *\n * Processes queued scores messages when the UI scene becomes ready.\n *\n */\n\nconst { ScoresMessageHandler } = require('./scores-message-handler');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('./scores-message-listener').ScoresMessageListener} ScoresMessageListener\n */\nclass MessagesProcessor\n{\n\n    /**\n     * @param {RoomEvents} roomEvents\n     * @param {ScoresMessageListener} scoresMessageListener\n     */\n    static processScoresMessagesQueue(roomEvents, scoresMessageListener)\n    {\n        if(!sc.isArray(roomEvents.scoresMessagesQueue)){\n            return;\n        }\n        if(0 === roomEvents.scoresMessagesQueue.length){\n            return;\n        }\n        for(let message of roomEvents.scoresMessagesQueue){\n            scoresMessageListener.handleScoresMessage(message, new ScoresMessageHandler({roomEvents, message}));\n        }\n        roomEvents.scoresMessagesQueue = [];\n    }\n\n}\n\nmodule.exports.MessageProcessor = MessagesProcessor;\n"
  },
  {
    "path": "lib/scores/client/plugin.js",
    "content": "/**\n *\n * Reldens - Scores Client Plugin\n *\n * Initializes and manages the scores system on the client side.\n * Handles UI preloading, message listening, and translations for the scores feature.\n *\n */\n\nconst { PreloaderHandler } = require('./preloader-handler');\nconst { ScoresMessageListener } = require('./scores-message-listener');\nconst { MessageProcessor } = require('./messages-processor');\nconst { ScoresConst } = require('../constants');\nconst Translations = require('./snippets/en_US');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('./preloader-handler').PreloaderHandler} PreloaderHandler\n * @typedef {import('./scores-message-listener').ScoresMessageListener} ScoresMessageListener\n */\nclass ScoresPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {PreloaderHandler} */\n        this.preloaderHandler = new PreloaderHandler();\n        /** @type {ScoresMessageListener} */\n        this.scoresMessageListener = new ScoresMessageListener();\n        if(this.validateProperties()){\n            this.setTranslations();\n            this.listenEvents();\n            this.listenMessages();\n            //Logger.debug('Plugin READY: Scores');\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    validateProperties()\n    {\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in ScoresPlugin.');\n            return false;\n        }\n        if(!this.events){\n            Logger.error('EventsManager undefined in ScoresPlugin.');\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setTranslations()\n    {\n        if(!this.gameManager){\n            return false;\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations, ScoresConst.MESSAGE.DATA_VALUES);\n    }\n\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager undefined in ScoresPlugin for \"listenEvents\".');\n            return;\n        }\n        this.events.on('reldens.preloadUiScene', (preloadScene) => {\n            this.preloaderHandler.loadContents(preloadScene);\n        });\n        this.events.on('reldens.createEngineSceneDone', (event) => {\n            let roomEvents = event?.roomEvents;\n            if(!roomEvents){\n                Logger.critical('RoomEvents undefined for process Scores messages queue on ScoresPlugin.', event);\n                return false;\n            }\n            MessageProcessor.processScoresMessagesQueue(roomEvents, this.scoresMessageListener);\n        });\n    }\n\n    listenMessages()\n    {\n        if(!this.gameManager || !this.events){\n            Logger.error('Game Manager or EventsManager undefined in ScoresPlugin for \"listenMessages\".');\n            return;\n        }\n        this.gameManager.config.client.message.listeners[ScoresConst.KEY] = this.scoresMessageListener;\n    }\n\n}\n\nmodule.exports.ScoresPlugin = ScoresPlugin;\n"
  },
  {
    "path": "lib/scores/client/preloader-handler.js",
    "content": "/**\n *\n * Reldens - PreloaderHandler\n *\n * Handles preloading of scores UI templates during the game initialization phase.\n *\n */\n\nconst { ScoresConst } = require('../constants');\n\n/**\n * @typedef {import('../../game/client/scene-preloader').ScenePreloader} ScenePreloader\n */\nclass PreloaderHandler\n{\n\n    /**\n     * @param {ScenePreloader} uiScene\n     */\n    loadContents(uiScene)\n    {\n        let scoresTemplatePath = '/assets/features/scores/templates/';\n        uiScene.load.html(ScoresConst.KEY, scoresTemplatePath+'ui-scores.html');\n        uiScene.load.html(ScoresConst.TEMPLATES.SCORES_TABLE, scoresTemplatePath+'ui-scores-table.html');\n    }\n\n}\n\nmodule.exports.PreloaderHandler = PreloaderHandler;\n"
  },
  {
    "path": "lib/scores/client/scores-message-handler.js",
    "content": "/**\n *\n * Reldens - ScoresMessageHandler\n *\n * Handles scores-related messages on the client side, managing the scores UI creation and updates.\n * Creates and updates the scores interface including player scores and top scores leaderboard.\n *\n */\n\nconst { UserInterface } = require('../../game/client/user-interface');\nconst { ScoresConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('../../game/client/game-dom').GameDom} GameDom\n * @typedef {import('../../game/client/scene-preloader').ScenePreloader} ScenePreloader\n *\n * @typedef {Object} ScoresMessageHandlerProps\n * @property {RoomEvents} roomEvents\n * @property {Object} message\n */\nclass ScoresMessageHandler\n{\n\n    /**\n     * @param {ScoresMessageHandlerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {RoomEvents|boolean} */\n        this.roomEvents = sc.get(props, 'roomEvents', false);\n        /** @type {Object|boolean} */\n        this.message = sc.get(props, 'message', false);\n        /** @type {GameManager|undefined} */\n        this.gameManager = this.roomEvents?.gameManager;\n        /** @type {GameDom|undefined} */\n        this.gameDom = this.gameManager?.gameDom;\n        /** @type {ScenePreloader|undefined} */\n        this.uiScene = this.gameManager?.gameEngine?.uiScene;\n    }\n\n    /**\n     * @returns {ScenePreloader|boolean}\n     */\n    validate()\n    {\n        if(!this.roomEvents){\n            Logger.info('Missing RoomEvents on ScoresMessageHandler.');\n            return false;\n        }\n        if(!this.message){\n            Logger.info('Missing message on ScoresMessageHandler.');\n            return false;\n        }\n        if(!this.gameManager){\n            Logger.info('Missing GameManager on ScoresMessageHandler.');\n            return false;\n        }\n        // @NOTE: the message could arrive before the uiScene gets ready.\n        // if(!this.uiScene){\n        //     Logger.info('Missing UI Scene on ScoresMessageHandler.');\n        // }\n        return this.uiScene;\n    }\n\n    /**\n     * @returns {UserInterface|boolean}\n     */\n    createScoresUi()\n    {\n        let scoresUi = sc.get(this.uiScene.userInterfaces, ScoresConst.KEY);\n        if(scoresUi){\n            return scoresUi;\n        }\n        if(!this.uiScene.userInterfaces){\n            this.uiScene.userInterfaces = {};\n        }\n        let uiScores = new UserInterface(\n            this.gameManager,\n            {id: ScoresConst.KEY, type: ScoresConst.KEY, defaultOpen: true, defaultClose: true},\n            '/assets/features/scores/templates/ui-scores.html',\n            ScoresConst.KEY\n        );\n        uiScores.createUiElement(this.uiScene, ScoresConst.KEY);\n        // @TODO - BETA - Check if this can be moved inside the createUiElement.\n        let uiBox = this.uiScene.elementsUi[ScoresConst.KEY];\n        if(!uiBox){\n            Logger.error('Scores UI box not found.', {uiScores, uiBox});\n            return false;\n        }\n        let title = this.gameManager.services.translator.t(\n            this.gameManager.config.getWithoutLogs('client/scores/labels/title', ScoresConst.SNIPPETS.TITLE)\n        );\n        let content = this.gameManager.services.translator.t(\n            this.gameManager.config.getWithoutLogs('client/scores/labels/content', ScoresConst.SNIPPETS.CONTENT)\n        );\n        this.roomEvents.uiSetTitleAndContent(uiBox, {title, content}, this.uiScene);\n        this.uiScene.userInterfaces[ScoresConst.KEY] = uiScores;\n        return this.uiScene.userInterfaces[ScoresConst.KEY];\n    }\n\n    updatePlayerScore()\n    {\n        this.createScoresUi();\n        let currentPlayerScore = sc.get(this.message, 'newTotalScore', false);\n        if(!currentPlayerScore){\n            Logger.debug('Missing new total score on update message.');\n            return;\n        }\n        this.uiScene.currentPlayerScore = currentPlayerScore;\n        this.roomEvents.uiSetContent(\n            this.uiScene.elementsUi[ScoresConst.KEY],\n            {content: this.createContentsUpdate()},\n            this.uiScene\n        );\n    }\n\n    updateScoresBox()\n    {\n        this.createScoresUi();\n        let scores = sc.get(this.message, 'scores', false);\n        if(!scores){\n            Logger.debug('Missing scores data on message.');\n            return;\n        }\n        this.uiScene.scores = scores;\n        this.roomEvents.uiSetContent(\n            this.uiScene.elementsUi[ScoresConst.KEY],\n            {content: this.createContentsUpdate()},\n            this.uiScene\n        );\n    }\n\n    /**\n     * @returns {string}\n     */\n    createContentsUpdate()\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let templateContent = this.uiScene.cache.html.get(ScoresConst.TEMPLATES.SCORES_TABLE);\n        if(!templateContent){\n            Logger.error('Missing template \"' + ScoresConst.TEMPLATES.SCORES_TABLE + '\".');\n            return '';\n        }\n        let templateParams = {\n            scores: this.uiScene.scores,\n            showCurrentPlayer: true,\n            currentPlayerScore: this.gameManager.services.translator.t(\n                this.gameManager.config.getWithoutLogs('client/scores/labels/myScore', ScoresConst.SNIPPETS.MY_SCORE),\n                {myScore: this.uiScene.currentPlayerScore || '0'}\n            )\n        };\n        return this.gameManager.gameEngine.parseTemplate(templateContent, templateParams);\n    }\n}\n\nmodule.exports.ScoresMessageHandler = ScoresMessageHandler;\n"
  },
  {
    "path": "lib/scores/client/scores-message-listener.js",
    "content": "/**\n *\n * Reldens - ScoresMessageListener\n *\n * Listens for scores-related messages from the server and delegates handling to the appropriate handler.\n * Queues messages if the UI is not ready yet.\n *\n */\n\nconst { ScoresMessageHandler } = require('./scores-message-handler');\nconst { ScoresConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/client/room-events').RoomEvents} RoomEvents\n */\nclass ScoresMessageListener\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async executeClientMessageActions(props)\n    {\n        let message = sc.get(props, 'message', false);\n        if(!message){\n            Logger.error('Missing message data on ScoresMessageListener.', props);\n            return false;\n        }\n        let roomEvents = sc.get(props, 'roomEvents', false);\n        if(!roomEvents){\n            Logger.error('Missing RoomEvents on ScoresMessageListener.', props);\n            return false;\n        }\n        let scoresMessageHandler = new ScoresMessageHandler({roomEvents, message});\n        if(!scoresMessageHandler.validate()){\n            if(this.isScoresMessage(message)){\n                if(!roomEvents.scoresMessagesQueue){\n                    roomEvents.scoresMessagesQueue = [];\n                }\n                roomEvents.scoresMessagesQueue.push(message);\n                return true;\n            }\n            Logger.error('Invalid ScoresMessageHandler', scoresMessageHandler);\n            return false;\n        }\n        if(!this.isScoresMessage(message)){\n            return false;\n        }\n        return this.handleScoresMessage(message, scoresMessageHandler);\n    }\n\n    /**\n     * @param {Object} message\n     * @param {ScoresMessageHandler} scoresMessageHandler\n     * @returns {boolean|void}\n     */\n    handleScoresMessage(message, scoresMessageHandler)\n    {\n        if(ScoresConst.ACTIONS.UPDATE === message.act){\n            return scoresMessageHandler.updatePlayerScore();\n        }\n        if(ScoresConst.ACTIONS.TOP_SCORES_UPDATE === message.act){\n            return scoresMessageHandler.updateScoresBox();\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {boolean}\n     */\n    isScoresMessage(message)\n    {\n        return 0 === message.act?.indexOf(ScoresConst.PREFIX);\n    }\n}\n\nmodule.exports.ScoresMessageListener = ScoresMessageListener;\n"
  },
  {
    "path": "lib/scores/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    scores: {\n        scoresTitle: 'Top Players Scores',\n        scoresContent: 'No scores available.',\n        myScore: 'My score: %myScore'\n    }\n}\n"
  },
  {
    "path": "lib/scores/constants.js",
    "content": "/**\n *\n * Reldens - ScoresConst\n *\n */\n\nlet prefix = 'sco';\nlet snippetsPrefix = 'scores.';\n\nmodule.exports.ScoresConst = {\n    KEY: 'scores',\n    PREFIX: prefix,\n    ACTIONS: {\n        UPDATE: prefix+'Up',\n        TOP_SCORES_UPDATE: prefix+'Tops'\n    },\n    TEMPLATES: {\n        SCORES_TABLE: 'scoresTable'\n    },\n    MESSAGE: {\n        DATA_VALUES: {\n            NAMESPACE: 'scores'\n        }\n    },\n    SNIPPETS: {\n        PREFIX: snippetsPrefix,\n        TITLE: snippetsPrefix+'scoresTitle',\n        CONTENT: snippetsPrefix+'scoresContent',\n        MY_SCORE: snippetsPrefix+'myScore'\n    }\n};\n"
  },
  {
    "path": "lib/scores/server/entities/scores-detail-entity-override.js",
    "content": "/**\n *\n * Reldens - ScoresDetailEntityOverride\n *\n * Customizes the scores detail entity configuration for the admin panel.\n * Removes the auto-populated kill_time field from the edit form.\n *\n */\n\nconst { ScoresDetailEntity } = require('../../../../generated-entities/entities/scores-detail-entity');\n\nclass ScoresDetailEntityOverride extends ScoresDetailEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.editProperties.splice(config.editProperties.indexOf('kill_time'), 1);\n        return config;\n    }\n\n}\n\nmodule.exports.ScoresDetailEntityOverride = ScoresDetailEntityOverride;\n"
  },
  {
    "path": "lib/scores/server/entities/scores-entity-override.js",
    "content": "/**\n *\n * Reldens - ScoresEntityOverride\n *\n * Customizes the scores entity configuration for the admin panel.\n * Removes auto-populated timestamp fields from the edit form.\n *\n */\n\nconst { ScoresEntity } = require('../../../../generated-entities/entities/scores-entity');\nconst { sc } = require('@reldens/utils');\n\nclass ScoresEntityOverride extends ScoresEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.editProperties = sc.removeFromArray(config.editProperties, [\n            'last_player_kill_time',\n            'last_npc_kill_time'\n        ]);\n        return config;\n    }\n\n}\n\nmodule.exports.ScoresEntityOverride = ScoresEntityOverride;\n"
  },
  {
    "path": "lib/scores/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { ScoresDetailEntityOverride } = require('./entities/scores-detail-entity-override');\nconst { ScoresEntityOverride } = require('./entities/scores-entity-override');\n\nmodule.exports.entitiesConfig = {\n    scoresDetail: ScoresDetailEntityOverride,\n    scores: ScoresEntityOverride\n};\n"
  },
  {
    "path": "lib/scores/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        scores: 'Scores',\n        scoresDetail: 'Scores Detail'\n    }\n};\n"
  },
  {
    "path": "lib/scores/server/mapper/increase-score-on-kill-mapper.js",
    "content": "/**\n *\n * Reldens - IncreaseScoreOnKillMapper\n *\n * Maps player death and battle ended events to score increase data.\n * Extracts relevant information from events for score processing.\n *\n */\n\n/**\n * @typedef {import('../../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../../../actions/server/events/player-death-event').PlayerDeathEvent} PlayerDeathEvent\n * @typedef {import('../../../actions/server/events/battle-ended-event').BattleEndedEvent} BattleEndedEvent\n * @typedef {import('../../../users/server/player').Player} Player\n */\nclass IncreaseScoreOnKillMapper\n{\n\n    constructor()\n    {\n        /** @type {RoomScene|null} */\n        this.room = null;\n        /** @type {Player|null} */\n        this.attackerPlayer = null;\n        /** @type {number|null} */\n        this.killPlayerId = null;\n        /** @type {number|null} */\n        this.killNpcId = null;\n        /** @type {number|null} */\n        this.obtainedNpcCustomScore = null;\n        this.reset();\n    }\n\n    /**\n     * @param {PlayerDeathEvent} playerDeathEvent\n     * @returns {IncreaseScoreOnKillMapper}\n     */\n    fromPlayerDeathEvent(playerDeathEvent)\n    {\n        this.reset();\n        this.room = playerDeathEvent?.room;\n        this.attackerPlayer = playerDeathEvent?.attackerPlayer;\n        this.killPlayerId = playerDeathEvent?.targetSchema?.player_id;\n        return this;\n    }\n\n    /**\n     * @param {BattleEndedEvent} battleEndedEvent\n     * @returns {IncreaseScoreOnKillMapper}\n     */\n    fromBattleEndedEvent(battleEndedEvent)\n    {\n        this.reset();\n        this.room = battleEndedEvent?.room;\n        this.attackerPlayer = battleEndedEvent?.playerSchema;\n        this.killNpcId = battleEndedEvent?.pve.targetObject.id;\n        this.obtainedNpcCustomScore = battleEndedEvent?.pve.targetObject.useNpcCustomScore;\n        return this;\n    }\n\n    reset()\n    {\n        this.room = null;\n        this.attackerPlayer = null;\n        this.killPlayerId = null;\n        this.killNpcId = null;\n        this.obtainedNpcCustomScore = null;\n    }\n\n}\n\nmodule.exports.IncreaseScoreOnKillMapper = IncreaseScoreOnKillMapper;\n"
  },
  {
    "path": "lib/scores/server/plugin.js",
    "content": "/**\n *\n * Reldens - Scores Server Plugin\n *\n * Initializes and manages the scores system on the server side.\n * Handles score increases on kills, initial scores data sending, and optional public scores route.\n *\n */\n\nconst { IncreaseScoreOnKillMapper } = require('./mapper/increase-score-on-kill-mapper');\nconst { IncreaseScoreOnKill } = require('./subscriber/increase-score-on-kill');\nconst { SendInitialScoresData } = require('./subscriber/send-initial-scores-data');\nconst { CreateScoresRoute } = require('./subscriber/create-scores-route');\nconst { ObjectsConst } = require('../../objects/constants');\nconst { GameConst } = require('../../game/constants');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('./subscriber/increase-score-on-kill').IncreaseScoreOnKill} IncreaseScoreOnKill\n * @typedef {import('./mapper/increase-score-on-kill-mapper').IncreaseScoreOnKillMapper} IncreaseScoreOnKillMapper\n * @typedef {import('./subscriber/create-scores-route').CreateScoresRoute} CreateScoresRoute\n * @typedef {import('./subscriber/send-initial-scores-data').SendInitialScoresData} SendInitialScoresData\n */\nclass ScoresPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async setup(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        /** @type {boolean} */\n        this.enableFullTableView = this.config?.getWithoutLogs('server/scores/fullTableView/enabled', false);\n        /** @type {string} */\n        this.scoresPath = this.config.getWithoutLogs('server/scores/fullTableView/scoresPath', '/scores');\n        /** @type {IncreaseScoreOnKill} */\n        this.increaseScoreOnKill = new IncreaseScoreOnKill({config: this.config, dataServer: this.dataServer});\n        /** @type {IncreaseScoreOnKillMapper} */\n        this.increaseScoreOnKillMapper = new IncreaseScoreOnKillMapper();\n        /** @type {CreateScoresRoute} */\n        this.createScoresRoute = new CreateScoresRoute(props);\n        /** @type {SendInitialScoresData} */\n        this.sendInitialScoresData = new SendInitialScoresData(props);\n        if(!this.validateProperties()){\n            return false;\n        }\n        this.listenEvents();\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    validateProperties()\n    {\n        if(!this.events){\n            Logger.error('EventsManager undefined in ScoresPlugin.');\n            return false;\n        }\n        if(!this.config){\n            Logger.error('Config undefined in ScoresPlugin.');\n            return false;\n        }\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in ScoresPlugin.');\n            return false;\n        }\n        return true;\n    }\n\n    listenEvents()\n    {\n        if(this.enableFullTableView){\n            this.events.on('reldens.serverBeforeListen', async (event) => {\n                return await this.createScoresRoute.execute(event, this.scoresPath);\n            });\n        }\n        this.events.on('reldens.joinRoomEnd', async (event) => {\n            return await this.sendInitialScoresData.execute(event.roomScene, event.client, event.loggedPlayer);\n        });\n        this.events.on('reldens.playerDeath', async (event) => {\n            await this.increaseScoreOnKill.execute(\n                this.increaseScoreOnKillMapper.fromPlayerDeathEvent(event),\n                GameConst.TYPE_PLAYER\n            );\n        });\n        this.events.on('reldens.battleEnded', async (event) => {\n            await this.increaseScoreOnKill.execute(\n                this.increaseScoreOnKillMapper.fromBattleEndedEvent(event),\n                ObjectsConst.TYPE_OBJECT\n            );\n        });\n    }\n\n}\n\nmodule.exports.ScoresPlugin = ScoresPlugin;\n"
  },
  {
    "path": "lib/scores/server/repositories-extension.js",
    "content": "/**\n *\n * Reldens - RepositoriesExtension\n *\n * Base class that provides repository assignment for scores-related database entities.\n * Extended by ScoresUpdater and ScoresProvider to access scores and scores detail repositories.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\nclass RepositoriesExtension\n{\n\n    /**\n     * @param {Object} props\n     * @returns {boolean}\n     */\n    assignRepositories(props)\n    {\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('Undefined DataServer on \"RepositoriesExtension\" class.');\n            return false;\n        }\n        /** @type {BaseDriver} */\n        this.scoresRepository = this.dataServer.getEntity('scores');\n        if(!this.scoresRepository){\n            Logger.error('Undefined \"scoresRepository\" in DataServer on \"RepositoriesExtension\".');\n            return false;\n        }\n        /** @type {BaseDriver} */\n        this.scoresDetailRepository = this.dataServer.getEntity('scoresDetail');\n        if(!this.scoresDetailRepository){\n            Logger.error('Undefined \"scoresDetailRepository\" in DataServer on \"RepositoriesExtension\".');\n            return false;\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.RepositoriesExtension = RepositoriesExtension;\n"
  },
  {
    "path": "lib/scores/server/scores-provider.js",
    "content": "/**\n *\n * Reldens - ScoresProvider\n *\n * Provides access to player scores and top scores data from the database.\n * Supports pagination for the score leaderboard.\n *\n */\n\nconst { RepositoriesExtension } = require('./repositories-extension');\nconst { Logger } = require('@reldens/utils');\n\nclass ScoresProvider extends RepositoriesExtension\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super();\n        /** @type {boolean} */\n        this.isReady = this.assignRepositories(props);\n    }\n\n    /**\n     * @param {number} playerId\n     * @returns {Promise<Object|boolean>}\n     */\n    async fetchPlayerScore(playerId)\n    {\n        if(!this.scoresRepository){\n            return false;\n        }\n        return await this.scoresRepository.loadOneBy('player_id', playerId);\n    }\n\n    /**\n     * @param {number} pageSize\n     * @param {number} page\n     * @returns {Promise<Array<Object>|boolean>}\n     */\n    async fetchTopScoresMappedData(pageSize = 0, page = 0)\n    {\n        if(!this.scoresRepository){\n            return false;\n        }\n        if(0 < pageSize){\n            this.scoresRepository.limit = pageSize;\n            if(1 < page){\n                this.scoresRepository.offset = (page - 1) * pageSize;\n            }\n        }\n        this.scoresRepository.sortBy = 'total_score';\n        let scores = await this.scoresRepository.loadWithRelations({}, []);\n        this.scoresRepository.limit = 0;\n        this.scoresRepository.offset = 0;\n        this.scoresRepository.sortBy = false;\n        return scores.map((score) => {\n            if(!score.related_players){\n                Logger.warning('Score player not found.', score);\n            }\n            return {playerName: score.related_players?.name, score: score.total_score};\n        });\n    }\n\n}\n\nmodule.exports.ScoresProvider = ScoresProvider;\n"
  },
  {
    "path": "lib/scores/server/scores-sender.js",
    "content": "/**\n *\n * Reldens - ScoresSender\n *\n * Sends score updates to clients including individual player scores and top scores broadcasts.\n *\n */\n\nconst { ScoresConst } = require('../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../../users/server/player').Player} Player\n * @typedef {import('@colyseus/core').Client} Client\n */\nclass ScoresSender\n{\n\n    /**\n     * @param {RoomScene} room\n     * @param {Player} attacker\n     * @param {number|string} newTotalScore\n     * @param {Array<Object>} scores\n     * @returns {Promise<Object|boolean>}\n     */\n    async sendUpdates(room, attacker, newTotalScore, scores)\n    {\n        let client = room?.activePlayerByPlayerId(attacker?.player_id, room?.roomId)?.client;\n        if(!client){\n            Logger.error('Player missing client.', {playerId: attacker?.player_id, roomId: room?.roomId});\n            return false;\n        }\n        let updatePlayerResult = this.updatePlayerScore(client, attacker, newTotalScore);\n        let broadcastTopScoresResult = this.broadcastTopScores(room, scores);\n        return {updatePlayerResult, broadcastTopScoresResult};\n    }\n\n    /**\n     * @param {Client} client\n     * @param {Player} attacker\n     * @param {number|string} newTotalScore\n     * @returns {boolean}\n     */\n    updatePlayerScore(client, attacker, newTotalScore)\n    {\n        if(!newTotalScore){\n            Logger.warning('Missing new total score data.');\n            return false;\n        }\n        client.send('*', {act: ScoresConst.ACTIONS.UPDATE, newTotalScore, listener: ScoresConst.KEY});\n        return true;\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @param {Array<Object>} scores\n     * @returns {boolean}\n     */\n    broadcastTopScores(room, scores)\n    {\n        if(!room){\n            Logger.error('Room undefined to send scores update.', room);\n            return false;\n        }\n        if(!scores){\n            Logger.warning('Missing scores data.');\n            return false;\n        }\n        room.broadcast('*', {act: ScoresConst.ACTIONS.TOP_SCORES_UPDATE, scores, listener: ScoresConst.KEY});\n        return true;\n    }\n\n}\n\nmodule.exports.ScoresSender = ScoresSender;\n"
  },
  {
    "path": "lib/scores/server/scores-updater.js",
    "content": "/**\n *\n * Reldens - ScoresUpdater\n *\n * Updates player scores in the database including total score, kill counts, and kill details.\n *\n */\n\nconst { RepositoriesExtension } = require('./repositories-extension');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../users/server/player').Player} Player\n */\nclass ScoresUpdater extends RepositoriesExtension\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        super();\n        /** @type {boolean} */\n        this.isReady = this.assignRepositories(props);\n    }\n\n    /**\n     * @param {Object} scoreData\n     * @param {Player} attacker\n     * @param {number} obtainedScore\n     * @param {Object} props\n     * @returns {Promise<Object|boolean>}\n     */\n    async updatePlayerScores(scoreData, attacker, obtainedScore, props)\n    {\n        if(!this.scoresRepository || !this.scoresDetailRepository){\n            return false;\n        }\n        let scoreSaveResult = await this.scoresRepository.upsert(scoreData);\n        if(!scoreSaveResult){\n            Logger.error('Score could not be saved.', scoreData);\n            return false;\n        }\n        let scoreDetailData = {\n            player_id: attacker.player_id,\n            obtained_score: obtainedScore,\n            kill_time: sc.formatDate(new Date()),\n            kill_player_id: props.killPlayerId || null,\n            kill_npc_id: props.killNpcId || null,\n        };\n        return this.scoresDetailRepository.create(scoreDetailData);\n    }\n}\n\nmodule.exports.ScoresUpdater = ScoresUpdater;\n"
  },
  {
    "path": "lib/scores/server/subscriber/create-scores-route.js",
    "content": "/**\n *\n * Reldens - CreateScoresRoute\n *\n * Creates an HTTP route to display the scores table as a public web page.\n * Supports pagination for browsing through the complete scores leaderboard.\n *\n */\n\nconst { ScoresProvider } = require('../scores-provider');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { PageRangeProvider, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../game/server/theme-manager').ThemeManager} ThemeManager\n * @typedef {import('../../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('../scores-provider').ScoresProvider} ScoresProvider\n */\nclass CreateScoresRoute\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {ThemeManager|boolean} */\n        this.themeManager = sc.get(props, 'themeManager', false);\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        /** @type {ScoresProvider} */\n        this.scoresProvider = new ScoresProvider(props);\n    }\n\n    /**\n     * @param {Object} event\n     * @param {string} scoresPath\n     * @returns {Promise<boolean>}\n     */\n    async execute(event, scoresPath)\n    {\n        if(!event?.serverManager?.app){\n            Logger.warning('Undefined app to create scores route.');\n            return false;\n        }\n        if(!this.config){\n            Logger.error('Undefined config in CreateScoresRoute.');\n            return false;\n        }\n        if(!this.themeManager){\n            Logger.error('Undefined themeManager in CreateScoresRoute.');\n            return false;\n        }\n        event.serverManager.app.get(scoresPath, async (req, res) => {\n            let pageSize = 100;\n            let page = req.body.page || 1;\n            let totalPages = Math.ceil(await this.scoresProvider.scoresRepository.count({}) / pageSize);\n            let pagesData = PageRangeProvider.fetch(page, totalPages);\n            let pages = [];\n            for(let pageData of pagesData){\n                pages.push({pageLabel: pageData.label, pageLink: scoresPath+'/?page='+ pageData.value});\n            }\n            let scores = await this.scoresProvider.fetchTopScoresMappedData(pageSize, page);\n            let content = await this.themeManager.templateEngine.render(\n                FileHandler.fetchFileContents(FileHandler.joinPaths(\n                    this.themeManager.projectAssetsPath,\n                    'features',\n                    'scores',\n                    'templates',\n                    'ui-scores-table.html'\n                )),\n                {\n                    scores,\n                    pages,\n                    showScoresTitle: true,\n                    // @TODO - BETA - Apply translations.\n                    scoresTitle: this.config.getWithoutLogs('server/scores/fullTableView/title', 'Scores Table')\n                }\n            );\n            let result = await this.themeManager.templateEngine.render(\n                FileHandler.fetchFileContents(FileHandler.joinPaths(\n                    this.themeManager.projectAssetsPath,\n                    'html',\n                    'layout.html'\n                )),\n                {content, contentKey: 'scores-content'}\n            );\n            res.send(result);\n        });\n    }\n\n}\n\nmodule.exports.CreateScoresRoute = CreateScoresRoute;\n"
  },
  {
    "path": "lib/scores/server/subscriber/increase-score-on-kill.js",
    "content": "/**\n *\n * Reldens - IncreaseScoreOnKill\n *\n * Handles score increases when players kill other players or NPCs.\n * Calculates obtained scores, updates player totals, and broadcasts changes.\n *\n */\n\nconst { ScoresProvider } = require('../scores-provider');\nconst { ScoresUpdater } = require('../scores-updater');\nconst { ScoresSender } = require('../scores-sender');\nconst { GameConst } = require('../../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../game/server/config-manager').ConfigManager} ConfigManager\n * @typedef {import('../scores-provider').ScoresProvider} ScoresProvider\n * @typedef {import('../scores-updater').ScoresUpdater} ScoresUpdater\n * @typedef {import('../scores-sender').ScoresSender} ScoresSender\n */\nclass IncreaseScoreOnKill\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        /** @type {Object|boolean} */\n        this.scoresConfig = this.config?.getWithoutLogs('server/scores', false);\n        /** @type {number} */\n        this.obtainedScorePerPlayer = sc.get(this.scoresConfig, 'obtainedScorePerPlayer', 0);\n        /** @type {number} */\n        this.obtainedScorePerNpc = sc.get(this.scoresConfig, 'obtainedScorePerNpc', 0);\n        /** @type {boolean} */\n        this.useNpcCustomScore = sc.get(this.scoresConfig, 'useNpcCustomScore', false);\n        this.checkScoresConfiguration();\n        /** @type {ScoresProvider} */\n        this.scoresProvider = new ScoresProvider(props);\n        /** @type {ScoresUpdater} */\n        this.scoresUpdater = new ScoresUpdater(props);\n        /** @type {ScoresSender} */\n        this.scoresSender = new ScoresSender();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    checkScoresConfiguration()\n    {\n        if(!this.config){\n            Logger.error('Undefined config on \"IncreaseKillCountOnPlayerDeath\" class.');\n            return false;\n        }\n        if(!this.scoresConfig){\n            Logger.error('Undefined server scores configuration.');\n            return false;\n        }\n    }\n\n    /**\n     * @param {Object} props\n     * @param {string} killType\n     * @returns {Promise<Object|boolean>}\n     */\n    async execute(props, killType)\n    {\n        let attacker = props.attackerPlayer;\n        if(!attacker){\n            // expected when a player has been killed:\n            // Logger.debug('Undefined attacker to increase score on kill.', killType, props?.killPlayerId);\n            return false;\n        }\n        if(!attacker.player_id){\n            // Logger.debug('Attacker is not a player.', attacker.constructor.name, attacker.uid, attacker.key);\n            return false;\n        }\n        if(attacker.player_id === props.killPlayerId){\n            // Logger.debug('Player death does not count as kill for the same player.');\n            return false;\n        }\n        if(!props.killPlayerId && !props.killNpcId){\n            Logger.error('Missing target ID for score counts.', props);\n            return false;\n        }\n        let currentScore = await this.scoresProvider.fetchPlayerScore(attacker.player_id);\n        let isPlayerKill = killType === GameConst.TYPE_PLAYER;\n        let obtainedScore = this.determineObtainedScore(props, isPlayerKill);\n        let newTotalScore = (currentScore?.total_score || 0) + obtainedScore;\n        let scoreData = {\n            player_id: attacker.player_id,\n            total_score: newTotalScore,\n            players_kills_count: (currentScore?.players_kills_count || 0) + (isPlayerKill ? 1 : 0),\n            npcs_kills_count: (currentScore?.npcs_kills_count || 0) + (isPlayerKill ? 0 : 1)\n        };\n        let killTimeFor = isPlayerKill ? 'last_player_kill_time' : 'last_npc_kill_time';\n        scoreData[killTimeFor] = sc.formatDate(new Date());\n        if(currentScore){\n            scoreData.id = currentScore.id;\n        }\n        let scoreSaveResult = await this.scoresUpdater.updatePlayerScores(scoreData, attacker, obtainedScore, props);\n        if(!scoreSaveResult){\n            Logger.error('Score could not be saved.', scoreData);\n            return false;\n        }\n        let sendUpdatesResult = await this.scoresSender.sendUpdates(\n            props.room,\n            attacker,\n            newTotalScore,\n            await this.scoresProvider.fetchTopScoresMappedData(10)\n        );\n        return {scoreSaveResult, sendUpdatesResult};\n    }\n\n    /**\n     * @param {Object} props\n     * @param {boolean} isPlayerKill\n     * @returns {number}\n     */\n    determineObtainedScore(props, isPlayerKill)\n    {\n        if(isPlayerKill){\n            return this.obtainedScorePerPlayer;\n        }\n        if(!this.useNpcCustomScore){\n            return this.obtainedScorePerNpc;\n        }\n        return props.obtainedNpcCustomScore || this.obtainedScorePerNpc;\n    }\n\n}\n\nmodule.exports.IncreaseScoreOnKill = IncreaseScoreOnKill;\n"
  },
  {
    "path": "lib/scores/server/subscriber/send-initial-scores-data.js",
    "content": "/**\n *\n * Reldens - SendInitialScoresData\n *\n * Sends initial scores data to players when they join a room.\n * Includes the player's current score and the top scores leaderboard.\n *\n */\n\nconst { ScoresProvider } = require('../scores-provider');\nconst { ScoresSender } = require('../scores-sender');\n\n/**\n * @typedef {import('../../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('@colyseus/core').Client} Client\n * @typedef {import('../../../users/server/player').Player} Player\n * @typedef {import('../scores-provider').ScoresProvider} ScoresProvider\n * @typedef {import('../scores-sender').ScoresSender} ScoresSender\n */\nclass SendInitialScoresData\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {ScoresProvider} */\n        this.scoresProvider = new ScoresProvider(props);\n        /** @type {ScoresSender} */\n        this.scoresSender = new ScoresSender();\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @param {Client} client\n     * @param {Player} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async execute(room, client, playerSchema)\n    {\n        let score = await this.scoresProvider.fetchPlayerScore(playerSchema.player_id);\n        let scores = await this.scoresProvider.fetchTopScoresMappedData(10);\n        await this.scoresSender.sendUpdates(room, playerSchema, (score?.total_score || '0'), scores);\n        return true;\n    }\n\n}\n\nmodule.exports.SendInitialScoresData = SendInitialScoresData;\n"
  },
  {
    "path": "lib/snippets/client/plugin.js",
    "content": "/**\n *\n * Reldens - Snippets Client Plugin\n *\n * Initializes the client-side snippets system with translations and locale management.\n *\n */\n\nconst { Translator } = require('../translator');\nconst { SnippetsUi } = require('./snippets-ui');\nconst { TemplatesHandler } = require('./templates-handler');\nconst { TranslationsMapper } = require('./translations-mapper');\nconst Translations = require('./snippets/en_US');\nconst { SnippetsConst } = require('../constants');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n *\n * @typedef {Object} SnippetsPluginProps\n * @property {GameManager} gameManager\n * @property {EventsManager} events\n */\nclass SnippetsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {SnippetsPluginProps} props\n     * @returns {Promise<boolean>}\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in InventoryPlugin.');\n            return false;\n        }\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in InventoryPlugin.');\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations);\n        /** @type {string} */\n        this.activeLocale = this.gameManager.initialGameData?.userLocale?.locale.locale || SnippetsConst.DEFAULT_LOCALE;\n        this.gameManager.services.translator = new Translator({\n            snippets: Object.assign({}, this.gameManager.config.client.snippets),\n            dataValues: Object.assign({}, this.gameManager.config.client.snippetsDataValues),\n            locale: SnippetsConst.DEFAULT_LOCALE,\n            activeLocale: this.activeLocale\n        });\n        return this.listenEvents();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        this.events.on('reldens.startEngineScene', async (roomEvents, player, room, previousScene) => {\n            // @TODO - BETA - Test for possible differences.\n            // re-assign the snippets after all the plugins added their own sets (search TranslationsMapper.forConfig)\n            this.gameManager.services.translator.snippets = Object.assign(\n                this.gameManager.services.translator.snippets,\n                this.gameManager.config.client.snippets\n            );\n        });\n        this.events.on('reldens.preloadUiScene', (preloadScene) => {\n            TemplatesHandler.preloadTemplates(preloadScene);\n        });\n        this.events.on('reldens.createUiScene', (preloadScene) => {\n            /** @type {SnippetsUi} */\n            this.uiManager = new SnippetsUi(preloadScene);\n            this.uiManager.createUi();\n        });\n        return true\n    }\n\n}\n\nmodule.exports.SnippetsPlugin = SnippetsPlugin;\n"
  },
  {
    "path": "lib/snippets/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    translator: {\n        title: 'Languages Settings',\n        label: 'Choose your language:',\n        notification: 'Changes will take place after next login.'\n    }\n}\n"
  },
  {
    "path": "lib/snippets/client/snippets-ui.js",
    "content": "/**\n *\n * Reldens - SnippetsUi\n *\n * Manages the user interface for language/locale selection in the settings panel.\n *\n */\n\nconst { SnippetsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('../../game/client/scene-preloader').ScenePreloader} ScenePreloader\n * @typedef {import('../translator').Translator} Translator\n */\nclass SnippetsUi\n{\n\n    /**\n     * @param {ScenePreloader} uiScene\n     */\n    constructor(uiScene)\n    {\n        /** @type {ScenePreloader} */\n        this.uiScene = uiScene;\n        /** @type {GameManager} */\n        this.gameManager = this.uiScene.gameManager;\n        /** @type {Translator} */\n        this.translator = this.gameManager.services.translator;\n        /** @type {Object} */\n        this.locales = {};\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    createUi()\n    {\n        this.locales = sc.get(this.gameManager.config.client, 'locales',  {});\n        let localesKeys = Object.keys(this.locales);\n        // if there's only one locale then don't show the locale selector:\n        if(1 >= localesKeys.length){\n            return false;\n        }\n        let snippetsSettings = this.gameManager.gameEngine.parseTemplate(\n            this.uiScene.cache.html.get(SnippetsConst.KEY),\n            {\n                snippetsTitle: this.translator.t('translator.title'),\n                snippetsLabel: this.translator.t('translator.label'),\n                snippetsNotification: this.translator.t('translator.notification')\n            }\n        );\n        let appendResult = this.gameManager.gameDom.appendToElement('#settings-dynamic', snippetsSettings);\n        if(!appendResult){\n            Logger.warning('Could not append snippets settings.');\n            return false;\n        }\n        let localeSelector = this.gameManager.gameDom.getElement('.snippets-setting');\n        if(!localeSelector){\n            Logger.warning('Snippets settings container not available.');\n            return false;\n        }\n        for(let i of localesKeys){\n            let locale = this.locales[i];\n            let localeOption = this.gameManager.gameDom.createElement('option');\n            localeOption.value = locale.id;\n            localeOption.innerHTML = locale.country_code;\n            localeSelector.appendChild(localeOption);\n        }\n        localeSelector.addEventListener('change', async () => {\n            this.gameManager.activeRoomEvents.send({\n                act: SnippetsConst.ACTIONS.UPDATE,\n                up: localeSelector.value\n            })\n        });\n        return true;\n    }\n\n}\n\nmodule.exports.SnippetsUi = SnippetsUi;\n"
  },
  {
    "path": "lib/snippets/client/templates-handler.js",
    "content": "/**\n *\n * Reldens - TemplatesHandler\n *\n * Handles preloading of snippet-related HTML templates.\n *\n */\n\nconst { SnippetsConst } = require('../constants');\n\n/**\n * @typedef {import('../../game/client/scene-preloader').ScenePreloader} ScenePreloader\n */\nclass TemplatesHandler\n{\n\n    /**\n     * @param {ScenePreloader} preloadScene\n     */\n    static preloadTemplates(preloadScene)\n    {\n        let teamsTemplatePath = '/assets/features/snippets/templates/';\n        preloadScene.load.html(SnippetsConst.KEY, teamsTemplatePath+'ui-snippets.html');\n    }\n\n}\nmodule.exports.TemplatesHandler = TemplatesHandler;\n"
  },
  {
    "path": "lib/snippets/client/translations-mapper.js",
    "content": "/**\n *\n * Reldens - TranslationsMapper\n *\n * Maps nested translation objects into flat key-value pairs with dot notation.\n *\n */\n\nconst { SnippetsConst } = require('../constants');\nconst { sc } = require('@reldens/utils');\n\nclass TranslationsMapper\n{\n\n    /**\n     * @param {Object} config\n     * @param {Object} translations\n     * @param {Object|boolean} dataValues\n     * @param {string} locale\n     */\n    static forConfig(config, translations, dataValues = false, locale = SnippetsConst.DEFAULT_LOCALE)\n    {\n        if(!config.snippets){\n            config.snippets = {};\n        }\n        if(!config.snippets[locale]){\n            config.snippets[locale] = {};\n        }\n        let mappedSnippets = this.fromObject(translations);\n        config.snippets[locale] = sc.deepMergeProperties(mappedSnippets, config.snippets[locale]);\n        if(!dataValues){\n            return;\n        }\n        if(!config.snippetsDataValues){\n            config.snippetsDataValues = {};\n        }\n        let nameSpace = dataValues.NAMESPACE || SnippetsConst.DATA_VALUES_DEFAULT_NAMESPACE;\n        sc.deepMergeProperties(config.snippetsDataValues, {[nameSpace]: dataValues});\n    }\n\n    /**\n     * @param {Object} translations\n     * @returns {Object}\n     */\n    static fromObject(translations)\n    {\n        let keys = Object.keys(translations);\n        if(0 === keys.length){\n            return {};\n        }\n        let mappedTranslations = {};\n        for(let i of keys){\n            this.recursiveMap(i, translations[i], mappedTranslations);\n        }\n        return mappedTranslations;\n    }\n\n    /**\n     * @param {string} key\n     * @param {any} translation\n     * @param {Object} mappedTranslations\n     */\n    static recursiveMap(key, translation, mappedTranslations)\n    {\n        if(!sc.isObject(translation)){\n            mappedTranslations[key] = translation;\n            return;\n        }\n        let nextKeys = Object.keys(translation);\n        if(0 === nextKeys.length){\n            return;\n        }\n        for(let i of nextKeys){\n            this.recursiveMap(key+SnippetsConst.CONCAT_CHARACTER+i, translation[i], mappedTranslations);\n        }\n    }\n\n}\n\nmodule.exports.TranslationsMapper = TranslationsMapper;\n"
  },
  {
    "path": "lib/snippets/constants.js",
    "content": "/**\n *\n * Reldens - snippets/constants\n *\n */\n\nlet pref = 'sn.'\n\nmodule.exports.SnippetsConst = {\n    KEY: 'snippets',\n    DEFAULT_LOCALE: 'en_US',\n    CONCAT_CHARACTER: '.',\n    DATA_VALUES_DEFAULT_NAMESPACE: 'default',\n    ACTIONS: {\n        UPDATE: pref+'Up'\n    }\n};\n"
  },
  {
    "path": "lib/snippets/server/configuration-enricher.js",
    "content": "/**\n *\n * Reldens - ConfigurationEnricher\n *\n * Enriches the server configuration with locales and snippets from the database.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n * @typedef {import('../../game/server/manager').ServerManager} ServerManager\n *\n * @typedef {Object} ConfigurationEnricherProps\n * @property {BaseDriver|boolean} localeRepository\n * @property {BaseDriver|boolean} snippetRepository\n *\n * @typedef {Object} WithLocalesAndSnippetsProps\n * @property {ServerManager} serverManager\n */\nclass ConfigurationEnricher\n{\n\n    /**\n     * @param {ConfigurationEnricherProps} props\n     */\n    constructor(props)\n    {\n        /** @type {BaseDriver|boolean} */\n        this.localeRepository = sc.get(props, 'localeRepository', false);\n        /** @type {BaseDriver|boolean} */\n        this.snippetRepository = sc.get(props, 'snippetRepository', false);\n    }\n\n    /**\n     * @param {WithLocalesAndSnippetsProps} props\n     * @returns {Promise<boolean|void>}\n     */\n    async withLocalesAndSnippets(props)\n    {\n        if(!this.localeRepository){\n            Logger.error('Locale repository undefined on ConfigurationEnricher.');\n            return false;\n        }\n        if(!this.snippetRepository){\n            Logger.error('Snippet repository undefined on ConfigurationEnricher.');\n            return false;\n        }\n        let serverManager = props.serverManager;\n        if(!serverManager){\n            Logger.error('ServerManager undefined on ConfigurationEnricher.');\n            return false;\n        }\n        let locales = await this.localeRepository.loadAll();\n        let snippets = {};\n        for(let locale of locales){\n            snippets[locale.locale] = {};\n            let snippetsModels = await this.snippetRepository.loadBy('locale_id', locale.id);\n            for(let snippet of snippetsModels){\n                snippets[locale.locale][snippet.key] = snippet.value;\n            }\n        }\n        // these will be automatically be sent to the client config:\n        serverManager.configManager.configList.client['locales'] = locales;\n        serverManager.configManager.configList.client['snippets'] = snippets;\n    }\n\n}\n\nmodule.exports.ConfigurationEnricher = ConfigurationEnricher;\n"
  },
  {
    "path": "lib/snippets/server/entities/locale-entity-override.js",
    "content": "/**\n *\n * Reldens - LocaleEntityOverride\n *\n * Overrides the locale entity configuration for the admin panel.\n *\n */\n\nconst { LocaleEntity } = require('../../../../generated-entities/entities/locale-entity');\n\nclass LocaleEntityOverride extends LocaleEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.titleProperty = 'locale';\n        return config;\n    }\n\n}\n\nmodule.exports.LocaleEntityOverride = LocaleEntityOverride;\n"
  },
  {
    "path": "lib/snippets/server/entities/snippets-entity-override.js",
    "content": "/**\n *\n * Reldens - SnippetsEntityOverride\n *\n * Overrides the snippets entity configuration for the admin panel.\n *\n */\n\nconst { SnippetsEntity } = require('../../../../generated-entities/entities/snippets-entity');\n\nclass SnippetsEntityOverride extends SnippetsEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 1300;\n        return config;\n    }\n\n}\n\nmodule.exports.SnippetsEntityOverride = SnippetsEntityOverride;\n"
  },
  {
    "path": "lib/snippets/server/entities/users-locale-entity-override.js",
    "content": "/**\n *\n * Reldens - UsersLocaleEntityOverride\n *\n * Overrides the users locale entity configuration for the admin panel.\n *\n */\n\nconst { UsersLocaleEntity } = require('../../../../generated-entities/entities/users-locale-entity');\n\nclass UsersLocaleEntityOverride extends UsersLocaleEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 820;\n        return config;\n    }\n\n}\n\nmodule.exports.UsersLocaleEntityOverride = UsersLocaleEntityOverride;\n"
  },
  {
    "path": "lib/snippets/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { LocaleEntityOverride } = require('./entities/locale-entity-override');\nconst { SnippetsEntityOverride } = require('./entities/snippets-entity-override');\nconst { UsersLocaleEntityOverride } = require('./entities/users-locale-entity-override');\n\nmodule.exports.entitiesConfig = {\n    locale: LocaleEntityOverride,\n    snippets: SnippetsEntityOverride,\n    usersLocale: UsersLocaleEntityOverride\n};\n"
  },
  {
    "path": "lib/snippets/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        snippet: 'Snippets',\n        locale: 'Locales'\n    }\n};\n"
  },
  {
    "path": "lib/snippets/server/initial-game-data-enricher.js",
    "content": "/**\n *\n * Reldens - InitialGameDataEnricher\n *\n * Enriches the initial game data with user locale information.\n *\n */\n\n/**\n * @typedef {import('@colyseus/core').Client} Client\n */\nclass InitialGameDataEnricher\n{\n\n    /**\n     * @param {Object} superInitialGameData\n     * @param {Object} roomGame\n     * @param {Client} client\n     * @param {Object} userModel\n     * @returns {Promise<boolean|void>}\n     */\n    static async withLocale(superInitialGameData, roomGame, client, userModel)\n    {\n        let eventData = {superInitialGameData, roomGame, client, userModel};\n        let startEvent = Object.assign({continueProcess: true}, eventData);\n        roomGame.events.emit('reldens.beforeEnrichUserWithLocale', startEvent);\n        if(!startEvent.continueProcess){\n            return false;\n        }\n        let userLocale = await roomGame.dataServer.getEntity('usersLocale').loadOneByWithRelations(\n            'user_id',\n            userModel.id,\n            ['related_locale']\n        );\n        if(!userLocale?.locale){\n            return true;\n        }\n        superInitialGameData.userLocale = userLocale.locale;\n        roomGame.events.emit('reldens.afterEnrichPlayerWithLocale', eventData);\n    }\n\n}\n\nmodule.exports.InitialGameDataEnricher = InitialGameDataEnricher;\n"
  },
  {
    "path": "lib/snippets/server/plugin.js",
    "content": "/**\n *\n * Reldens - SnippetsPlugin\n *\n * Initializes the server-side snippets system with database-driven locale and snippet loading.\n *\n */\n\nconst { InitialGameDataEnricher } = require('./initial-game-data-enricher');\nconst { ConfigurationEnricher } = require('./configuration-enricher');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('./configuration-enricher').ConfigurationEnricher} ConfigurationEnricher\n *\n * @typedef {Object} SnippetsPluginProps\n * @property {EventsManager} events\n * @property {BaseDataServer} dataServer\n */\nclass SnippetsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {SnippetsPluginProps} props\n     * @returns {Promise<boolean>}\n     */\n    async setup(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in ChatPlugin.');\n            return false;\n        }\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in ChatPlugin.');\n            return false;\n        }\n        /** @type {ConfigurationEnricher} */\n        this.configurationEnricher = new ConfigurationEnricher({\n            localeRepository: this.dataServer.getEntity('locale'),\n            snippetRepository: this.dataServer.getEntity('snippets'),\n        });\n        this.events.on('reldens.serverBeforeListen', async (event) => {\n            await this.configurationEnricher.withLocalesAndSnippets(event);\n        });\n        this.events.on(\n            'reldens.beforeSuperInitialGameData',\n            async (superInitialGameData, roomGame, client, userModel) => {\n                await InitialGameDataEnricher.withLocale(superInitialGameData, roomGame, client, userModel);\n            }\n        );\n        return true;\n    }\n\n}\n\nmodule.exports.SnippetsPlugin = SnippetsPlugin;\n"
  },
  {
    "path": "lib/snippets/translator.js",
    "content": "/**\n *\n * Reldens - Translator\n *\n * Handles translation of snippet keys into localized strings with parameter replacement.\n *\n */\n\nconst { SnippetsConst } = require('./constants');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} TranslatorProps\n * @property {Object<string, Object<string, string>>} snippets\n * @property {Object<string, Object<string, string>>} dataValues\n * @property {string} locale\n * @property {string} activeLocale\n */\nclass Translator\n{\n\n    /**\n     * @param {TranslatorProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Object<string, Object<string, string>>} */\n        this.snippets = sc.get(props, 'snippets', {});\n        /** @type {Object<string, Object<string, string>>} */\n        this.dataValues = sc.get(props, 'dataValues', {});\n        /** @type {string} */\n        this.locale = sc.get(props, 'locale', SnippetsConst.DEFAULT_LOCALE);\n        /** @type {string} */\n        this.activeLocale = sc.get(props, 'activeLocale', SnippetsConst.DEFAULT_LOCALE);\n    }\n\n    /**\n     * @param {string} snippetKey\n     * @param {Object<string, any>} params\n     * @param {string|boolean} activeLocale\n     * @returns {string}\n     */\n    translate(snippetKey, params = {}, activeLocale = false)\n    {\n        if(!activeLocale){\n            activeLocale = this.activeLocale;\n        }\n        let currentSnippet = sc.get(this.snippets[activeLocale], snippetKey, snippetKey);\n        if(snippetKey === currentSnippet){\n            return snippetKey;\n        }\n        if(!sc.isObject(params)){\n            return currentSnippet;\n        }\n        let paramsKeys = Object.keys(params);\n        if(0 === paramsKeys.length){\n            return currentSnippet;\n        }\n        let nameSpace = this.snippetNameSpace(snippetKey);\n        for(let i of paramsKeys){\n            let param = params[i];\n            let replaceKey = '%'+((this.dataValues[nameSpace] || {})[i] || i);\n            while(-1 !== currentSnippet.indexOf(replaceKey)){\n                currentSnippet = currentSnippet.replace(replaceKey, param);\n            }\n        }\n        return currentSnippet;\n    }\n\n    /**\n     * @param {string} snippetKey\n     * @returns {string}\n     */\n    snippetNameSpace(snippetKey)\n    {\n        let keys = snippetKey.split('.');\n        if(1 === keys.length){\n            return SnippetsConst.DATA_VALUES_DEFAULT_NAMESPACE;\n        }\n        return keys[0];\n    }\n\n    /**\n     * @param {string} snippetKey\n     * @param {Object<string, any>} params\n     * @param {string|boolean} activeLocale\n     * @returns {string}\n     */\n    t(snippetKey, params = {}, activeLocale = false)\n    {\n        return this.translate(snippetKey, params, activeLocale);\n    }\n\n}\n\nmodule.exports.Translator = Translator;\n"
  },
  {
    "path": "lib/teams/client/clan-message-handler.js",
    "content": "/**\n *\n * Reldens - ClanMessageHandler\n *\n * Handles clan-related messages on the client side, managing the clan UI creation and updates.\n * Creates and updates the clan interface including clan members, invites, and clan management actions.\n *\n */\n\nconst { UserInterface } = require('../../game/client/user-interface');\nconst { TeamsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('../../game/client/game-dom').GameDom} GameDom\n * @typedef {import('../../game/client/scene-preloader').ScenePreloader} ScenePreloader\n *\n * @typedef {Object} ClanMessageHandlerProps\n * @property {RoomEvents} roomEvents\n * @property {Object} message\n */\nclass ClanMessageHandler\n{\n\n    /**\n     * @param {ClanMessageHandlerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {RoomEvents|boolean} */\n        this.roomEvents = sc.get(props, 'roomEvents', false);\n        /** @type {Object|boolean} */\n        this.message = sc.get(props, 'message', false);\n        /** @type {GameManager|undefined} */\n        this.gameManager = this.roomEvents?.gameManager;\n        /** @type {GameDom|undefined} */\n        this.gameDom = this.gameManager?.gameDom;\n        /** @type {ScenePreloader|undefined} */\n        this.uiScene = this.gameManager?.gameEngine?.uiScene;\n    }\n\n    /**\n     * @returns {number|boolean}\n     */\n    validate()\n    {\n        if(!this.roomEvents){\n            Logger.info('Missing RoomEvents on ClanMessageHandler.');\n            return false;\n        }\n        if(!this.message){\n            Logger.info('Missing message on ClanMessageHandler.');\n            return false;\n        }\n        if(!this.gameManager){\n            Logger.info('Missing GameManager on ClanMessageHandler.');\n            return false;\n        }\n        if(!this.uiScene){\n            // @NOTE: the message could arrive before the uiScene gets ready.\n            // Logger.info('Missing UI Scene on ClanMessageHandler.');\n            return false;\n        }\n        return this.gameManager.playerData?.id;\n\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    initializeClanUi()\n    {\n        this.uiScene.currentClan = false;\n        let clanUi = this.createClanUi();\n        let title = this.gameManager.config.getWithoutLogs(\n            'client/clan/labels/createClanTitle',\n            TeamsConst.LABELS.CLAN.CREATE_CLAN_TITLE\n        );\n        let container = this.gameManager.gameDom.getElement('.clan-dialog-box .box-content');\n        if(!container){\n            Logger.error('Missing container: \"#box-clan .box-content\".');\n            return false;\n        }\n        let uiBox = this.uiScene.elementsUi[TeamsConst.CLAN_KEY];\n        if(!uiBox){\n            Logger.error('Clan UI box not found.', {clanUi, container, uiBox});\n            return false;\n        }\n        this.roomEvents.uiSetTitle(uiBox, {title});\n        this.roomEvents.uiSetContent(uiBox, {content: this.createClanContent()}, this.uiScene);\n        this.activateCreateButton();\n        this.addAndRemoveCaptureKeys();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    showNewClan()\n    {\n        let clanUi = this.createClanUi();\n        let title = this.gameManager.config.getWithoutLogs(\n            'client/clan/labels/clanTitle',\n            TeamsConst.LABELS.CLAN.CLAN_TITLE\n        ).replace('%clanName', this.message.clanName)\n        .replace('%leaderName', this.gameManager.currentPlayerName());\n        let container = this.gameManager.gameDom.getElement('.clan-dialog-box .box-content');\n        if(!container){\n            Logger.error('Missing container: \".clan-dialog-box .box-content\".');\n            return false;\n        }\n        let uiBox = this.uiScene.elementsUi[TeamsConst.CLAN_KEY];\n        if(!uiBox){\n            Logger.error('Clan UI box not found.', {clanUi, container, uiBox});\n            return false;\n        }\n        this.roomEvents.uiSetTitle(uiBox, {title});\n        this.roomEvents.uiSetContent(uiBox, {content: ''}, this.uiScene);\n        this.updateClanBox(container);\n        this.setClanFromMessage();\n    }\n\n    showClanRequest()\n    {\n        this.createClanUi();\n        this.roomEvents.initUi({\n            id: TeamsConst.CLAN_KEY,\n            title: this.gameManager.config.getWithoutLogs(\n                'client/clan/labels/requestFromTitle',\n                TeamsConst.LABELS.CLAN.REQUEST_FROM\n            ),\n            content: this.message.from,\n            options: this.gameManager.config.get('client/ui/options/acceptOrDecline'),\n            overrideSendOptions: {act: TeamsConst.ACTIONS.CLAN_ACCEPTED, id: this.message.id}\n        });\n        this.gameDom.getElement('#opt-2-clan')?.addEventListener('click', () => {\n            this.initializeClanUi();\n        });\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    showClanBox()\n    {\n        this.createClanUi();\n        let title = this.gameManager.config.getWithoutLogs(\n            'client/clan/labels/clanTitle',\n            TeamsConst.LABELS.CLAN.CLAN_TITLE\n        )\n            .replace('%clanName', this.message.clanName)\n            .replace('%leaderName', this.message.leaderName);\n        let container = this.gameManager.gameDom.getElement('#box-clan .box-content');\n        if(!container){\n            Logger.error('Missing container: \"#box-clan .box-content\".');\n            return false;\n        }\n        let uiBox = this.uiScene.elementsUi[TeamsConst.CLAN_KEY];\n        this.roomEvents.uiSetTitle(uiBox, {title});\n        this.roomEvents.uiSetContent(uiBox, {content: ''}, this.uiScene);\n        this.setClanFromMessage();\n        this.updateClanBox(container);\n    }\n\n    setClanFromMessage()\n    {\n        let players = sc.get(this.message, 'players', false);\n        let members = sc.get(this.message, 'members', false);\n        this.uiScene.currentClan = {\n            id: this.message.id,\n            name: this.message.clanName,\n            leader: this.message.leaderName,\n            ownerId: this.message.ownerId,\n            players,\n            members\n        };\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    removeClanUi()\n    {\n        let uiElement = this.gameManager.getUiElement(TeamsConst.CLAN_KEY);\n        if(!uiElement){\n            Logger.error('Clan UI Element not found for remove.');\n            return false;\n        }\n        uiElement.removeElement();\n        delete this.uiScene.userInterfaces[TeamsConst.CLAN_KEY];\n        delete this.uiScene.elementsUi[TeamsConst.CLAN_KEY];\n    }\n\n    /**\n     * @returns {UserInterface}\n     */\n    createClanUi()\n    {\n        let clanUi = sc.get(this.uiScene.userInterfaces, TeamsConst.CLAN_KEY);\n        if(clanUi){\n            return clanUi;\n        }\n        if(!this.uiScene.userInterfaces){\n            this.uiScene.userInterfaces = {};\n        }\n        this.uiScene.userInterfaces[TeamsConst.CLAN_KEY] = new UserInterface(\n            this.gameManager,\n            {id: TeamsConst.CLAN_KEY, type: TeamsConst.CLAN_KEY, defaultOpen: true, defaultClose: true},\n            '/assets/features/teams/templates/ui-clan.html',\n            TeamsConst.CLAN_KEY\n        );\n        this.uiScene.userInterfaces[TeamsConst.CLAN_KEY].createUiElement(this.uiScene, TeamsConst.CLAN_KEY);\n        return this.uiScene.userInterfaces[TeamsConst.CLAN_KEY];\n    }\n\n    /**\n     * @returns {string}\n     */\n    createClanContent()\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let templateContent = this.uiScene.cache.html.get('clanCreate');\n        if(!templateContent){\n            Logger.error('Missing template \"clanCreate\".');\n            return '';\n        }\n        let templateParams = {\n            playerId: this.gameManager.playerData.id.toString(),\n            createLabel: this.gameManager.config.getWithoutLogs(\n                'client/clan/labels/createLabel',\n                TeamsConst.LABELS.CLAN.CREATE\n            ),\n            clanNamePlaceholder: this.gameManager.config.getWithoutLogs(\n                'client/clan/labels/namePlaceholder',\n                TeamsConst.LABELS.CLAN.NAME_PLACEHOLDER\n            )\n        };\n        return this.gameManager.gameEngine.parseTemplate(templateContent, templateParams);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    activateCreateButton()\n    {\n        let createButton = this.gameManager.gameDom.getElement('.clan-dialog-box .submit-clan-create');\n        if(!createButton){\n            Logger.warning('Clan create button not found by \".clan-dialog-box .clan-create\".');\n            return false;\n        }\n        let nameInput = this.gameManager.gameDom.getElement('.clan-dialog-box .clan-name-input');\n        if(!nameInput){\n            Logger.warning('Clan create button not found by \".clan-dialog-box .clan-name-input\".');\n            return false;\n        }\n        createButton.addEventListener('click', () => {\n            if(0 === nameInput.value.length){\n                return false;\n            }\n            this.gameManager.gameDom.updateContent(\n                '.clan-dialog-box .box-content',\n                this.uiScene.cache.html.get('uiLoading')\n            );\n            this.gameManager.activeRoomEvents.send({\n                act: TeamsConst.ACTIONS.CLAN_CREATE,\n                [TeamsConst.ACTIONS.CLAN_NAME]: nameInput.value\n            });\n        });\n    }\n\n    /**\n     * @param {HTMLElement} container\n     */\n    updateClanBox(container)\n    {\n        let players = sc.get(this.message, 'players', []);\n        let connectedPlayersKeys = Object.keys(players);\n        let clanPlayers = 0 === connectedPlayersKeys.length ? this.gameManager.config.getWithoutLogs(\n            'client/clan/labels/noneConnected',\n            TeamsConst.LABELS.CLAN.NONE_CONNECTED\n        ) : '';\n        for(let i of connectedPlayersKeys){\n            clanPlayers += this.createClanPlayerBox(players[i]);\n        }\n        let isPlayerOwner = this.gameManager.playerData.id.toString() === this.message.ownerId.toString();\n        let members = sc.get(this.message, 'members', []);\n        let clanMembers = '';\n        for(let i of Object.keys(members)){\n            clanMembers += this.createClanMemberBox(members[i], isPlayerOwner);\n        }\n        container.innerHTML = this.createClanContainer(clanPlayers, clanMembers);\n        this.activateClanPlayersActions(players);\n        this.activateClanMembersActions(members);\n        this.activateClanLeaveButtonAction();\n    }\n\n    addAndRemoveCaptureKeys()\n    {\n        let dynamicScene = this.gameManager.getActiveScene();\n        let keys = dynamicScene.availableControllersKeyCodes();\n        let inputElement = this.gameManager.gameDom.getElement('.clan-name-input');\n        dynamicScene.addAndRemoveCapture(keys, inputElement);\n    }\n\n    /**\n     * @param {string} clanPlayers\n     * @param {string} clanMembers\n     * @returns {string}\n     */\n    createClanContainer(clanPlayers, clanMembers)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let templateContent = this.uiScene.cache.html.get('clanContainer');\n        if(!templateContent){\n            Logger.error('Missing template \"clanContainer\".');\n            return '';\n        }\n        let isPlayerOwner = this.gameManager.playerData.id.toString() === this.message.ownerId.toString();\n        let leaveActionLabel = isPlayerOwner\n            ? this.gameManager.config.getWithoutLogs('client/clan/labels/disbandLabel', TeamsConst.LABELS.CLAN.DISBAND)\n            : this.gameManager.config.getWithoutLogs('client/clan/labels/leaveLabel', TeamsConst.LABELS.CLAN.LEAVE);\n        let templateParams = {\n            clanId: this.message.id,\n            playerId: this.gameManager.playerData.id.toString(),\n            leaveActionLabel: leaveActionLabel,\n            clanPlayersTitle: this.gameManager.config.getWithoutLogs(\n                'client/clan/labels/clanPlayersTitle',\n                TeamsConst.LABELS.CLAN.PLAYERS_TITLE\n            ),\n            clanPlayers,\n            clanMembersTitle: this.gameManager.config.getWithoutLogs(\n                'client/clan/labels/clanMembersTitle',\n                TeamsConst.LABELS.CLAN.MEMBERS_TITLE\n            ),\n            clanMembers\n        };\n        return this.gameManager.gameEngine.parseTemplate(templateContent, templateParams);\n    }\n\n    activateClanLeaveButtonAction()\n    {\n        let leaveButton = this.gameManager.gameDom.getElement('.leave-'+this.message.id);\n        leaveButton?.addEventListener('click', () => {\n            let sendData = {\n                act: TeamsConst.ACTIONS.CLAN_LEAVE,\n                id: this.message.id\n            };\n            this.gameManager.activeRoomEvents.send(sendData);\n        });\n    }\n\n    /**\n     * @param {Object} playerData\n     * @returns {string}\n     */\n    createClanPlayerBox(playerData)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let templateContent = this.uiScene.cache.html.get('clanPlayerData');\n        if(!templateContent){\n            Logger.error('Missing template \"clanPlayerData\".');\n            return '';\n        }\n        return this.gameManager.gameEngine.parseTemplate(templateContent, {\n            playerId: playerData.player_id,\n            playerName: playerData.name,\n            playerProperties: this.createSharedPropertiesContent(playerData.sharedProperties),\n        });\n    }\n\n    /**\n     * @param {Object} playerData\n     * @param {boolean} isPlayerOwner\n     * @returns {string}\n     */\n    createClanMemberBox(playerData, isPlayerOwner)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let templateContent = this.uiScene.cache.html.get('clanMemberData');\n        if(!templateContent){\n            Logger.error('Missing template \"clanMemberData\".');\n            return '';\n        }\n        let showPlayerRemove = playerData.id.toString() !== this.message.ownerId.toString();\n        return this.gameManager.gameEngine.parseTemplate(templateContent, {\n            playerId: playerData.id.toString(),\n            playerName: playerData.name,\n            clanRemove: isPlayerOwner && showPlayerRemove ? this.createDismissPlayerButton(playerData) : ''\n        });\n    }\n\n    /**\n     * @param {Object} playerData\n     * @returns {string}\n     */\n    createDismissPlayerButton(playerData)\n    {\n        let templateContent = this.uiScene.cache.html.get('clanRemove');\n        if(!templateContent){\n            Logger.error('Missing template \"clanRemove\".');\n            return '';\n        }\n        return this.gameManager.gameEngine.parseTemplate(templateContent, {playerId: playerData.id.toString()});\n    }\n\n    /**\n     * @param {Object} playerSharedProperties\n     * @returns {string}\n     */\n    createSharedPropertiesContent(playerSharedProperties)\n    {\n        let templateContent = this.uiScene.cache.html.get('teamsSharedProperty');\n        if(!templateContent){\n            Logger.error('Missing template \"teamsSharedProperty\".');\n            return '';\n        }\n        let sharedPropertiesContent = '';\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        for(let i of Object.keys(playerSharedProperties)){\n            templateContent = this.uiScene.cache.html.get('teamsSharedProperty');\n            let propertyData = playerSharedProperties[i];\n            let propertyMaxValue = sc.get(propertyData, 'max', '');\n            if('' !== propertyMaxValue){\n                propertyMaxValue = this.gameManager.config.getWithoutLogs(\n                    'client/clan/labels/propertyMaxValue',\n                    TeamsConst.LABELS.CLAN.PROPERTY_MAX_VALUE\n                ).replace('%propertyMaxValue', propertyMaxValue);\n            }\n            sharedPropertiesContent += this.gameManager.gameEngine.parseTemplate(templateContent, {\n                key: i,\n                label: propertyData.label,\n                value: propertyData.value,\n                max: propertyMaxValue\n            });\n        }\n        return sharedPropertiesContent;\n    }\n\n    /**\n     * @param {Object} playersData\n     */\n    activateClanPlayersActions(playersData)\n    {\n        for(let i of Object.keys(playersData)){\n            let playerData = playersData[i];\n            let selectorPlayerName = '.clan-player-'+i+' .player-name';\n            let selectorPlayerProperties = '.clan-player-'+i+' .properties-list-container';\n            let playerNameElement = this.gameDom.getElement(selectorPlayerName);\n            if(!playerNameElement){\n                Logger.notice('Player name element not found.', selectorPlayerName);\n            }\n            playerNameElement?.addEventListener('click', () => {\n                this.gameManager.getCurrentPlayer().setTargetPlayerById(playerData.sessionId);\n            });\n            let playerPropertiesElement = this.gameDom.getElement(selectorPlayerProperties);\n            if(!playerNameElement){\n                Logger.notice('Player properties element not found.', selectorPlayerProperties);\n            }\n            playerPropertiesElement?.addEventListener('click', () => {\n                this.gameManager.getCurrentPlayer().setTargetPlayerById(playerData.sessionId);\n            });\n        }\n    }\n\n    /**\n     * @param {Object} membersData\n     */\n    activateClanMembersActions(membersData)\n    {\n        for(let i of Object.keys(membersData)){\n            let memberData = membersData[i];\n            let selectorPlayerRemove = '.clan-member-' + memberData.id + ' .clan-remove-button';\n            this.gameDom.getElement(selectorPlayerRemove)?.addEventListener('click', () => {\n                this.gameManager.activeRoomEvents.send({\n                    act: TeamsConst.ACTIONS.CLAN_REMOVE,\n                    id: this.message.id,\n                    remove: memberData.id\n                });\n            });\n        }\n    }\n\n}\n\nmodule.exports.ClanMessageHandler = ClanMessageHandler;\n"
  },
  {
    "path": "lib/teams/client/clan-message-listener.js",
    "content": "/**\n *\n * Reldens - ClanMessageListener\n *\n * Listens for clan-related messages from the server and delegates handling to the appropriate handler.\n * Queues messages if the UI is not ready yet.\n *\n */\n\nconst { ClanMessageHandler } = require('./clan-message-handler');\nconst { TeamsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass ClanMessageListener\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async executeClientMessageActions(props)\n    {\n        let message = sc.get(props, 'message', false);\n        if(!message){\n            Logger.error('Missing message data on ClanMessageListener.', props);\n            return false;\n        }\n        let roomEvents = sc.get(props, 'roomEvents', false);\n        if(!roomEvents){\n            Logger.error('Missing RoomEvents on ClanMessageListener.', props);\n            return false;\n        }\n        let clanMessageHandler = new ClanMessageHandler({roomEvents, message});\n        if(!clanMessageHandler.validate()){\n            if(this.isClanMessage(message)){\n                if(!roomEvents.clanMessagesQueue){\n                    roomEvents.clanMessagesQueue = [];\n                }\n                roomEvents.clanMessagesQueue.push(message);\n            }\n            return false;\n        }\n        if(!this.isClanMessage(message)){\n            return false;\n        }\n        return this.handleClanMessage(message, clanMessageHandler);\n    }\n\n    /**\n     * @param {Object} message\n     * @param {ClanMessageHandler} clanMessageHandler\n     * @returns {boolean}\n     */\n    handleClanMessage(message, clanMessageHandler)\n    {\n        if(TeamsConst.ACTIONS.CLAN_INITIALIZE === message.act){\n            return clanMessageHandler.initializeClanUi();\n        }\n        if(TeamsConst.ACTIONS.CLAN_CREATE === message.act){\n            if(TeamsConst.VALIDATION.SUCCESS === message.result){\n                return clanMessageHandler.showNewClan();\n            }\n            return clanMessageHandler.initializeClanUi();\n        }\n        if(TeamsConst.ACTIONS.CLAN_INVITE === message.act){\n            return clanMessageHandler.showClanRequest();\n        }\n        if(TeamsConst.ACTIONS.CLAN_UPDATE === message.act){\n            return clanMessageHandler.showClanBox();\n        }\n        if(TeamsConst.ACTIONS.CLAN_LEFT === message.act){\n            return clanMessageHandler.removeClanUi();\n        }\n        if(TeamsConst.ACTIONS.CLAN_REMOVED){\n            clanMessageHandler.removeClanUi();\n            return clanMessageHandler.initializeClanUi();\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {boolean}\n     */\n    isClanMessage(message)\n    {\n        return 0 === message.act?.indexOf(TeamsConst.CLAN_PREF);\n    }\n\n}\n\nmodule.exports.ClanMessageListener = ClanMessageListener;\n"
  },
  {
    "path": "lib/teams/client/messages-processor.js",
    "content": "/**\n *\n * Reldens - MessagesProcessor\n *\n * Processes queued team and clan messages when the UI scene becomes ready.\n *\n */\n\nconst { ClanMessageHandler } = require('./clan-message-handler');\nconst { TeamMessageHandler } = require('./team-message-handler');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('./clan-message-listener').ClanMessageListener} ClanMessageListener\n * @typedef {import('./team-message-listener').TeamMessageListener} TeamMessageListener\n */\nclass MessagesProcessor\n{\n\n    /**\n     * @param {RoomEvents} roomEvents\n     * @param {ClanMessageListener} clanMessageListener\n     */\n    static processClanMessagesQueue(roomEvents, clanMessageListener)\n    {\n        if(!sc.isArray(roomEvents.clanMessagesQueue)){\n            return;\n        }\n        if(0 === roomEvents.clanMessagesQueue.length){\n            return;\n        }\n        for(let message of roomEvents.clanMessagesQueue){\n            clanMessageListener.handleClanMessage(message, new ClanMessageHandler({roomEvents, message}));\n        }\n        roomEvents.clanMessagesQueue = [];\n    }\n\n    /**\n     * @param {RoomEvents} roomEvents\n     * @param {TeamMessageListener} teamMessageListener\n     */\n    static processTeamMessagesQueue(roomEvents, teamMessageListener)\n    {\n        if(!sc.isArray(roomEvents.teamMessagesQueue)){\n            return;\n        }\n        if(0 === roomEvents.teamMessagesQueue.length){\n            return;\n        }\n        for(let message of roomEvents.teamMessagesQueue){\n            teamMessageListener.handleTeamMessage(message, new TeamMessageHandler({roomEvents, message}));\n        }\n        roomEvents.teamMessagesQueue = [];\n    }\n\n}\n\nmodule.exports.MessageProcessor = MessagesProcessor;\n"
  },
  {
    "path": "lib/teams/client/plugin.js",
    "content": "/**\n *\n * Reldens - Teams Client Plugin\n *\n */\n\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { TargetBoxEnricher } = require('./target-box-enricher');\nconst { TeamMessageListener } = require('./team-message-listener');\nconst { ClanMessageListener } = require('./clan-message-listener');\nconst { MessageProcessor } = require('./messages-processor');\nconst { TemplatesHandler } = require('./templates-handler');\nconst { TeamsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('./team-message-listener').TeamMessageListener} TeamMessageListener\n * @typedef {import('./clan-message-listener').ClanMessageListener} ClanMessageListener\n */\nclass TeamsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in TeamsPlugin.');\n            return false;\n        }\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in TeamsPlugin.');\n            return false;\n        }\n        /** @type {TeamMessageListener} */\n        this.teamMessageListener = new TeamMessageListener();\n        /** @type {ClanMessageListener} */\n        this.clanMessageListener = new ClanMessageListener();\n        this.listenEvents();\n        // @TODO - BETA - Standardize, listeners on config or added by events like:\n        // this.events.on('reldens.activateRoom', (room) => {\n        //     room.onMessage('*', (message) => {\n        //         this.messagesHandler.processOrQueueMessage(message);\n        //     });\n        // });\n        this.listenMessages();\n        return true;\n    }\n\n    listenMessages()\n    {\n        if(!this.gameManager || !this.events){\n            return;\n        }\n        this.gameManager.config.client.message.listeners[TeamsConst.KEY] = this.teamMessageListener;\n        this.gameManager.config.client.message.listeners[TeamsConst.CLAN_KEY] = this.clanMessageListener;\n    }\n\n    listenEvents()\n    {\n        if(!this.events){\n            return;\n        }\n        this.events.on('reldens.createEngineSceneDone', (event) => {\n            let roomEvents = event.roomEvents;\n            if(!roomEvents){\n                Logger.critical('RoomEvents undefined for process Team messages queue on TeamsPlugin.', event);\n                return false;\n            }\n            MessageProcessor.processClanMessagesQueue(roomEvents, this.clanMessageListener);\n            MessageProcessor.processTeamMessagesQueue(roomEvents, this.teamMessageListener);\n        });\n        this.events.on('reldens.preloadUiScene', (preloadScene) => {\n            TemplatesHandler.preloadTemplates(preloadScene);\n        });\n        this.events.on('reldens.gameEngineShowTarget', (gameEngine, target, previousTarget, targetName) => {\n            TargetBoxEnricher.appendClanInviteButton(this.gameManager, target, previousTarget, targetName);\n            TargetBoxEnricher.appendTeamInviteButton(this.gameManager, target, previousTarget, targetName);\n        });\n    }\n\n    /**\n     * @param {string} sessionId\n     * @returns {Object|boolean}\n     */\n    fetchTeamPlayerBySessionId(sessionId)\n    {\n        let currentTeam = this.gameManager.gameEngine.uiScene.currentTeam;\n        if(!currentTeam){\n            return false;\n        }\n        for(let i of Object.keys(currentTeam)){\n            let teamPlayer = currentTeam[i];\n            if(teamPlayer.sessionId === sessionId){\n                return teamPlayer;\n            }\n        }\n        return false;\n    }\n\n}\n\nmodule.exports.TeamsPlugin = TeamsPlugin;\n"
  },
  {
    "path": "lib/teams/client/target-box-enricher.js",
    "content": "/**\n *\n * Reldens - TargetBoxEnricher\n *\n * Enriches the target box with team and clan invite buttons when appropriate.\n *\n */\n\nconst { TeamsConst } = require('../constants');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass TargetBoxEnricher\n{\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {Object} target\n     * @param {Object} previousTarget\n     * @param {string} targetName\n     * @returns {boolean}\n     */\n    static appendClanInviteButton(gameManager, target, previousTarget, targetName)\n    {\n        let currentClan = gameManager?.gameEngine?.uiScene?.currentClan;\n        if(!currentClan){\n            // the current player has none clan:\n            return false;\n        }\n        if(!currentClan.ownerId){\n            Logger.error('Current clan missing owner.', currentClan);\n            return false;\n        }\n        if(this.playerBySessionId(currentClan, target.id)){\n            // target player is already on the clan:\n            return false;\n        }\n        let currentPlayer = gameManager.getCurrentPlayer();\n        if(!this.targetIsValidPlayer(target, currentPlayer)){\n            // target is not the current player\n            return false;\n        }\n        let isOpenInvites = gameManager.config.getWithoutLogs('client/clan/general/openInvites', false);\n        if(gameManager.playerData.id.toString() !== currentClan.ownerId.toString() && !isOpenInvites){\n            // only clan owner can invite:\n            return false;\n        }\n        return this.appendInviteButton('clan', target, gameManager, targetName);\n    }\n\n    /**\n     * @param {GameManager} gameManager\n     * @param {Object} target\n     * @param {Object} previousTarget\n     * @param {string} targetName\n     * @returns {boolean}\n     */\n    static appendTeamInviteButton(gameManager, target, previousTarget, targetName)\n    {\n        if(!this.targetIsValidPlayer(target, gameManager.getCurrentPlayer())){\n            return false;\n        }\n        if(gameManager.getFeature('teams').fetchTeamPlayerBySessionId(target.id)){\n            return false;\n        }\n        return this.appendInviteButton('team', target, gameManager, targetName);\n    }\n\n    /**\n     * @param {string} type\n     * @param {Object} target\n     * @param {GameManager} gameManager\n     * @param {string} targetName\n     * @returns {boolean}\n     */\n    static appendInviteButton(type, target, gameManager, targetName)\n    {\n        let uiScene = gameManager.gameEngine.uiScene;\n        let uiTarget = sc.get(uiScene, 'uiTarget', false);\n        if(false === uiTarget){\n            Logger.critical('Missing \"uiTarget\" on uiScene.');\n            return false;\n        }\n        let teamPlayerActionsTemplate = uiScene.cache.html.get(type+'PlayerInvite');\n        if(!teamPlayerActionsTemplate){\n            Logger.critical('Template \"'+type+'PlayerInvite\" not found.');\n            return false;\n        }\n        gameManager.gameDom.appendToElement(\n            '#target-container',\n            gameManager.gameEngine.parseTemplate(\n                teamPlayerActionsTemplate,\n                {\n                    // @TODO - BETA - Create translations table with a loader and processor.\n                    playerName: targetName,\n                    playerId: target.player_id,\n                    inviteLabel: gameManager.config.getWithoutLogs(\n                        type+'/labels/inviteLabel',\n                        TeamsConst.LABELS[type.toUpperCase()].INVITE_BUTTON_LABEL\n                    )\n                }\n            )\n        );\n        let inviteButton = gameManager.gameDom.getElement('.'+type+'-invite-' + target.player_id + ' button');\n        inviteButton?.addEventListener('click', () => {\n            let sendInvite = {act: TeamsConst.ACTIONS[type.toUpperCase()+'_INVITE'], id: target.player_id};\n            gameManager.activeRoomEvents.send(sendInvite);\n            inviteButton.style.display = 'none';\n            gameManager.gameEngine.clearTarget();\n        });\n    }\n\n    /**\n     * @param {Object} target\n     * @param {Object} currentPlayer\n     * @returns {boolean}\n     */\n    static targetIsValidPlayer(target, currentPlayer)\n    {\n        return GameConst.TYPE_PLAYER === target.type && currentPlayer.playerId !== target.id;\n    }\n\n    /**\n     * @param {Object} currentClan\n     * @param {string} targetId\n     * @returns {Object|boolean}\n     */\n    static playerBySessionId(currentClan, targetId)\n    {\n        let playersKeys = Object.keys(currentClan.players);\n        if(0 === playersKeys.length){\n            return false;\n        }\n        for(let i of playersKeys){\n            if(currentClan.players[i].sessionId === targetId){\n                return currentClan.players[i];\n            }\n        }\n        return false;\n    }\n\n}\n\nmodule.exports.TargetBoxEnricher = TargetBoxEnricher;\n"
  },
  {
    "path": "lib/teams/client/team-message-handler.js",
    "content": "/**\n *\n * Reldens - TeamMessageHandler\n *\n * Handles team-related messages on the client side, managing the team UI creation and updates.\n * Creates and updates the team interface including team members, invites, and team management actions.\n *\n */\n\nconst { UserInterface } = require('../../game/client/user-interface');\nconst { TeamsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('../../game/client/game-dom').GameDom} GameDom\n * @typedef {import('../../game/client/scene-preloader').ScenePreloader} ScenePreloader\n *\n * @typedef {Object} TeamMessageHandlerProps\n * @property {RoomEvents} roomEvents\n * @property {Object} message\n */\nclass TeamMessageHandler\n{\n\n    /**\n     * @param {TeamMessageHandlerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {RoomEvents|boolean} */\n        this.roomEvents = sc.get(props, 'roomEvents', false);\n        /** @type {Object|boolean} */\n        this.message = sc.get(props, 'message', false);\n        /** @type {GameManager|undefined} */\n        this.gameManager = this.roomEvents?.gameManager;\n        /** @type {GameDom|undefined} */\n        this.gameDom = this.gameManager?.gameDom;\n        /** @type {ScenePreloader|undefined} */\n        this.uiScene = this.gameManager?.gameEngine?.uiScene;\n    }\n\n    /**\n     * @returns {ScenePreloader|boolean}\n     */\n    validate()\n    {\n        if(!this.roomEvents){\n            Logger.info('Missing RoomEvents on TeamMessageHandler.');\n            return false;\n        }\n        if(!this.message){\n            Logger.info('Missing message on TeamMessageHandler.');\n            return false;\n        }\n        if(!this.gameManager){\n            Logger.info('Missing GameManager on TeamMessageHandler.');\n            return false;\n        }\n        // @NOTE: the message could arrive before the uiScene gets ready.\n        // if(!this.uiScene){\n        //     Logger.info('Missing UI Scene on TeamMessageHandler.');\n        // }\n        return this.uiScene;\n\n    }\n\n    showTeamRequest()\n    {\n        this.createTeamUi(this.teamUiKey());\n        this.roomEvents.initUi({\n            id: this.teamUiKey(),\n            title: this.gameManager.config.getWithoutLogs(\n                'client/team/labels/requestFromTitle',\n                TeamsConst.LABELS.TEAM.REQUEST_FROM\n            ),\n            content: this.message.from,\n            options: this.gameManager.config.get('client/ui/options/acceptOrDecline'),\n            overrideSendOptions: {act: TeamsConst.ACTIONS.TEAM_ACCEPTED, id: this.message.id}\n        });\n        this.gameDom.getElement('#opt-1-'+this.teamUiKey())?.addEventListener('click', () => {\n            this.gameDom.removeElement('.team-invite');\n        });\n        this.gameDom.getElement('#opt-2-'+this.teamUiKey())?.addEventListener('click', () => {\n            this.removeTeamUi();\n        });\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    removeTeamUi()\n    {\n        let uiElement = this.gameManager.getUiElement(this.teamUiKey());\n        if(!uiElement){\n            Logger.error('UI Element not found by team UI key \"'+this.teamUiKey()+'\".');\n            return false;\n        }\n        uiElement.removeElement();\n        delete this.uiScene.userInterfaces[this.teamUiKey()];\n        delete this.uiScene.elementsUi[this.teamUiKey()];\n        this.uiScene.currentTeam = false;\n    }\n\n    /**\n     * @returns {string}\n     */\n    teamUiKey()\n    {\n        return TeamsConst.KEY + this.message.id;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    showTeamBox()\n    {\n        let teamUiKey = this.teamUiKey();\n        this.createTeamUi(teamUiKey);\n        let title = this.gameManager.config.getWithoutLogs(\n            'client/team/labels/leaderNameTitle',\n            TeamsConst.LABELS.TEAM.LEADER_NAME_TITLE\n            ).replace('%leaderName', this.message.leaderName);\n        let container = this.gameManager.gameDom.getElement('#box-'+teamUiKey+' .box-content');\n        if(!container){\n            Logger.error('Missing container: \"#box-'+teamUiKey+' .box-content\".');\n            return false;\n        }\n        let uiBox = this.uiScene.elementsUi[teamUiKey];\n        this.roomEvents.uiSetTitle(uiBox, {title});\n        this.roomEvents.uiSetContent(uiBox, {content: ''}, this.uiScene);\n        let players = sc.get(this.message, 'players', false);\n        this.uiScene.currentTeam = players;\n        this.updateTeamBox(players, container);\n    }\n\n    /**\n     * @param {string} teamUiKey\n     * @returns {UserInterface}\n     */\n    createTeamUi(teamUiKey)\n    {\n        let teamsUi = sc.get(this.uiScene.userInterfaces, teamUiKey);\n        if(teamsUi){\n            return teamsUi;\n        }\n        if(!this.uiScene.userInterfaces){\n            this.uiScene.userInterfaces = {};\n        }\n        this.uiScene.userInterfaces[teamUiKey] = new UserInterface(\n            this.gameManager,\n            {id: teamUiKey, type: TeamsConst.KEY, defaultOpen: true, defaultClose: true},\n            '/assets/features/teams/templates/ui-teams.html',\n            TeamsConst.KEY\n        );\n        this.uiScene.userInterfaces[teamUiKey].createUiElement(this.uiScene, TeamsConst.KEY);\n        return this.uiScene.userInterfaces[teamUiKey];\n    }\n\n    /**\n     * @param {Object} players\n     * @param {HTMLElement} container\n     */\n    updateTeamBox(players, container)\n    {\n        if(!players){\n            Logger.error('Players not defined.', players);\n            return;\n        }\n        let teamMembers = '';\n        for(let i of Object.keys(players)){\n            teamMembers += this.createTeamMemberBox(players[i]);\n        }\n        container.innerHTML = this.createTeamContainer(teamMembers);\n        this.activateTeamPlayerActions(players);\n        this.activateTeamLeaveButtonAction();\n    }\n\n    /**\n     * @param {string} teamMembers\n     * @returns {string}\n     */\n    createTeamContainer(teamMembers)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let templateContent = this.uiScene.cache.html.get('teamContainer');\n        if(!templateContent){\n            Logger.error('Missing template \"teamContainer\".');\n            return '';\n        }\n        let playerId = this.gameManager.playerData.id.toString();\n        let isPlayerOwner = playerId === this.message.id.toString();\n        let configPath = 'client/team/labels/';\n        let leaveActionLabel = isPlayerOwner\n            ? this.gameManager.config.getWithoutLogs(configPath+'disbandLabel', TeamsConst.LABELS.TEAM.DISBAND)\n            : this.gameManager.config.getWithoutLogs(configPath+'leaveLabel', TeamsConst.LABELS.TEAM.LEAVE);\n        let templateParams = {\n            teamId: this.message.id,\n            playerId,\n            leaveActionLabel,\n            teamMembers\n        };\n        return this.gameManager.gameEngine.parseTemplate(templateContent, templateParams);\n    }\n\n    activateTeamLeaveButtonAction()\n    {\n        let leaveButton = this.gameManager.gameDom.getElement('.leave-'+this.gameManager.playerData.id.toString());\n        leaveButton?.addEventListener('click', () => {\n            this.roomEvents.send({\n                act: TeamsConst.ACTIONS.TEAM_LEAVE,\n                id: this.message.id\n            });\n        });\n    }\n\n    /**\n     * @param {Object} playerData\n     * @returns {string}\n     */\n    createTeamMemberBox(playerData)\n    {\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        let templateContent = this.uiScene.cache.html.get('teamPlayerData');\n        if(!templateContent){\n            Logger.error('Missing template \"teamPlayerData\".');\n            return '';\n        }\n        let isPlayerOwner = this.gameManager.playerData.id.toString() === this.message.id.toString();\n        return this.gameManager.gameEngine.parseTemplate(templateContent, {\n            playerId: playerData.player_id,\n            playerName: playerData.name,\n            playerProperties: this.createSharedPropertiesContent(playerData.sharedProperties),\n            playerRemove: isPlayerOwner ? this.createDismissPlayerButton(playerData) : ''\n        });\n    }\n\n    /**\n     * @param {Object} playerData\n     * @returns {string}\n     */\n    createDismissPlayerButton(playerData)\n    {\n        let templateContent = this.uiScene.cache.html.get('teamRemove');\n        if(!templateContent){\n            Logger.error('Missing template \"teamRemove\".');\n            return '';\n        }\n        return this.gameManager.gameEngine.parseTemplate(templateContent, {playerId: playerData.player_id});\n    }\n\n    /**\n     * @param {Object} playerSharedProperties\n     * @returns {string}\n     */\n    createSharedPropertiesContent(playerSharedProperties)\n    {\n        let templateContent = this.uiScene.cache.html.get('teamsSharedProperty');\n        if(!templateContent){\n            Logger.error('Missing template \"teamsSharedProperty\".');\n            return '';\n        }\n        let sharedPropertiesContent = '';\n        // @TODO - BETA - Move the template load from cache as part of the engine driver.\n        for(let i of Object.keys(playerSharedProperties)){\n            templateContent = this.uiScene.cache.html.get('teamsSharedProperty');\n            let propertyData = playerSharedProperties[i];\n            let propertyMaxValue = sc.get(propertyData, 'max', '');\n            if('' !== propertyMaxValue){\n                propertyMaxValue = this.gameManager.config.getWithoutLogs(\n                    'client/team/labels/propertyMaxValue',\n                    TeamsConst.LABELS.TEAM.PROPERTY_MAX_VALUE\n                    ).replace('%propertyMaxValue', propertyMaxValue);\n            }\n            sharedPropertiesContent += this.gameManager.gameEngine.parseTemplate(templateContent, {\n                key: i,\n                label: propertyData.label,\n                value: propertyData.value,\n                max: propertyMaxValue\n            });\n        }\n        return sharedPropertiesContent;\n    }\n\n    /**\n     * @param {Object} playersData\n     */\n    activateTeamPlayerActions(playersData)\n    {\n        for(let i of Object.keys(playersData)){\n            let playerData = playersData[i];\n            let selectorPlayerName = '.team-player-'+playerData.player_id+' .player-name';\n            this.gameDom.getElement(selectorPlayerName)?.addEventListener('click', () => {\n                this.gameManager.getCurrentPlayer().setTargetPlayerById(playerData.sessionId);\n            });\n            let selectorPlayerProperties = '.team-player-'+playerData.player_id+' .properties-list-container';\n            this.gameDom.getElement(selectorPlayerProperties)?.addEventListener('click', () => {\n                this.gameManager.getCurrentPlayer().setTargetPlayerById(playerData.sessionId);\n            });\n            let selectorPlayerRemove = '.team-player-'+playerData.player_id+' .team-remove-button';\n            this.gameDom.getElement(selectorPlayerRemove)?.addEventListener('click', () => {\n                this.roomEvents.send({\n                    act: TeamsConst.ACTIONS.TEAM_REMOVE,\n                    id: this.message.id,\n                    remove: playerData.player_id\n                });\n            });\n        }\n    }\n\n}\n\nmodule.exports.TeamMessageHandler = TeamMessageHandler;\n"
  },
  {
    "path": "lib/teams/client/team-message-listener.js",
    "content": "/**\n *\n * Reldens - TeamMessageListener\n *\n * Listens for team-related messages from the server and delegates handling to the appropriate handler.\n * Queues messages if the UI is not ready yet.\n *\n */\n\nconst { TeamMessageHandler } = require('./team-message-handler');\nconst { TeamsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass TeamMessageListener\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async executeClientMessageActions(props)\n    {\n        let message = sc.get(props, 'message', false);\n        if(!message){\n            Logger.error('Missing message data on TeamMessageListener.', props);\n            return false;\n        }\n        let roomEvents = sc.get(props, 'roomEvents', false);\n        if(!roomEvents){\n            Logger.error('Missing RoomEvents on TeamMessageListener.', props);\n            return false;\n        }\n        let teamMessageHandler = new TeamMessageHandler({roomEvents, message});\n        if(!teamMessageHandler.validate()){\n            if(this.isTeamMessage(message)){\n                if(!roomEvents.teamMessagesQueue){\n                    roomEvents.teamMessagesQueue = [];\n                }\n                roomEvents.teamMessagesQueue.push(message);\n            }\n            Logger.error('Invalid TeamMessageHandler', teamMessageHandler);\n            return false;\n        }\n        if(!this.isTeamMessage(message)){\n            return false;\n        }\n        return this.handleTeamMessage(message, teamMessageHandler);\n    }\n\n    /**\n     * @param {Object} message\n     * @param {TeamMessageHandler} teamMessageHandler\n     * @returns {boolean}\n     */\n    handleTeamMessage(message, teamMessageHandler)\n    {\n        if(TeamsConst.ACTIONS.TEAM_INVITE === message.act){\n            return teamMessageHandler.showTeamRequest();\n        }\n        if(TeamsConst.ACTIONS.TEAM_UPDATE === message.act){\n            return teamMessageHandler.showTeamBox();\n        }\n        if(TeamsConst.ACTIONS.TEAM_LEFT === message.act){\n            return teamMessageHandler.removeTeamUi();\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {boolean}\n     */\n    isTeamMessage(message)\n    {\n        return 0 === message.act?.indexOf(TeamsConst.TEAM_PREF);\n    }\n}\n\nmodule.exports.TeamMessageListener = TeamMessageListener;\n"
  },
  {
    "path": "lib/teams/client/templates-handler.js",
    "content": "/**\n *\n * Reldens - TemplatesHandler\n *\n * Handles preloading of team and clan UI templates during the game initialization phase.\n *\n */\n\nconst { TeamsConst } = require('../constants');\n\n/**\n * @typedef {import('../../game/client/scene-preloader').ScenePreloader} ScenePreloader\n */\nclass TemplatesHandler\n{\n\n    /**\n     * @param {ScenePreloader} preloadScene\n     */\n    static preloadTemplates(preloadScene)\n    {\n        let teamsTemplatePath = '/assets/features/teams/templates/';\n        preloadScene.load.html(TeamsConst.KEY, teamsTemplatePath+'ui-teams.html');\n        preloadScene.load.html(TeamsConst.CLAN_KEY, teamsTemplatePath+'ui-clan.html');\n        preloadScene.load.html('teamPlayerInvite', teamsTemplatePath+'team-invite.html');\n        preloadScene.load.html('teamPlayerAccept', teamsTemplatePath+'team-accept.html');\n        preloadScene.load.html('teamRemove', teamsTemplatePath+'team-remove.html');\n        preloadScene.load.html('teamContainer', teamsTemplatePath+'team-container.html');\n        preloadScene.load.html('teamPlayerData', teamsTemplatePath+'team-player-data.html');\n        preloadScene.load.html('clanCreate', teamsTemplatePath+'clan-create.html');\n        preloadScene.load.html('clanPlayerInvite', teamsTemplatePath+'clan-invite.html');\n        preloadScene.load.html('clanPlayerAccept', teamsTemplatePath+'clan-accept.html');\n        preloadScene.load.html('clanRemove', teamsTemplatePath+'clan-remove.html');\n        preloadScene.load.html('clanContainer', teamsTemplatePath+'clan-container.html');\n        preloadScene.load.html('clanPlayerData', teamsTemplatePath+'clan-player-data.html');\n        preloadScene.load.html('clanMemberData', teamsTemplatePath+'clan-member-data.html');\n        preloadScene.load.html('teamsSharedProperty', teamsTemplatePath+'shared-property.html');\n    }\n\n}\nmodule.exports.TemplatesHandler = TemplatesHandler;\n"
  },
  {
    "path": "lib/teams/constants.js",
    "content": "/**\n *\n * Reldens - teams/constants\n *\n */\n\nlet pref = 'tm.'\nlet clanPref = 'cln.';\n\nmodule.exports.TeamsConst = {\n    KEY: 'teams',\n    CLAN_KEY: 'clan',\n    TEAM_PREF: pref,\n    CLAN_PREF: clanPref,\n    NAME_LIMIT: 50,\n    CLAN_STARTING_POINTS: 1,\n    VALIDATION: {\n        SUCCESS: 1,\n        NAME_EXISTS: 2,\n        LEVEL_ISSUE: 3,\n        CREATE_ERROR: 4,\n        CREATE_OWNER_ERROR: 5\n    },\n    ACTIONS: {\n        // @TODO - BETA - Standardize generic actions and use dots to split, like UPDATE = '.up', REMOVE = '.rm', etc.\n        TEAM_INVITE: pref+'inv',\n        TEAM_ACCEPTED: pref+'acp',\n        TEAM_LEAVE: pref+'lev',\n        TEAM_UPDATE: pref+'upd',\n        TEAM_LEFT: pref+'lef',\n        TEAM_REMOVE: pref+'rem',\n        CLAN_INITIALIZE: clanPref+'ini',\n        CLAN_CREATE: clanPref+'new',\n        CLAN_INVITE: clanPref+'inv',\n        CLAN_ACCEPTED: clanPref+'acp',\n        CLAN_LEAVE: clanPref+'lev',\n        CLAN_UPDATE: clanPref+'upd',\n        CLAN_LEFT: clanPref+'lef',\n        CLAN_REMOVE: clanPref+'rem',\n        CLAN_REMOVED: clanPref+'remd',\n        CLAN_NAME: clanPref+'nam'\n    },\n    LABELS: {\n        TEAM: {\n            INVITE_BUTTON_LABEL: 'Team - Invite',\n            REQUEST_FROM: 'Accept team request from:',\n            LEADER_NAME_TITLE: 'Team leader: %leaderName',\n            DISBAND: 'Disband Team',\n            LEAVE: 'Leave Team',\n            PROPERTY_MAX_VALUE: '/ %propertyMaxValue'\n        },\n        CLAN: {\n            CREATE_CLAN_TITLE: 'Clan - Creation',\n            INVITE_BUTTON_LABEL: 'Clan - Invite',\n            REQUEST_FROM: 'Accept clan request from:',\n            CLAN_TITLE: 'Clan: %clanName - Leader: %leaderName',\n            NAME_PLACEHOLDER: 'Choose a clan name...',\n            CREATE: 'Create',\n            DISBAND: 'Disband Clan',\n            LEAVE: 'Leave Clan',\n            PROPERTY_MAX_VALUE: '/ %propertyMaxValue',\n            PLAYERS_TITLE: 'Connected Players:',\n            MEMBERS_TITLE: 'Clan Members:',\n            NONE_CONNECTED: 'None'\n        }\n    },\n    CHAT: {\n        MESSAGE: {\n            INVITE_ACCEPTED: '%playerName has accepted your invitation.',\n            INVITE_REJECTED: '%playerName has rejected your invitation.',\n            DISBANDED: '%playerName has disbanded the %groupName.',\n            LEFT: 'You left the %groupName.',\n            LEAVE: '%playerName has left the %groupName.',\n            REMOVED: '%playerName has been removed from the %groupName.',\n            ENTER: '%playerName has enter the %groupName.',\n            NOT_ENOUGH_PLAYERS: 'The team was disbanded due to a lack of players.'\n        }\n    }\n};\n"
  },
  {
    "path": "lib/teams/server/clan-factory.js",
    "content": "/**\n *\n * Reldens - ClanFactory\n *\n * Factory class for creating and initializing Clan instances from database models.\n * Handles clan model loading, clan object creation, and plugin registration.\n *\n */\n\nconst { Clan } = require('./clan');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('./plugin').TeamsPlugin} TeamsPlugin\n */\nclass ClanFactory\n{\n\n    /**\n     * @param {number|string} clanId\n     * @param {PlayerState} playerOwner\n     * @param {Object} clientOwner\n     * @param {Object} sharedProperties\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<Clan|boolean>}\n     */\n    static async create(clanId, playerOwner, clientOwner, sharedProperties, teamsPlugin)\n    {\n        // @TODO - BETA - Refactor to extract the teamsPlugin.\n        let clanModel = await teamsPlugin.dataServer.getEntity('clan').loadByIdWithRelations(\n            clanId,\n            [\n                'related_players',\n                'related_clan_members.related_players',\n                'related_clan_levels.related_clan_levels_modifiers'\n            ]\n        );\n        if(!clanModel){\n            Logger.error('Clan not found by ID \"'+clanId+'\".');\n            return false;\n        }\n        // @TODO - BETA - Refactor fromModel and join methods to use a single one.\n        let newClan = Clan.fromModel({\n            clanModel,\n            clientOwner,\n            sharedProperties\n        });\n        newClan.join(playerOwner, clientOwner, newClan.members[playerOwner.player_id]);\n        teamsPlugin.clans[clanId] = newClan;\n        return teamsPlugin.clans[clanId];\n    }\n\n}\n\nmodule.exports.ClanFactory = ClanFactory;\n"
  },
  {
    "path": "lib/teams/server/clan-message-actions.js",
    "content": "/**\n *\n * Reldens - ClanMessageActions\n *\n * Handles clan-related message actions from clients.\n * Routes clan creation, invitations, joins, leaves, and removals to appropriate handlers.\n *\n */\n\nconst { ClanCreate } = require('./message-actions/clan-create');\nconst { TryClanInvite } = require('./message-actions/try-clan-invite');\nconst { ClanJoin } = require('./message-actions/clan-join');\nconst { ClanLeave } = require('./message-actions/clan-leave');\nconst { TeamsConst } = require('../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./plugin').TeamsPlugin} TeamsPlugin\n * @typedef {import('../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass ClanMessageActions\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {TeamsPlugin} */\n        this.teamsPlugin = props.teamsPlugin;\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {PlayerState} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        if(!sc.hasOwn(data, 'act')){\n            return false;\n        }\n        if(0 !== data.act.indexOf(TeamsConst.CLAN_PREF)){\n            return false;\n        }\n        if(TeamsConst.ACTIONS.CLAN_INVITE === data.act){\n            return await TryClanInvite.execute(client, data, room, playerSchema, this.teamsPlugin);\n        }\n        if(TeamsConst.ACTIONS.CLAN_CREATE === data.act){\n            return await ClanCreate.execute(client, data, room, playerSchema, this.teamsPlugin);\n        }\n        if(TeamsConst.ACTIONS.CLAN_ACCEPTED === data.act && '1' === data.value){\n            return await ClanJoin.execute(client, data, room, playerSchema, this.teamsPlugin);\n        }\n        if(TeamsConst.ACTIONS.CLAN_ACCEPTED === data.act && '2' === data.value){\n            let clanInvite = this.teamsPlugin.clans[data.id];\n            if(!clanInvite){\n                Logger.error('Invite Clan not found.', clanInvite, data);\n                return false;\n            }\n            let clientSendingInvite = clanInvite.clients[clanInvite.owner.player_id];\n            if(!clientSendingInvite){\n                Logger.error(\n                    'Clan invitation declined, player owner client not found.',\n                    clanInvite,\n                    clientSendingInvite,\n                    data\n                );\n                return false;\n            }\n            let playerRejectingName = playerSchema.playerName;\n            await this.teamsPlugin.events.emit('reldens.clanJoinInviteRejected', {\n                clientSendingInvite,\n                playerRejectingName,\n                clanInvite\n            });\n            return true;\n        }\n        if(TeamsConst.ACTIONS.CLAN_LEAVE === data.act || TeamsConst.ACTIONS.CLAN_REMOVE === data.act){\n            return await ClanLeave.fromMessage(data, playerSchema, this.teamsPlugin);\n        }\n        return false;\n    }\n\n}\n\nmodule.exports.ClanMessageActions = ClanMessageActions;\n"
  },
  {
    "path": "lib/teams/server/clan-updates-handler.js",
    "content": "/**\n *\n * Reldens - ClanUpdatesHandler\n *\n * Handles broadcasting clan updates to all clan members.\n * Sends player data updates and clan status changes to connected clients.\n *\n */\n\nconst { PlayersDataMapper } = require('./players-data-mapper');\nconst { TeamsConst } = require('../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('./clan').Clan} Clan\n */\nclass ClanUpdatesHandler\n{\n\n    /**\n     * @param {Clan} clan\n     * @returns {boolean}\n     */\n    static updateClanPlayers(clan)\n    {\n        // @TODO - BETA - Consider extend TeamUpdatesHandler.\n        let clientsKeys = Object.keys(clan.clients);\n        if(0 === clientsKeys.length){\n            // expected if clan members are not logged in and by that there will not be any clients available:\n            return false;\n        }\n        let playersList = PlayersDataMapper.fetchPlayersData(clan);\n        if(0 === Object.keys(playersList).length){\n            Logger.info('Clan update without players.', clan);\n            return false;\n        }\n        for(let i of clientsKeys){\n            let otherPlayersData = Object.assign({}, playersList);\n            delete otherPlayersData[i];\n            let sendUpdate = Object.assign(\n                {},\n                {\n                    act: this.actionConstant(),\n                    listener: this.listenerKey(),\n                    players: otherPlayersData,\n                },\n                clan.mapForClient()\n            );\n            clan.clients[i].send('*', sendUpdate);\n        }\n        return true;\n    }\n\n    /**\n     * @returns {string}\n     */\n    static listenerKey()\n    {\n        return TeamsConst.CLAN_KEY;\n    }\n\n    /**\n     * @returns {string}\n     */\n    static actionConstant()\n    {\n        return TeamsConst.ACTIONS.CLAN_UPDATE;\n    }\n\n}\n\nmodule.exports.ClanUpdatesHandler = ClanUpdatesHandler;\n"
  },
  {
    "path": "lib/teams/server/clan.js",
    "content": "/**\n *\n * Reldens - Clan\n *\n * Represents a clan of players with shared modifiers, properties, and persistent membership.\n * Manages clan membership, levels, points, modifiers, and provides client data mapping.\n *\n */\n\nconst { ModifierConst } = require('@reldens/modifiers');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/server/state').PlayerState} PlayerState\n */\nclass Clan\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {number} */\n        this.level = sc.get(props, 'level', 1);\n        /** @type {Object} */\n        this.modifiers = sc.get(props, 'modifiers', {});\n        /** @type {Object} */\n        this.sharedProperties = sc.get(props, 'sharedProperties', {});\n        /** @type {Object|boolean} */\n        this.owner = sc.get(props, 'owner', false);\n        /** @type {Object|boolean} */\n        this.ownerClient = sc.get(props, 'ownerClient', false);\n        /** @type {Object} */\n        this.players = sc.get(props, 'players', {});\n        /** @type {Object} */\n        this.clients = sc.get(props, 'clients', {});\n        /** @type {string|number} */\n        this.id = sc.get(props, 'id', '');\n        /** @type {string} */\n        this.name = sc.get(props, 'name', '');\n        /** @type {string|number} */\n        this.points = sc.get(props, 'points', '');\n        /** @type {Object} */\n        this.members = sc.get(props, 'members', {});\n        /** @type {Object} */\n        this.pendingInvites = sc.get(props, 'pendingInvites', {});\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Clan}\n     */\n    static fromModel(props)\n    {\n        let {clanModel, sharedProperties, clientOwner} = props;\n        return new this({\n            sharedProperties,\n            owner: {\n                player_id: clanModel.related_players.id,\n                playerName: clanModel.related_players.name\n            },\n            ownerClient: clientOwner,\n            members: this.mapMembersFromModelArray(clanModel.related_clan_members),\n            id: clanModel.id,\n            ownerId: clanModel.owner_id,\n            name: clanModel.name,\n            points: clanModel.points,\n            level: clanModel.related_clan_levels\n        });\n    }\n\n    /**\n     * @param {Array} membersCollection\n     * @returns {Object}\n     */\n    static mapMembersFromModelArray(membersCollection)\n    {\n        if(!sc.isArray(membersCollection) || 0 === membersCollection.length){\n            return {};\n        }\n        let mappedMembers = {};\n        for(let memberModel of membersCollection){\n            mappedMembers[memberModel.player_id] = memberModel;\n        }\n        return mappedMembers;\n    }\n\n    /**\n     * @returns {Object}\n     */\n    mapForClient()\n    {\n        return {\n            id: this.id,\n            clanName: this.name,\n            points: this.points,\n            level: this.level,\n            ownerId: this.owner.player_id,\n            leaderName: this.owner.playerName,\n            members: this.mapMembersForClient()\n        };\n    }\n\n    /**\n     * @returns {Object|Array}\n     */\n    mapMembersForClient()\n    {\n        if(0 === sc.length(this.members)){\n            return [];\n        }\n        let members = {};\n        for(let i of Object.keys(this.members)){\n            let member = this.members[i];\n            let parentPlayer = member?.related_players;\n            if(!parentPlayer){\n                Logger.error('Member player not available.', member);\n                continue;\n            }\n            members[i] = {\n                // @TODO - BETA - Make other members data optional, like level or class path.\n                name: parentPlayer.name,\n                id: i\n            }\n        }\n        return members;\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @param {Object} client\n     * @param {Object} clanMemberModel\n     * @returns {boolean}\n     */\n    join(playerSchema, client, clanMemberModel)\n    {\n        let result = this.applyModifiers(playerSchema);\n        if(!result){\n            Logger.error('Player modifiers could not be applied.', playerSchema.player_id, result, this.players);\n        }\n        this.players[playerSchema.player_id] = playerSchema;\n        this.clients[playerSchema.player_id] = client;\n        this.members[playerSchema.player_id] = clanMemberModel;\n        return result;\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @returns {boolean}\n     */\n    leave(playerSchema)\n    {\n        delete this.members[playerSchema.player_id];\n        return this.disconnect(playerSchema);\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @returns {boolean}\n     */\n    disconnect(playerSchema)\n    {\n        let result = this.revertModifiers(playerSchema);\n        if(!result){\n            Logger.error('Player modifiers could not be reverted.', playerSchema.player_id, result, this.players);\n        }\n        playerSchema.privateData.clan = false;\n        delete this.clients[playerSchema.player_id];\n        delete this.players[playerSchema.player_id];\n        return true;\n    }\n\n    /**\n     * @param {string} sessionId\n     * @returns {PlayerState|boolean}\n     */\n    playerBySessionId(sessionId)\n    {\n        let playersKeys = Object.keys(this.players);\n        if(0 === playersKeys.length){\n            return false;\n        }\n        for(let i of playersKeys){\n            if(this.players[i].sessionId === sessionId){\n                return this.players[i];\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @returns {boolean}\n     */\n    applyModifiers(playerSchema)\n    {\n        let modifiersKeys = Object.keys(this.modifiers);\n        if(0 === modifiersKeys.length){\n            return true;\n        }\n        for(let i of modifiersKeys){\n            let modifier = this.modifiers[i];\n            modifier.apply(playerSchema);\n            if(ModifierConst.MOD_APPLIED !== modifier.state){\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @returns {boolean}\n     */\n    revertModifiers(playerSchema)\n    {\n        let modifiersKeys = Object.keys(this.modifiers);\n        if(0 === modifiersKeys.length){\n            return true;\n        }\n        for(let i of modifiersKeys){\n            let modifier = this.modifiers[i];\n            modifier.revert(playerSchema);\n            if(ModifierConst.MOD_REVERTED !== modifier.state){\n                return false;\n            }\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.Clan = Clan;\n"
  },
  {
    "path": "lib/teams/server/entities/clan-entity-override.js",
    "content": "/**\n *\n * Reldens - ClanEntityOverride\n *\n * Customizes admin panel configuration for the Clan entity.\n * Sets title property and navigation position for the admin interface.\n *\n */\n\nconst { ClanEntity } = require('../../../../generated-entities/entities/clan-entity');\n\nclass ClanEntityOverride extends ClanEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.titleProperty = 'name';\n        config.navigationPosition = 900;\n        return config;\n    }\n\n}\n\nmodule.exports.ClanEntityOverride = ClanEntityOverride;\n"
  },
  {
    "path": "lib/teams/server/entities/clan-levels-modifiers-entity-override.js",
    "content": "/**\n *\n * Reldens - ClanLevelsModifiersEntityOverride\n *\n * Customizes admin panel configuration for the ClanLevelsModifiers entity.\n * Removes min/max properties from list view for cleaner admin interface display.\n *\n */\n\nconst { ClanLevelsModifiersEntity } = require('../../../../generated-entities/entities/clan-levels-modifiers-entity');\nconst { sc } = require('@reldens/utils');\n\nclass ClanLevelsModifiersEntityOverride extends ClanLevelsModifiersEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties = sc.removeFromArray(config.listProperties, [\n            'minValue',\n            'maxValue',\n            'minProperty',\n            'maxProperty'\n        ]);\n        return config;\n    }\n\n}\n\nmodule.exports.ClanLevelsModifiersEntityOverride = ClanLevelsModifiersEntityOverride;\n"
  },
  {
    "path": "lib/teams/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { ClanEntityOverride } = require('./entities/clan-entity-override');\nconst { ClanLevelsModifiersEntityOverride } = require('./entities/clan-levels-modifiers-entity-override');\n\nmodule.exports.entitiesConfig = {\n    clan: ClanEntityOverride,\n    clanLevelsModifiers: ClanLevelsModifiersEntityOverride\n};\n"
  },
  {
    "path": "lib/teams/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        clan: 'Clan',\n        clan_levels: 'Levels',\n        clan_levels_modifiers: 'Levels Modifiers',\n        clan_members: 'Members'\n    }\n};\n"
  },
  {
    "path": "lib/teams/server/event-handlers/create-player-clan-handler.js",
    "content": "/**\n *\n * Reldens - CreatePlayerClanHandler\n *\n * Handles clan membership restoration when players log in or change rooms.\n * Loads clan data, rejoins players to their clan, and broadcasts updates to clan members.\n *\n */\n\nconst { ClanFactory } = require('../clan-factory');\nconst { ClanUpdatesHandler } = require('../clan-updates-handler');\nconst { TeamsConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n * @typedef {import('../../../config/server/manager').ConfigManager} ConfigManager\n * @typedef {import('@reldens/storage').BaseDriver} BaseDriver\n */\nclass CreatePlayerClanHandler\n{\n\n    /**\n     * @param {ConfigManager} config\n     * @param {TeamsPlugin} teamsPlugin\n     */\n    constructor(config, teamsPlugin)\n    {\n        /** @type {ConfigManager} */\n        this.config = config;\n        /** @type {Object|undefined} */\n        this.sharedProperties = this.config?.get('client/ui/teams/sharedProperties');\n        /** @type {BaseDriver|undefined} */\n        this.clanMembersRepository = teamsPlugin?.dataServer?.getEntity('clanMembers');\n    }\n\n    /**\n     * @param {Object} client\n     * @param {PlayerState} playerSchema\n     * @param {RoomScene} room\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    async enrichPlayerWithClan(client, playerSchema, room, teamsPlugin)\n    {\n        let startEvent = {client, playerSchema, room, teamsPlugin, continueProcess: true};\n        teamsPlugin.events.emit('reldens.beforeEnrichPlayerWithClan', startEvent);\n        if(!startEvent.continueProcess){\n            return false;\n        }\n        // @TODO - BETA - Improve login performance, avoid query by getting config from existent player schema.\n        let clanMemberModel = await this.clanMembersRepository.loadOneByWithRelations(\n            'player_id',\n            playerSchema.player_id,\n            ['related_players']\n        );\n        if(!clanMemberModel){\n            client.send('*', {act: TeamsConst.ACTIONS.CLAN_INITIALIZE, listener: TeamsConst.CLAN_KEY});\n            return true;\n        }\n        let clan = await this.loadClan(teamsPlugin, clanMemberModel.clan_id, playerSchema, client, room);\n        if(!clan){\n            Logger.error('Loading clan by ID \"'+clanMemberModel.clan_id+'\" not found.', clan);\n            return false;\n        }\n        clan.join(playerSchema, client, clanMemberModel);\n        playerSchema.setPrivate('clan', clanMemberModel.clan_id);\n        let endEvent = {client, playerSchema, room, teamsPlugin, continueProcess: true};\n        teamsPlugin.events.emit('reldens.beforeEnrichPlayerWithClanUpdate', endEvent);\n        if(!endEvent.continueProcess){\n            return false;\n        }\n        return ClanUpdatesHandler.updateClanPlayers(clan);\n    }\n\n    /**\n     * @param {TeamsPlugin} teamsPlugin\n     * @param {number|string} clanId\n     * @param {PlayerState} playerSchema\n     * @param {Object} client\n     * @param {RoomScene} room\n     * @returns {Promise<Object|boolean>}\n     */\n    async loadClan(teamsPlugin, clanId, playerSchema, client, room)\n    {\n        let clan = sc.get(teamsPlugin.clans, clanId, false);\n        if(clan){\n            //Logger.debug('Loading clan from plugin with ID \"'+clanId+'\".');\n            return clan;\n        }\n        //Logger.debug('Clan with ID \"'+clanId+'\" not loaded, creating it.');\n        return await ClanFactory.create(clanId, playerSchema, client, this.sharedProperties, teamsPlugin);\n    }\n}\n\nmodule.exports.CreatePlayerClanHandler = CreatePlayerClanHandler;\n"
  },
  {
    "path": "lib/teams/server/event-handlers/create-player-team-handler.js",
    "content": "/**\n *\n * Reldens - CreatePlayerTeamHandler\n *\n * Handles rejoining players to their team when changing rooms or reconnecting.\n * Restores team membership and broadcasts updates to team members.\n *\n */\n\nconst { TeamUpdatesHandler } = require('../team-updates-handler');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass CreatePlayerTeamHandler\n{\n\n    /**\n     * @param {Object} client\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async joinExistentTeam(client, playerSchema, teamsPlugin)\n    {\n        let teamId = teamsPlugin.teamChangingRoomPlayers[playerSchema.player_id]?.teamId;\n        if(!teamId){\n            //Logger.debug('Player \"'+playerSchema.playerName+'\" (ID \"'+playerSchema.player_id+'\"), is not in a team.');\n            return false;\n        }\n        let currentTeam = teamsPlugin.teams[teamId];\n        if(!currentTeam){\n            Logger.error('Player \"'+playerSchema.player_id+'\" current team \"'+teamId+'\"not found.');\n            playerSchema.currentTeam = false;\n            return false;\n        }\n        currentTeam.join(playerSchema, client);\n        playerSchema.currentTeam = teamId;\n        TeamUpdatesHandler.updateTeamPlayers(currentTeam);\n    }\n\n}\n\nmodule.exports.CreatePlayerTeamHandler = CreatePlayerTeamHandler;\n"
  },
  {
    "path": "lib/teams/server/event-handlers/end-player-hit-change-point-team-handler.js",
    "content": "/**\n *\n * Reldens - EndPlayerHitChangePointTeamHandler\n *\n * Handles team membership preservation when a player changes rooms.\n * Stores team information temporarily to allow rejoining after room transition.\n *\n */\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass EndPlayerHitChangePointTeamHandler\n{\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async savePlayerTeam(playerSchema, teamsPlugin)\n    {\n        let teamId = playerSchema.currentTeam;\n        if(!teamId){\n            return false;\n        }\n        teamsPlugin.teamChangingRoomPlayers[playerSchema.player_id] = {\n            teamId,\n            leavingPlayerSessionId: playerSchema.sessionId\n        };\n        teamsPlugin.teams[teamId].leave(playerSchema);\n    }\n\n}\n\nmodule.exports.EndPlayerHitChangePointTeamHandler = EndPlayerHitChangePointTeamHandler;\n"
  },
  {
    "path": "lib/teams/server/event-handlers/stats-update-handler.js",
    "content": "/**\n *\n * Reldens - StatsUpdateHandler\n *\n * Handles broadcasting stat updates to team and clan members.\n * Triggers updates when player stats change to keep team/clan UI synchronized.\n *\n */\n\nconst { ClanUpdatesHandler } = require('../clan-updates-handler');\nconst { TeamUpdatesHandler } = require('../team-updates-handler');\nconst { sc } = require('@reldens/utils');\n\nclass StatsUpdateHandler\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    static async updateTeam(props)\n    {\n        let currentTeamId = sc.get(props.playerSchema, 'currentTeam', '');\n        if('' === currentTeamId){\n            return false;\n        }\n        let currentTeam = sc.get(props.teamsPlugin.teams, currentTeamId, false);\n        if(!currentTeam){\n            // expected, team not found\n            return false;\n        }\n        return TeamUpdatesHandler.updateTeamPlayers(currentTeam);\n    }\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    static async updateClan(props)\n    {\n        let clanId = props.playerSchema?.privateData?.clan;\n        if(!clanId){\n            return false;\n        }\n        let clan = sc.get(props.teamsPlugin.clans, clanId, false);\n        if(!clan){\n            //Logger.debug('Expected, Clan not found: '+clanId);\n            return false;\n        }\n        return ClanUpdatesHandler.updateClanPlayers(clan);\n    }\n\n}\n\nmodule.exports.StatsUpdateHandler = StatsUpdateHandler;\n"
  },
  {
    "path": "lib/teams/server/message-actions/chat-message-actions.js",
    "content": "/**\n *\n * Reldens - ChatMessageActions\n *\n * Integrates team and clan events with the chat system.\n * Sends chat notifications for team/clan invitations, joins, rejections, leaves, and disbands.\n *\n */\n\nconst { MessageFactory } = require('../../../chat/message-factory');\nconst { ChatConst } = require('../../../chat/constants');\nconst { TeamsConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../../chat/server/plugin').ChatPlugin} ChatPlugin\n */\nclass ChatMessageActions\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {ChatPlugin|boolean} */\n        this.chatPlugin = sc.get(props, 'chatPlugin', false);\n        /** @type {boolean} */\n        this.client = false;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    listenEvents()\n    {\n        if(!this.events){\n            Logger.error('EventsManager undefined in Teams ChatMessageActions.');\n            return false;\n        }\n        if(!this.chatPlugin){\n            Logger.error('ChatPlugin undefined in Teams ChatMessageActions.');\n            return false;\n        }\n        this.inviteTeamAcceptedEventListener();\n        this.inviteTeamRejectedEventListener();\n        this.teamMemberLeaveEventListener();\n        this.inviteClanAcceptedEventListener();\n        this.inviteClanRejectedEventListener();\n        this.clanMemberLeavingEventListener();\n    }\n\n    inviteTeamAcceptedEventListener()\n    {\n        this.events.on('reldens.afterPlayerJoinedTeam', async (props) => {\n            let playerJoining = sc.get(props, 'playerJoining', false);\n            if(!playerJoining){\n                Logger.warning('Missing event property \"playerJoining\".');\n                return false;\n            }\n            let currentTeam = sc.get(props, 'currentTeam', false);\n            if(!currentTeam){\n                Logger.warning('Missing event property \"currentTeam\".');\n                return false;\n            }\n            let message = this.createMessage(TeamsConst.CHAT.MESSAGE.INVITE_ACCEPTED, playerJoining.playerName, 'team');\n            await this.sendMessage(\n                message,\n                'Team',\n                currentTeam.ownerClient,\n                playerJoining.player_id,\n                playerJoining.state.room_id\n            );\n            let messageEnter = this.createMessage(TeamsConst.CHAT.MESSAGE.ENTER, playerJoining.playerName, 'team');\n            let otherClients = Object.assign({}, currentTeam.clients);\n            delete otherClients[playerJoining.player_id];\n            delete otherClients[currentTeam.owner.player_id];\n            for(let i of Object.keys(otherClients)){\n                let player = currentTeam.players[i];\n                await this.sendMessage(messageEnter, 'Team', otherClients[i], player.player_id, player.state.room_id);\n            }\n        });\n    }\n\n    inviteTeamRejectedEventListener()\n    {\n        this.events.on('reldens.teamJoinInviteRejected', async (props) => {\n            let playerSendingInvite = sc.get(props, 'playerSendingInvite', false);\n            let playerRejectingName = sc.get(props, 'playerRejectingName', false);\n            if(!playerSendingInvite || !playerRejectingName){\n                return false;\n            }\n            let message = this.createMessage(TeamsConst.CHAT.MESSAGE.INVITE_REJECTED, playerRejectingName, 'team');\n            await this.sendMessage(\n                message,\n                'Team',\n                playerSendingInvite.client,\n                playerSendingInvite.playerId,\n                playerSendingInvite.roomId\n            );\n        });\n    }\n\n    teamMemberLeaveEventListener()\n    {\n        this.events.on('reldens.teamLeaveBeforeSendUpdate', async (props) => {\n            let currentTeam = sc.get(props, 'currentTeam', false);\n            if(!currentTeam){\n                return false;\n            }\n            let removingPlayerId = sc.get(props, 'playerId', false);\n            if(!removingPlayerId){\n                return false;\n            }\n            let removingPlayer = currentTeam.players[removingPlayerId];\n            let room = sc.get(props, 'room', false);\n            if(!room){\n                Logger.warning('Room undefined on \"teamLeaveBeforeSendUpdate\" event.');\n                return false;\n            }\n            let isOwnerDisbanding = sc.get(props, 'isOwnerDisbanding', false);\n            if(isOwnerDisbanding){\n                return await this.ownerDisbandTeam(removingPlayer, currentTeam, room);\n            }\n            let leavingPlayerId = sc.get(props, 'singleRemoveId', false);\n            if(!leavingPlayerId){\n                return false;\n            }\n            let message = this.createMessage(TeamsConst.CHAT.MESSAGE.LEFT, '', 'team');\n            let otherClients = Object.assign({}, currentTeam.clients);\n            delete otherClients[leavingPlayerId];\n            for(let i of Object.keys(otherClients)){\n                let player = currentTeam.players[i];\n                await this.sendMessage(message, 'Team', otherClients[i], player.player_id, player.state.room_id);\n            }\n            let areLessPlayerThanRequired = sc.get(props, 'areLessPlayerThanRequired', false);\n            if(areLessPlayerThanRequired){\n                await this.sendMessage(\n                    TeamsConst.CHAT.MESSAGE.NOT_ENOUGH_PLAYERS,\n                    'Team',\n                    currentTeam.clients[removingPlayerId],\n                    removingPlayer.player_id,\n                    removingPlayer.state.room_id,\n                );\n            }\n            return true;\n        });\n    }\n\n    /**\n     * @param {Object} ownerPlayer\n     * @param {Object} currentTeam\n     * @param {Object} room\n     * @returns {Promise<boolean>}\n     */\n    async ownerDisbandTeam(ownerPlayer, currentTeam, room)\n    {\n        let message = this.createMessage(TeamsConst.CHAT.MESSAGE.DISBANDED, currentTeam.owner.playerName, 'team');\n        let leavingPlayer = room.activePlayerByPlayerId(ownerPlayer.player_id, room.roomId);\n        if(!leavingPlayer){\n            Logger.warning('Leaving team player width ID \"'+ownerPlayer.player_id+'\" not found.');\n            return false;\n        }\n        await this.sendMessage(message, 'Team', leavingPlayer.client, ownerPlayer.player_id, ownerPlayer.state.room_id);\n        return true;\n    }\n\n    inviteClanAcceptedEventListener()\n    {\n        this.events.on('reldens.afterPlayerJoinedClan', async (props) => {\n            let playerJoining = sc.get(props, 'playerJoining', false);\n            if(!playerJoining){\n                return false;\n            }\n            let clan = sc.get(props, 'clan', false);\n            if(!clan){\n                return false;\n            }\n            let playerJoiningName = playerJoining.playerName;\n            let message = this.createMessage(\n                TeamsConst.CHAT.MESSAGE.INVITE_ACCEPTED,\n                playerJoiningName\n            );\n            await this.sendMessage(message, 'Clan', clan.ownerClient, clan.owner.player_id, playerJoining.state.room_id);\n        });\n    }\n\n    inviteClanRejectedEventListener()\n    {\n        this.events.on('reldens.clanJoinInviteRejected', async (props) => {\n            let clientSendingInvite = sc.get(props, 'clientSendingInvite', false);\n            let playerRejectingName = sc.get(props, 'playerRejectingName', false);\n            let clanInvite = sc.get(props, 'clanInvite', false);\n            if(!clientSendingInvite || !playerRejectingName){\n                return false;\n            }\n            let message = this.createMessage(\n                TeamsConst.CHAT.MESSAGE.INVITE_REJECTED,\n                playerRejectingName\n            );\n            await this.sendMessage(\n                message,\n                'Clan',\n                clientSendingInvite,\n                clanInvite.owner.player_id,\n                clanInvite.players[clanInvite.owner.player_id].state.room_id\n            );\n        });\n    }\n\n    clanMemberLeavingEventListener()\n    {\n        this.events.on('reldens.clanLeaveBeforeSendUpdate', async (props) => {\n            let playerLeavingId = sc.get(props, 'playerId', false);\n            if(!playerLeavingId){\n                Logger.error('Leaving player ID undefined on \"clanLeaveBeforeSendUpdate\" event.');\n                return false;\n            }\n            let currentClan = sc.get(props, 'currentClan', false);\n            if(!currentClan){\n                Logger.error('Clan undefined on \"clanLeaveBeforeSendUpdate\" event.');\n                return false;\n            }\n            let disbandClan = sc.get(props, 'disbandClan', false);\n            let leavingPlayer = currentClan.players[playerLeavingId];\n            let leavingClient = currentClan.clients[playerLeavingId];\n            if(disbandClan){\n                let message = this.createMessage(\n                    TeamsConst.CHAT.MESSAGE.DISBANDED,\n                    leavingPlayer.playerName,\n                    'clan'\n                );\n                await this.sendMessage(\n                    message,\n                    'Clan',\n                    leavingClient,\n                    leavingPlayer.player_id,\n                    leavingPlayer.state.room_id\n                );\n                return true;\n            }\n            let message = this.createMessage(\n                props.singleRemoveId ? TeamsConst.CHAT.MESSAGE.REMOVED : TeamsConst.CHAT.MESSAGE.LEAVE,\n                leavingPlayer.playerName,\n                'clan'\n            );\n            await this.sendMessage(message, 'Clan', leavingClient, leavingPlayer.player_id, leavingPlayer.state.room_id);\n            return true;\n        });\n    }\n\n    /**\n     * @param {string} baseChatMessage\n     * @param {string} playerName\n     * @param {string} groupName\n     * @returns {string}\n     */\n    createMessage(baseChatMessage = '', playerName = '', groupName = '')\n    {\n        let message = baseChatMessage.replace('%playerName', playerName);\n        // @TODO - BETA - Split class in multiple actions, remove the \"groupName\" since it will limit the translations.\n        if(groupName){\n            message = message.replace('%groupName', groupName);\n        }\n        return message;\n    }\n\n    /**\n     * @param {string} message\n     * @param {string} chatFrom\n     * @param {Object} client\n     * @param {number|string} playerId\n     * @param {number|string} roomId\n     * @returns {Promise<boolean>}\n     */\n    async sendMessage(message, chatFrom, client, playerId, roomId)\n    {\n        if(!client){\n            Logger.critical('Client undefined for message.', message, chatFrom, client);\n            return false;\n        }\n        let messageObject = MessageFactory.create(\n            ChatConst.TYPES.TEAMS,\n            message,\n            {},\n            chatFrom\n        );\n        client.send('*', messageObject);\n        if(!playerId){\n            Logger.error('Undefined playerId for save chat message.', message);\n            return false;\n        }\n        if(!roomId){\n            Logger.error('Undefined roomId for save chat message.', message);\n            return false;\n        }\n        let saveResult = await this.chatPlugin.chatManager.saveMessage(\n            message,\n            playerId,\n            roomId,\n            false,\n            ChatConst.TYPES.TEAMS\n        );\n        if(!saveResult){\n            Logger.error('Save team chat message error.', messageObject, playerId, roomId);\n        }\n    }\n\n}\n\nmodule.exports.ChatMessageActions = ChatMessageActions;\n"
  },
  {
    "path": "lib/teams/server/message-actions/clan-create.js",
    "content": "/**\n *\n * Reldens - ClanCreate\n *\n * Handles clan creation requests from players.\n * Validates clan name, creates clan and owner membership records, and initializes the clan instance.\n *\n */\n\nconst { ClanFactory } = require('../clan-factory');\nconst { TeamsConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass ClanCreate\n{\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async execute(client, data, room, playerSchema, teamsPlugin)\n    {\n        let clanName = sc.cleanMessage(\n            data[TeamsConst.ACTIONS.CLAN_NAME],\n            room.config.getWithoutLogs('server/clan/settings/nameLimit', TeamsConst.NAME_LIMIT)\n        );\n        if(!clanName){\n            Logger.info('The provided clan name is invalid.');\n            return this.clanCreateSend(client, TeamsConst.VALIDATION.CREATE_ERROR, clanName);\n        }\n        let clanRepository = teamsPlugin.dataServer.getEntity('clan');\n        let exists = await clanRepository.loadOneBy('name', clanName);\n        if(exists){\n            Logger.info('Clan name \"'+clanName+'\" is already taken.');\n            return this.clanCreateSend(client, TeamsConst.VALIDATION.NAME_EXISTS, clanName);\n        }\n       let firstLevel = await this.fetchInitialLevel(teamsPlugin);\n        if(!firstLevel){\n            Logger.info('Clan creation invalid level \"'+clanName+'\".');\n            return this.clanCreateSend(client, TeamsConst.VALIDATION.LEVEL_ISSUE, clanName);\n        }\n        let playerId = playerSchema.player_id;\n        let createdClanModel = false;\n        try {\n            createdClanModel = await clanRepository.create({\n                name: clanName,\n                owner_id: playerId,\n                points: room.config.getWithoutLogs(\n                    'server/clan/settings/startingPoints',\n                    TeamsConst.CLAN_STARTING_POINTS\n                ),\n                level: firstLevel.key\n            });\n        } catch (error) {\n            Logger.warning('Clan create storage error.', error);\n        }\n        if(!createdClanModel){\n            Logger.info('Clan creation error \"'+clanName+'\".', createdClanModel);\n            return this.clanCreateSend(client, TeamsConst.VALIDATION.CREATE_ERROR, clanName);\n        }\n        let clanId = createdClanModel.id;\n        let ownerMember = await teamsPlugin.dataServer.getEntity('clanMembers').create({\n            clan_id: clanId,\n            player_id: playerId\n        });\n        if(!ownerMember){\n            Logger.info('Clan owner creation error \"'+clanName+'\".', createdClanModel, ownerMember);\n            return this.clanCreateSend(client, TeamsConst.VALIDATION.CREATE_OWNER_ERROR, clanName);\n        }\n        playerSchema.setPrivate('clan', clanId);\n        let createdClan = await ClanFactory.create(\n            clanId,\n            playerSchema,\n            client,\n            room.config.get('client/ui/teams/sharedProperties'),\n            teamsPlugin\n        );\n        if(!createdClan){\n            Logger.error('Clan \"'+clanName+'\" could not be created.');\n            return false;\n        }\n        Logger.info('New clan created \"'+clanName+'\" with ID \"'+clanId+'\", by player ID \"'+playerId+'\".');\n        return this.clanCreateSend(\n            client,\n            TeamsConst.VALIDATION.SUCCESS,\n            clanName,\n            playerId,\n            clanId\n        );\n    }\n\n    /**\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<Object|boolean>}\n     */\n    static async fetchInitialLevel(teamsPlugin)\n    {\n        let levelsRepository = teamsPlugin.dataServer.getEntity('clanLevels');\n        levelsRepository.limit = 1;\n        levelsRepository.sortBy = 'key';\n        let firstLevel = await levelsRepository.loadOne({});\n        levelsRepository.limit = 0;\n        levelsRepository.sortBy = false;\n        return firstLevel;\n    }\n\n    /**\n     * @param {Object} client\n     * @param {string} result\n     * @param {string} clanName\n     * @param {number|string} ownerId\n     * @param {number|string} clanId\n     * @returns {boolean}\n     */\n    static clanCreateSend(client, result, clanName, ownerId, clanId)\n    {\n        // @TODO - BETA - Include additional event before send.\n        let sendData = {\n            act: TeamsConst.ACTIONS.CLAN_CREATE,\n            listener: TeamsConst.CLAN_KEY,\n            clanName,\n            result\n        };\n        if(ownerId){\n            sendData.ownerId = ownerId;\n        }\n        if(clanId){\n            sendData.id = clanId;\n        }\n        client.send('*', sendData);\n        return true;\n    }\n\n}\n\nmodule.exports.ClanCreate = ClanCreate;\n"
  },
  {
    "path": "lib/teams/server/message-actions/clan-disconnect.js",
    "content": "/**\n *\n * Reldens - ClanDisconnect\n *\n * Handles player disconnection from a clan when leaving the game.\n * Removes player from active clan members, sends disconnect updates, and manages clan cleanup.\n *\n */\n\nconst { ClanUpdatesHandler } = require('../clan-updates-handler');\nconst { TeamsConst } = require('../../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass ClanDisconnect\n{\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async execute(playerSchema, teamsPlugin)\n    {\n        // @TODO - BETA - Consider extend TeamLeave.\n        if(!playerSchema){\n            //Logger.debug('Player already left, will not disconnect from clan.');\n            return false;\n        }\n        if(playerSchema?.physicalBody?.isChangingScene){\n            //Logger.debug('Player is changing scene, avoid disconnect clan update.');\n            return false;\n        }\n        let clanId = playerSchema?.privateData?.clan;\n        if(!clanId){\n            Logger.debug('Clan ID not found in current player ID \"'+playerSchema.player_id+'\" for disconnection.');\n            return false;\n        }\n        let clan = teamsPlugin.clans[clanId];\n        if(!clan){\n            Logger.error('Player \"'+playerSchema.player_id+'\" current clan \"'+clanId+'\" not found for disconnection.');\n            return false;\n        }\n        // @NOTE: the way this works is by making the clients leave the clan and then updating the remaining players.\n        let playerId = playerSchema.player_id;\n        let client = clan.clients[playerId];\n        if(1 === client?.ref?.readyState){\n            let sendUpdate = {\n                act: TeamsConst.ACTIONS.CLAN_LEFT,\n                id: clan.owner.player_id,\n                listener: TeamsConst.KEY\n            };\n            await teamsPlugin.events.emit('reldens.clanDisconnectBeforeSendUpdate', {\n                playerId,\n                sendUpdate,\n                playerSchema,\n                teamsPlugin\n            });\n            client.send('*', sendUpdate);\n        }\n        clan.disconnect(clan.players[playerId]);\n        let afterDisconnectKeys = Object.keys(clan.players);\n        if(0 === afterDisconnectKeys.length){\n            Logger.info('Last player on clan disconnected.');\n            delete teamsPlugin.clans[clanId];\n            return true;\n        }\n        let event = {playerSchema, teamsPlugin, continueLeave: true};\n        await teamsPlugin.events.emit('reldens.clanDisconnectAfterSendUpdate', event);\n        if(!event.continueLeave){\n            Logger.info('Stopped event \"clanDisconnectAfterSendUpdate\".');\n            return false;\n        }\n        return ClanUpdatesHandler.updateClanPlayers(clan);\n    }\n\n}\n\nmodule.exports.ClanDisconnect = ClanDisconnect;\n"
  },
  {
    "path": "lib/teams/server/message-actions/clan-join.js",
    "content": "/**\n *\n * Reldens - ClanJoin\n *\n * Handles player joining a clan after accepting an invitation.\n * Creates clan membership record, manages previous clan membership, and broadcasts updates to clan members.\n *\n */\n\nconst { ClanUpdatesHandler } = require('../clan-updates-handler');\nconst { ClanLeave } = require('./clan-leave');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass ClanJoin\n{\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async execute(client, data, room, playerSchema, teamsPlugin)\n    {\n        let clanToJoin = teamsPlugin.clans[data.id];\n        if(!clanToJoin?.pendingInvites[playerSchema.player_id]){\n            Logger.error('Player trying to join a clan without invite.');\n            return false;\n        }\n        let previousClanId = playerSchema.getPrivate('clan');\n        if(previousClanId){\n            await ClanLeave.execute(playerSchema, teamsPlugin);\n        }\n        let eventBeforeJoin = {clanToJoin, teamsPlugin, continueBeforeJoin: true};\n        await teamsPlugin.events.emit('reldens.beforeClanJoin', eventBeforeJoin);\n        if(!eventBeforeJoin.continueBeforeJoin){\n            return false;\n        }\n        let result = await teamsPlugin.dataServer.getEntity('clanMembers').create({\n            player_id: playerSchema.player_id,\n            clan_id: clanToJoin.id\n        });\n        if(!result){\n            Logger.critical('Clan member could not be created.', playerSchema?.id, clanToJoin?.id);\n            return false;\n        }\n        let newMemberModel = await teamsPlugin.dataServer.getEntity('clanMembers').loadOneByWithRelations(\n            {player_id: playerSchema.player_id, clan_id: clanToJoin.id},\n            ['related_players']\n        );\n        clanToJoin.join(\n            playerSchema,\n            client,\n            // @TODO - BETA - Replace this query with a constructed member, use the exiting player model and the result.\n            newMemberModel\n        );\n        playerSchema.setPrivate('clan', clanToJoin.id);\n        let eventBeforeJoinUpdate = {clanToJoin, teamsPlugin, continueBeforeJoinUpdate: true};\n        await teamsPlugin.events.emit('reldens.beforeClanUpdatePlayers', eventBeforeJoinUpdate);\n        if(!eventBeforeJoinUpdate.continueBeforeJoinUpdate){\n            return false;\n        }\n        let updatedClan = ClanUpdatesHandler.updateClanPlayers(clanToJoin);\n        if(updatedClan){\n            await teamsPlugin.events.emit('reldens.afterPlayerJoinedClan', { playerJoining: playerSchema, clan: clanToJoin });\n        }\n        return updatedClan;\n    }\n\n}\n\nmodule.exports.ClanJoin = ClanJoin;\n"
  },
  {
    "path": "lib/teams/server/message-actions/clan-leave.js",
    "content": "/**\n *\n * Reldens - ClanLeave\n *\n * Handles player leaving or being removed from a clan.\n * Manages clan disbanding when owner leaves, removes clan membership records, and broadcasts updates.\n *\n */\n\nconst { ClanUpdatesHandler } = require('../clan-updates-handler');\nconst { TeamsConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass ClanLeave\n{\n\n    /**\n     * @param {Object} message\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async fromMessage(message, playerSchema, teamsPlugin)\n    {\n        await teamsPlugin.events.emit('reldens.clanLeave', {message, playerSchema, teamsPlugin});\n        let clanId = playerSchema?.privateData?.clan;\n        if(!clanId){\n            Logger.warning('From message, clan ID not found in current player for \"leave\".', playerSchema?.player_id);\n            return false;\n        }\n        let currentClan = teamsPlugin.clans[clanId];\n        let playerSchemaId = playerSchema.player_id.toString();\n        if(!currentClan){\n            Logger.error('Player \"'+playerSchemaId+'\" current clan \"'+clanId+'\" not found.');\n            return false;\n        }\n        let isPlayerFromClan = message.id === playerSchema.getPrivate('clan');\n        let isClanOwner = currentClan.owner.player_id.toString() === playerSchemaId;\n        if(TeamsConst.ACTIONS.CLAN_REMOVE === message.act && (!isPlayerFromClan || !isClanOwner)){\n            Logger.error('Clan remove failed, player \"'+playerSchema.playerName+'\" not allowed.');\n            return false;\n        }\n        let singleRemoveId = sc.get(message, 'remove', playerSchema.player_id);\n        return await this.execute(playerSchema, teamsPlugin, singleRemoveId);\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @param {number|string} singleRemoveId\n     * @returns {Promise<boolean>}\n     */\n    static async execute(playerSchema, teamsPlugin, singleRemoveId)\n    {\n        let clanId = playerSchema?.privateData?.clan;\n        if(!clanId){\n            Logger.warning('Clan ID not found in current player for \"leave\".', playerSchema?.player_id);\n            return false;\n        }\n        let currentClan = teamsPlugin.clans[clanId];\n        let playerSchemaId = playerSchema.player_id.toString();\n        if(!currentClan){\n            Logger.error('Player \"'+playerSchemaId+'\" current clan \"'+clanId+'\" not found.');\n            return false;\n        }\n        let clanOwnerPlayerId = currentClan.owner.player_id.toString();\n        let disbandClan = playerSchemaId === clanOwnerPlayerId;\n        let removeByKeys = disbandClan && singleRemoveId !== clanOwnerPlayerId\n            ? [singleRemoveId]\n            : (disbandClan ? Object.keys(currentClan.players) : [playerSchemaId]);\n        for(let playerId of removeByKeys){\n            let sendUpdate = {\n                act: TeamsConst.ACTIONS.CLAN_REMOVED,\n                id: clanOwnerPlayerId,\n                listener: TeamsConst.CLAN_KEY\n            };\n            await teamsPlugin.events.emit('reldens.clanLeaveBeforeSendUpdate', {\n                playerId,\n                sendUpdate,\n                currentClan,\n                disbandClan,\n                singleRemoveId,\n                playerSchema,\n                teamsPlugin\n            });\n            currentClan.clients[playerId].send('*', sendUpdate);\n            currentClan.leave(currentClan.players[playerId]);\n            let clanMembersRepository = teamsPlugin.dataServer.getEntity('clanMembers');\n            await clanMembersRepository.delete({player_id: Number(playerId), clan_id: Number(clanId)});\n        }\n        if(0 === Object.keys(currentClan.members).length){\n            let event = {singleRemoveId, playerSchema, teamsPlugin, continueDisband: true};\n            await teamsPlugin.events.emit('reldens.beforeClanDisband', event);\n            if(!event.continueDisband){\n                return false;\n            }\n            delete teamsPlugin.clans[clanId];\n            await teamsPlugin.dataServer.getEntity('clan').deleteById(clanId);\n            return true;\n        }\n        let event = {singleRemoveId, playerSchema, teamsPlugin, continueLeave: true};\n        await teamsPlugin.events.emit('reldens.clanLeaveAfterSendUpdate', event);\n        if(!event.continueLeave){\n            return false;\n        }\n        return ClanUpdatesHandler.updateClanPlayers(currentClan);\n    }\n\n}\n\nmodule.exports.ClanLeave = ClanLeave;\n"
  },
  {
    "path": "lib/teams/server/message-actions/team-join.js",
    "content": "/**\n *\n * Reldens - TeamJoin\n *\n * Handles player joining a team.\n * Creates new team if needed, manages team membership, and broadcasts updates to team members.\n *\n */\n\nconst { Team } = require('../team');\nconst { TeamUpdatesHandler } = require('../team-updates-handler');\nconst { TeamLeave } = require('./team-leave');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass TeamJoin\n{\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async execute(client, data, room, playerSchema, teamsPlugin)\n    {\n        if(playerSchema.player_id === data.id){\n            Logger.info('The player is trying to join a team with himself.', playerSchema.player_id, data);\n            return false;\n        }\n        if(playerSchema.currentTeam){\n            await TeamLeave.execute(room, playerSchema, teamsPlugin);\n        }\n        // TODO - BETA - Replace to improve performance.\n        let teamOwnerPlayer = room.playerByPlayerIdFromState(data.id);\n        if(!teamOwnerPlayer){\n            Logger.error('Player team owner not found.', teamOwnerPlayer, data);\n            return false;\n        }\n        if(teamOwnerPlayer.currentTeam && teamOwnerPlayer.currentTeam !== data.id){\n            Logger.info('Player was already in a team, leaving Team ID \"'+teamOwnerPlayer.currentTeam+'\"');\n            await TeamLeave.execute(room, teamOwnerPlayer, teamsPlugin);\n        }\n        let teamOwnerClient = room.activePlayerByPlayerId(data.id, room.roomId)?.client;\n        if(!teamOwnerClient){\n            Logger.error('Team join, player owner client not found.', teamOwnerClient, data);\n            return false;\n        }\n        let teamProps = {\n            owner: teamOwnerPlayer,\n            ownerClient: teamOwnerClient,\n            sharedProperties: room.config.get('client/ui/teams/sharedProperties')\n        };\n        let currentTeam = teamsPlugin.teams[teamOwnerPlayer.player_id];\n        if(!currentTeam){\n            let beforeCreateEvent = {teamProps, teamsPlugin, continueBeforeCreate: true};\n            await teamsPlugin.events.emit('reldens.beforeTeamCreate', beforeCreateEvent);\n            if(!beforeCreateEvent.continueBeforeCreate){\n                return false;\n            }\n            currentTeam = new Team(teamProps);\n        }\n        let eventBeforeJoin = {currentTeam, teamsPlugin, continueBeforeJoin: true};\n        await teamsPlugin.events.emit('reldens.beforeTeamJoin', eventBeforeJoin);\n        if(!eventBeforeJoin.continueBeforeJoin){\n            return false;\n        }\n        currentTeam.join(playerSchema, client);\n        teamOwnerPlayer.currentTeam = teamOwnerPlayer.player_id;\n        playerSchema.currentTeam = teamOwnerPlayer.player_id;\n        teamsPlugin.teams[teamOwnerPlayer.player_id] = currentTeam;\n        let eventBeforeJoinUpdate = {currentTeam, teamsPlugin, continueBeforeJoinUpdate: true};\n        await teamsPlugin.events.emit('reldens.beforeTeamUpdatePlayers', eventBeforeJoinUpdate);\n        if(!eventBeforeJoinUpdate.continueBeforeJoinUpdate){\n            return false;\n        }\n        let updateSuccess = TeamUpdatesHandler.updateTeamPlayers(currentTeam);\n        if(updateSuccess){\n            await teamsPlugin.events.emit('reldens.afterPlayerJoinedTeam', {currentTeam, playerJoining: playerSchema});\n        }\n        return updateSuccess;\n    }\n\n}\n\nmodule.exports.TeamJoin = TeamJoin;\n"
  },
  {
    "path": "lib/teams/server/message-actions/team-leave.js",
    "content": "/**\n *\n * Reldens - TeamLeave\n *\n * Handles player leaving or being removed from a team.\n * Manages team disbanding when conditions are met and broadcasts updates to remaining members.\n *\n */\n\nconst { TeamUpdatesHandler } = require('../team-updates-handler');\nconst { TeamsConst } = require('../../constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass TeamLeave\n{\n\n    /**\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async fromMessage(data, room, playerSchema, teamsPlugin)\n    {\n        await teamsPlugin.events.emit('reldens.teamLeave', {data, room, playerSchema, teamsPlugin});\n        let singleRemoveId = sc.get(data, 'remove', false);\n        if(TeamsConst.ACTIONS.TEAM_REMOVE === data.act){\n            if(data.id !== playerSchema.player_id){\n                Logger.error('Team remove failed, player \"'+playerSchema.playerName+'\" not allowed.');\n                return false;\n            }\n            if(!singleRemoveId){\n                Logger.error('Team remove failed, missing single remove ID.', data);\n                return false;\n            }\n        }\n        if(TeamsConst.ACTIONS.TEAM_LEAVE === data.act && !singleRemoveId && playerSchema.player_id !== data.id){\n            singleRemoveId = playerSchema.player_id;\n        }\n        return await this.execute(room, playerSchema, teamsPlugin, singleRemoveId);\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @param {number|string|boolean} singleRemoveId\n     * @returns {Promise<boolean>}\n     */\n    static async execute(room, playerSchema, teamsPlugin, singleRemoveId)\n    {\n        let teamId = playerSchema.currentTeam;\n        if(!teamId){\n            return false;\n        }\n        let currentTeam = teamsPlugin.teams[teamId];\n        if(!currentTeam){\n            Logger.error('Player \"'+playerSchema.player_id+'\" current team \"'+teamId+'\" not found.');\n            playerSchema.currentTeam = false;\n            return false;\n        }\n        // @NOTE: the way this works is by making the clients leave the team and then updating the remaining players.\n        let playerIds = Object.keys(currentTeam.players);\n        let isOwnerDisbanding = playerSchema.player_id === teamId && !singleRemoveId;\n        let areLessPlayerThanRequired = 2 >= playerIds.length;\n        let removeByKeys = isOwnerDisbanding || areLessPlayerThanRequired ? playerIds : [singleRemoveId];\n        for(let playerId of removeByKeys){\n            if(1 === currentTeam.clients[playerId]?.ref?.readyState){\n                let sendUpdate = {\n                    act: TeamsConst.ACTIONS.TEAM_LEFT,\n                    id: currentTeam.owner.player_id,\n                    listener: TeamsConst.KEY\n                };\n                await teamsPlugin.events.emit('reldens.teamLeaveBeforeSendUpdate', {\n                    playerId,\n                    sendUpdate,\n                    currentTeam,\n                    isOwnerDisbanding,\n                    areLessPlayerThanRequired,\n                    singleRemoveId,\n                    room,\n                    playerSchema,\n                    teamsPlugin\n                });\n                currentTeam.clients[playerId].send('*', sendUpdate);\n            }\n            let leavingPlayerName = currentTeam.players[playerId].playerName;\n            currentTeam.leave(currentTeam.players[playerId]);\n            await teamsPlugin.events.emit('reldens.afterTeamLeave', {currentTeam, leavingPlayerName});\n        }\n        if(1 >= Object.keys(currentTeam.players).length){\n            let event = {singleRemoveId, room, playerSchema, teamsPlugin, continueDisband: true};\n            await teamsPlugin.events.emit('reldens.beforeTeamDisband', event);\n            if(!event.continueDisband){\n                return false;\n            }\n            delete teamsPlugin.teams[teamId];\n            return true;\n        }\n        let event = {singleRemoveId, room, playerSchema, teamsPlugin, continueLeave: true};\n        await teamsPlugin.events.emit('reldens.beforeTeamDisband', event);\n        if(!event.continueLeave){\n            return false;\n        }\n        return TeamUpdatesHandler.updateTeamPlayers(currentTeam);\n    }\n\n}\n\nmodule.exports.TeamLeave = TeamLeave;\n"
  },
  {
    "path": "lib/teams/server/message-actions/try-clan-invite.js",
    "content": "/**\n *\n * Reldens - TryClanInvite\n *\n * Handles clan invitation requests from clan members.\n * Validates the invitation, checks clan membership, and sends clan invite message to the target player.\n *\n */\n\nconst { TeamsConst } = require('../../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass TryClanInvite\n{\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async execute(client, data, room, playerSchema, teamsPlugin)\n    {\n        // @TODO - BETA - Replace send data by short constants so we will know like \"data.id\" here is the target ID.\n        if(playerSchema.player_id === data.id){\n            Logger.info('The player is trying to clan up with himself.', playerSchema.player_id, data);\n            return false;\n        }\n        let clanId = playerSchema.getPrivate('clan');\n        if(!clanId){\n            Logger.error('Player without a clan is trying to send a clan invite.', playerSchema.player_id, data);\n            return false;\n        }\n        let clan = teamsPlugin.clans[clanId];\n        if(!clan){\n            Logger.critical(\n                'Player has a clan ID but clan entity does not exists on TeamsPlugin.',\n                playerSchema.sessionId,\n                playerSchema.player_id,\n                data,\n                {availableClans: Object.keys(teamsPlugin.clans)}\n            );\n            return false;\n        }\n        let toPlayerClient = room.activePlayerByPlayerId(data.id, room.roomId)?.client;\n        if(!toPlayerClient){\n            Logger.error('Clan invite player not found.', toPlayerClient, data);\n            return false;\n        }\n        if(clan.playerBySessionId(data.id)){\n            Logger.info('Player already exists in clan.');\n            return false;\n        }\n        let sendData = {\n            act: TeamsConst.ACTIONS.CLAN_INVITE,\n            listener: TeamsConst.CLAN_KEY,\n            from: playerSchema.playerName,\n            id: clan.id,\n            ownerId: playerSchema.player_id\n        };\n        let event = {client, data, room, playerSchema, teamsPlugin, continueStart: true};\n        await teamsPlugin.events.emit('reldens.tryClanStart', event);\n        if(!event.continueStart){\n            return false;\n        }\n        toPlayerClient.send('*', sendData);\n        clan.pendingInvites[data.id] = true;\n        return true;\n    }\n}\n\nmodule.exports.TryClanInvite = TryClanInvite;\n"
  },
  {
    "path": "lib/teams/server/message-actions/try-team-start.js",
    "content": "/**\n *\n * Reldens - TryTeamStart\n *\n * Handles team invitation requests from players.\n * Validates the invitation and sends team invite message to the target player.\n *\n */\n\nconst { TeamsConst } = require('../../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../../../rooms/server/scene').RoomScene} RoomScene\n * @typedef {import('../plugin').TeamsPlugin} TeamsPlugin\n */\nclass TryTeamStart\n{\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {PlayerState} playerSchema\n     * @param {TeamsPlugin} teamsPlugin\n     * @returns {Promise<boolean>}\n     */\n    static async execute(client, data, room, playerSchema, teamsPlugin)\n    {\n        if(playerSchema.player_id === data.id){\n            Logger.info('The player is trying to team up with himself.', playerSchema.player_id, data);\n            return false;\n        }\n        let toPlayerClient = room.activePlayerByPlayerId(data.id, room.roomId)?.client;\n        if(!toPlayerClient){\n            Logger.error('Team invite player not found.', toPlayerClient, data);\n            return false;\n        }\n        let sendData = {\n            act: TeamsConst.ACTIONS.TEAM_INVITE,\n            listener: TeamsConst.KEY,\n            from: playerSchema.playerName,\n            id: playerSchema.player_id,\n        };\n        let event = {client, data, room, playerSchema, teamsPlugin, continueStart: true};\n        await teamsPlugin.events.emit('reldens.tryTeamStart', event);\n        if(!event.continueStart){\n            return false;\n        }\n        toPlayerClient.send('*', sendData);\n        return true;\n    }\n}\n\nmodule.exports.TryTeamStart = TryTeamStart;\n"
  },
  {
    "path": "lib/teams/server/players-data-mapper.js",
    "content": "/**\n *\n * Reldens - PlayersDataMapper\n *\n * Maps player data for team and clan updates.\n * Extracts and formats player information including shared properties for client transmission.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('./team').Team} Team\n * @typedef {import('./clan').Clan} Clan\n */\nclass PlayersDataMapper\n{\n\n    /**\n     * @param {Team|Clan} team\n     * @returns {Object}\n     */\n    static fetchPlayersData(team)\n    {\n        let teamPlayersId = Object.keys(team.players);\n        let playersData = {};\n        for(let i of teamPlayersId){\n            playersData[i] = this.fetchPlayerData(team.players[i], team.sharedProperties);\n        }\n        return playersData;\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @param {Object} sharedProperties\n     * @returns {Object}\n     */\n    static fetchPlayerData(playerSchema, sharedProperties)\n    {\n        let playerData = {\n            name: playerSchema.playerName,\n            player_id: playerSchema.player_id,\n            sessionId: playerSchema.sessionId,\n            sharedProperties: {}\n        };\n        for(let i of Object.keys(sharedProperties)){\n            let propertyData = sharedProperties[i];\n            playerData.sharedProperties[i] = {\n                label: propertyData.label,\n                value: sc.getByPath(playerSchema, propertyData.path.split('/'), 0),\n            };\n            let pathMax = sc.get(propertyData, 'pathMax', '');\n            if('' !== pathMax){\n                playerData.sharedProperties[i].max = sc.getByPath(playerSchema, pathMax.split('/'), 0);\n            }\n        }\n        return playerData;\n    }\n\n}\n\nmodule.exports.PlayersDataMapper = PlayersDataMapper;\n"
  },
  {
    "path": "lib/teams/server/plugin.js",
    "content": "/**\n *\n * Reldens - Teams Server Plugin.\n *\n * Initializes and manages the teams and clans system on the server side.\n * Handles team and clan message actions, player creation with clan/team membership,\n * stats updates, room transitions, and integration with the chat system.\n *\n */\n\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { ClanMessageActions } = require('./clan-message-actions');\nconst { TeamMessageActions } = require('./team-message-actions');\nconst { CreatePlayerClanHandler } = require('./event-handlers/create-player-clan-handler');\nconst { CreatePlayerTeamHandler } = require('./event-handlers/create-player-team-handler');\nconst { StatsUpdateHandler } = require('./event-handlers/stats-update-handler');\nconst { EndPlayerHitChangePointTeamHandler } = require('./event-handlers/end-player-hit-change-point-team-handler');\nconst { TeamLeave } = require('./message-actions/team-leave');\nconst { ClanDisconnect } = require('./message-actions/clan-disconnect');\nconst { ChatMessageActions } = require('./message-actions/chat-message-actions');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('./event-handlers/create-player-clan-handler').CreatePlayerClanHandler} CreatePlayerClanHandler\n * @typedef {import('../../chat/server/plugin').ChatPlugin} ChatPlugin\n */\nclass TeamsPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<boolean>}\n     */\n    async setup(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in TeamsPlugin.');\n            return false;\n        }\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in TeamsPlugin.');\n            return false;\n        }\n        /** @type {Object} */\n        this.teams = sc.get(props, 'teams', {});\n        /** @type {Object} */\n        this.clans = sc.get(props, 'clans', {});\n        /** @type {Object} */\n        this.teamChangingRoomPlayers = sc.get(props, 'teamChangingRoomPlayers', {});\n        /** @type {Object} */\n        this.clanChangingRoomPlayers = sc.get(props, 'clanChangingRoomPlayers', {});\n        /** @type {CreatePlayerClanHandler} */\n        this.createPlayerClanHandler = new CreatePlayerClanHandler(props.config, this);\n        this.events.on('reldens.roomsMessageActionsGlobal', (roomMessageActions) => {\n            roomMessageActions.teams = new TeamMessageActions({teamsPlugin: this});\n            roomMessageActions.clan = new ClanMessageActions({teamsPlugin: this});\n        });\n        this.events.on('reldens.createPlayerAfter', async (client, userModel, playerSchema, room) => {\n            await this.createPlayerClanHandler.enrichPlayerWithClan(client, playerSchema, room, this);\n            await CreatePlayerTeamHandler.joinExistentTeam(client, playerSchema, this);\n        });\n        this.events.on('reldens.savePlayerStatsUpdateClient', async (client, playerSchema) => {\n            await StatsUpdateHandler.updateTeam({teamsPlugin: this, playerSchema});\n            await StatsUpdateHandler.updateClan({teamsPlugin: this, playerSchema});\n        });\n        this.events.on('reldens.endPlayerHitChangePoint', async (event) => {\n            await EndPlayerHitChangePointTeamHandler.savePlayerTeam(event.playerSchema, this);\n        });\n        this.events.on('reldens.removePlayerBefore', async(event) => {\n            await TeamLeave.execute(event.room, event.playerSchema, this);\n            await ClanDisconnect.execute(event.playerSchema, this);\n        });\n        /** @type {ChatPlugin|undefined} */\n        this.chatPlugin = props.featuresManager.featuresList?.chat?.package;\n        if(this.chatPlugin){\n            let chatMessageActions = new ChatMessageActions({events: this.events, chatPlugin: this.chatPlugin});\n            chatMessageActions.listenEvents();\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.TeamsPlugin = TeamsPlugin;\n"
  },
  {
    "path": "lib/teams/server/team-message-actions.js",
    "content": "/**\n *\n * Reldens - TeamMessageActions\n *\n * Handles team-related message actions from clients.\n * Routes team invitations, joins, leaves, and removals to appropriate handlers.\n *\n */\n\nconst { TryTeamStart } = require('./message-actions/try-team-start');\nconst { TeamJoin } = require('./message-actions/team-join');\nconst { TeamLeave } = require('./message-actions/team-leave');\nconst { TeamsConst } = require('../constants');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./plugin').TeamsPlugin} TeamsPlugin\n * @typedef {import('../../rooms/server/state').PlayerState} PlayerState\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass TeamMessageActions\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {TeamsPlugin} */\n        this.teamsPlugin = props.teamsPlugin;\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} data\n     * @param {RoomScene} room\n     * @param {PlayerState} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        if(!sc.hasOwn(data, 'act')){\n            return false;\n        }\n        if(0 !== data.act.indexOf(TeamsConst.TEAM_PREF)){\n            return false;\n        }\n        if(TeamsConst.ACTIONS.TEAM_INVITE === data.act){\n            return await TryTeamStart.execute(client, data, room, playerSchema, this.teamsPlugin);\n        }\n        if(TeamsConst.ACTIONS.TEAM_ACCEPTED === data.act && '1' === data.value){\n            return await TeamJoin.execute(client, data, room, playerSchema, this.teamsPlugin);\n        }\n        if(TeamsConst.ACTIONS.TEAM_ACCEPTED === data.act && '2' === data.value){\n            let playerSendingInvite = room.activePlayerByPlayerId(data.id, room.roomId);\n            if(!playerSendingInvite){\n                // expected when the player disconnects in between the invitation is sent:\n                return false;\n            }\n            let playerRejectingName = playerSchema.playerName;\n            await this.teamsPlugin.events.emit('reldens.teamJoinInviteRejected', {\n                playerSendingInvite,\n                playerRejectingName\n            });\n        }\n        if(TeamsConst.ACTIONS.TEAM_LEAVE === data.act){\n            return await TeamLeave.fromMessage(data, room, playerSchema, this.teamsPlugin);\n        }\n        if(TeamsConst.ACTIONS.TEAM_REMOVE === data.act){\n            return await TeamLeave.fromMessage(data, room, playerSchema, this.teamsPlugin);\n        }\n    }\n\n}\n\nmodule.exports.TeamMessageActions = TeamMessageActions;\n"
  },
  {
    "path": "lib/teams/server/team-updates-handler.js",
    "content": "/**\n *\n * Reldens - TeamUpdatesHandler\n *\n * Handles broadcasting team updates to all team members.\n * Sends player data updates and team status changes to connected clients.\n *\n */\n\nconst { PlayersDataMapper } = require('./players-data-mapper');\nconst { TeamsConst } = require('../constants');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('./team').Team} Team\n */\nclass TeamUpdatesHandler\n{\n\n    /**\n     * @param {Team} team\n     * @returns {boolean}\n     */\n    static updateTeamPlayers(team)\n    {\n        let clientsKeys = Object.keys(team.clients);\n        if(0 === clientsKeys.length){\n            return false;\n        }\n        let playersList = PlayersDataMapper.fetchPlayersData(team);\n        if(0 === Object.keys(playersList).length){\n            Logger.info('Team update without players.', team);\n            return false;\n        }\n        for(let i of clientsKeys){\n            let otherPlayersData = Object.assign({}, playersList);\n            delete otherPlayersData[i];\n            let sendUpdate = Object.assign(\n                {},\n                {\n                    act: this.actionConstant(),\n                    id: team.owner.player_id,\n                    listener: this.listenerKey(),\n                    players: otherPlayersData,\n                    leaderName: team.owner.playerName,\n                }\n            );\n            team.clients[i].send('*', sendUpdate);\n        }\n        return true;\n    }\n\n    /**\n     * @returns {string}\n     */\n    static listenerKey()\n    {\n        return TeamsConst.KEY;\n    }\n\n    /**\n     * @returns {string}\n     */\n    static actionConstant()\n    {\n        return TeamsConst.ACTIONS.TEAM_UPDATE;\n    }\n\n}\n\nmodule.exports.TeamUpdatesHandler = TeamUpdatesHandler;\n"
  },
  {
    "path": "lib/teams/server/team.js",
    "content": "/**\n *\n * Reldens - Team\n *\n * Represents a team of players with shared modifiers and properties.\n * Manages team membership, modifier application/reversion, and client tracking.\n *\n */\n\nconst { ModifierConst } = require('@reldens/modifiers');\nconst { ErrorManager, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/server/state').PlayerState} PlayerState\n */\nclass Team\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {number} */\n        this.level = sc.get(props, 'level', 1);\n        /** @type {Object} */\n        this.modifiers = sc.get(props, 'modifiers', {});\n        /** @type {Object} */\n        this.sharedProperties = sc.get(props, 'sharedProperties', {});\n        /** @type {PlayerState|boolean} */\n        this.owner = sc.get(props, 'owner', false);\n        if(false === this.owner){\n            ErrorManager.error('Team owner undefined.', props);\n        }\n        /** @type {Object|boolean} */\n        this.ownerClient = sc.get(props, 'ownerClient', false);\n        if(false === this.ownerClient){\n            ErrorManager.error('Team owner client undefined.', props);\n        }\n        let players = {};\n        let clients = {};\n        players[this.owner.player_id] = this.owner;\n        clients[this.owner.player_id] = this.ownerClient;\n        /** @type {Object} */\n        this.players = sc.get(props, 'players', players);\n        /** @type {Object} */\n        this.clients = sc.get(props, 'clients', clients);\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @param {Object} client\n     * @returns {boolean}\n     */\n    join(playerSchema, client)\n    {\n        this.players[playerSchema.player_id] = playerSchema;\n        this.clients[playerSchema.player_id] = client;\n        return this.applyModifiers(playerSchema);\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @returns {boolean}\n     */\n    leave(playerSchema)\n    {\n        this.revertModifiers(playerSchema);\n        playerSchema.currentTeam = false;\n        delete this.clients[playerSchema.player_id];\n        delete this.players[playerSchema.player_id];\n        return true;\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @returns {boolean}\n     */\n    applyModifiers(playerSchema)\n    {\n        let modifiersKeys = Object.keys(this.modifiers);\n        if(0 === modifiersKeys.length){\n            return true;\n        }\n        for(let i of modifiersKeys){\n            let modifier = this.modifiers[i];\n            modifier.apply(playerSchema);\n            if(ModifierConst.MOD_APPLIED !== modifier.state){\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {PlayerState} playerSchema\n     * @returns {boolean}\n     */\n    revertModifiers(playerSchema)\n    {\n        let modifiersKeys = Object.keys(this.modifiers);\n        if(0 === modifiersKeys.length){\n            return true;\n        }\n        for(let i of modifiersKeys){\n            let modifier = this.modifiers[i];\n            modifier.revert(playerSchema);\n            if(ModifierConst.MOD_REVERTED !== modifier.state){\n                return false;\n            }\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.Team = Team;"
  },
  {
    "path": "lib/users/client/bar-properties.js",
    "content": "/**\n *\n * Reldens - BarProperties\n *\n * Model for validating and storing bar property configuration.\n *\n */\n\nconst { sc } = require('@reldens/utils');\n\nclass BarProperties\n{\n\n    /**\n     * @param {string} statKey\n     * @param {Object} config\n     */\n    constructor(statKey, config)\n    {\n        this.statKey = statKey;\n        this.enabled = sc.get(config, 'enabled', false);\n        this.label = sc.get(config, 'label', '');\n        this.activeColor = sc.get(config, 'activeColor', '');\n        this.inactiveColor = sc.get(config, 'inactiveColor', '');\n        this.ready = this.enabled && this.label && this.activeColor && this.inactiveColor;\n    }\n\n}\n\nmodule.exports.BarProperties = BarProperties;\n"
  },
  {
    "path": "lib/users/client/lifebar-ui.js",
    "content": "/**\n *\n * Reldens - LifebarUi\n *\n * Manages health/life bar UI for players and objects in the game.\n *\n */\n\nconst { UsersConst } = require('../constants');\nconst { ActionsConst } = require('../../actions/constants');\nconst { GameConst } = require('../../game/constants');\nconst { ObjectsConst } = require('../../objects/constants');\nconst { ObjectsHandler } = require('./objects-handler');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass LifebarUi\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManager} */\n        this.events = props.events;\n    }\n\n    /**\n     * @param {Object} gameManager\n     * @returns {boolean|Object}\n     */\n    createLifeBarUi(gameManager)\n    {\n        // @TODO - BETA - General refactor, extract methods into different services.\n        this.barConfig = gameManager.config.get('client/ui/lifeBar');\n        if(!this.barConfig.enabled){\n            return false;\n        }\n        this.gameManager = gameManager;\n        this.fixedPositionX = false;\n        this.fixedPositionY = false;\n        this.barProperty = this.gameManager.config.get('client/actions/skills/affectedProperty');\n        this.playerSize = this.gameManager.config.get('client/players/size');\n        this.lifeBars = {};\n        this.lifeDataByKey = {};\n        this.listenEvents();\n        return this;\n    }\n\n    listenEvents()\n    {\n        this.events.on('reldens.playerStatsUpdateAfter', (message, roomEvents) => {\n            this.updatePlayerLifeBar(message, roomEvents);\n        });\n        this.events.on('reldens.joinedRoom', (room) => {\n            this.listenMessages(room);\n        });\n        this.events.on('reldens.runPlayerAnimation', (playerEngine, playerId) => {\n            this.drawPlayerLifeBar(playerId);\n        });\n        this.events.on('reldens.updateGameSizeBefore', (gameEngine, newWidth, newHeight) => {\n            this.drawOnGameResize(newWidth, newHeight);\n        });\n        this.events.on('reldens.playersOnRemove', (player, key) => {\n            this.removePlayerLifeBar(key);\n        });\n        this.events.on('reldens.playerEngineAddPlayer', () => {\n            this.processLifeBarQueue();\n        });\n        this.events.on('reldens.createAnimationAfter', () => {\n            ObjectsHandler.drawObjectsLifeBar(this);\n        });\n        this.events.on('reldens.objectBodyChanged', (event) => {\n            ObjectsHandler.generateObjectLifeBar(event.key, this);\n        });\n        this.events.on('reldens.gameEngineShowTarget', (gameEngine, target, previousTarget) => {\n            this.showTargetLifeBar(target, previousTarget);\n        });\n        this.events.on('reldens.gameEngineClearTarget', (gameEngine, previousTarget) => {\n            this.clearPreviousBar(previousTarget);\n        });\n    }\n\n    /**\n     * @param {number} newWidth\n     * @param {number} newHeight\n     * @returns {boolean}\n     */\n    drawOnGameResize(newWidth, newHeight)\n    {\n        if(!this.barConfig.fixedPosition){\n            return false;\n        }\n        this.setPlayerLifeBarFixedPosition(newWidth, newHeight);\n        this.drawPlayerLifeBar(this.gameManager.getCurrentPlayer().playerId);\n    }\n\n    /**\n     * @param {Object} previousTarget\n     * @returns {void}\n     */\n    clearPreviousBar(previousTarget)\n    {\n        if(\n            previousTarget\n            && sc.hasOwn(this.lifeBars, previousTarget.id)\n            && this.gameManager.getCurrentPlayer().playerId !== previousTarget.id\n        ){\n            this.lifeBars[previousTarget.id].destroy();\n        }\n    }\n\n    /**\n     * @param {Object} target\n     * @param {Object} previousTarget\n     * @returns {boolean}\n     */\n    showTargetLifeBar(target, previousTarget)\n    {\n        if(!this.barConfig.showOnClick){\n            return false;\n        }\n        this.clearPreviousBar(previousTarget);\n        if(target.type === ObjectsConst.TYPE_OBJECT){\n            ObjectsHandler.generateObjectLifeBar(target.id, this);\n        }\n        if(target.type === GameConst.TYPE_PLAYER){\n            this.drawPlayerLifeBar(target.id);\n        }\n    }\n\n    /**\n     * @returns {string}\n     */\n    barPropertyValue()\n    {\n        return this.barProperty+'Value';\n    }\n\n    /**\n     * @returns {string}\n     */\n    barPropertyTotal()\n    {\n        return this.barProperty+'Total';\n    }\n\n    /**\n     * @param {number} [newWidth]\n     * @param {number} [newHeight]\n     * @returns {void}\n     */\n    setPlayerLifeBarFixedPosition(newWidth, newHeight)\n    {\n        if(!newWidth || !newHeight){\n            let position = this.gameManager.gameEngine.getCurrentScreenSize(this.gameManager);\n            newWidth = position.newWidth;\n            newHeight = position.newHeight;\n        }\n        let {uiX, uiY} = this.gameManager.gameEngine.uiScene.getUiConfig('lifeBar', newWidth, newHeight);\n        this.fixedPositionX = uiX;\n        this.fixedPositionY = uiY;\n    }\n\n    /**\n     * @param {Object} message\n     * @param {Object} roomEvents\n     * @returns {void}\n     */\n    updatePlayerLifeBar(message, roomEvents)\n    {\n        let currentPlayer = roomEvents.gameManager.getCurrentPlayer();\n        this.updatePlayerBarData(\n            currentPlayer.playerId,\n            message.statsBase[this.barProperty],\n            message.stats[this.barProperty]\n        );\n        this.drawPlayerLifeBar(currentPlayer.playerId);\n    }\n\n    /**\n     * @param {Object} room\n     * @returns {void}\n     */\n    listenMessages(room)\n    {\n        room.onMessage('*', (message) => {\n            this.listenBattleEnd(message);\n            this.listenLifeBarUpdates(message);\n        });\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {boolean}\n     */\n    listenBattleEnd(message)\n    {\n        if(message.act !== ActionsConst.BATTLE_ENDED){\n            return false;\n        }\n        if(!sc.hasOwn(this.lifeBars, message.t)){\n            return false;\n        }\n        this.lifeBars[message.t].destroy();\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {boolean}\n     */\n    listenLifeBarUpdates(message)\n    {\n        if(message.act !== UsersConst.ACTION_LIFEBAR_UPDATE){\n            return false;\n        }\n        ObjectsHandler.processObjectLifeBarMessage(message, true, this);\n        this.processPlayerLifeBarMessage(message, true);\n    }\n\n    /**\n     * @param {string} playerId\n     * @returns {boolean}\n     */\n    canShowPlayerLifeBar(playerId)\n    {\n        let currentPlayer = this.gameManager.getCurrentPlayer();\n        if(!sc.isFunction(currentPlayer?.isDeath)){\n            // expected, when changing scenes the next scene could not be active yet\n            return false;\n        }\n        let isCurrentPlayer = playerId === currentPlayer?.playerId;\n        if(isCurrentPlayer && currentPlayer && (currentPlayer.isDeath() || currentPlayer.isDisabled())){\n            this.lifeBars[playerId]?.setVisible(false);\n            return false;\n        }\n        if(isCurrentPlayer){\n            return this.barConfig.showCurrentPlayer;\n        }\n        if(this.barConfig.showAllPlayers){\n            // @TODO - BETA - Include validation for other players inState.\n            return true;\n        }\n        return this.barConfig.showOnClick && playerId === this.getCurrentTargetId();\n    }\n\n    /**\n     * @param {Object} message\n     * @returns {void}\n     */\n    queueLifeBarMessage(message)\n    {\n        if(!sc.hasOwn(this.gameManager, 'lifeBarQueue')){\n            this.gameManager.lifeBarQueue = [];\n        }\n        this.gameManager.lifeBarQueue.push(message);\n    }\n\n    /**\n     * @param {Object} message\n     * @param {boolean} [queue]\n     * @returns {boolean}\n     */\n    processPlayerLifeBarMessage(message, queue = false)\n    {\n        if(ActionsConst.DATA_TYPE_VALUE_PLAYER !== message[ActionsConst.DATA_OWNER_TYPE]){\n            return false;\n        }\n        let currentPlayer = this.gameManager.getCurrentPlayer();\n        let messageOwnerKey = message[ActionsConst.DATA_OWNER_KEY];\n        if(!currentPlayer || !currentPlayer.players || !currentPlayer.players[messageOwnerKey]){\n            if(queue){\n                this.queueLifeBarMessage(message);\n            }\n            return false;\n        }\n        this.updatePlayerBarData(messageOwnerKey, message.totalValue, message.newValue);\n        if(this.canShowPlayerLifeBar(messageOwnerKey)){\n            this.drawPlayerLifeBar(messageOwnerKey);\n        }\n        return true;\n    }\n\n    /**\n     * @param {string} playerId\n     * @param {number} total\n     * @param {number} newValue\n     * @returns {void}\n     */\n    updatePlayerBarData(playerId, total, newValue)\n    {\n        let currentPlayer = this.gameManager.getCurrentPlayer();\n        currentPlayer.players[playerId][this.barPropertyTotal()] = total;\n        currentPlayer.players[playerId][this.barPropertyValue()] = newValue;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    processLifeBarQueue()\n    {\n        if(0 === this.gameManager.lifeBarQueue.length){\n            return false;\n        }\n        let forDelete = [];\n        for(let message of this.gameManager.lifeBarQueue){\n            if(ObjectsHandler.processObjectLifeBarMessage(message, false, this)){\n                forDelete.push(message);\n            }\n            if(this.processPlayerLifeBarMessage(message, false)){\n                forDelete.push(message);\n            }\n        }\n        if(0 < forDelete.length){\n            this.gameManager.lifeBarQueue = this.gameManager.lifeBarQueue.filter(item => !forDelete.includes(item));\n        }\n    }\n\n    /**\n     * @param {string} playerId\n     * @returns {boolean|Object}\n     */\n    drawPlayerLifeBar(playerId)\n    {\n        this.destroyByKey(playerId);\n        if(!this.canShowPlayerLifeBar(playerId)){\n            this.lifeBars[playerId]?.setVisible(false);\n            return false;\n        }\n        let barData = this.prepareBarData(playerId);\n        let barHeight = this.barConfig.height;\n        let barTop = this.barConfig.top;\n        let fullBarWidth = this.barConfig.width;\n        let uiX = barData.player.x-(fullBarWidth/2);\n        let uiY = barData.player.y-barHeight-barTop+(barData.ownerTop/2);\n        if(playerId === this.gameManager.getCurrentPlayer().playerId && this.barConfig.fixedPosition){\n            // if the position is fixed then the bar has to go on the ui scene:\n            this.lifeBars[playerId] = this.gameManager.getActiveScenePreloader().add.graphics();\n            if(this.fixedPositionX === false || this.fixedPositionY === false){\n                this.setPlayerLifeBarFixedPosition();\n            }\n            uiX = this.fixedPositionX;\n            uiY = this.fixedPositionY;\n        } else {\n            // otherwise, the bar will be added in the current scene:\n            this.lifeBars[playerId] = this.gameManager.getActiveScene().add.graphics();\n        }\n        this.drawBar(this.lifeBars[playerId], barData.fullValue, barData.filledValue, uiX, uiY);\n        return this;\n    }\n\n    /**\n     * @param {string} barKey\n     * @returns {void}\n     */\n    destroyByKey(barKey)\n    {\n        if(sc.hasOwn(this.lifeBars, barKey)){\n            this.lifeBars[barKey].destroy();\n        }\n    }\n\n    /**\n     * @param {string} playerId\n     * @returns {Object}\n     */\n    prepareBarData(playerId)\n    {\n        let player = this.gameManager.getCurrentPlayer().players[playerId];\n        let fullValue = player[this.barPropertyTotal()];\n        let filledValue = player[this.barPropertyValue()];\n        let ownerTop = sc.get(player, 'topOff', 0)-this.playerSize.height;\n        return {player, fullValue, filledValue, ownerTop};\n    }\n\n    /**\n     * @param {string} playerId\n     * @returns {boolean}\n     */\n    removePlayerLifeBar(playerId)\n    {\n        if(!sc.hasOwn(this.lifeBars, playerId)){\n            return false;\n        }\n        this.lifeBars[playerId].destroy();\n        delete this.lifeBars[playerId];\n    }\n\n    /**\n     * @param {Object} lifeBarGraphic\n     * @param {number} fullValue\n     * @param {number} filledValue\n     * @param {number} uiX\n     * @param {number} uiY\n     * @returns {void}\n     */\n    drawBar(lifeBarGraphic, fullValue, filledValue, uiX, uiY)\n    {\n        let barHeight = this.barConfig.height;\n        let fullBarWidth = this.barConfig.width;\n        let filledBarWidth = (filledValue*fullBarWidth)/fullValue;\n        lifeBarGraphic.clear();\n        lifeBarGraphic.fillStyle(parseInt(this.barConfig.fillStyle), 1);\n        lifeBarGraphic.fillRect(uiX, uiY, filledBarWidth, barHeight);\n        lifeBarGraphic.lineStyle(1, parseInt(this.barConfig.lineStyle));\n        lifeBarGraphic.strokeRect(uiX, uiY, fullBarWidth, barHeight);\n        lifeBarGraphic.alpha = 0.6;\n        lifeBarGraphic.setDepth(300000);\n    }\n\n    /**\n     * @returns {string|boolean}\n     */\n    getCurrentTargetId()\n    {\n        return sc.get(this.gameManager.getCurrentPlayer()?.currentTarget, 'id', false);\n    }\n\n    /**\n     * @param {string} objectKey\n     * @returns {Object|boolean}\n     */\n    getObjectByKey(objectKey)\n    {\n        return sc.get(this.gameManager.getActiveScene()?.objectsAnimations, objectKey, false);\n    }\n\n}\n\nmodule.exports.LifebarUi = LifebarUi;\n"
  },
  {
    "path": "lib/users/client/objects-handler.js",
    "content": "/**\n *\n * Reldens - ObjectsHandler\n *\n * Handles object life bar rendering and updates for NPCs and enemies.\n *\n */\n\nconst { ActionsConst } = require('../../actions/constants');\nconst { GameConst } = require('../../game/constants');\n\nclass ObjectsHandler\n{\n\n    /**\n     * @param {Object} message\n     * @param {boolean} [queue]\n     * @param {Object} lifeBarUi\n     * @returns {boolean}\n     */\n    static processObjectLifeBarMessage(message, queue = false, lifeBarUi)\n    {\n        if(!this.isValidMessage(message, lifeBarUi)){\n            return false;\n        }\n        let objectKey = message[ActionsConst.DATA_OWNER_KEY];\n        let barData = {};\n        barData[lifeBarUi.barPropertyTotal()] = message.totalValue;\n        barData[lifeBarUi.barPropertyValue()] = message.newValue;\n        lifeBarUi.lifeDataByKey[objectKey] = barData;\n        let object = lifeBarUi.getObjectByKey(objectKey);\n        if(!object){\n            if(queue){\n                lifeBarUi.queueLifeBarMessage(message);\n            }\n            return false;\n        }\n        this.drawObjectLifeBar(\n            object,\n            message[ActionsConst.DATA_OWNER_KEY],\n            message.totalValue,\n            message.newValue,\n            lifeBarUi\n        );\n        return true;\n    }\n\n    /**\n     * @param {Object} message\n     * @param {Object} lifeBarUi\n     * @returns {boolean}\n     */\n    static isValidMessage(message, lifeBarUi)\n    {\n        return ActionsConst.DATA_TYPE_VALUE_OBJECT === message[ActionsConst.DATA_OWNER_TYPE]\n            && lifeBarUi.barConfig.showEnemies;\n    }\n\n    /**\n     * @param {Object} lifeBarUi\n     * @returns {void}\n     */\n    static drawObjectsLifeBar(lifeBarUi)\n    {\n        for(let objectKey of Object.keys(lifeBarUi.lifeDataByKey)){\n            let object = lifeBarUi.getObjectByKey(objectKey);\n            this.drawObjectLifeBar(\n                object,\n                objectKey,\n                lifeBarUi.lifeDataByKey[objectKey][lifeBarUi.barPropertyTotal()],\n                lifeBarUi.lifeDataByKey[objectKey][lifeBarUi.barPropertyValue()],\n                lifeBarUi\n            );\n        }\n    }\n\n    /**\n     * @param {Object} object\n     * @param {string} key\n     * @param {Object} lifeBarUi\n     * @returns {boolean}\n     */\n    static isValidToDraw(object, key, lifeBarUi)\n    {\n        if(!object){\n            return false;\n        }\n        if(GameConst.STATUS.DEATH === object.inState || GameConst.STATUS.DISABLED === object.inState){\n            return false;\n        }\n        return !(lifeBarUi.barConfig.showOnClick && key !== lifeBarUi.getCurrentTargetId());\n    }\n\n    /**\n     * @param {string} objectKey\n     * @param {Object} lifeBarUi\n     * @returns {boolean|void}\n     */\n    static generateObjectLifeBar(objectKey, lifeBarUi)\n    {\n        let lifeBarData = lifeBarUi.lifeDataByKey[objectKey];\n        if(!lifeBarData){\n            return false;\n        }\n        let object = lifeBarUi.getObjectByKey(objectKey);\n        this.drawObjectLifeBar(\n            object,\n            objectKey,\n            lifeBarData[lifeBarUi.barPropertyTotal()],\n            lifeBarData[lifeBarUi.barPropertyValue()],\n            lifeBarUi\n        );\n    }\n\n    /**\n     * @param {Object} object\n     * @param {string} objectKey\n     * @param {number} totalValue\n     * @param {number} newValue\n     * @param {Object} lifeBarUi\n     * @returns {boolean|void}\n     */\n    static drawObjectLifeBar(object, objectKey, totalValue, newValue, lifeBarUi)\n    {\n        lifeBarUi.destroyByKey(objectKey);\n        if(!this.isValidToDraw(object, objectKey, lifeBarUi)){\n            return false;\n        }\n        this.drawLifeBarInPosition(lifeBarUi, objectKey, object, totalValue, newValue);\n    }\n\n    /**\n     * @param {Object} lifeBarUi\n     * @param {string} key\n     * @param {Object} object\n     * @param {number} totalValue\n     * @param {number} newValue\n     * @returns {void}\n     */\n    static drawLifeBarInPosition(lifeBarUi, key, object, totalValue, newValue)\n    {\n        lifeBarUi.lifeBars[key] = lifeBarUi.gameManager.getActiveScene().add.graphics();\n        let {x, y} = this.calculateObjectLifeBarPosition(object, lifeBarUi);\n        lifeBarUi.drawBar(lifeBarUi.lifeBars[key], totalValue, newValue, x, y);\n    }\n\n    /**\n     * @param {Object} object\n     * @param {Object} lifeBarUi\n     * @returns {Object}\n     */\n   static calculateObjectLifeBarPosition(object, lifeBarUi)\n    {\n        return {\n            x: object.x - (object.sceneSprite.width / 2),\n            y: object.y - (object.sceneSprite.height / 2) - lifeBarUi.barConfig.height - lifeBarUi.barConfig.top\n        };\n    }\n\n}\n\nmodule.exports.ObjectsHandler = ObjectsHandler;"
  },
  {
    "path": "lib/users/client/player-engine.js",
    "content": "/**\n *\n * Reldens - PlayerEngine\n *\n * Manages the player character on the client-side including sprite rendering, animations,\n * movement, camera controls, player interactions, and state synchronization with the server.\n *\n */\n\nconst { SpriteTextFactory } = require('../../game/client/engine/sprite-text-factory');\nconst { GameConst } = require('../../game/constants');\nconst { ActionsConst } = require('../../actions/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('colyseus.js').Room} Room\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n * @typedef {import('../../game/client/room-events').RoomEvents} RoomEvents\n * @typedef {import('../../game/client/scene-dynamic').SceneDynamic} SceneDynamic\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n *\n * @typedef {Object} PlayerEngineProps\n * @property {SceneDynamic} scene\n * @property {Object} playerData\n * @property {GameManager} gameManager\n * @property {Room} room\n * @property {RoomEvents} roomEvents\n */\nclass PlayerEngine\n{\n\n    /**\n     * @param {PlayerEngineProps} props\n     */\n    constructor(props)\n    {\n        // @TODO - BETA - Refactor entirely.\n        let {scene, playerData, gameManager, room, roomEvents} = props;\n        /** @type {SceneDynamic} */\n        this.scene = scene;\n        /** @type {ConfigManager} */\n        this.config = gameManager.config;\n        /** @type {GameManager} */\n        this.gameManager = gameManager;\n        /** @type {EventsManager} */\n        this.events = gameManager.events;\n        /** @type {string} */\n        this.playerName = playerData.playerName;\n        /** @type {string} */\n        this.avatarKey = playerData.avatarKey;\n        /** @type {string} */\n        this.roomName = playerData.state.scene;\n        /** @type {Object} */\n        this.state = playerData.state;\n        /** @type {Room} */\n        this.room = room;\n        /** @type {RoomEvents} */\n        this.roomEvents = roomEvents;\n        /** @type {string} */\n        this.playerId = room.sessionId;\n        /** @type {number} */\n        this.player_id = playerData.player_id; // id from storage\n        /** @type {Object<string, Object>} */\n        this.players = {};\n        /** @type {number} */\n        this.playedTime = playerData.playedTime;\n        /** @type {boolean} */\n        this.mov = false;\n        /** @type {boolean|string} */\n        this.dir = false;\n        /** @type {boolean|Object} */\n        this.currentTarget = false;\n        /** @type {boolean} */\n        this.pointsValidator = false;\n        // @TODO - BETA - Set all the configs in a single config property.\n        /** @type {boolean} */\n        this.animationBasedOnPress = this.config.get('client/players/animations/basedOnPress');\n        // @TODO - BETA - Make size configurations depend on class-paths assets if present.\n        /** @type {number} */\n        this.topOff = this.config.get('client/players/size/topOffset');\n        /** @type {number} */\n        this.leftOff = this.config.get('client/players/size/leftOffset');\n        /** @type {boolean} */\n        this.collideWorldBounds = this.config.get('client/players/animations/collideWorldBounds');\n        /** @type {number} */\n        this.fadeDuration = Number(this.config.get('client/players/animations/fadeDuration'));\n        /** @type {boolean} */\n        this.cameraRoundPixels = Boolean(\n            this.config.getWithoutLogs('client/general/engine/cameraRoundPixels', false)\n        );\n        /** @type {number} */\n        this.cameraInterpolationX = Number(\n            this.config.getWithoutLogs('client/general/engine/cameraInterpolationX', 0.02)\n        );\n        /** @type {number} */\n        this.cameraInterpolationY = Number(\n            this.config.getWithoutLogs('client/general/engine/cameraInterpolationY', 0.02)\n        );\n        /** @type {Object} */\n        this.globalConfigNameText = this.config.get('client/ui/players/nameText');\n        /** @type {boolean} */\n        this.globalConfigShowNames = Boolean(this.config.get('client/ui/players/showNames'));\n        /** @type {boolean} */\n        this.globalConfigShowCurrentPlayerName = Boolean(this.config.getWithoutLogs('client/ui/players/showCurrentPlayerName'));\n        /** @type {number} */\n        this.globalConfigShowNamesLimit = this.config.getWithoutLogs('client/ui/players/showNamesLimit', 10);\n        /** @type {string} */\n        this.defaultActionKeyConfig = this.config.get('client/ui/controls/defaultActionKey');\n        /** @type {boolean} */\n        this.highlightOnOver = Boolean(this.config.getWithoutLogs('client/ui/players/highlightOnOver', true));\n        /** @type {string} */\n        this.highlightColor = this.config.getWithoutLogs('client/ui/players/highlightColor', '0x00ff00');\n        /** @type {Object<string, string>} */\n        this.lastKeyState = {};\n    }\n\n    create()\n    {\n        let addPlayerData = {\n            x: this.state.x,\n            y: this.state.y,\n            dir: this.state.dir,\n            playerName: this.playerName,\n            avatarKey: this.avatarKey,\n            playedTime: this.playedTime,\n            player_id: this.player_id\n        };\n        this.addPlayer(this.playerId, addPlayerData);\n        this.scene.scene.setVisible(true, this.roomName);\n        this.scene.cameras.main.fadeFrom(this.fadeDuration);\n        this.scene.physics.world.fixedStep = false;\n        this.scene.physics.world.setBounds(0, 0, this.scene.map.widthInPixels, this.scene.map.heightInPixels);\n        this.scene.cameras.main.setBounds(0, 0, this.scene.map.widthInPixels, this.scene.map.heightInPixels);\n        this.scene.cameras.main.setIsSceneCamera(true);\n        this.scene.cameras.main.startFollow(\n            this.players[this.playerId],\n            this.cameraRoundPixels,\n            this.cameraInterpolationX,\n            this.cameraInterpolationY\n        );\n    }\n\n    /**\n     * @param {string} id\n     * @param {Object} addPlayerData\n     * @returns {Object}\n     */\n    addPlayer(id, addPlayerData)\n    {\n        // @TODO - BETA - Create a PlayersManager attached to the Scene and move all the players handler methods there.\n        if(sc.hasOwn(this.players, id)){\n            // player sprite already exists, update it and return it:\n            return this.players[id];\n        }\n        let {x, y, dir, playerName, avatarKey, playedTime, player_id} = addPlayerData;\n        let mappedAvatarKey = this.gameManager.mappedAvatars[avatarKey];\n        //Logger.debug({mappedAvatarKey, avatarKey, mappedAvatars: this.gameManager.mappedAvatars});\n        this.players[id] = this.scene.physics.add.sprite(x, (y-this.topOff), mappedAvatarKey);\n        this.players[id].playerName = playerName;\n        this.players[id].playedTime = playedTime;\n        this.players[id].avatarKey = avatarKey;\n        this.players[id].playerId = id;\n        this.players[id].player_id = player_id;\n        this.players[id].anims.play(mappedAvatarKey+'_'+dir);\n        this.players[id].anims.stop();\n        this.showPlayerName(id);\n        this.makePlayerInteractive(id);\n        this.players[id].moveSprites = {};\n        this.players[id].setDepth(this.players[id].y+this.players[id].body.height);\n        this.players[id].setCollideWorldBounds(this.collideWorldBounds);\n        this.events.emitSync('reldens.playerEngineAddPlayer', this, id, addPlayerData);\n        return this.players[id];\n    }\n\n    /**\n     * @param {string} id\n     */\n    makePlayerInteractive(id)\n    {\n        this.players[id].setInteractive({useHandCursor: true}).on('pointerdown', (e) => {\n            // @NOTE: we avoid executing object interactions while the UI element is open, if we click on the UI, the\n            // other elements in the background scene should not be executed.\n            if(GameConst.SELECTORS.CANVAS !== e.downElement.nodeName){\n                return false;\n            }\n            // @NOTE: we could send a specific action when the player has been targeted.\n            // this.roomEvents.send('*', {act: GameConst.TYPE_PLAYER, id: id});\n            // update target ui:\n            this.setTargetPlayerById(id);\n        });\n        if(this.highlightOnOver){\n            this.players[id].on('pointerover', () => {\n                this.players[id].setTint(this.highlightColor);\n            });\n            this.players[id].on('pointerout', () => {\n                this.players[id].clearTint();\n            });\n        }\n    }\n\n    /**\n     * @param {string} id\n     * @returns {boolean|void}\n     */\n    setTargetPlayerById(id)\n    {\n        if(!sc.get(this.players, id, false)){\n            Logger.info('Target player ID \"'+id+'\" was not found.');\n            this.gameManager.gameEngine.clearTarget();\n            return false;\n        }\n        let previousTarget = Object.assign({}, this.currentTarget);\n        this.currentTarget = {id: id, type: GameConst.TYPE_PLAYER, player_id: this.players[id].player_id};\n        this.gameManager.gameEngine.showTarget(this.players[id].playerName, this.currentTarget, previousTarget);\n    }\n\n    /**\n     * @param {string} id\n     * @returns {boolean}\n     */\n    showPlayerName(id)\n    {\n        let shouldShow = id === this.playerId\n            ? this.globalConfigShowCurrentPlayerName\n            : this.globalConfigShowNames;\n        if(!shouldShow){\n            return false;\n        }\n        if(!this.players[id]){\n            Logger.critical('Player ID \"'+id+'\" not found.', this.players);\n            return false;\n        }\n        let showName = this.players[id].playerName;\n        if(!showName){\n            Logger.critical('Player name not found on player ID \"'+id+'\".', this.players[id]);\n            return false;\n        }\n        SpriteTextFactory.attachTextToSprite(\n            this.players[id],\n            this.applyNameLengthLimit(showName),\n            this.globalConfigNameText,\n            this.topOff,\n            'nameSprite',\n            this.scene\n        );\n    }\n\n    /**\n     * @param {string} showName\n     * @returns {string}\n     */\n    applyNameLengthLimit(showName)\n    {\n        if(0 < this.globalConfigShowNamesLimit && showName.length > this.globalConfigShowNamesLimit){\n            showName = showName.slice(0, this.globalConfigShowNamesLimit)+'...';\n        }\n        return showName;\n    }\n\n    /**\n     * @param {string} playerId\n     * @param {Object} player\n     */\n    updatePlayer(playerId, player)\n    {\n        let playerSprite = this.players[playerId];\n        if(!playerSprite){\n            Logger.error('PlayerSprite not defined.', this.players, playerId);\n            return;\n        }\n        Logger.debug('Updating player ID \"'+playerId+'\". - Current player ID \"'+this.player_id+'\".');\n        if(this.scene.clientInterpolation){\n            this.scene.interpolatePlayersPosition[playerId] = player.state;\n            return;\n        }\n        this.processPlayerPositionAnimationUpdate(\n            playerSprite,\n            player.state,\n            playerId,\n            player.state.x-this.leftOff,\n            player.state.y-this.topOff\n        );\n    }\n\n    /**\n     * @param {Object} playerSprite\n     * @param {Object} playerState\n     * @param {string} playerId\n     * @param {number} [newX]\n     * @param {number} [newY]\n     */\n    processPlayerPositionAnimationUpdate(playerSprite, playerState, playerId, newX = 0, newY = 0)\n    {\n        Logger.debug('Process player position animation update.', {playerSprite, playerState, playerId, newX, newY});\n        if(!playerSprite){\n            Logger.error('Missing player sprite to process animation update.', playerSprite, playerState, playerId);\n            return;\n        }\n        if(!playerState){\n            Logger.error('Missing player state to process animation update.', playerSprite, playerState, playerId);\n            return;\n        }\n        if(!playerId){\n            Logger.error('Missing player ID to process animation update.', playerSprite, playerState, playerId);\n            return;\n        }\n        let currentInterpolations = Object.keys(this.scene.interpolatePlayersPosition);\n        if(0 === currentInterpolations.length){\n            return;\n        }\n        if(GameConst.STATUS.DEATH === playerState.inState || GameConst.STATUS.DISABLED === playerState.inState){\n            delete this.scene.interpolatePlayersPosition[playerId];\n            return;\n        }\n        this.playPlayerAnimation(playerSprite, playerState, playerId);\n        this.stopPlayerAnimation(playerSprite, playerState);\n        this.updateSpritePosition(playerSprite, newX, newY);\n        this.updatePlayerState(playerSprite, playerState, playerId);\n    }\n\n    /**\n     * @param {Object} playerSprite\n     * @param {Object} playerState\n     * @param {string} playerId\n     */\n    updatePlayerState(playerSprite, playerState, playerId)\n    {\n        // @NOTE: depth has to be set dynamically, this way the player will be above or below other objects.\n        let playerNewDepth = playerSprite.y+playerSprite.body.height;\n        if(playerSprite.depth !== playerNewDepth){\n            playerSprite.setDepth(playerNewDepth);\n        }\n        this.events.emitSync('reldens.runPlayerAnimation', this, playerId, playerState, playerSprite);\n        this.updateNamePosition(playerSprite);\n        this.moveAttachedSprites(playerSprite, playerNewDepth);\n    }\n\n    /**\n     * @param {Object} sprite\n     * @param {number} newX\n     * @param {number} newY\n     */\n    updateSpritePosition(sprite, newX, newY)\n    {\n        if(sprite.x !== newX){\n            sprite.x = newX;\n        }\n        if(sprite.y !== newY){\n            sprite.y = newY;\n        }\n    }\n\n    /**\n     * @param {Object} playerSprite\n     * @returns {boolean}\n     */\n    updateNamePosition(playerSprite)\n    {\n        let isCurrentPlayer = playerSprite.playerId === this.playerId;\n        let shouldShowName = isCurrentPlayer ? this.globalConfigShowCurrentPlayerName : this.globalConfigShowNames;\n        if(!shouldShowName || !playerSprite['nameSprite']){\n            return false;\n        }\n        let relativeNamePosition = SpriteTextFactory.getTextPosition(\n            playerSprite,\n            this.applyNameLengthLimit(playerSprite.playerName),\n            this.globalConfigNameText,\n            this.topOff\n        );\n        playerSprite['nameSprite'].x = relativeNamePosition.x;\n        playerSprite['nameSprite'].y = relativeNamePosition.y;\n    }\n\n    /**\n     * @param {Object} playerSprite\n     * @param {number} playerNewDepth\n     * @returns {boolean}\n     */\n    moveAttachedSprites(playerSprite, playerNewDepth)\n    {\n        let moveSpriteKeys = Object.keys(playerSprite.moveSprites);\n        if(0 === moveSpriteKeys.length){\n            return false;\n        }\n        for(let i of moveSpriteKeys){\n            let sprite = playerSprite.moveSprites[i];\n            if(sprite.x === playerSprite.x && sprite.y === playerSprite.y){\n                continue;\n            }\n            sprite.x = playerSprite.x;\n            sprite.y = playerSprite.y;\n            // by default moving sprites will be always below the player:\n            let newSpriteDepth = playerNewDepth+(sc.get(sprite, 'depthByPlayer', '') === 'above' ? 1 :  -0.1);\n            Logger.debug('Sprite \"'+i+'\" new depth: '+newSpriteDepth+'.', sprite);\n            sprite.setDepth(newSpriteDepth);\n        }\n    }\n\n    /**\n     * @param {Object} playerSprite\n     * @param {Object} playerState\n     * @param {string} playerId\n     * @returns {boolean}\n     */\n    playPlayerAnimation(playerSprite, playerState, playerId)\n    {\n        if(this.isDeath(playerState) || this.isDisabled(playerState)){\n            Logger.debug('Player with ID \"'+playerId+'\" is disabled to play the animation.', playerState);\n            return false;\n        }\n        Logger.debug('Play player animation.', playerSprite.avatarKey, playerState);\n        // @NOTE: player speed is defined by the server.\n        let activeAvatarKey = this.gameManager.mappedAvatars[playerSprite.avatarKey];\n        if(this.animationBasedOnPress){\n            let directionKey = activeAvatarKey+'_'+playerState.dir;\n            if(playerState.x === playerSprite.x && playerState.y === playerSprite.y){\n                Logger.debug('Player has not changed, skipped animation \"'+directionKey+'\".');\n                return false;\n            }\n            Logger.debug('Animation played based on press active.', activeAvatarKey,\n                {\n                    x: playerState.x+' / '+playerSprite.x,\n                    y: playerState.y+' / '+playerSprite.y\n                }\n            );\n            playerSprite.anims.play(directionKey, true);\n            return;\n        }\n        if(playerState.x !== playerSprite.x){\n            let directionToPlayX = playerState.x < playerSprite.x\n                ? activeAvatarKey+'_'+GameConst.LEFT\n                : activeAvatarKey+'_'+GameConst.RIGHT;\n            playerSprite.anims.play(directionToPlayX, true);\n        }\n        if(playerState.y !== playerSprite.y){\n            let directionToPlayY = playerState.y < playerSprite.y\n                ? activeAvatarKey+'_'+GameConst.UP\n                : activeAvatarKey+'_'+GameConst.DOWN;\n            playerSprite.anims.play(directionToPlayY, true);\n        }\n    }\n\n    /**\n     * @param {Object} playerSprite\n     * @param {Object} playerState\n     */\n    stopPlayerAnimation(playerSprite, playerState)\n    {\n        // if not moving, then stop the player animation:\n        if(playerState.mov){\n            return;\n        }\n        playerSprite.anims.stop();\n        playerSprite.mov = playerState.mov;\n    }\n\n    /**\n     * @param {string} key\n     */\n    removePlayer(key)\n    {\n        if(!sc.hasOwn(this.players, key) || !sc.hasOwn(this.players[key], 'nameSprite')){\n            return;\n        }\n        this.players[key]['nameSprite'].destroy();\n        this.players[key].destroy();\n        delete this.players[key];\n    }\n\n    left()\n    {\n        if('pressed' === this.lastKeyState[GameConst.LEFT]){\n            return;\n        }\n        this.lastKeyState[GameConst.LEFT] = 'pressed';\n        this.roomEvents.send({dir: GameConst.LEFT});\n    }\n\n    right()\n    {\n        if('pressed' === this.lastKeyState[GameConst.RIGHT]){\n            return;\n        }\n        this.lastKeyState[GameConst.RIGHT] = 'pressed';\n        this.roomEvents.send({dir: GameConst.RIGHT});\n    }\n\n    up()\n    {\n        if('pressed' === this.lastKeyState[GameConst.UP]){\n            return;\n        }\n        this.lastKeyState[GameConst.UP] = 'pressed';\n        this.roomEvents.send({dir: GameConst.UP});\n    }\n\n    down()\n    {\n        if('pressed' === this.lastKeyState[GameConst.DOWN]){\n            return;\n        }\n        this.lastKeyState[GameConst.DOWN] = 'pressed';\n        this.roomEvents.send({dir: GameConst.DOWN});\n    }\n\n    stop()\n    {\n        this.lastKeyState[GameConst.LEFT] = '';\n        this.lastKeyState[GameConst.RIGHT] = '';\n        this.lastKeyState[GameConst.UP] = '';\n        this.lastKeyState[GameConst.DOWN] = '';\n        this.roomEvents.send({act: GameConst.STOP});\n    }\n\n    runActions()\n    {\n        this.roomEvents.send({\n            act: ActionsConst.ACTION,\n            type: this.defaultActionKeyConfig,\n            target: this.currentTarget\n        });\n    }\n\n    /**\n     * @param {Object} pointer\n     * @returns {boolean}\n     */\n    moveToPointer(pointer)\n    {\n        if(this.isDeath() || this.isDisabled()){\n            this.fullStop();\n            return false;\n        }\n        this.lastKeyState[GameConst.LEFT] = '';\n        this.lastKeyState[GameConst.RIGHT] = '';\n        this.lastKeyState[GameConst.UP] = '';\n        this.lastKeyState[GameConst.DOWN] = '';\n        this.roomEvents.send({\n            act: GameConst.POINTER,\n            column: pointer.worldColumn,\n            row: pointer.worldRow,\n            x: pointer.worldX-this.leftOff,\n            y: pointer.worldY-this.topOff\n        });\n    }\n\n    /**\n     * @param {Object} [state]\n     * @returns {boolean}\n     */\n    isDisabled(state)\n    {\n        if(!state){\n            state = this.state;\n        }\n        return GameConst.STATUS.DISABLED === state.inState;\n    }\n\n    /**\n     * @param {Object} [state]\n     * @returns {boolean}\n     */\n    isDeath(state)\n    {\n        if(!state){\n            state = this.state;\n        }\n        return GameConst.STATUS.DEATH === state.inState;\n    }\n\n    fullStop()\n    {\n        delete this.scene.interpolatePlayersPosition[this.player_id];\n        this.stop();\n    }\n\n    /**\n     * @returns {Object}\n     */\n    getPosition()\n    {\n        return {\n            x: this.players[this.playerId].x,\n            y: this.players[this.playerId].y\n        };\n    }\n\n}\n\nmodule.exports.PlayerEngine = PlayerEngine;\n"
  },
  {
    "path": "lib/users/client/player-stats-bars-ui.js",
    "content": "/**\n *\n * Reldens - PlayerStatsBarsUi\n *\n * Manages player stats bars in the player box UI.\n *\n */\n\nconst { BarProperties } = require('./bar-properties');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass PlayerStatsBarsUi\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManager} */\n        this.events = props.events;\n        /** @type {GameManager} */\n        this.gameManager = props.gameManager;\n        /** @type {Object<string, BarProperties>} */\n        this.barPropertiesModels = {};\n    }\n\n    setupListeners()\n    {\n        this.loadBarPropertiesModels();\n        this.events.on('reldens.beforePreloadUiScene', (uiScene) => {\n            this.preloadBarTemplate(uiScene);\n        });\n        this.events.on('reldens.playerStatsUpdateAfter', (message, roomEvents) => {\n            this.updatePlayerStatsBars(message, roomEvents);\n        });\n    }\n\n    loadBarPropertiesModels()\n    {\n        let barsConfig = this.gameManager.config.get('client/players/barsProperties');\n        if(!sc.isObject(barsConfig)){\n            return false;\n        }\n        let configKeys = Object.keys(barsConfig);\n        if(0 === configKeys.length){\n            return false;\n        }\n        for(let statKey of configKeys){\n            this.barPropertiesModels[statKey] = new BarProperties(statKey, barsConfig[statKey]);\n        }\n        return true;\n    }\n\n    preloadBarTemplate(uiScene)\n    {\n        if(0 === Object.keys(this.barPropertiesModels).length){\n            return false;\n        }\n        uiScene.load.html('playerStatsBar', '/assets/html/player-stats-bar.html');\n        return true;\n    }\n\n    updatePlayerStatsBars(message, roomEvents)\n    {\n        if(0 === Object.keys(this.barPropertiesModels).length){\n            return false;\n        }\n        let playerBox = this.gameManager.getUiElement('playerBox');\n        if(!playerBox){\n            return false;\n        }\n        let barsContainer = playerBox.getChildByProperty('id', 'ui-player-extras');\n        if(!barsContainer){\n            return false;\n        }\n        let barTemplate = roomEvents.gameEngine.uiScene.cache.html.get('playerStatsBar');\n        if(!barTemplate){\n            return false;\n        }\n        let barsWrapper = this.gameManager.gameDom.getElement('#player-stats-bars-wrapper', barsContainer);\n        if(!barsWrapper){\n            this.gameManager.gameDom.appendToElement('#ui-player-extras', '<div id=\"player-stats-bars-wrapper\"></div>');\n        }\n        let barsHtml = '';\n        for(let statKey of Object.keys(this.barPropertiesModels)){\n            let barProperties = this.barPropertiesModels[statKey];\n            if(!barProperties.ready){\n                continue;\n            }\n            if(!sc.hasOwn(message.stats, statKey)){\n                continue;\n            }\n            let currentValue = message.stats[statKey];\n            let maxValue = message.statsBase[statKey];\n            let percentage = 0 < maxValue ? (currentValue / maxValue) * 100 : 0;\n            let parsedBarTemplate = roomEvents.gameManager.gameEngine.parseTemplate(barTemplate, {\n                statKey: statKey,\n                statLabel: barProperties.label,\n                currentValue: currentValue,\n                maxValue: maxValue,\n                percentage: percentage,\n                activeColor: barProperties.activeColor,\n                inactiveColor: barProperties.inactiveColor\n            });\n            barsHtml = barsHtml+parsedBarTemplate;\n        }\n        this.gameManager.gameDom.updateContent('#player-stats-bars-wrapper', barsHtml);\n        return true;\n    }\n\n}\n\nmodule.exports.PlayerStatsBarsUi = PlayerStatsBarsUi;\n"
  },
  {
    "path": "lib/users/client/player-stats-ui.js",
    "content": "/**\n *\n * Reldens - PlayerStatsUi\n *\n * Manages player stats UI panel display and interaction.\n *\n */\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n */\nclass PlayerStatsUi\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManager} */\n        this.events = props.events;\n    }\n\n    createPlayerStatsUi()\n    {\n        this.events.on('reldens.beforePreloadUiScene', (uiScene) => {\n            if(!uiScene.gameManager.config.get('client/ui/playerStats/enabled')){\n                return false;\n            }\n            uiScene.load.html('playerStats', '/assets/html/ui-player-stats.html');\n            uiScene.load.html('playerStat', '/assets/html/player-stat.html');\n        });\n        this.events.on('reldens.beforeCreateUiScene', (uiScene) => {\n            // @TODO - BETA - Replace by UserInterface.\n            let statsUi = uiScene.getUiConfig('playerStats');\n            if(!statsUi.enabled){\n                return false;\n            }\n            let dialogBox = uiScene.add.dom(statsUi.uiX, statsUi.uiY).createFromCache('playerStats');\n            // @TODO - BETA - Replace all \"getChildByProperty\" by gameDom.getElement() method.\n            let closeButton = dialogBox.getChildByProperty('id', 'player-stats-close');\n            let openButton = dialogBox.getChildByProperty('id', 'player-stats-open');\n            openButton?.addEventListener('click', () => {\n                let dialogContainer = dialogBox.getChildByProperty('id', 'player-stats-ui');\n                // @TODO - BETA - Replace styles by classes.\n                dialogContainer.style.display = 'block';\n                openButton.style.display = 'none';\n                dialogBox.setDepth(4);\n                this.events.emit('reldens.openUI', {ui: this, openButton, dialogBox, dialogContainer, uiScene});\n            });\n            closeButton?.addEventListener('click', () => {\n                let dialogContainer = dialogBox.getChildByProperty('id', 'player-stats-ui');\n                // @TODO - BETA - Replace styles by classes.\n                dialogContainer.style.display = 'none';\n                if(openButton){\n                    openButton.style.display = 'block';\n                }\n                dialogBox.setDepth(1);\n                this.events.emit(\n                    'reldens.closeUI',\n                    {ui: this, closeButton, openButton, dialogBox, dialogContainer, uiScene}\n                );\n            });\n            uiScene.elementsUi['playerStats'] = dialogBox;\n        });\n    }\n\n}\n\nmodule.exports.PlayerStatsUi = PlayerStatsUi;\n"
  },
  {
    "path": "lib/users/client/plugin.js",
    "content": "/**\n *\n * Reldens - Users Client Plugin.\n *\n * Handles user-related client features including lifebars, player stats UI, and player selection.\n *\n */\n\nconst { LifebarUi } = require('./lifebar-ui');\nconst { PlayerStatsUi } = require('./player-stats-ui');\nconst { PlayerStatsBarsUi } = require('./player-stats-bars-ui');\nconst { ActionsConst } = require('../../actions/constants');\nconst { GameConst } = require('../../game/constants');\nconst Translations = require('./snippets/en_US');\nconst { TranslationsMapper } = require('../../snippets/client/translations-mapper');\nconst { UsersConst } = require('../constants');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass UsersPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @return {Promise<void>}\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        this.initialGameData = {};\n        if(this.validateProperties()){\n            this.setTranslations();\n            this.listenEvents();\n            this.setupPlayerStatsUi();\n            this.setupPlayerStatsBarsUi();\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    validateProperties()\n    {\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in UsersPlugin.');\n            return false;\n        }\n        if(!this.events){\n            Logger.error('EventsManager undefined in UsersPlugin.');\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @returns {void}\n     */\n    setupPlayerStatsUi()\n    {\n        this.playerStatsUi = new PlayerStatsUi({events: this.events});\n        this.playerStatsUi.createPlayerStatsUi();\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setupPlayerStatsBarsUi()\n    {\n        if(!this.gameManager.config.get('client/players/barsProperties')){\n            return false;\n        }\n        this.playerStatsBarsUi = new PlayerStatsBarsUi({\n            events: this.events,\n            gameManager: this.gameManager\n        });\n        this.playerStatsBarsUi.setupListeners();\n        return true;\n    }\n\n    listenEvents()\n    {\n        this.events.on('reldens.beforeCreateEngine', (initialGameData, gameManager) => {\n            this.initialGameData = initialGameData;\n            this.onBeforeCreateEngine(initialGameData, gameManager);\n            if(!this.lifeBarUi){\n                this.lifeBarUi = new LifebarUi({events: this.events});\n                this.lifeBarUi.createLifeBarUi(gameManager);\n            }\n        });\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setTranslations()\n    {\n        if(!this.events || !this.gameManager){\n            return false;\n        }\n        TranslationsMapper.forConfig(this.gameManager.config.client, Translations, UsersConst.MESSAGE.DATA_VALUES);\n    }\n\n    /**\n     * @param {Object} initialGameData\n     * @param {Object} gameManager\n     * @returns {void}\n     */\n    onBeforeCreateEngine(initialGameData, gameManager)\n    {\n        let isMultiplayerEnabled = gameManager.config.get('client/players/multiplePlayers/enabled', false);\n        let isRoomSelectionDisabled = gameManager.config.get('client/rooms/selection/allowOnLogin', false);\n        // @TODO - BETA - If the player selection container doesn't exist we should create one.\n        let playersCount = sc.isTrue(initialGameData, 'players') ? Object.keys(initialGameData.players).length : 0;\n        // if multiplayer is disabled and the user already has a player then just allow the engine to be executed:\n        if(0 < playersCount && !isMultiplayerEnabled && !isRoomSelectionDisabled){\n            // before return set the only player available:\n            initialGameData.player = initialGameData.players[0];\n            return;\n        }\n        // for every other case we will stop the normal execution of the engine and show the selection/creation block:\n        gameManager.canInitEngine = false;\n        let playerSelection = gameManager.gameDom.getElement(GameConst.SELECTORS.PLAYER_SELECTION);\n        playerSelection.classList.remove('hidden');\n        // if multiplayer is enabled, the user already has a player it can only select the room:\n        if(!isMultiplayerEnabled && 1 === playersCount){\n            this.prepareSinglePlayerInput(playerSelection, initialGameData, gameManager);\n            return;\n        }\n        // if multiplayer is enabled and the user already has a player then set up the selector form:\n        if(isMultiplayerEnabled && 0 < playersCount){\n            this.preparePlayerSelector(playerSelection, initialGameData, gameManager);\n        }\n        this.preparePlayerCreator(playerSelection, initialGameData, gameManager);\n    }\n\n    /**\n     * @param {HTMLElement} playerSelection\n     * @param {Object} initialGameData\n     * @param {Object} gameManager\n     * @returns {boolean|void}\n     */\n    prepareSinglePlayerInput(playerSelection, initialGameData, gameManager)\n    {\n        // @TODO - BETA - Extract all this.\n        let form = gameManager.gameDom.getElement(GameConst.SELECTORS.PLAYER_SELECTION_FORM);\n        let player = initialGameData.player;\n        if(!form || !player){\n            Logger.error('Form or player not defined in prepareSinglePlayerInput.');\n            return false;\n        }\n        gameManager.gameDom.getElement(GameConst.SELECTORS.PLAYER_SELECT_ELEMENT)?.remove();\n        let playerLabel = this.gameManager.services.translator.t(\n            UsersConst.SNIPPETS.OPTION_LABEL,\n            {\n                playerName: player.name,\n                currentLevel: player.currentLevel,\n                classPathLabel: player.currentClassPathLabel\n            }\n        );\n        let selectedPlayerHiddenInput = gameManager.gameDom.createElement('input');\n        selectedPlayerHiddenInput.type = 'hidden';\n        selectedPlayerHiddenInput.id = GameConst.SELECTORS.PLAYER_SELECT_ELEMENT;\n        selectedPlayerHiddenInput.value = player.id;\n        let playerLabelElement = gameManager.gameDom.createElement('div');\n        playerLabelElement.innerText = playerLabel;\n        form.append(selectedPlayerHiddenInput);\n        let playerSelectBox = gameManager.gameDom.getElement('.player-select-box');\n        playerSelectBox?.append(playerLabelElement);\n        form.addEventListener('submit', (e) => {\n            e.preventDefault();\n            playerSelection.classList.add('hidden');\n            this.submitSelectedPlayer(gameManager, form, selectedPlayerHiddenInput, player);\n            return false;\n        });\n        this.showAvatarContainer(gameManager, initialGameData, selectedPlayerHiddenInput);\n        form.classList.remove('hidden');\n    }\n\n    /**\n     * @param {Object} gameManager\n     * @param {HTMLFormElement} form\n     * @param {HTMLInputElement} selectElement\n     * @param {Object} player\n     * @returns {void}\n     */\n    submitSelectedPlayer(gameManager, form, selectElement, player)\n    {\n        // @TODO - BETA - Extract all this.\n        gameManager.events.emitSync('reldens.onPrepareSinglePlayerSelectorFormSubmit', {\n            usersPlugin: this,\n            form,\n            selectElement,\n            player,\n            gameManager\n        });\n        gameManager.initEngine().catch((error) => {\n            Logger.error(error);\n            // @TODO - BETA - Add error handling here.\n        });\n    }\n\n    /**\n     * @param {Object} gameManager\n     * @param {Object} initialGameData\n     * @param {HTMLElement} selectElement\n     * @returns {void}\n     */\n    showAvatarContainer(gameManager, initialGameData, selectElement)\n    {\n        // @TODO - BETA - Extract all this.\n        let additionalInfoContainer = gameManager.gameDom.getElement(\n            GameConst.SELECTORS.PLAYER_SELECTION_ADDITIONAL_INFO\n        );\n        if(!additionalInfoContainer){\n            return;\n        }\n        if(!this.gameManager.config.getWithoutLogs('client/players/multiplePlayers/showAvatar', true)){\n            return;\n        }\n        let avatarContainer = gameManager.gameDom.createElement('div');\n        avatarContainer.className = 'avatar-container';\n        // @TODO - BETA - Refactor, extract all the styles and replace the avatar background by an element.\n        let avatar = gameManager.gameDom.createElement('div');\n        let avatarKey = initialGameData.player.avatarKey;\n        avatar.classList.add('class-path-select-avatar');\n        avatar.style.backgroundImage = `url('/assets/custom/sprites/${avatarKey}${GameConst.FILES.EXTENSIONS.PNG}')`;\n        let widthInPx = this.gameManager.config.getWithoutLogs('client/players/size/width', '0')+'px';\n        avatar.style.backgroundPositionX = '-'+widthInPx;\n        avatar.style.width = widthInPx;\n        avatar.style.height = this.gameManager.config.getWithoutLogs('client/players/size/height', '0')+'px';\n        avatarContainer.append(avatar);\n        additionalInfoContainer.append(avatarContainer);\n    }\n\n    /**\n     * @param {HTMLElement} playerSelection\n     * @param {Object} initialGameData\n     * @param {Object} gameManager\n     * @returns {boolean}\n     */\n    preparePlayerSelector(playerSelection, initialGameData, gameManager)\n    {\n        let form = gameManager.gameDom.getElement(GameConst.SELECTORS.PLAYER_SELECTION_FORM);\n        let select = gameManager.gameDom.getElement(GameConst.SELECTORS.PLAYER_SELECT_ELEMENT);\n        if(!form || !select){\n            return false;\n        }\n        form.addEventListener('submit', (e) => {\n            e.preventDefault();\n            let selectedOption = select.options[select.selectedIndex].value;\n            let selectedPlayer = this.getPlayerById(initialGameData.players, Number(selectedOption));\n            if(selectedPlayer){\n                let loadingContainer = form.querySelector(GameConst.SELECTORS.LOADING_CONTAINER);\n                if(loadingContainer){\n                    loadingContainer?.classList.remove(GameConst.CLASSES.HIDDEN);\n                }\n                gameManager.initialGameData.player = selectedPlayer;\n                gameManager.events.emitSync('reldens.onPreparePlayerSelectorFormSubmit', {\n                    usersPlugin: this,\n                    form,\n                    select,\n                    selectedPlayer,\n                    gameManager\n                });\n                gameManager.initEngine().catch((error) => {\n                    Logger.error(error);\n                });\n            }\n            return false;\n        });\n        for(let i of Object.keys(initialGameData.players)){\n            let player = initialGameData.players[i];\n            let option = new Option(\n                this.gameManager.services.translator.t(\n                    UsersConst.SNIPPETS.OPTION_LABEL,\n                    {\n                        playerName: player.name,\n                        currentLevel: player.currentLevel,\n                        classPathLabel: player.currentClassPathLabel\n                    }\n                ),\n                player.id\n            );\n            option.dataset.key = player.avatarKey;\n            select.append(option);\n        }\n        this.showAvatarContainer(gameManager, initialGameData, select);\n        form.classList.remove('hidden');\n    }\n\n    /**\n     * @param {HTMLElement} playerSelection\n     * @param {Object} initialGameData\n     * @param {Object} gameManager\n     * @returns {void}\n     */\n    preparePlayerCreator(playerSelection, initialGameData, gameManager)\n    {\n        let form = gameManager.gameDom.getElement(ActionsConst.SELECTORS.PLAYER_CREATE_FORM);\n        if(!form){\n            return;\n        }\n        form.addEventListener('submit', (e) => {\n            e.preventDefault();\n            // @TODO - BETA - Change classes by constants and make the .response-error toggle the hidden class.\n            let errorElement = gameManager.gameDom.getElement('#player-create-form .response-error');\n            errorElement.innerHTML = '';\n            let formData = new FormData(form);\n            let serializedForm = sc.serializeFormData(formData);\n            // @TODO - BETA - Make player name length configurable.\n            if(3 > serializedForm['new-player-name'].toString().length){\n                return false;\n            }\n            gameManager.submitedForm = true;\n            gameManager.events.emitSync('reldens.onPreparePlayerCreationFormSubmit', {\n                usersPlugin: this,\n                form,\n                gameManager\n            });\n            try {\n                gameManager.gameRoom.send('*', {act: GameConst.CREATE_PLAYER, formData: serializedForm});\n            } catch (error) {\n                Logger.critical('Create player error.', error);\n                gameManager.gameDom.alertReload(gameManager.services.translator.t('game.errors.connectionLost'));\n            }\n            return false;\n        });\n    }\n\n    /**\n     * @param {Array<Object>} players\n     * @param {number} playerId\n     * @returns {Object|boolean}\n     */\n    getPlayerById(players, playerId)\n    {\n        if(0 === players.length){\n            return false;\n        }\n        for(let player of players){\n            if(player.id === playerId){\n                return player;\n            }\n        }\n        return false;\n    }\n\n}\n\nmodule.exports.UsersPlugin = UsersPlugin;\n"
  },
  {
    "path": "lib/users/client/snippets/en_US.js",
    "content": "/**\n *\n * Reldens - Translations - en_US\n *\n */\n\nmodule.exports = {\n    users: {\n        optionLabel: '%playerName - LvL %currentLevel - %classPathLabel'\n    }\n}\n"
  },
  {
    "path": "lib/users/constants.js",
    "content": "/**\n *\n * Reldens - UsersConst\n *\n */\n\nlet snippetsPrefix = 'users.';\n\nmodule.exports.UsersConst = {\n    ACTION_LIFEBAR_UPDATE: 'alu',\n    SNIPPETS: {\n        PREFIX: snippetsPrefix,\n        OPTION_LABEL: snippetsPrefix+'optionLabel'\n    },\n    MESSAGE: {\n        DATA_VALUES: {\n            NAMESPACE: 'users'\n        }\n    },\n};\n"
  },
  {
    "path": "lib/users/server/create-admin.js",
    "content": "/**\n *\n * Reldens - CreateAdmin\n *\n * Service for creating admin users via CLI command.\n *\n */\n\nconst { Encryptor } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass CreateAdmin\n{\n\n    /**\n     * @param {Object} serverManager\n     */\n    constructor(serverManager)\n    {\n        /** @type {Object} */\n        this.serverManager = serverManager;\n        /** @type {Object} */\n        this.usersRepository = this.serverManager.dataServer.getEntity('users');\n        /** @type {string|null} */\n        this.error = null;\n    }\n\n    /**\n     * @param {string} username\n     * @param {string} password\n     * @param {string} email\n     * @returns {Promise<boolean>}\n     */\n    async create(username, password, email)\n    {\n        this.error = null;\n        if(!sc.isString(username) || !sc.isString(password) || !sc.isString(email)){\n            this.error = 'Invalid parameters for createAdmin command.';\n            Logger.critical(this.error);\n            return false;\n        }\n        if(!sc.validateInput(email, 'email')){\n            this.error = 'Invalid email format: '+email;\n            Logger.critical(this.error);\n            return false;\n        }\n        let adminRoleId = this.serverManager.configManager.getWithoutLogs('server/admin/roleId', 1);\n        let encryptedPassword = Encryptor.encryptPassword(password);\n        if(!encryptedPassword){\n            this.error = 'Failed to encrypt password.';\n            Logger.critical(this.error);\n            return false;\n        }\n        let newUser = await this.usersRepository.create({\n            email,\n            username,\n            password: encryptedPassword,\n            role_id: adminRoleId,\n            status: 1\n        });\n        if(!newUser){\n            this.error = 'Failed to create admin user.';\n            Logger.critical(this.error);\n            return false;\n        }\n        Logger.info('Admin user created successfully.', {username, email, role_id: adminRoleId});\n        return true;\n    }\n\n}\n\nmodule.exports.CreateAdmin = CreateAdmin;\n"
  },
  {
    "path": "lib/users/server/entities/players-entity-override.js",
    "content": "/**\n *\n * Reldens - PlayersEntityOverride\n *\n * Extends players entity with custom navigation position for admin panel.\n *\n */\n\nconst { PlayersEntity } = require('../../../../generated-entities/entities/players-entity');\n\nclass PlayersEntityOverride extends PlayersEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 950;\n        return config;\n    }\n\n}\n\nmodule.exports.PlayersEntityOverride = PlayersEntityOverride;\n"
  },
  {
    "path": "lib/users/server/entities/players-state-entity-override.js",
    "content": "/**\n *\n * Reldens - PlayersStateEntityOverride\n *\n * Extends players state entity with customized edit properties for admin panel.\n *\n */\n\nconst { PlayersStateEntity } = require('../../../../generated-entities/entities/players-state-entity');\n\nclass PlayersStateEntityOverride extends PlayersStateEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.editProperties.splice(config.editProperties.indexOf('player_id'), 1)\n        config.navigationPosition = 960;\n        return config;\n    }\n\n}\n\nmodule.exports.PlayersStateEntityOverride = PlayersStateEntityOverride;\n"
  },
  {
    "path": "lib/users/server/entities/players-stats-entity-override.js",
    "content": "/**\n *\n * Reldens - PlayersStatsEntityOverride\n *\n * Extends players stats entity with customized edit properties for admin panel.\n *\n */\n\nconst { PlayersStatsEntity } = require('../../../../generated-entities/entities/players-stats-entity');\nconst { sc } = require('@reldens/utils');\n\nclass PlayersStatsEntityOverride extends PlayersStatsEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.editProperties = sc.removeFromArray(config.editProperties, ['player_id', 'stat_id']);\n        config.navigationPosition = 970;\n        return config;\n    }\n\n}\n\nmodule.exports.PlayersStatsEntityOverride = PlayersStatsEntityOverride;\n"
  },
  {
    "path": "lib/users/server/entities/stats-entity-override.js",
    "content": "/**\n *\n * Reldens - StatsEntityOverride\n *\n * Extends stats entity with customized list properties for admin panel.\n *\n */\n\nconst { StatsEntity } = require('../../../../generated-entities/entities/stats-entity');\n\nclass StatsEntityOverride extends StatsEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.listProperties.splice(config.listProperties.indexOf('description'), 1);\n        return config;\n    }\n\n}\n\nmodule.exports.StatsEntityOverride = StatsEntityOverride;\n"
  },
  {
    "path": "lib/users/server/entities/users-entity-override.js",
    "content": "/**\n *\n * Reldens - UsersEntityOverride\n *\n * Extends users entity with custom title property and navigation position for admin panel.\n *\n */\n\nconst { UsersEntity } = require('../../../../generated-entities/entities/users-entity');\n\nclass UsersEntityOverride extends UsersEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.titleProperty = 'email';\n        config.navigationPosition = 800;\n        return config;\n    }\n\n}\n\nmodule.exports.UsersEntityOverride = UsersEntityOverride;\n"
  },
  {
    "path": "lib/users/server/entities/users-login-entity-override.js",
    "content": "/**\n *\n * Reldens - UsersLoginEntityOverride\n *\n * Extends users login entity with custom navigation position for admin panel.\n *\n */\n\nconst {UsersLoginEntity} = require('../../../../generated-entities/entities/users-login-entity');\n\nclass UsersLoginEntityOverride extends UsersLoginEntity\n{\n\n    /**\n     * @param {Object} extraProps\n     * @returns {Object}\n     */\n    static propertiesConfig(extraProps)\n    {\n        let config = super.propertiesConfig(extraProps);\n        config.navigationPosition = 810;\n        return config;\n    }\n\n}\n\nmodule.exports.UsersLoginEntityOverride = UsersLoginEntityOverride;\n"
  },
  {
    "path": "lib/users/server/entities-config.js",
    "content": "/**\n *\n * Reldens - Entities Config\n *\n */\n\nconst { PlayersEntityOverride } = require('./entities/players-entity-override');\nconst { PlayersStateEntityOverride } = require('./entities/players-state-entity-override');\nconst { PlayersStatsEntityOverride } = require('./entities/players-stats-entity-override');\nconst { StatsEntityOverride } = require('./entities/stats-entity-override');\nconst { UsersEntityOverride } = require('./entities/users-entity-override');\nconst { UsersLoginEntityOverride } = require('./entities/users-login-entity-override');\n\nmodule.exports.entitiesConfig = {\n    players: PlayersEntityOverride,\n    playersState: PlayersStateEntityOverride,\n    playersStats: PlayersStatsEntityOverride,\n    stats: StatsEntityOverride,\n    users: UsersEntityOverride,\n    usersLogin: UsersLoginEntityOverride,\n};\n"
  },
  {
    "path": "lib/users/server/entities-translations.js",
    "content": "/**\n *\n * Reldens - Entities Translations\n *\n */\n\nmodule.exports.entitiesTranslations = {\n    labels: {\n        users: 'Users',\n        usersLocale: 'Users Locale',\n        usersLogin: 'Users Login',\n        players: 'Players',\n        playerStats: 'Players Stats',\n        playerState: 'Players State',\n        stats: 'Stats'\n    }\n};\n"
  },
  {
    "path": "lib/users/server/manager.js",
    "content": "/**\n *\n * Reldens - UsersManager\n *\n * User and player management service for authentication, creation, and state tracking.\n *\n */\n\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n */\nclass UsersManager\n{\n\n    /**\n     * @param {Object} props\n     */\n    constructor(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in UsersManager.');\n        }\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in UsersManager.');\n        }\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        this.setGuestRoleId();\n        this.setRepositories();\n    }\n\n    setGuestRoleId()\n    {\n        this.guestRoleId = Number(this.config?.server?.players?.guestUser?.roleId || 0);\n        if(0 === this.guestRoleId){\n            Logger.warning('Guest role ID is undefined.');\n        }\n        this.allowDuplicateGuestNames = Boolean(this.config?.server?.players?.allowDuplicateGuestNames || true);\n        this.bannedNames = String(this.config?.server?.players?.bannedNames || '');\n    }\n\n    setRepositories()\n    {\n        if(!this.dataServer){\n            return false;\n        }\n        this.statsRepository = this.dataServer.getEntity('stats');\n        this.usersRepository = this.dataServer.getEntity('users');\n        this.usersLoginRepository = this.dataServer.getEntity('usersLogin');\n        this.playersRepository = this.dataServer.getEntity('players');\n        this.playerStatsRepository = this.dataServer.getEntity('playersStats');\n        this.playerStateRepository = this.dataServer.getEntity('playersState');\n    }\n\n    /**\n     * @param {string} username\n     * @returns {Promise<Object|boolean>}\n     */\n    async loadUserByUsername(username)\n    {\n        let result = false;\n        if(!username){\n            ErrorManager.error('Missing user name.');\n        }\n        // @TODO - BETA - Replace the login association with a call to the usersLogin repository with a limit.\n        let loadedUser = await this.usersRepository.loadOneByWithRelations(\n            'username',\n            username,\n            ['related_users_login', 'related_players.related_players_state']\n        );\n        if(loadedUser){\n            result = loadedUser;\n        }\n        return result;\n    }\n\n    /**\n     * @param {string} email\n     * @returns {Promise<Object|boolean>}\n     */\n    async loadUserByEmail(email)\n    {\n        let result = false;\n        if(!email){\n            ErrorManager.error('Missing email.');\n        }\n        // @TODO - BETA - Replace the login association with a call to the usersLogin repository with a limit.\n        let loadedUser = await this.usersRepository.loadOneByWithRelations(\n            'email',\n            email,\n            ['related_users_login', 'related_players.related_players_state']\n        );\n        if(loadedUser){\n            result = loadedUser;\n        }\n        return result;\n    }\n\n    /**\n     * @param {Object} userData\n     * @returns {Promise<Object>}\n     */\n    async createUser(userData)\n    {\n        return await this.usersRepository.create(userData);\n    }\n\n    /**\n     * @param {string} playerName\n     * @returns {Promise<boolean>}\n     */\n    async isNameAvailable(playerName)\n    {\n        if(-1 !== this.bannedNames.indexOf(playerName)){\n            Logger.debug('Banned name: '+playerName);\n            return false;\n        }\n        if(this.allowDuplicateGuestNames){\n            Logger.debug('Allow duplicate guest names.');\n            return await this.isAvailableForGuest(playerName);\n        }\n        let foundPlayer = await this.playersRepository.loadOneBy('name', playerName);\n        return !foundPlayer?.name;\n    }\n\n    /**\n     * @param {string} playerName\n     * @returns {Promise<boolean>}\n     */\n    async isAvailableForGuest(playerName)\n    {\n        let playersByName = await this.playersRepository.loadByWithRelations('name', playerName, ['related_users']);\n        for(let player of playersByName){\n            if(this.guestRoleId !== player.related_users.role_id){\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} playerData\n     * @returns {Promise<Object|boolean>}\n     */\n    async createPlayer(playerData)\n    {\n        let stateData = sc.get(playerData, 'state', null);\n        let playerInsertData = {\n            name: playerData.name,\n            user_id: playerData.user_id\n        };\n        let newPlayerModel = await this.playersRepository.create(playerInsertData);\n        if(!newPlayerModel){\n            return false;\n        }\n        if(stateData){\n            let stateInsertData = Object.assign({}, stateData, {player_id: newPlayerModel.id});\n            let createdState = await this.playerStateRepository.create(stateInsertData);\n            if(createdState){\n                newPlayerModel.related_players_state = createdState;\n            }\n        }\n        await this.generatePlayerStats(newPlayerModel.id);\n        return newPlayerModel;\n    }\n\n    /**\n     * @param {number} playerId\n     * @returns {Promise<boolean>}\n     */\n    async generatePlayerStats(playerId)\n    {\n        let statsList = await this.statsRepository.loadAll();\n        if(0 === statsList.length){\n            return false;\n        }\n        for(let stat of statsList){\n            let statData = {\n                player_id: playerId,\n                stat_id: stat['id'],\n                base_value: stat['base_value'],\n                value: stat['base_value']\n            };\n            await this.playerStatsRepository.create(statData);\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} userModel\n     * @returns {Promise<Object|boolean>}\n     */\n    async updateUserLastLogin(userModel)\n    {\n        try {\n            let currentDate = sc.getCurrentDate();\n            await this.usersLoginRepository.create({user_id: userModel.id, login_date: currentDate});\n            return this.usersRepository.updateById(userModel.id, {\n                updated_at: currentDate,\n                login_count: Number(userModel.login_count || 0) + 1\n            });\n        } catch (error) {\n            Logger.error('Update user last login error.', error.message, userModel);\n        }\n        return false;\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @returns {Promise<Object|boolean>}\n     */\n    async updatePlayedTimeAndLogoutDate(playerSchema)\n    {\n        if(!playerSchema){\n            //Logger.debug('Missing player schema to update played time and logout date.');\n            return false;\n        }\n        let currentlyPlayedTime = (Date.now() - playerSchema.playStartTime) / 1000;\n        let playedTime = Number(playerSchema.playedTime)+Number(Number(currentlyPlayedTime).toFixed(0));\n        playerSchema.playedTime = playedTime;\n        let updateResult = await this.usersRepository.updateById(\n            playerSchema.userId,\n            {played_time: playedTime}\n        );\n        if(!updateResult){\n            Logger.critical('User played time update error.', playerSchema.player_id);\n        }\n        this.usersLoginRepository.sortBy = 'login_date';\n        this.usersLoginRepository.sortDirection = 'DESC';\n        let lastLogin = await this.usersLoginRepository.loadOneBy('user_id', playerSchema.userId);\n        this.usersLoginRepository.sortBy = false;\n        this.usersLoginRepository.sortDirection = false;\n        await this.usersLoginRepository.updateById(lastLogin.id, {logout_date: sc.getCurrentDate()});\n        return playerSchema;\n    }\n\n    /**\n     * @param {string} email\n     * @param {Object} updatePatch\n     * @returns {Promise<Object>}\n     */\n    updateUserByEmail(email, updatePatch)\n    {\n        return this.usersRepository.updateBy('email', email, updatePatch);\n    }\n\n    /**\n     * @param {number} playerId\n     * @param {Object} newState\n     * @returns {Promise<Object>}\n     */\n    updateUserStateByPlayerId(playerId, newState)\n    {\n        return this.playerStateRepository.updateBy('player_id', playerId, newState);\n    }\n\n    /**\n     * @param {number} playerId\n     * @param {number} statId\n     * @param {Object} statPatch\n     * @returns {Promise<Object>}\n     */\n    async updatePlayerStatByIds(playerId, statId, statPatch)\n    {\n        return this.playerStatsRepository.update({player_id: playerId, stat_id: statId}, statPatch);\n    }\n\n}\n\nmodule.exports.UsersManager = UsersManager;\n"
  },
  {
    "path": "lib/users/server/player.js",
    "content": "/**\n *\n * Reldens - Player\n *\n * Colyseus Schema representing a player in the game session.\n *\n */\n\nconst { Schema, type, defineTypes } = require('@colyseus/schema');\nconst { BodyState } = require('../../world/server/body-state');\nconst { GameConst } = require('../../game/constants');\n\nclass Player extends Schema\n{\n\n    /**\n     * @param {Object} data\n     * @param {string} sessionId\n     */\n    constructor(data, sessionId)\n    {\n        super();\n        let player = data.player;\n        // @TODO - BETA - Replace \"id\" to be \"player_id\" and set the ID from the model as userId.\n        this.userId = data.id.toString(); // this is the user_id from the storage\n        // @TODO - BETA - Use camelCase on player_id.\n        this.player_id = player.id.toString(); // this is the player_id from the storage\n        this.sessionId = sessionId;\n        this.broadcastKey = sessionId;\n        this.roleId = data.role_id;\n        this.status = data.status;\n        this.username = data.username;\n        this.playerName = player.name;\n        this.physicalBody = false;\n        this.eventsPrefix = 'p'+player.id+'.'+this.sessionId;\n        // body state contains the scene and position data:\n        this.state = new BodyState(player.state);\n        // @NOTE: stats can't be a schema because is private data manually handled.\n        this.stats = player.stats; // this is the current value\n        this.statsBase = player.statsBase; // this is the base or max value\n        this.avatarKey = GameConst.IMAGE_PLAYER;\n        this.playedTime = data.played_time;\n        // @TODO - BETA - Look for references where we assign data on the player using dynamic properties and move\n        //   the data inside this privateData property. For example: playerSchema.currentAction, actions, inventory,\n        //   skillsServer, physicalBody, etc. should become playerSchema.privateData.currentAction.\n        this.privateData = {};\n        this.customData = {};\n    }\n\n    /**\n     * @param {string} key\n     * @returns {any}\n     */\n    getPrivate(key)\n    {\n        return this.privateData[key] || null;\n    }\n\n    /**\n     * @param {string} key\n     * @param {any} data\n     * @returns {any}\n     */\n    setPrivate(key, data)\n    {\n        return this.privateData[key] = data;\n    }\n\n    /**\n     * @param {string} key\n     * @returns {any}\n     */\n    getCustom(key)\n    {\n        return this.customData[key] || null;\n    }\n\n    /**\n     * @param {string} key\n     * @param {any} data\n     * @returns {any}\n     */\n    setCustom(key, data)\n    {\n        return this.customData[key] = data;\n    }\n\n    /**\n     * @returns {string}\n     */\n    eventUniqueKey()\n    {\n        return this.eventsPrefix+'.'+(new Date()).getTime();\n    }\n\n    /**\n     * @returns {Object}\n     */\n    getPosition()\n    {\n        return {\n            x: this.state.x,\n            y: this.state.y\n        };\n    }\n\n    /**\n     * @param {Object} playerSchema\n     * @returns {void}\n     */\n    syncPlayer(playerSchema)\n    {\n        this.roleId = playerSchema.roleId;\n        this.status = playerSchema.status;\n        this.username = playerSchema.username;\n        this.playerName = playerSchema.playerName;\n        this.state.sync(playerSchema.state);\n        this.stats = playerSchema.stats;\n        this.statsBase = playerSchema.statsBase;\n        this.avatarKey = playerSchema.avatarKey;\n        this.playedTime = playerSchema.playedTime;\n        this.privateData = playerSchema.privateData;\n        this.customData = playerSchema.customData;\n        return this;\n    }\n\n    inState(inStateValue)\n    {\n        return this.state.inState === inStateValue;\n    }\n\n    isDeath()\n    {\n        return GameConst.STATUS.DEATH === this.state.inState;\n    }\n\n    isDisabled()\n    {\n        return GameConst.STATUS.DISABLED === this.state.inState;\n    }\n\n}\n\ntype('string')(Player.prototype, 'sessionId');\ntype('string')(Player.prototype, 'player_id');\ntype('string')(Player.prototype, 'username');\ntype('string')(Player.prototype, 'playerName');\ntype('number')(Player.prototype, 'playedTime');\ntype('string')(Player.prototype, 'status');\ntype('string')(Player.prototype, 'avatarKey');\ntype('string')(Player.prototype, 'broadcastKey');\ndefineTypes(Player, {state: BodyState});\n\nmodule.exports.Player = Player;\n"
  },
  {
    "path": "lib/users/server/plugin.js",
    "content": "/**\n *\n * Reldens - UsersPlugin\n *\n * Server-side users plugin handling player stats, lifebars, and user management.\n *\n */\n\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { UsersConst } = require('../constants');\nconst { ObjectsConst } = require('../../objects/constants');\nconst { ActionsConst } = require('../../actions/constants');\nconst { SkillsEvents } = require('@reldens/skills');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('@reldens/storage').BaseDataServer} BaseDataServer\n * @typedef {import('../../game/server/config-manager').ConfigManager} ConfigManager\n */\nclass UsersPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     */\n    async setup(props)\n    {\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        if(!this.events){\n            Logger.error('EventsManager undefined in UsersPlugin.');\n        }\n        /** @type {BaseDataServer|boolean} */\n        this.dataServer = sc.get(props, 'dataServer', false);\n        if(!this.dataServer){\n            Logger.error('DataServer undefined in UsersPlugin.');\n        }\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(props, 'config', false);\n        if(!this.config){\n            Logger.error('Config undefined in UsersPlugin.');\n        }\n        /** @type {boolean} */\n        this.usePlayerSpeedProperty = this.config.get('server/players/physicsBody/usePlayerSpeedProperty');\n        /** @type {string} */\n        this.playerSpeedPropertyPath = this.config.getWithoutLogs(\n            'server/players/physicsBody/playerSpeedPropertyPath',\n            'stats/speed'\n        );\n        // @TODO - BETA - Move LifeBar to its own package, convert into PropertyUpdater and make generic.\n        /** @type {Object|boolean} */\n        this.lifeBarConfig = false;\n        /** @type {string|boolean} */\n        this.lifeProp = false;\n        this.listenEvents();\n    }\n\n    listenEvents()\n    {\n        if(!this.events){\n            return false;\n        }\n        this.events.on('reldens.serverReady', async (event) => {\n            await this.onServerReady(event);\n        });\n        this.events.on('reldens.createPlayerAfter', async (client, userModel, currentPlayer, roomScene) => {\n            await this.onCreatePlayerAfterAppendStats(client, userModel, currentPlayer, roomScene);\n        });\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<void>}\n     */\n    async onServerReady(event)\n    {\n        let configProcessor = event.serverManager.configManager;\n        await this.preparePlayersStats(configProcessor);\n        if(configProcessor.get('client/ui/lifeBar/enabled')){\n            await this.activateLifeBar(configProcessor);\n        }\n    }\n\n    /**\n     * @param {Object} configProcessor\n     * @returns {Promise<boolean|void>}\n     */\n    async activateLifeBar(configProcessor)\n    {\n        if(!this.events){\n            return false;\n        }\n        if(!this.lifeBarConfig){\n            this.lifeBarConfig = configProcessor.get('client/ui/lifeBar');\n        }\n        if(!this.lifeProp){\n            this.lifeProp = configProcessor.get('client/actions/skills/affectedProperty');\n        }\n        this.events.on('reldens.createPlayerStatsAfter', this.updateLifeBars.bind(this));\n        this.events.on('reldens.savePlayerStatsUpdateClient', this.updateClientsWithPlayerStats.bind(this));\n        this.events.on('reldens.runBattlePveAfter', this.sendLifeBarUpdate.bind(this));\n        this.events.on(\n            'reldens.actionsPrepareEventsListeners',\n            this.addEventListenerOnSkillAttackApplyDamage.bind(this)\n        );\n        this.events.on('reldens.restoreObjectAfter', this.broadcastObjectUpdateAfterRestore.bind(this));\n        return true;\n    }\n\n    /**\n     * @param {Object} actionsPack\n     * @param {Object} classPath\n     * @returns {Promise<void>}\n     */\n    async addEventListenerOnSkillAttackApplyDamage(actionsPack, classPath)\n    {\n        // @TODO - BETA - Make sure lifebar is updated on every stats change and not only after damage was applied.\n        classPath.listenEvent(\n            SkillsEvents.SKILL_ATTACK_APPLY_DAMAGE,\n            async (skill, target) => {\n                let client = skill.owner.skillsServer.client.client;\n                if(sc.hasOwn(target, 'player_id')){\n                    await this.updatePlayersLifebar(client.room, client, target);\n                    return;\n                }\n                await this.broadcastObjectUpdate(client, target);\n            },\n            classPath.getOwnerUniqueEventKey('skillAttackApplyDamageLifebar'),\n            classPath.getOwnerEventKey()\n        );\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<void>}\n     */\n    async broadcastObjectUpdateAfterRestore(event)\n    {\n        await this.broadcastObjectUpdate(event.room, event.enemyObject);\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} userModel\n     * @param {Object} playerSchema\n     * @param {Object} roomScene\n     * @returns {Promise<void>}\n     */\n    async updateLifeBars(client, userModel, playerSchema, roomScene)\n    {\n        await this.updatePlayersLifebar(roomScene, client, playerSchema);\n        await this.updateEnemiesLifebar(roomScene);\n    }\n\n    /**\n     * @param {Object} room\n     * @param {Object} enemyObject\n     * @returns {Promise<void>}\n     */\n    async broadcastObjectUpdate(room, enemyObject)\n    {\n        return room.broadcast('*', {\n            act: UsersConst.ACTION_LIFEBAR_UPDATE,\n            [ActionsConst.DATA_OWNER_TYPE]: ActionsConst.DATA_TYPE_VALUE_OBJECT,\n            [ActionsConst.DATA_OWNER_KEY]: enemyObject.broadcastKey,\n            newValue: enemyObject.stats[this.lifeProp],\n            totalValue: enemyObject.initialStats[this.lifeProp]\n        });\n    }\n\n    /**\n     * @param {Object} event\n     * @returns {Promise<boolean|void>}\n     */\n    async sendLifeBarUpdate(event)\n    {\n        if(!this.lifeBarConfig.showEnemies && !this.lifeBarConfig.showOnClick){\n            return false;\n        }\n        let {target, roomScene} = event;\n        if(!target.stats[this.lifeProp]){\n            return false;\n        }\n        await this.broadcastObjectUpdate(roomScene, target)\n    }\n\n    /**\n     * @param {Object} roomScene\n     * @param {Object} client\n     * @param {Object} playerSchema\n     * @returns {Promise<boolean>}\n     */\n    async updatePlayersLifebar(roomScene, client, playerSchema)\n    {\n        if(this.lifeBarConfig.showAllPlayers || this.lifeBarConfig.showOnClick){\n            return await this.updateAllPlayersLifeBars(roomScene);\n        }\n        return await this.updateClientsWithPlayerStats(client, playerSchema, roomScene);\n    }\n\n    /**\n     * @param {Object} roomScene\n     * @returns {Promise<boolean|void>}\n     */\n    async updateEnemiesLifebar(roomScene)\n    {\n        if(!this.lifeBarConfig.showEnemies && !this.lifeBarConfig.showOnClick){\n            return false;\n        }\n        for(let i of Object.keys(roomScene.objectsManager.roomObjects)){\n            let obj = roomScene.objectsManager.roomObjects[i];\n            if(obj.type !== ObjectsConst.TYPE_ENEMY){\n                continue;\n            }\n            let updateData = {\n                act: UsersConst.ACTION_LIFEBAR_UPDATE,\n                [ActionsConst.DATA_OWNER_TYPE]: ActionsConst.DATA_TYPE_VALUE_OBJECT,\n                [ActionsConst.DATA_OWNER_KEY]: obj.broadcastKey,\n                newValue: obj.stats[this.lifeProp],\n                totalValue: obj.initialStats[this.lifeProp]\n            };\n            roomScene.broadcast('*', updateData);\n        }\n    }\n\n    /**\n     * @param {Object} roomScene\n     * @returns {Promise<boolean>}\n     */\n    async updateAllPlayersLifeBars(roomScene)\n    {\n        if(0 === roomScene.playersCountInState()){\n            return false;\n        }\n        for(let i of roomScene.playersKeysFromState()){\n            let player = roomScene.playerBySessionIdFromState(i);\n            if(!player?.stats || !player?.statsBase){\n                continue;\n            }\n            let newValue = sc.get(player?.stats, this.lifeProp, null);\n            let totalValue = sc.get(player?.statsBase, this.lifeProp, null);\n            let playerSessionId = sc.get(player, 'sessionId', null);\n            if(null === newValue || null === totalValue || null === playerSessionId){\n                Logger.warning('Missing lifebar data for player update.', {newValue, totalValue, playerSessionId});\n                continue;\n            }\n            let updateData = {\n                act: UsersConst.ACTION_LIFEBAR_UPDATE,\n                [ActionsConst.DATA_OWNER_TYPE]: ActionsConst.DATA_TYPE_VALUE_PLAYER,\n                [ActionsConst.DATA_OWNER_KEY]: playerSessionId,\n                newValue,\n                totalValue\n            };\n            roomScene.broadcast('*', updateData);\n        }\n        return true;\n    }\n\n    /**\n     * @param {Object} configProcessor\n     * @returns {Promise<boolean>}\n     */\n    async preparePlayersStats(configProcessor)\n    {\n        if(sc.hasOwn(configProcessor.client.players, 'initialStats')){\n            return true;\n        }\n        this.stats = {};\n        this.statsByKey = {};\n        let statsData = await this.dataServer.getEntity('stats').loadAll();\n        if(statsData){\n            for(let stat of statsData){\n                stat.data = sc.toJson(stat.customData);\n                this.stats[stat.id] = stat;\n                this.statsByKey[stat.key] = stat;\n            }\n        }\n        configProcessor.client.players.initialStats = this.statsByKey;\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} userModel\n     * @param {Object} currentPlayer\n     * @param {Object} roomScene\n     * @returns {Promise<boolean|void>}\n     */\n    async onCreatePlayerAfterAppendStats(client, userModel, currentPlayer, roomScene)\n    {\n        let {stats, statsBase} = await this.processStatsData('playersStats', currentPlayer.player_id);\n        if(!stats){\n            Logger.critical('Undefined player ID \"'+currentPlayer?.player_id+'\" stats.');\n            return false;\n        }\n        if(!statsBase){\n            Logger.critical('Undefined player ID \"'+currentPlayer?.player_id+'\" statsBase.');\n            return false;\n        }\n        currentPlayer.stats = stats;\n        currentPlayer.statsBase = statsBase;\n        // @TODO - BETA - Remove hardcoded \"speed\" property and replace by configurable key.\n        let playerSpeed = Number(sc.getByPath(currentPlayer, this.playerSpeedPropertyPath.split('/'), 0));\n        if(this.usePlayerSpeedProperty && 0 < playerSpeed){\n            currentPlayer.physicalBody.movementSpeed = playerSpeed;\n            //Logger.debug('Use player speed: '+playerSpeed);\n        }\n        this.events.emit('reldens.createPlayerStatsAfter', client, userModel, currentPlayer, roomScene);\n    }\n\n    /**\n     * @param {string} modelName\n     * @param {number} playerId\n     * @returns {Promise<Object|boolean>}\n     */\n    async processStatsData(modelName, playerId)\n    {\n        // @TODO - BETA - Improve login performance, on scene change avoid query by getting stats from existent player.\n        if(!modelName){\n            Logger.error('Undefined modelName to process stats data.');\n            return false;\n        }\n        let modelRepository = this.dataServer.getEntity(modelName);\n        if(!modelRepository){\n            Logger.error('Missing repository to process stats data for model: '+modelName);\n            return false;\n        }\n        let loadedStats = await modelRepository.loadBy('player_id', playerId);\n        let stats = {};\n        let statsBase = {};\n        if(0 === loadedStats.length){\n            return {stats, statsBase};\n        }\n        if(!this.stats){\n            Logger.critical('Missing stats in Users Plugin.');\n            return {stats, statsBase};\n        }\n        for(let loadedStat of loadedStats){\n            let statData = this.stats[loadedStat.stat_id] || false;\n            if(!statData){\n                Logger.critical('Missing stat data for loaded stat.', this.stats, loadedStat);\n                continue;\n            }\n            stats[statData.key] = loadedStat.value;\n            statsBase[statData.key] = loadedStat.base_value;\n        }\n        return {stats, statsBase};\n    }\n\n    /**\n     * @param {Object} client\n     * @param {Object} playerSchema\n     * @param {Object} roomScene\n     * @returns {Promise<boolean>}\n     */\n    async updateClientsWithPlayerStats(client, playerSchema, roomScene)\n    {\n        if(\n            client.sessionId !== playerSchema.sessionId\n            && !this.lifeBarConfig.showAllPlayers\n            && !this.lifeBarConfig.showOnClick\n        ){\n            return false;\n        }\n        let updateData = {\n            act: UsersConst.ACTION_LIFEBAR_UPDATE,\n            [ActionsConst.DATA_OWNER_TYPE]: ActionsConst.DATA_TYPE_VALUE_PLAYER,\n            [ActionsConst.DATA_OWNER_KEY]: playerSchema.sessionId,\n            newValue: playerSchema.stats[this.lifeProp],\n            totalValue: playerSchema.statsBase[this.lifeProp]\n        };\n        if(this.lifeBarConfig.showAllPlayers || this.lifeBarConfig.showOnClick){\n            roomScene.broadcast('*', updateData);\n            return true;\n        }\n        client.send('*', updateData);\n        return true;\n    }\n\n}\n\nmodule.exports.UsersPlugin = UsersPlugin;\n"
  },
  {
    "path": "lib/users/server/reset-password.js",
    "content": "/**\n *\n * Reldens - ResetPassword\n *\n * Service for resetting user passwords via CLI command.\n *\n */\n\nconst { Encryptor } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass ResetPassword\n{\n\n    /**\n     * @param {Object} serverManager\n     */\n    constructor(serverManager)\n    {\n        /** @type {Object} */\n        this.serverManager = serverManager;\n        /** @type {Object} */\n        this.usersRepository = this.serverManager.dataServer.getEntity('users');\n        /** @type {string|null} */\n        this.error = null;\n    }\n\n    /**\n     * @param {string} username\n     * @param {string} newPassword\n     * @returns {Promise<boolean>}\n     */\n    async reset(username, newPassword)\n    {\n        this.error = null;\n        if(!sc.isString(username) || !sc.isString(newPassword)){\n            this.error = 'Invalid parameters for resetPassword command.';\n            Logger.critical(this.error);\n            return false;\n        }\n        let encryptedPassword = Encryptor.encryptPassword(newPassword);\n        if(!encryptedPassword){\n            this.error = 'Failed to encrypt password.';\n            Logger.critical(this.error);\n            return false;\n        }\n        let user = await this.usersRepository.loadOneBy('username', username);\n        if(!user){\n            this.error = 'User not found: '+username;\n            Logger.critical(this.error);\n            return false;\n        }\n        let updateResult = await this.usersRepository.updateById(user.id, {password: encryptedPassword});\n        if(!updateResult){\n            this.error = 'Failed to reset password for user: '+username;\n            Logger.critical(this.error);\n            return false;\n        }\n        Logger.info('Password reset successfully for user: '+username);\n        return true;\n    }\n\n}\n\nmodule.exports.ResetPassword = ResetPassword;\n"
  },
  {
    "path": "lib/world/client/debug-world-creator.js",
    "content": "/**\n *\n * Reldens - DebugWorldCreator\n *\n * Creates and manages the debug physics world visualization for client-side debugging.\n *\n */\n\nconst { Renderer } = require('./renderer');\nconst { P2world } = require('../../world/server/p2world');\nconst { WorldTimer } = require('../../world/world-timer');\nconst { Logger } = require('@reldens/utils');\n\n/**\n * @typedef {import('../server/p2world').P2world} P2world\n */\nclass DebugWorldCreator\n{\n\n    /**\n     * @param {Object} scene\n     * @returns {Promise<void>}\n     */\n    async createSceneWorld(scene)\n    {\n        let validLayers = this.findValidLayers(scene);\n        let mapJson = this.cloneMapJson(scene, validLayers);\n        let worldData = {\n            sceneName: scene.key,\n            roomId: scene.params.roomId,\n            roomMap: scene.params.roomName,\n            mapJson,\n            config: scene.configManager,\n            events: scene.eventsManager,\n            allowSimultaneous: scene.configManager.get('client/general/controls/allowSimultaneousKeys', true),\n            worldConfig: scene.gameManager.activeRoomEvents.roomData?.worldConfig || scene.worldConfig\n        };\n        scene.debugWorld = this.createWorldInstance(worldData);\n        scene.debugWorld.createLimits();\n        await scene.debugWorld.createWorldContent({});\n        scene.debugWorldTimer = new WorldTimer({\n            callbacks: [() => {\n                if(!scene.debugWorld){\n                    Logger.error('Scene World not longer exists.', scene.roomWorld);\n                    return;\n                }\n                scene.debugWorld.removeBodiesFromWorld();\n            }]\n        });\n        scene.debugWorldTimer.startWorldSteps(scene.debugWorld);\n        scene.debugWorldRenderer = new Renderer(scene);\n    }\n\n    /**\n     * @param {Object} scene\n     * @param {Array<Object>} validLayers\n     * @returns {Object}\n     */\n    cloneMapJson(scene, validLayers)\n    {\n        // @TODO - BETA - Fix to support multiple tilesets.\n        let tileset = scene.tilesets[0];\n        if(!tileset){\n            return {};\n        }\n        return Object.assign(\n            {},\n            (scene.cache?.tilemap?.entries?.entries[tileset.name]?.data || {}),\n            {layers: validLayers}\n        );\n    }\n\n    /**\n     * @param {Object} scene\n     * @returns {Array<Object>}\n     */\n    findValidLayers(scene)\n    {\n        let validLayers = [];\n        // @TODO - BETA - Fix to support multiple tilesets.\n        let tileset = scene.tilesets[0];\n        if(!tileset){\n            return validLayers;\n        }\n        for(let layer of scene.cache.tilemap.entries.entries[tileset.name].data.layers){\n            if(-1 !== layer.name.indexOf('collision')){\n                validLayers.push(layer);\n            }\n        }\n        return validLayers;\n    }\n\n    /**\n     * @param {Object} worldData\n     * @returns {P2world}\n     */\n    createWorldInstance(worldData)\n    {\n        return new P2world(worldData);\n    }\n\n}\n\nmodule.exports.DebugWorldCreator = DebugWorldCreator;\n"
  },
  {
    "path": "lib/world/client/plugin.js",
    "content": "/**\n *\n * Reldens - World Client Plugin\n *\n * Initializes the client-side world system and debug visualization features.\n *\n */\n\nconst { DebugWorldCreator } = require('./debug-world-creator');\nconst { PluginInterface } = require('../../features/plugin-interface');\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../game/client/game-manager').GameManager} GameManager\n */\nclass WorldPlugin extends PluginInterface\n{\n\n    /**\n     * @param {Object} props\n     * @returns {Promise<void>}\n     */\n    async setup(props)\n    {\n        /** @type {GameManager|boolean} */\n        this.gameManager = sc.get(props, 'gameManager', false);\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(props, 'events', false);\n        /** @type {Object|boolean} */\n        this.debugWorldCreator = false;\n        if(this.validateProperties()){\n            this.setupDebugMode();\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    validateProperties()\n    {\n        if(!this.gameManager){\n            Logger.error('Game Manager undefined in PredictionPlugin.');\n            return false;\n        }\n        if(!this.events){\n            Logger.error('EventsManager undefined in PredictionPlugin.');\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    setupDebugMode()\n    {\n        if(!this.gameManager.config.getWithoutLogs('client/world/debug/enabled', false)){\n            return false;\n        }\n        this.debugWorldCreator = new DebugWorldCreator();\n        this.events.on('reldens.createEngineSceneDone', async (event) => {\n            await this.debugWorldCreator.createSceneWorld(event.currentScene);\n        });\n    }\n\n}\n\nmodule.exports.WorldPlugin = WorldPlugin;\n"
  },
  {
    "path": "lib/world/client/renderer.js",
    "content": "/**\n *\n * Reldens - Renderer\n *\n * Renders the debug physics world visualization on an HTML canvas element.\n *\n */\n\nconst { Box } = require('p2');\n\nclass Renderer\n{\n\n    /**\n     * @param {Object} scene\n     */\n    constructor(scene)\n    {\n        // @TODO - BETA - Refactor this entire class.\n        /** @type {Object} */\n        this.scene = scene;\n        /** @type {Object} */\n        this.gameDom = scene.gameManager.gameDom;\n        /** @type {Object} */\n        this.world = scene.debugWorld;\n        /** @type {HTMLCanvasElement|boolean} */\n        this.canvasElement = false;\n        /** @type {CanvasRenderingContext2D|boolean} */\n        this.canvasContext = false;\n    }\n\n    fetchCanvasContext()\n    {\n        this.canvasContext = this.canvasElement.getContext('2d');\n    }\n\n    /**\n     * @param {number} width\n     * @param {number} height\n     * @returns {void}\n     */\n    createCanvas(width, height)\n    {\n        this.canvasElement = this.gameDom.createElement('canvas');\n        this.canvasElement.width = width;\n        this.canvasElement.height = height;\n        this.canvasElement.id = 'physicsCanvas';\n        this.gameDom.getDocument().body.appendChild(this.canvasElement);\n        this.fetchCanvasContext();\n    }\n\n    renderLoop()\n    {\n        // @TODO - BETA - Finish implementation to render all the objects movement.\n        this.canvasContext.clearRect(0, 0, this.canvasElement.width, this.canvasElement.height);\n        this.renderP2World();\n        this.gameDom.getWindow().requestAnimationFrame(this.renderLoop.bind(this));\n    }\n\n    renderP2World()\n    {\n        let context = this.canvasContext;\n        for(let i = 0; i < this.world.bodies.length; i++){\n            let body = this.world.bodies[i];\n            if(!body.isWall){\n                continue;\n            }\n            let shape = body.shapes[0];\n            context.fillStyle = '#2f7dde';\n            context.strokeStyle = '#333333';\n            if(shape instanceof Box){\n                let x = body.position[0];\n                let y = body.position[1];\n                let width = shape.width;\n                let height = shape.height;\n                context.save();\n                context.translate(x, y);\n                context.rotate(body.angle);\n                context.beginPath();\n                context.rect(-width / 2, -height / 2, width, height);\n                context.closePath();\n                context.fill();\n                context.stroke();\n                context.restore();\n            }\n            context.closePath();\n            context.fill();\n            context.stroke();\n        }\n        let textIndex = 0;\n        for(let i = 0; i < this.world.bodies.length; i++){\n            let body = this.world.bodies[i];\n            if(!body.isWall){\n                continue;\n            }\n            let shape = body.shapes[0];\n            if(shape instanceof Box){\n                let tileIndex = body.firstTileIndex || 0;\n                context.fillStyle = '#000000';\n                context.font = '9px Arial';\n                let fullText = tileIndex.toString()+' / '+shape.width + ' / '+body.position[0];\n                let x = body.position[0];\n                let y = body.position[1];\n                let textX = x - context.measureText(fullText).width / 2;\n                let textY = y;\n                context.textAlign = 'left';\n                context.textBaseline = 'middle';\n                context.fillText(fullText, textX, textY);\n                textIndex++;\n            }\n        }\n    }\n\n    debugWorld()\n    {\n        this.gameDom.getElement('.wrapper').style.display = 'none';\n        this.createCanvas(\n            this.scene.map.width * this.scene.map.tileWidth,\n            this.scene.map.height * this.scene.map.tileHeight\n        );\n        this.renderP2World();\n    }\n\n}\n\nmodule.exports.Renderer = Renderer;\n"
  },
  {
    "path": "lib/world/constants.js",
    "content": "/**\n *\n * Reldens - world/constants\n *\n */\n\nmodule.exports.WorldConst = {\n    WORLD_TYPES: {\n        NO_GRAVITY_2D: 'NO_GRAVITY_2D',\n        TOP_DOWN_WITH_GRAVITY: 'TOP_DOWN_WITH_GRAVITY'\n    },\n    COLLISIONS: {\n        PLAYER: Math.pow(2, 0),\n        OBJECT: Math.pow(2, 1),\n        WALL: Math.pow(2, 2),\n        BULLET_PLAYER: Math.pow(2, 3),\n        BULLET_OBJECT: Math.pow(2, 4),\n        BULLET_OTHER: Math.pow(2, 5),\n        DROP: Math.pow(2, 6),\n    },\n    FROM_TYPES: {\n        PLAYER: 'PLAYER',\n        OBJECT: 'OBJECT',\n        OTHER: 'OTHER'\n    }\n};\n"
  },
  {
    "path": "lib/world/server/body-state.js",
    "content": "/**\n *\n * Reldens - BodyState\n *\n * Colyseus schema representing the synchronized state of a physics body across server and clients.\n *\n */\n\nconst { Schema, type } = require('@colyseus/schema');\nconst { GameConst } = require('../../game/constants');\n\n/**\n * @typedef {Object} BodyStateData\n * @property {number} room_id\n * @property {string} scene\n * @property {string} [key]\n * @property {number} x\n * @property {number} y\n * @property {string} dir\n * @property {number} [inState]\n */\nclass BodyState extends Schema\n{\n\n    /**\n     * @param {BodyStateData} data\n     */\n    constructor(data)\n    {\n        super();\n        /** @type {number} */\n        this.room_id = data.room_id;\n        /** @type {string} */\n        this.scene = data.scene;\n        /** @type {string} */\n        this.key = data.key || '';\n        /** @type {number} */\n        this.x = parseFloat(data.x);\n        /** @type {number} */\n        this.y = parseFloat(data.y);\n        /** @type {string} */\n        this.dir = data.dir;\n        /** @type {boolean} */\n        this.mov = false;\n        /** @type {number} */\n        this.inState = data.inState || GameConst.STATUS.ACTIVE;\n    }\n\n    /**\n     * @param {BodyState} bodyState\n     * @returns {BodyState}\n     */\n    sync(bodyState)\n    {\n        this.room_id = bodyState.room_id;\n        this.scene = bodyState.scene;\n        this.key = bodyState.key;\n        this.x = parseFloat(bodyState.x);\n        this.y = parseFloat(bodyState.y);\n        this.dir = bodyState.dir;\n        this.mov = bodyState.mov;\n        this.inState = bodyState.inState;\n        return this;\n    }\n\n}\n\ntype('number')(BodyState.prototype, 'room_id');\ntype('string')(BodyState.prototype, 'scene');\ntype('string')(BodyState.prototype, 'key');\ntype('number')(BodyState.prototype, 'x');\ntype('number')(BodyState.prototype, 'y');\ntype('string')(BodyState.prototype, 'dir');\ntype('boolean')(BodyState.prototype, 'mov');\ntype('number')(BodyState.prototype, 'inState');\n\nmodule.exports.BodyState = BodyState;\n"
  },
  {
    "path": "lib/world/server/collisions-manager.js",
    "content": "/**\n *\n * Reldens - CollisionsManager\n *\n * Manage physics collision events and interactions between players, objects, walls, and change points.\n *\n */\n\nconst { PhysicalBody } = require('./physical-body');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('../../rooms/server/scene').RoomScene} RoomScene\n */\nclass CollisionsManager\n{\n\n    /**\n     * @param {RoomScene} room\n     */\n    constructor(room)\n    {\n        /** @type {RoomScene} */\n        this.room = null;\n        /** @type {string} */\n        this.guestEmailDomain = '';\n        this.activateCollisions(room);\n    }\n\n    /**\n     * @param {RoomScene} room\n     * @returns {void}\n     */\n    activateCollisions(room)\n    {\n        if(!room){\n            return;\n        }\n        this.room = room;\n        if(!sc.hasOwn(this.room, 'roomWorld')){\n            ErrorManager.error('Room world not found.');\n        }\n        this.guestEmailDomain = this.room.config.getWithoutLogs('server/players/guestsUser/emailDomain');\n        // @TODO - BETA - Refactor to extract p2js as driver.\n        // @NOTE: postBroadphase will be used to check pairs and test overlap instead of collision, for example, a spell\n        // will overlap the player but not collide with it, if the spell collides with the player it will push it in\n        // the opposite direction because the physics engine.\n        this.room.roomWorld.on('postBroadphase', this.onWorldStepStart.bind(this));\n        this.room.roomWorld.on('preSolve', this.beforeResolveCollision.bind(this));\n        this.room.roomWorld.on('beginContact', this.onCollisionsBegin.bind(this));\n        // @NOTE: \"endContact\"  will trigger when the contact ends and not when the collision step ends.\n        this.room.roomWorld.on('endContact', this.onCollisionsEnd.bind(this));\n    }\n\n    /**\n     * @param {Object} evt\n     * @returns {void}\n     */\n    onWorldStepStart(evt)\n    {\n        let { pairs } = evt;\n        // @NOTE: pairs can be a lot more than 2, these are not related to collisions pairs.\n        if(1 >= pairs.length){\n            return;\n        }\n        let bulletA = false;\n        let bulletB = false;\n        let player = false;\n        let roomObject = false;\n        for(let body of pairs){\n            if(body.playerId && body.pStop){\n                body.stopFull();\n            }\n            if(body.roomObject && body.pStop){\n                body.stopFull();\n            }\n            if(body.playerId){\n                player = body;\n            }\n            if(body.isBullet){\n                if(bulletA && !bulletB){\n                    bulletB = body;\n                }\n                if(!bulletA){\n                    bulletA = body;\n                }\n                body.removeInvalidStateBulletBody();\n            }\n            if(body.isRoomObject && !body.isBullet){\n                roomObject = body;\n            }\n        }\n        if(this.room.roomWorld.bulletsStopOnPlayer && player && bulletA){\n            player.stopFull();\n        }\n        if(this.room.roomWorld.bulletsStopOnObject && roomObject && bulletA){\n            roomObject.stopFull();\n        }\n        this.removeIdleBullets();\n    }\n\n    removeIdleBullets()\n    {\n        if(0 === this.room.roomWorld.removeBulletsStateIds.length){\n            return;\n        }\n        for(let stateId of this.room.roomWorld.removeBulletsStateIds){\n            this.room.state.removeBody(stateId);\n            this.room.roomWorld.removeBulletsStateIds.splice(\n                this.room.roomWorld.removeBulletsStateIds.indexOf(stateId),\n                1\n            );\n        }\n    }\n\n    /**\n     * @param {Object} evt\n     * @returns {void}\n     */\n    beforeResolveCollision(evt)\n    {\n        if(!this.room.roomWorld.allowPassWallsFromBelow){\n            return;\n        }\n        for(let contact of evt.contactEquations){\n            let playerBody = this.getPlayerBody(contact);\n            let wallBody = this.getWallBody(contact);\n            if(!playerBody || !wallBody || wallBody.isWorldWall){\n                return;\n            }\n            if(playerBody.position[1] > wallBody.position[1]){\n                contact.enabled = false;\n            }\n        }\n    }\n\n    /**\n     * @param {Object} evt\n     * @returns {Object|boolean|void}\n     */\n    onCollisionsBegin(evt)\n    {\n        let bodyA = evt.bodyA,\n            bodyB = evt.bodyB,\n            playerBody = false,\n            otherBody = false,\n            roomObjectBody = false;\n        if(bodyA.playerId && bodyB.playerId){\n            return this.playerHitPlayerBegin(bodyA, bodyB);\n        }\n        if(bodyA.playerId){\n            playerBody = bodyA;\n            otherBody = bodyB;\n        }\n        if(bodyB.playerId){\n            playerBody = bodyB;\n            otherBody = bodyA;\n        }\n        if(playerBody && otherBody.isRoomObject){\n            return this.playerHitObjectBegin(playerBody, otherBody);\n        }\n        if(playerBody && otherBody.changeScenePoint){\n            return this.playerHitChangePointBegin(playerBody, otherBody);\n        }\n        if(playerBody && otherBody.isWall){\n            return this.playerHitWallBegin(playerBody, otherBody);\n        }\n        if(bodyA.isRoomObject && bodyB.isRoomObject){\n            return this.objectHitObjectBegin(bodyA, bodyB);\n        }\n        if(bodyA.isRoomObject){\n            roomObjectBody = bodyA;\n            otherBody = bodyB;\n        }\n        if(bodyB.isRoomObject){\n            roomObjectBody = bodyB;\n            otherBody = bodyA;\n        }\n        if(roomObjectBody && otherBody.isWall){\n            this.objectHitWallBegin(roomObjectBody, otherBody);\n        }\n    }\n\n    /**\n     * @param {Object} evt\n     * @returns {void}\n     */\n    onCollisionsEnd(evt)\n    {\n        let bodyA = evt.bodyA,\n            bodyB = evt.bodyB,\n            playerBody = false,\n            otherBody = false,\n            roomObjectBody = false;\n        if(evt.bodyA.playerId && evt.bodyB.playerId){\n            this.playerHitPlayerEnd(evt.bodyA, evt.bodyB);\n        }\n        if(bodyA.playerId){\n            playerBody = bodyA;\n            otherBody = bodyB;\n        }\n        if(bodyB.playerId){\n            playerBody = bodyB;\n            otherBody = bodyA;\n        }\n        if(playerBody && otherBody.isRoomObject){\n            return this.playerHitObjectEnd(playerBody, otherBody);\n        }\n        if(playerBody && otherBody.isWall){\n            return this.playerHitWallEnd(playerBody, otherBody);\n        }\n        if(bodyA.isRoomObject && bodyB.isRoomObject){\n            this.objectHitObjectEnd(bodyA, bodyB);\n        }\n        if(bodyA.isRoomObject){\n            roomObjectBody = bodyA;\n            otherBody = bodyB;\n        }\n        if(bodyB.isRoomObject){\n            roomObjectBody = bodyB;\n            otherBody = bodyA;\n        }\n        if(roomObjectBody && otherBody.isWall){\n            return this.objectHitWallEnd(roomObjectBody, otherBody);\n        }\n    }\n\n    /**\n     * @param {Object} bodyA\n     * @param {Object} bodyB\n     * @returns {void}\n     */\n    playerHitPlayerBegin(bodyA, bodyB)\n    {\n        // @NOTE: we could run specific events when a player collides with another player.\n        // Logger.debug('Player hit player begin.', bodyA.playerId, bodyB.playerId);\n        this.room.events.emit('reldens.playerHitPlayer', {bodyA, bodyB});\n    }\n\n    /**\n     * @param {Object} bodyA\n     * @param {Object} bodyB\n     * @returns {void}\n     */\n    playerHitPlayerEnd(bodyA, bodyB)\n    {\n        // Logger.debug('Player hit player end.', bodyA.playerId, bodyB.playerId);\n        // player stops pushing a player:\n        bodyA.stopFull();\n        bodyB.stopFull();\n        this.room.events.emit('reldens.playerHitPlayerEnd', {bodyA, bodyB});\n    }\n\n    /**\n     * @param {Object} playerBody\n     * @param {Object} otherBody\n     * @returns {void}\n     */\n    playerHitObjectBegin(playerBody, otherBody)\n    {\n        // Logger.debug('Player hit object being.', playerBody.playerId, otherBody.bodyState?.key);\n        this.room.events.emit('reldens.startPlayerHitObjectBegin', {playerBody, otherBody});\n        // if the player collides with something we need to restart the pathfinder if it was active:\n        this.findAlternativePath(playerBody);\n        // now the collision manager only run the object hit action:\n        if(otherBody.roomObject && sc.isFunction(otherBody.roomObject.onHit)){\n            otherBody.roomObject.onHit({bodyA: playerBody, bodyB: otherBody, room: this.room});\n        }\n        this.room.events.emit('reldens.endPlayerHitObjectBegin', {playerBody, otherBody});\n    }\n\n    /**\n     * @param {Object} playerBody\n     * @param {Object} otherBody\n     * @returns {boolean|void}\n     */\n    playerHitObjectEnd(playerBody, otherBody)\n    {\n        // Logger.debug('Player hit object end.', playerBody.playerId, otherBody.bodyState?.key);\n        let result = {stopFull: true, continue: true};\n        this.room.events.emit('reldens.playerHitObjectEnd', {playerBody, result});\n        if(!result.continue){\n            return false;\n        }\n        playerBody.stopFull(result.stopFull);\n    }\n\n    /**\n     * @param {Object} playerBody\n     * @param {Object} wallBody\n     * @returns {void}\n     */\n    playerHitWallBegin(playerBody, wallBody)\n    {\n        // Logger.debug('Player hit wall being.', playerBody.playerId);\n        this.room.events.emit('reldens.playerHitWallBegin', {playerBody, wallBody});\n    }\n\n    /**\n     * @param {Object} playerBody\n     * @param {Object} wallBody\n     * @returns {void}\n     */\n    playerHitWallEnd(playerBody, wallBody)\n    {\n        // Logger.debug('Player hit wall end.', playerBody.playerId);\n        this.room.events.emit('reldens.startPlayerHitWallEnd', {playerBody, wallBody});\n        // @NOTE: we can use wall.material to trigger an action over the player, like:\n        // wall.material = lava > reduce player.hp in every step\n        // if the player collides with something we need to restart the pathfinder if it was active:\n        if(playerBody.autoMoving && 1 < playerBody.autoMoving.length){\n            let destPoint = playerBody.autoMoving.pop();\n            playerBody.moveToPoint({column: destPoint[0], row: destPoint[1]});\n            return;\n        }\n        if(playerBody.world && !playerBody.world.applyGravity){\n            playerBody.stopFull(true);\n        }\n        this.room.events.emit('reldens.endPlayerHitWallEnd', {playerBody, wallBody});\n    }\n\n    /**\n     * @param {Object} playerBody\n     * @param {Object} changePoint\n     * @returns {boolean|void}\n     */\n    playerHitChangePointBegin(playerBody, changePoint)\n    {\n        // Logger.debug('Player hit change point begin.', playerBody.playerId, changePoint.changeScenePoint);\n        this.room.events.emit('reldens.startPlayerHitChangePoint', {collisionsManager: this, playerBody, changePoint});\n        playerBody.resetAuto();\n        // check if the player is not changing scenes already:\n        let isChangingScene = sc.get(playerBody, 'isChangingScene', false);\n        if(isChangingScene){\n            // @NOTE: if the player is already changing scene do nothing.\n            Logger.info('Player is busy for a change point: '+playerBody.playerId);\n            return false;\n        }\n        let playerSchema = this.room.playerBySessionIdFromState(playerBody.playerId);\n        let contactClient = this.room.getClientById(playerBody.playerId);\n        let isGuest = -1 !== contactClient.auth.email?.indexOf(this.guestEmailDomain);\n        if(!this.room.validateRoom(changePoint.changeScenePoint, isGuest, true)){\n            Logger.info('Guest Player hit change point but is not allowed to the room: '+playerSchema.state.scene);\n            this.room.events.emit('reldens.guestInvalidChangePoint', {\n                collisionsManager: this,\n                playerBody,\n                changePoint,\n                playerSchema,\n                contactClient,\n                isGuest\n            });\n            return false;\n        }\n        let playerPosition = {x: playerBody.position[0], y: playerBody.position[1]};\n        this.room.state.positionPlayer(playerBody.playerId, playerPosition);\n        let changeData = {prev: playerSchema.state.scene, next: changePoint.changeScenePoint};\n        // Logger.debug('Player \"'+playerBody.playerId+'\" hit change point.', changeData);\n        playerBody.isChangingScene = true;\n        // @NOTE: we do not need to change back the isChangingScene property back to false since in the new\n        // scene a new body will be created with the value set to false by default.\n        this.room.nextSceneInitialPosition(contactClient, changeData, playerBody).catch((error) => {\n            Logger.error('There was an error while setting the next scene initial position.', error);\n        });\n        this.room.events.emit('reldens.endPlayerHitChangePoint', {\n            collisionsManager: this,\n            playerSchema,\n            playerBody,\n            changePoint,\n            changeData\n        });\n    }\n\n    /**\n     * @param {Object} bodyA\n     * @param {Object} bodyB\n     * @returns {void}\n     */\n    objectHitObjectBegin(bodyA, bodyB)\n    {\n        // Logger.debug('Object hit object begin.', bodyA.bodyState?.key, bodyB.bodyState?.key);\n        this.room.events.emit('reldens.startObjectHitObject', {bodyA, bodyB});\n        let aPriority = sc.hasOwn(bodyA, 'hitPriority');\n        let bPriority = sc.hasOwn(bodyB, 'hitPriority');\n        let onHitData = {bodyA: bodyA, bodyB: bodyB, room: this.room};\n        let priorityObject = (!aPriority && !bPriority) || (aPriority && (!bPriority || aPriority > bPriority))\n            ? bodyA\n            : bodyB;\n        if(priorityObject.roomObject && sc.isFunction(priorityObject.roomObject?.onHit)){\n            priorityObject.roomObject.onHit(onHitData);\n        }\n        if(bodyA.isBullet){\n            bodyA.roomObject.removeBullet(bodyA);\n        }\n        if(bodyB.isBullet){\n            bodyB.roomObject.removeBullet(bodyB);\n        }\n        this.findAlternativePath(bodyA);\n        this.findAlternativePath(bodyB);\n        this.room.events.emit('reldens.endObjectHitObject', {bodyA, bodyB, priorityObject});\n    }\n\n    /**\n     * @param {Object} bodyA\n     * @param {Object} bodyB\n     * @returns {void}\n     */\n    objectHitObjectEnd(bodyA, bodyB)\n    {\n        // Logger.debug('Object hit object end.', bodyA.bodyState?.key, bodyB.bodyState?.key);\n        this.bodyFullStop(bodyA);\n        this.bodyFullStop(bodyB);\n        this.room.events.emit('reldens.objectHitObjectEnd', {bodyA, bodyB});\n    }\n\n    /**\n     * @param {Object} objectBody\n     * @param {Object} wall\n     * @returns {Object}\n     */\n    objectHitWallBegin(objectBody, wall)\n    {\n        // Logger.debug('Object hit wall begin.', objectBody.bodyState?.key);\n        let event = {objectBody, wall, continue: true};\n        this.room.events.emit('reldens.objectHitWallBegin', event);\n        if(!event.continue){\n            return event;\n        }\n        if(objectBody.isBullet){\n            objectBody.roomObject.removeBullet(objectBody);\n        }\n        return event;\n    }\n\n    /**\n     * @param {Object} objectBody\n     * @returns {void}\n     */\n    objectHitWallEnd(objectBody)\n    {\n        // Logger.debug('Object hit wall end.', objectBody.bodyState?.key);\n        this.room.events.emit('reldens.startObjectHitWall', {objectBody});\n        // @NOTE: we can use wall.material to trigger an action over the player, like:\n        // wall.material = lava > reduce player.hp in every step\n        // if the player collides with something we need to restart the pathfinder if it was active:\n        this.resetObjectAutoMove(objectBody);\n        this.room.events.emit('reldens.endObjectHitWall', {objectBody});\n    }\n\n    /**\n     * @param {Object} body\n     * @returns {boolean|void}\n     */\n    bodyFullStop(body)\n    {\n        if(!body){\n            return false;\n        }\n        let isBodyAMoving = body.autoMoving && 0 < body.autoMoving.length;\n        if(!isBodyAMoving && !body.isBullet && body.isRoomObject && (body instanceof PhysicalBody)){\n            body.stopFull(true);\n        }\n        if(body.isBullet){\n            body.roomObject.removeBullet(body);\n        }\n    }\n\n    /**\n     * @param {Object} body\n     * @returns {boolean|void}\n     */\n    findAlternativePath(body)\n    {\n        if(!body.autoMoving || 0 === body.autoMoving.length){\n            return false;\n        }\n        // Logger.debug('Find alternative path for body \"'+body.bodyLogKey()+'\".');\n        let currentPoint = body.autoMoving.shift();\n        let destPoint = body.autoMoving.pop();\n        body.autoMoving = body.getPathFinder().findPath(currentPoint, destPoint);\n    }\n\n    /**\n     * @param {Object} body\n     * @returns {void}\n     */\n    resetObjectAutoMove(body)\n    {\n        if(!(body instanceof PhysicalBody)){\n            return;\n        }\n        if(!body.world){\n            return;\n        }\n        let lastPoint = false;\n        if(sc.isArray(body.autoMoving) && 0 < body.autoMoving.length){\n            lastPoint = body.autoMoving.pop();\n        }\n        if(!lastPoint){\n            return;\n        }\n        body.world.applyGravity ? body.stopFull(true) : body.stopX(true);\n        body.autoMovingResetRetries++;\n        if(body.autoMovingResetMaxRetries === body.autoMovingResetRetries){\n            body.autoMovingResetRetries = 0;\n            // Logger.debug('Reset object auto-move, returning to original point.');\n            return body.moveToOriginalPoint();\n        }\n        /*\n        Logger.debug(\n            'Body \"'+body.bodyLogKey()+'\" auto-move to points: '+lastPoint[0]+' / '+lastPoint[1]+'.'\n            +' Retries: '+body.autoMovingResetRetries+' / '+body.autoMovingResetMaxRetries\n        );\n        */\n        body.moveToPoint({column: lastPoint[0], row: lastPoint[1]});\n    }\n\n    /**\n     * @param {Object} evt\n     * @returns {Object|boolean}\n     */\n    getWallBody(evt)\n    {\n        let {bodyA, bodyB} = evt;\n        return bodyA && bodyA.isWall ? bodyA : (bodyB && bodyB.isWall ? bodyB : false);\n    }\n\n    /**\n     * @param {Object} evt\n     * @returns {Object|boolean}\n     */\n    getObjectBody(evt)\n    {\n        let {bodyA, bodyB} = evt;\n        return bodyA && bodyA.isRoomObject ? bodyA : (bodyB && bodyB.isRoomObject ? bodyB : false);\n    }\n\n    /**\n     * @param {Object} evt\n     * @returns {Object|boolean}\n     */\n    getPlayerBody(evt)\n    {\n        let {bodyA, bodyB} = evt;\n        return bodyA && bodyA.playerId ? bodyA : (bodyB && bodyB.playerId ? bodyB : false);\n    }\n\n}\n\nmodule.exports.CollisionsManager = CollisionsManager;\n"
  },
  {
    "path": "lib/world/server/object-body-state.js",
    "content": "/**\n *\n * Reldens - ObjectBodyState\n *\n * Colyseus schema extending BodyState to represent an object-specific body state with auto-direction support.\n *\n */\n\nconst { type } = require('@colyseus/schema');\nconst { BodyState } = require('./body-state');\nconst { sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('./body-state').BodyStateData} BodyStateData\n *\n * @typedef {Object} ObjectBodyStateData\n * @property {number} id\n * @property {boolean} [autoDirection]\n */\nclass ObjectBodyState extends BodyState\n{\n\n    /**\n     * @param {BodyStateData & ObjectBodyStateData} data\n     */\n    constructor(data)\n    {\n        super(data);\n        /** @type {number} */\n        this.id = data.id;\n        /** @type {boolean} */\n        this.autoDirection = sc.get(data, 'autoDirection', true);\n    }\n\n}\n\ntype('number')(ObjectBodyState.prototype, 'id');\n\nmodule.exports.ObjectBodyState = ObjectBodyState;\n"
  },
  {
    "path": "lib/world/server/p2world.js",
    "content": "/**\n *\n * Reldens - P2world\n *\n * Physics world implementation using P2.js engine with tile map integration, collision management, and pathfinding.\n *\n */\n\nconst { World, Body, Box } = require('p2');\nconst { PhysicalBody } = require('./physical-body');\nconst { ObjectBodyState } = require('./object-body-state');\nconst { PathFinder } = require('./path-finder');\nconst { TypeDeterminer } = require('../../game/type-determiner');\nconst { GameConst } = require('../../game/constants');\nconst { RoomsConst } = require('../../rooms/constants');\nconst { WorldConst } = require('../constants');\nconst { ErrorManager, Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {import('@reldens/utils').EventsManager} EventsManager\n * @typedef {import('../../config/server/manager').ConfigManager} ConfigManager\n * @typedef {import('../../objects/server/manager').ObjectsManager} ObjectsManager\n */\nclass P2world extends World\n{\n\n    /**\n     * @param {Object} options\n     */\n    constructor(options)\n    {\n        // @TODO - BETA - Remove this class, create a driver for the physics engine.\n        super(options);\n        /** @type {EventsManager|boolean} */\n        this.events = sc.get(options, 'events', false);\n        /** @type {number|boolean} */\n        this.roomId = sc.get(options, 'roomId', false);\n        /** @type {string|boolean} */\n        this.sceneName = sc.get(options, 'sceneName', false);\n        /** @type {string|boolean} */\n        this.sceneTiledMapFile = sc.get(options, 'roomMap', false);\n        /** @type {ConfigManager|boolean} */\n        this.config = sc.get(options, 'config', false);\n        this.validateRequiredProperties(options);\n        /** @type {Object} */\n        this.mapJson = null;\n        this.saveMapData(options);\n        /** @type {ObjectsManager|boolean} */\n        this.objectsManager = sc.get(options, 'objectsManager', false);\n        /** @type {boolean} */\n        this.applyGravity = sc.get(options.worldConfig, 'applyGravity', false);\n        /** @type {Array<number>} */\n        this.gravity = sc.get(options.worldConfig, 'gravity', [0, 0]);\n        /** @type {number} */\n        this.globalStiffness = sc.get(options.worldConfig, 'globalStiffness', 100000000);\n        /** @type {number} */\n        this.globalRelaxation = sc.get(options.worldConfig, 'globalRelaxation', 10);\n        /** @type {boolean} */\n        this.useFixedWorldStep = sc.get(options.worldConfig, 'useFixedWorldStep', true);\n        /** @type {number} */\n        this.timeStep = sc.get(options.worldConfig, 'timeStep', 0.04);\n        /** @type {number} */\n        this.maxSubSteps = sc.get(options.worldConfig, 'maxSubSteps', 1);\n        /** @type {number} */\n        this.movementSpeed = sc.get(options.worldConfig, 'movementSpeed', 180);\n        /** @type {boolean} */\n        this.allowPassWallsFromBelow = sc.get(options.worldConfig, 'allowPassWallsFromBelow', false);\n        /** @type {number} */\n        this.jumpSpeed = sc.get(options.worldConfig, 'jumpSpeed', 0);\n        /** @type {number} */\n        this.jumpTimeMs = sc.get(options.worldConfig, 'jumpTimeMs', 0);\n        /** @type {boolean} */\n        this.tryClosestPath = sc.get(options.worldConfig, 'tryClosestPath', false);\n        /** @type {boolean} */\n        this.onlyWalkable = sc.get(options.worldConfig, 'onlyWalkable', false);\n        /** @type {number} */\n        this.wallsMassValue = sc.get(options.worldConfig, 'wallsMassValue', 1);\n        /** @type {number} */\n        this.playerMassValue = sc.get(options.worldConfig, 'playerMassValue', 1);\n        /** @type {boolean} */\n        this.bulletsStopOnPlayer = sc.get(options.worldConfig, 'bulletsStopOnPlayer', true);\n        /** @type {boolean} */\n        this.bulletsStopOnObject = sc.get(options.worldConfig, 'bulletsStopOnObject', true);\n        /** @type {boolean} */\n        this.disableObjectsCollisionsOnChase = sc.get(options.worldConfig, 'disableObjectsCollisionsOnChase', false);\n        /** @type {boolean} */\n        this.disableObjectsCollisionsOnReturn = sc.get(options.worldConfig, 'disableObjectsCollisionsOnReturn', true);\n        /** @type {boolean} */\n        this.collisionsGroupsByType = sc.get(options.worldConfig, 'collisionsGroupsByType', true);\n        /** @type {boolean} */\n        this.groupWallsVertically = sc.get(options.worldConfig, 'groupWallsVertically', false);\n        /** @type {boolean} */\n        this.groupWallsHorizontally = sc.get(options.worldConfig, 'groupWallsHorizontally', false);\n        /** @type {boolean} */\n        this.allowSimultaneous = sc.get(options, 'allowSimultaneous', false);\n        /** @type {boolean} */\n        this.allowChangePoints = sc.get(options, 'allowChangePoints', true);\n        /** @type {boolean} */\n        this.allowRoomObjectsCreation = sc.get(options, 'allowRoomObjectsCreation', true);\n        /** @type {boolean} */\n        this.allowBodiesWithState = sc.get(options, 'allowBodiesWithState', true);\n        /** @type {boolean} */\n        this.usePathFinder = sc.get(options, 'usePathFinder', true);\n        /** @type {boolean} */\n        this.respawnAreas = false;\n        /** @type {Array<Object>} */\n        this.removeBodies = [];\n        /** @type {Array<string>} */\n        this.removeBulletsStateIds = [];\n        /** @type {string} */\n        this.type = sc.get(options, 'type', WorldConst.WORLD_TYPES.NO_GRAVITY_2D);\n        /** @type {number} */\n        this.totalBodiesCount = 0;\n        /** @type {number} */\n        this.totalBodiesCreated = 0;\n        /** @type {Array<Object>} */\n        this.queueBodies = [];\n        /** @type {PathFinder|boolean} */\n        this.pathFinder = false;\n        this.enablePathFinder();\n        /** @type {Date} */\n        this.worldDateTime = null;\n        /** @type {number} */\n        this.worldDateTimeInterval = null;\n        this.enableWorldDateTime();\n        /** @type {string} */\n        this.worldKey = sc.randomChars(16);\n        /** @type {number} */\n        this.limitsBodyType = sc.get(options.worldConfig, 'limitsBodyType', Body.STATIC);\n        /** @type {number} */\n        this.wallBodyType = sc.get(options.worldConfig, 'wallBodyType', Body.STATIC);\n        /** @type {number} */\n        this.changePointsBodyType = sc.get(options.worldConfig, 'changePointsBodyType', Body.STATIC);\n        /** @type {number} */\n        this.worldObjectBodyType = sc.get(options.worldConfig, 'worldObjectBodyType', Body.DYNAMIC);\n        /** @type {number} */\n        this.playersBodyType = sc.get(options.worldConfig, 'playersBodyType', Body.DYNAMIC);\n        /** @type {number} */\n        this.bulletsBodyType = sc.get(options.worldConfig, 'playersBodyType', Body.DYNAMIC);\n        /** @type {Object} */\n        this.bodyTypes = {\n            KINEMATIC: Body.KINEMATIC,\n            STATIC: Body.STATIC,\n            DYNAMIC: Body.DYNAMIC\n        };\n        /** @type {TypeDeterminer} */\n        this.typeDeterminer = new TypeDeterminer();\n        /** @type {boolean} */\n        this.playerAnimationBasedOnPress = this.config.get('client/players/animations/basedOnPress', false);\n        /** @type {boolean} */\n        this.playerAnimationDiagonalHorizontal = this.config.get('client/players/animations/diagonalHorizontal', false);\n        /** @type {boolean} */\n        this.usePlayerSpeedConfig = this.config.get('server/players/physicsBody/usePlayerSpeedConfig', false);\n        /** @type {Object<number, Object>} */\n        this.createdChangePoints = {};\n        /** @type {Object<number, string>} */\n        this.changePoints = {};\n        /** @type {number} */\n        this.playerMovementSpeed = 0;\n    }\n\n    /**\n     * @param {Object} options\n     * @returns {void}\n     */\n    saveMapData(options)\n    {\n        this.mapJson = sc.get(options, 'mapJson');\n        if(!this.mapJson && sc.hasOwn(this.config, 'server') && sc.hasOwn(this.config.server, 'maps')){\n            this.mapJson = sc.get(this.config.server.maps, this.sceneTiledMapFile, false);\n        }\n        if(!this.mapJson){\n            Logger.critical(\n                'Map \"'+this.sceneTiledMapFile+'\" not found in server maps.',\n                Object.keys(this.config.server.maps)\n            );\n            ErrorManager.error('Map \"'+this.sceneTiledMapFile+'\" not found in server maps.');\n        }\n    }\n\n    enableWorldDateTime()\n    {\n        this.worldDateTime = new Date();\n        this.worldDateTimeInterval = setInterval(() => {\n            this.worldDateTime = new Date();\n            // Logger.debug('World '+this.worldKey+': '+this.worldDateTime.toISOString().slice(0, 19).replace('T', ' '));\n        }, 1000);\n    }\n\n    enablePathFinder()\n    {\n        if(!this.usePathFinder){\n            return;\n        }\n        this.pathFinder = new PathFinder();\n        this.pathFinder.world = this;\n        this.pathFinder.createGridFromMap();\n    }\n\n    /**\n     * @param {Object} options\n     * @returns {void}\n     */\n    validateRequiredProperties(options)\n    {\n        if(!this.events){\n            ErrorManager.error('EventsManager undefined in P2world.');\n        }\n        if(!this.roomId || !this.sceneName || !this.sceneTiledMapFile){\n            Logger.critical('World creation missing data in options.', {\n                roomId: this.roomId,\n                sceneName: this.sceneName,\n                sceneTiledMapFile: this.sceneTiledMapFile\n            });\n            ErrorManager.error('World creation missing data in options.');\n        }\n        if(!this.config){\n            ErrorManager.error('Missing Config Manager.');\n        }\n    }\n\n    /**\n     * @param {Object} mapData\n     * @returns {Promise<void>}\n     */\n    async createWorldContent(mapData)\n    {\n        // @TODO - BETA - Analyze and implement blocks groups, for example, all simple collision blocks could be\n        //   grouped and use a single big block to avoid the overload number of small blocks which now impacts in the\n        //   consumed resources.\n        if(!this.validateMapData(this.mapJson)){\n            Logger.error('Missing map data.', this.mapJson);\n            return;\n        }\n        if(!this.shouldGroupBodies()){\n            Logger.warning('Group bodies fully disabled, this can impact performance.');\n        }\n        this.changePoints = this.getSceneChangePoints(mapData);\n        let mapLayers = this.mapJson.layers;\n        let createObjectsData = [];\n        for(let layer of mapLayers){\n            let eventData = {layer, world: this};\n            await this.events.emit('reldens.parsingMapLayerBefore', eventData);\n            createObjectsData.push(...await this.createLayerContents(eventData.layer));\n            await this.events.emit('reldens.parsingMapLayerAfter', eventData);\n        }\n        for(let objectData of createObjectsData){\n            let {layer, tileIndex, tileW, tileH, posX, posY} = objectData;\n            await this.createRoomObjectBody(layer, tileIndex, tileW, tileH, posX, posY);\n        }\n        this.processBodiesQueue();\n        for(let layer of mapLayers) {\n            let eventData = {layer, world: this};\n            await this.events.emit('reldens.parsingMapLayersAfterBodiesQueue', eventData);\n        }\n        Logger.info(\n            'Total wall bodies found: '+this.totalBodiesCount,\n            'Total wall bodies created: '+this.totalBodiesCreated\n        );\n    }\n\n    processBodiesQueue()\n    {\n        this.queueBodies.sort((a, b) => {\n            const lowestIndexA = a.tileIndexes[0];\n            const lowestIndexB = b.tileIndexes[0];\n            return lowestIndexA - lowestIndexB;\n        });\n        for(let bodyWall of this.queueBodies){\n            this.addBody(bodyWall);\n        }\n        this.queueBodies = [];\n    }\n\n    /**\n     * @param {Object} layer\n     * @returns {Promise<Array<Object>>}\n     */\n    async createLayerContents(layer)\n    {\n        let tileW = this.mapJson.tilewidth,\n            tileH = this.mapJson.tileheight,\n            halfTileW = tileW / 2,\n            halfTileH = tileH / 2;\n        let isChangePointsLayer = -1 !== layer.name.indexOf('change-points');\n        let isCollisionsLayer = -1 !== layer.name.indexOf('collisions');\n        let createObjectsData = [];\n        // loop columns:\n        for(let c = 0; c < this.mapJson.width; c++){\n            let posX = c * tileW + halfTileW;\n            // loop rows:\n            for(let r = 0; r < this.mapJson.height; r++){\n                // position in units:\n                let posY = r * tileH + halfTileH;\n                let tileIndex = this.tileIndexByRowAndColumn(r, c);\n                let tile = layer.data[tileIndex];\n                let isZeroTile = 0 === Number(tile);\n                let isChangePoint = false;\n                let isCollisionBody = false;\n                // the 0 value is for empty tiles without collisions or change points:\n                if(!isZeroTile){\n                    // look for change points on the layers with the proper name convention:\n                    if(this.allowChangePoints && isChangePointsLayer){\n                        isChangePoint = this.createChangePoint(tileIndex, tileW, tileH, posX, posY);\n                        this.createdChangePoints[tileIndex] = isChangePoint;\n                    }\n                    // create collisions for layers with the proper name convention:\n                    if(isCollisionsLayer){\n                        isCollisionBody = this.createWallCollisionBody(\n                            tileIndex,\n                            this.determinePreviousTileIndexFromGroupingType(tileIndex, layer, r, c),\n                            tileW,\n                            tileH,\n                            posX,\n                            posY\n                        );\n                    }\n                }\n                if(this.usePathFinder){\n                    this.markPathFinderTile(layer, isZeroTile, isChangePoint, isCollisionBody, c, r);\n                }\n                // @TODO - BETA - Emit event and move the rooms objects creation into the objects plugin.\n                createObjectsData.push({layer, tileIndex, tileW, tileH, posX, posY});\n            }\n        }\n        if(isChangePointsLayer){\n            this.createChangePointsFromStorage();\n        }\n        return createObjectsData;\n    }\n\n    createChangePointsFromStorage()\n    {\n        let roomChangePointsTileIndex = Object.keys(this.changePoints);\n        for(let tileIndex of roomChangePointsTileIndex){\n            let changePoint = this.changePoints[tileIndex];\n            if(this.createdChangePoints[tileIndex]){\n                Logger.debug('Change point already created on map.', tileIndex, changePoint);\n                continue;\n            }\n            Logger.warning('Change point saved in the storage was does not exists in the map.', changePoint);\n            let {col, row} = this.fetchPositionFromTileIndex(tileIndex);\n            if(!this.pathFinder.grid.isWalkableAt(col, row)){\n                Logger.error('Missing change point on map cannot be created because node is not walkable.', {\n                    changePoint,\n                    tileIndex,\n                    col,\n                    row\n                });\n                continue;\n            }\n            this.pathFinder.grid.setWalkableAt(col, row, false);\n            this.createdChangePoints[tileIndex] = this.createChangePoint(\n                tileIndex,\n                this.mapJson.tilewidth,\n                this.mapJson.tileheight,\n                col * this.mapJson.tilewidth,\n                row * this.mapJson.tileheight\n            );\n            Logger.info('Created missing change point in map.', changePoint, tileIndex, col, row);\n        }\n    }\n\n    /**\n     * @param {number} tileIndex\n     * @param {Object} layer\n     * @param {number} r\n     * @param {number} c\n     * @returns {number|boolean}\n     */\n    determinePreviousTileIndexFromGroupingType(tileIndex, layer, r, c)\n    {\n        if(!this.shouldGroupBodies()){\n            return false;\n        }\n        if(this.groupWallsVertically){\n            return this.fetchPreviousWallTile(layer, r, c);\n        }\n        return 0 === tileIndex ? false : tileIndex - 1;\n    }\n\n    /**\n     * @param {Object} layer\n     * @param {number} r\n     * @param {number} c\n     * @returns {number|boolean}\n     */\n    fetchPreviousWallTile(layer, r, c)\n    {\n        if(0 === r){\n            return false;\n        }\n        let tileIndex = this.tileIndexByRowAndColumn(r - 1, c);\n        let tile = layer.data[tileIndex];\n        let isZeroTile = 0 === Number(tile);\n        return isZeroTile ? false : tileIndex;\n    }\n\n    /**\n     * @param {number} r\n     * @param {number} c\n     * @returns {number}\n     */\n    tileIndexByRowAndColumn(r, c)\n    {\n        return r * this.mapJson.width + c;\n    }\n\n    /**\n     * @param {number} tileIndex\n     * @returns {Object}\n     */\n    fetchPositionFromTileIndex(tileIndex)\n    {\n        let row = Math.floor(tileIndex / this.mapJson.width);\n        let col = tileIndex % this.mapJson.width;\n        return { col, row };\n    }\n\n    /**\n     * @param {Object} mapJson\n     * @returns {boolean}\n     */\n    validateMapData(mapJson)\n    {\n        return 0 < Number(mapJson.width || 0)\n            && 0 < Number(mapJson.height || 0)\n            && 0 < Number(mapJson.tilewidth || 0)\n            && 0 < Number(mapJson.tileheight || 0);\n    }\n\n    /**\n     * @param {Object} layer\n     * @param {number} tileIndex\n     * @param {number} tileW\n     * @param {number} tileH\n     * @param {number} posX\n     * @param {number} posY\n     * @returns {Promise<Object|void>}\n     */\n    async createRoomObjectBody(layer, tileIndex, tileW, tileH, posX, posY)\n    {\n        if(!this.allowRoomObjectsCreation || !this.objectsManager){\n            return;\n        }\n        // objects will be found by layer name + tile index:\n        let objectIndex = layer.name + tileIndex;\n        // this will validate if the object class exists and return an instance of it:\n        let roomObject = this.objectsManager.getObjectData(objectIndex);\n        // if the data and the instance was created:\n        if(!roomObject){\n            return;\n        }\n        if(roomObject.multiple){\n            return;\n        }\n        return await this.createWorldObject(roomObject, objectIndex, tileW, tileH, posX, posY);\n    }\n\n    /**\n     * @param {Object} layer\n     * @param {boolean} isZeroTile\n     * @param {boolean|Object} isChangePoint\n     * @param {boolean|Object} isCollisionBody\n     * @param {number} c\n     * @param {number} r\n     * @returns {void}\n     */\n    markPathFinderTile(layer, isZeroTile, isChangePoint, isCollisionBody, c, r)\n    {\n        if(!this.pathFinder){\n            return;\n        }\n        let isPathFinderLayer = -1 !== layer.name.indexOf('pathfinder');\n        let hasBody = !isZeroTile && (isChangePoint || isCollisionBody);\n        let isNotPathFinderTile = isZeroTile && isPathFinderLayer;\n        if(!hasBody && !isNotPathFinderTile){\n            return;\n        }\n        this.pathFinder.grid.setWalkableAt(c, r, false);\n    }\n\n    /**\n     * @param {number} tileIndex\n     * @param {number|boolean} previousWallTileIndex\n     * @param {number} tileW\n     * @param {number} tileH\n     * @param {number} posX\n     * @param {number} posY\n     * @returns {Object}\n     */\n    createWallCollisionBody(tileIndex, previousWallTileIndex, tileW, tileH, posX, posY)\n    {\n        this.totalBodiesCount++;\n        let existentTileBodyWall = false !== previousWallTileIndex\n            ? this.fetchBodyByTileIndexId(previousWallTileIndex)\n            : false;\n        if(existentTileBodyWall){\n            let currentIndexes = existentTileBodyWall.tileIndexes;\n            if(-1 !== currentIndexes.indexOf(tileIndex)){\n                return existentTileBodyWall;\n            }\n            currentIndexes.push(tileIndex);\n            let bodyWall = this.createWall(\n                this.determineShapeWidth(currentIndexes, tileW),\n                this.determineShapeHeight(currentIndexes, tileH),\n                this.determineBodyPositionX(existentTileBodyWall, tileW, posX),\n                this.determineBodyPositionY(existentTileBodyWall, tileH, posY),\n                this.wallBodyType\n            );\n            bodyWall.tileIndexes = currentIndexes;\n            bodyWall.firstTileIndex = existentTileBodyWall.firstTileIndex;\n            this.queueBodies.splice(this.queueBodies.indexOf(existentTileBodyWall), 1);\n            this.queueBodies.push(bodyWall);\n            return bodyWall;\n        }\n        let bodyWall = this.createWall(tileW, tileH, posX, posY, this.wallBodyType);\n        bodyWall.tileIndexes = [tileIndex];\n        bodyWall.firstTileIndex = tileIndex;\n        !this.shouldGroupBodies() ? this.addBody(bodyWall) : this.queueBodies.push(bodyWall);\n        this.totalBodiesCreated++;\n        return bodyWall;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    shouldGroupBodies()\n    {\n        return this.groupWallsVertically || this.groupWallsHorizontally;\n    }\n\n    /**\n     * @param {Object} existentTileBodyWall\n     * @param {number} tileH\n     * @param {number} posY\n     * @returns {number}\n     */\n    determineBodyPositionY(existentTileBodyWall, tileH, posY)\n    {\n        if(!this.groupWallsVertically){\n            return posY;\n        }\n        return existentTileBodyWall.position[1] + (tileH / 2);\n    }\n\n    /**\n     * @param {Object} existentTileBodyWall\n     * @param {number} tileW\n     * @param {number} posX\n     * @returns {number}\n     */\n    determineBodyPositionX(existentTileBodyWall, tileW, posX)\n    {\n        if(!this.groupWallsHorizontally){\n            return posX;\n        }\n        return existentTileBodyWall.position[0] + (tileW / 2);\n    }\n\n    /**\n     * @param {Array<number>} currentIndexes\n     * @param {number} tileH\n     * @returns {number}\n     */\n    determineShapeHeight(currentIndexes, tileH)\n    {\n        if(!this.groupWallsVertically){\n            return tileH;\n        }\n        return currentIndexes.length * tileH;\n    }\n\n    /**\n     * @param {Array<number>} currentIndexes\n     * @param {number} tileW\n     * @returns {number}\n     */\n    determineShapeWidth(currentIndexes, tileW)\n    {\n        if(!this.groupWallsHorizontally){\n            return tileW;\n        }\n        return currentIndexes.length * tileW;\n    }\n\n    /**\n     * @param {number} tileIndex\n     * @returns {Object|boolean}\n     */\n    fetchBodyByTileIndexId(tileIndex)\n    {\n        for(let body of this.queueBodies){\n            if(!body.isWall || !body.tileIndexes){\n                continue;\n            }\n            if(-1 !== body.tileIndexes.indexOf(tileIndex)){\n                return body;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @param {number} tileIndex\n     * @param {number} tileW\n     * @param {number} tileH\n     * @param {number} posX\n     * @param {number} posY\n     * @returns {Object|boolean}\n     */\n    createChangePoint(tileIndex, tileW, tileH, posX, posY)\n    {\n        let changeScenePoint = sc.get(this.changePoints, tileIndex, null);\n        if(null === changeScenePoint){\n            Logger.error('Change point data not found in this.changePoints for tileIndex:', tileIndex);\n            return false;\n        }\n        // @NOTE: we make the change point smaller so the user needs to walk into to hit it.\n        let bodyChangePoint = this.createCollisionBody((tileW/2), (tileH/2), posX, posY, this.changePointsBodyType);\n        bodyChangePoint.changeScenePoint = changeScenePoint;\n        this.addBody(bodyChangePoint);\n        Logger.info('Created change point on tileIndex: ' + tileIndex, posX, posY);\n        return bodyChangePoint;\n    }\n\n    /**\n     * @param {Object} roomObject\n     * @param {string} objectIndex\n     * @param {number} tileW\n     * @param {number} tileH\n     * @param {number} posX\n     * @param {number} posY\n     * @param {Object|boolean} [pathFinder]\n     * @returns {Promise<Object>}\n     */\n    async createWorldObject(roomObject, objectIndex, tileW, tileH, posX, posY, pathFinder = false)\n    {\n        // handle body fixed position:\n        posX += sc.get(roomObject, 'xFix', 0);\n        posY += sc.get(roomObject, 'yFix', 0);\n        roomObject.x = posX;\n        roomObject.y = posY;\n        // save position in room object:\n        if(this.objectsManager && sc.hasOwn(this.objectsManager.objectsAnimationsData, objectIndex)){\n            this.objectsManager.objectsAnimationsData[objectIndex].x = posX;\n            this.objectsManager.objectsAnimationsData[objectIndex].y = posY;\n        }\n        // check and calculate interaction area:\n        if(roomObject.interactionArea){\n            roomObject.setupInteractionArea();\n        }\n        // by default objects won't have mass:\n        let bodyMass = sc.get(roomObject, 'bodyMass', 1);\n        let collision = sc.get(roomObject, 'collisionResponse', true);\n        let hasState = this.allowBodiesWithState ? sc.get(roomObject, 'hasState', false) : false;\n        let collisionType = sc.get(roomObject, 'collisionType', this.worldObjectBodyType);\n        let collisionGroup = sc.get(roomObject, 'collisionGroup', WorldConst.COLLISIONS.OBJECT);\n        // @TODO - BETA - Replace the tileW and tileH by the actual object size which should be saved in the storage.\n        let bodyObject = this.createCollisionBody(\n            tileW,\n            tileH,\n            posX,\n            posY,\n            collisionType,\n            collisionGroup,\n            bodyMass,\n            collision,\n            hasState,\n            objectIndex\n        );\n        bodyObject.disableObjectsCollisionsOnChase = this.disableObjectsCollisionsOnChase;\n        bodyObject.disableObjectsCollisionsOnReturn = this.disableObjectsCollisionsOnReturn;\n        bodyObject.isRoomObject = true;\n        // assign the room object to the body:\n        bodyObject.roomObject = roomObject;\n        if(this.usePathFinder && pathFinder){\n            bodyObject.pathFinder = pathFinder;\n        }\n        // try to get object instance from project root:\n        this.addBody(bodyObject);\n        // set data on room object:\n        roomObject.state = bodyObject.bodyState;\n        roomObject.objectBody = bodyObject;\n        Logger.info('Created object for objectIndex: '+objectIndex+' - At x/y: '+posX+' / '+posY+'.');\n        await this.events.emit('reldens.createdWorldObject', {\n            p2world: this,\n            roomObject,\n            bodyObject,\n            bodyMass,\n            collision,\n            hasState,\n            objectIndex,\n            tileW,\n            tileH,\n            posX,\n            posY,\n            pathFinder\n        });\n        return roomObject;\n    }\n\n    createLimits()\n    {\n        // map data:\n        let blockW = this.mapJson.tilewidth,\n            blockH = this.mapJson.tileheight,\n            mapW = this.mapJson.width * blockW,\n            mapH = this.mapJson.height * blockH,\n            worldLimit = 1,\n            fullW = mapW + blockW,\n            fullH = mapH + blockH;\n        // create world boundary, up wall:\n        let upWall = this.createWall(fullW, worldLimit, (mapW/2), 1, this.limitsBodyType);\n        upWall.isWorldWall = true;\n        this.addBody(upWall);\n        // create world boundary, down wall:\n        let downWall = this.createWall(fullW, worldLimit, (mapW/2), (mapH-worldLimit), this.limitsBodyType);\n        downWall.isWorldWall = true;\n        this.addBody(downWall);\n        // create world boundary, left wall:\n        let leftWall = this.createWall(worldLimit, fullH, 1, (mapH/2), this.limitsBodyType);\n        leftWall.isWorldWall = true;\n        this.addBody(leftWall);\n        // create world boundary, right wall:\n        let rightWall = this.createWall(worldLimit, fullH, (mapW-worldLimit), (mapH/2), this.limitsBodyType);\n        rightWall.isWorldWall = true;\n        this.addBody(rightWall);\n    }\n\n    /**\n     * @param {number} width\n     * @param {number} height\n     * @param {number} x\n     * @param {number} y\n     * @param {number} bodyType\n     * @returns {Object}\n     */\n    createWall(width, height, x, y, bodyType)\n    {\n        let wallBody = this.createCollisionBody(\n            width,\n            height,\n            x,\n            y,\n            bodyType,\n            WorldConst.COLLISIONS.WALL,\n            this.wallsMassValue\n        );\n        wallBody.isWall = true;\n        return wallBody;\n    }\n\n    /**\n     * @param {number} width\n     * @param {number} height\n     * @param {number} x\n     * @param {number} y\n     * @param {number} type\n     * @param {number} [collisionGroup]\n     * @param {number} [mass]\n     * @param {boolean} [collisionResponse]\n     * @param {boolean} [bodyState]\n     * @param {string|boolean} [bodyKey]\n     * @param {string|boolean} [dir]\n     * @returns {Object}\n     */\n    createCollisionBody(\n        width,\n        height,\n        x,\n        y,\n        type,\n        collisionGroup = WorldConst.COLLISIONS.WALL,\n        mass = 1,\n        collisionResponse = true,\n        bodyState = false,\n        bodyKey = false,\n        dir = false\n    ){\n        let boxShape = this.createCollisionShape(width, height, collisionGroup, collisionResponse);\n        let bodyConfig = {\n            mass: mass,\n            position: [x, y],\n            type,\n            fixedRotation: true,\n            movementSpeed: this.movementSpeed,\n            jumpSpeed: this.jumpSpeed,\n            jumpTimeMs: this.jumpTimeMs\n        };\n        let bodyClass = bodyState ? PhysicalBody : Body;\n        let boxBody = new bodyClass(bodyConfig);\n        if(bodyState){\n            boxBody.bodyState = this.createBodyState(bodyState, x, y, dir, boxBody, bodyKey);\n        }\n        boxBody.originalCollisionGroup = collisionGroup;\n        boxBody.addShape(boxShape);\n        return boxBody;\n    }\n\n    /**\n     * @param {boolean|Object} bodyState\n     * @param {number} x\n     * @param {number} y\n     * @param {string|boolean} dir\n     * @param {Object} boxBody\n     * @param {string|boolean} bodyKey\n     * @returns {Object}\n     */\n    createBodyState(bodyState, x, y, dir, boxBody, bodyKey)\n    {\n        if(bodyState instanceof PhysicalBody){\n            return bodyState;\n        }\n        return new ObjectBodyState({\n            x: x,\n            y: y,\n            dir: dir || GameConst.DOWN,\n            scene: this.sceneName,\n            id: boxBody.id,\n            key: bodyKey || '',\n            room_id: this.roomId\n        });\n    }\n\n    /**\n     * @param {number} width\n     * @param {number} height\n     * @param {number} collisionGroup\n     * @param {boolean} [collisionResponse]\n     * @param {number} [x]\n     * @param {number} [y]\n     * @returns {Object}\n     */\n    createCollisionShape(width, height, collisionGroup, collisionResponse = true, x = 0, y = 0)\n    {\n        // @TODO - BETA - Make collision groups configurable to be able to include more values.\n        let boxShape = new Box({width, height, position: [x, y]});\n        boxShape.collisionGroup = collisionGroup;\n        boxShape.collisionMask = this.collisionsGroupsByType[collisionGroup];\n        // Logger.debug('Setting collision mask \"'+boxShape.collisionMask+'\" for group \"'+boxShape.collisionGroup+'\".');\n        boxShape.collisionResponse = collisionResponse;\n        return boxShape;\n    }\n\n    /**\n     * @param {Object} mapData\n     * @returns {Object}\n     */\n    getSceneChangePoints(mapData)\n    {\n        if(!mapData.changePoints){\n            return {};\n        }\n        let changePointsKeys = Object.keys(mapData.changePoints);\n        if(0 === changePointsKeys.length){\n            return {};\n        }\n        let changePoints = {};\n        for(let i of changePointsKeys){\n            let changePoint = mapData.changePoints[i];\n            changePoints[changePoint[RoomsConst.TILE_INDEX]] = changePoint[RoomsConst.NEXT_SCENE];\n        }\n        return changePoints;\n    }\n\n    /**\n     * @param {Object} playerData\n     * @returns {Object}\n     */\n    createPlayerBody(playerData)\n    {\n        // @TODO - BETA - Players collision will be configurable, for now when collisions are active players can\n        //   push players.\n        let boxShape = this.createCollisionShape(playerData.width, playerData.height, WorldConst.COLLISIONS.PLAYER);\n        this.playerMovementSpeed = this.fetchPlayerSpeed(playerData.speed);\n        let boxBody = new PhysicalBody({\n            mass: this.playerMassValue,\n            position: [playerData.bodyState.x, playerData.bodyState.y],\n            type: this.playersBodyType,\n            fixedRotation: true,\n            animationBasedOnPress: this.playerAnimationBasedOnPress,\n            diagonalHorizontal: this.playerAnimationDiagonalHorizontal,\n            movementSpeed: this.playerMovementSpeed\n        });\n        boxBody.playerId = playerData.id;\n        boxBody.collideWorldBounds = true;\n        boxBody.isChangingScene = false;\n        boxBody.isBlocked = false;\n        boxBody.originalCollisionGroup = WorldConst.COLLISIONS.PLAYER;\n        boxBody.addShape(boxShape);\n        if(this.allowBodiesWithState){\n            boxBody.bodyState = playerData.bodyState;\n        }\n        this.addBody(boxBody);\n        return boxBody;\n    }\n\n    /**\n     * @param {number} playerSpeed\n     * @returns {number}\n     */\n    fetchPlayerSpeed(playerSpeed)\n    {\n        let movementSpeed = this.movementSpeed;\n        if(this.usePlayerSpeedConfig){\n            let configSpeed = this.config.get('server/players/physicsBody/speed', playerSpeed);\n            if(0 < configSpeed){\n                movementSpeed = configSpeed;\n            }\n        }\n        Logger.debug('Use movement speed: '+movementSpeed);\n        return movementSpeed;\n    }\n\n    /**\n     * @param {Object} fromPosition\n     * @param {Object} toPosition\n     * @param {Object} bulletObject\n     * @returns {Object}\n     */\n    shootBullet(fromPosition, toPosition, bulletObject)\n    {\n        let { objectWidth, objectHeight } = bulletObject;\n        let wTH = (this.mapJson.tileheight / 2) + (objectHeight / 2);\n        let wTW = (this.mapJson.tilewidth / 2) + (objectWidth / 2);\n        let bulletY = fromPosition.y + ((toPosition.y > fromPosition.y) ? wTH : -wTH);\n        let bulletX = fromPosition.x + ((toPosition.x > fromPosition.x) ? wTW : -wTW);\n        let y = toPosition.y - bulletY;\n        let x = toPosition.x - bulletX;\n        let angleByVelocity = Math.atan2(y, x);\n        let bulletAngle = angleByVelocity * 180 / Math.PI;\n        let bulletKey = bulletObject.key ? bulletObject.key : '';\n        let speedX = bulletObject.magnitude * Math.cos(angleByVelocity);\n        let speedY = bulletObject.magnitude * Math.sin(angleByVelocity);\n        let direction = this.calculateDirection(bulletObject, fromPosition, toPosition);\n        Logger.debug(\n            'Shooting bullet \"'+bulletKey+'\":',\n            {objectWidth, objectHeight, bulletY, bulletX, fromPosition, toPosition, bulletAngle, speedX, speedY},\n        );\n        let collisionKey = 'BULLET_'+this.determineFromType(bulletObject);\n        let bulletBody = this.createCollisionBody(\n            objectWidth,\n            objectHeight,\n            bulletX,\n            bulletY,\n            this.bulletsBodyType,\n            WorldConst.COLLISIONS[collisionKey],\n            1,\n            true,\n            true,\n            bulletKey,\n            direction\n        );\n        bulletBody.updateMassProperties();\n        bulletBody.roomObject = bulletObject;\n        bulletBody.hitPriority = bulletObject.hitPriority ? bulletObject.hitPriority : 2;\n        bulletBody.isRoomObject = true;\n        bulletBody.isBullet = true;\n        bulletBody.key = '' === bulletKey ? 'bullet-'+bulletBody.id : bulletKey;\n        // append body to world:\n        this.addBody(bulletBody);\n        // @NOTE: this index here will be the animation key since the bullet state doesn't have a key property.\n        let bodyStateId = bulletKey+'_bullet_'+bulletBody.id;\n        bulletBody.bodyStateId = bodyStateId;\n        // and state on room map schema:\n        bulletObject.room.state.addBodyToState(bulletBody.bodyState, bodyStateId);\n        bulletBody.angle = bulletAngle;\n        bulletBody.originalSpeed = {x: speedX, y: speedY};\n        bulletBody.velocity[0] = speedX;\n        bulletBody.velocity[1] = speedY;\n        // since the enemy won't be hit until the bullet reach the target we need to return false to avoid the onHit\n        // automatic actions (for example pve init).\n        return bulletBody;\n    }\n\n    /**\n     * @param {Object} bulletObject\n     * @returns {string}\n     */\n    determineFromType(bulletObject)\n    {\n        if(this.typeDeterminer.isPlayer(bulletObject.owner)){\n            return WorldConst.FROM_TYPES.PLAYER;\n        }\n        if(this.typeDeterminer.isObject(bulletObject.owner)){\n            return WorldConst.FROM_TYPES.OBJECT;\n        }\n        return WorldConst.FROM_TYPES.OTHER;\n    }\n\n    /**\n     * @param {Object} bulletObject\n     * @param {Object} fromPosition\n     * @param {Object} toPosition\n     * @returns {string}\n     */\n    calculateDirection(bulletObject, fromPosition, toPosition)\n    {\n        let animDir = sc.get(bulletObject, 'animDir', false);\n        if(3 === animDir){\n            return fromPosition.x < toPosition.x ? GameConst.RIGHT : GameConst.LEFT;\n        }\n        return fromPosition.y < toPosition.y ? GameConst.DOWN : GameConst.UP;\n    }\n\n    removeBodiesFromWorld()\n    {\n        if(0 === this.removeBodies.length){\n            return;\n        }\n        for(let removeBody of this.removeBodies){\n            this.removeBody(removeBody);\n        }\n        // reset the array after remove all bodies:\n        this.removeBodies = [];\n    }\n\n}\n\nmodule.exports.P2world = P2world;\n"
  },
  {
    "path": "lib/world/server/path-finder.js",
    "content": "/**\n *\n * Reldens - PathFinder\n *\n * Implements A* pathfinding algorithm for navigation on the game world grid.\n *\n */\n\nconst { sc } = require('@reldens/utils');\nconst { Grid, AStarFinder } = require('pathfinding');\n\nclass PathFinder\n{\n\n    constructor()\n    {\n        /** @type {AStarFinder} */\n        this.finder = new AStarFinder();\n        /** @type {Object|boolean} */\n        this.world = false;\n        /** @type {Grid|boolean} */\n        this.grid = false;\n        /** @type {Object<number, Object>} */\n        this.bodies = {};\n    }\n\n    createGridFromMap()\n    {\n        // @NOTE: here we create an empty grid with the size of the current scene +1 (because the index starts at zero).\n        // We mark the collisions on this grid when the layers and world contents are created.\n        // See \"P2world\", line 83, method \"setWalkableAt\".\n        this.grid = new Grid(this.world.mapJson.width+1, this.world.mapJson.height+1);\n    }\n\n    /**\n     * @param {Object} body\n     * @returns {void}\n     */\n    addBodyToProcess(body)\n    {\n        this.bodies[body.id] = body;\n    }\n\n    /**\n     * @param {Array<number>} from\n     * @param {Array<number>} to\n     * @returns {Array<Array<number>>|boolean}\n     */\n    findPath(from, to)\n    {\n        if(this.world.onlyWalkable){\n            let nodeTo = false;\n            try {\n                nodeTo = sc.hasOwn(this.grid, 'nodes') ? this.grid.getNodeAt(to[0], to[1]) : false;\n            } catch (error) {\n                // Logger.error('Node not found.');\n            }\n            if(!nodeTo || !nodeTo.walkable){\n                return false;\n            }\n        }\n        // we need a new grid clone for every path find.\n        let grid = this.grid.clone();\n        let path = this.finder.findPath(from[0], from[1], to[0], to[1], grid);\n        if(!path.length && this.world.tryClosestPath){\n            let newTo = [1, 1];\n            if(from[0] < to[0]){\n                newTo[0] = -1;\n            }\n            if(from[1] < to[1]){\n                newTo[1] = -1;\n            }\n            // @TODO - BETA - Improve how to check the closest nodes.\n            // check all closest nodes:\n            let worldW = this.world.mapJson.width;\n            let worldH = this.world.mapJson.height;\n            let testPointA = (to[0]+newTo[0] > worldW ? to[0]+newTo[0] : worldW);\n            let testPointB = (to[1]+newTo[1] > worldH ? to[1]+newTo[1] : worldH);\n            let testPointC = (to[0]-newTo[0] < 0 ? to[0]-newTo[0] : 0);\n            let testPointD = (to[1]-newTo[1] < 0 ? to[1]-newTo[1] : 0);\n            let nodeTo = this.grid.getNodeAt(testPointA, to[1]);\n            let candidates = [\n                [to[0], testPointB],\n                [testPointA, testPointB],\n                [testPointC, to[1]],\n                [to[0], testPointD],\n                [testPointC, testPointD],\n                [testPointC, testPointB],\n                [testPointA, testPointD]\n            ];\n            if(nodeTo && !nodeTo.walkable){\n                for(let [x, y] of candidates){\n                    nodeTo = this.grid.getNodeAt(x, y);\n                    if(nodeTo && nodeTo.walkable){\n                        break;\n                    }\n                }\n            }\n            if(nodeTo && nodeTo.walkable){\n                grid = this.grid.clone();\n                path = this.finder.findPath(from[0], from[1], nodeTo.x, nodeTo.y, grid);\n            }\n        }\n        return path;\n    }\n\n}\n\nmodule.exports.PathFinder = PathFinder;\n"
  },
  {
    "path": "lib/world/server/physical-body.js",
    "content": "/**\n *\n * Reldens - PhysicalBody\n *\n * Extends P2 physics Body with game-specific movement, pathfinding, collision management, and state synchronization.\n *\n */\n\nconst { Body, vec2 } = require('p2');\nconst { GameConst } = require('../../game/constants');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass PhysicalBody extends Body\n{\n    // @TODO - BETA - Using defined properties seems to be better for catching up the types.\n    currentCol = false;\n    currentRow = false;\n\n    /**\n     * @param {Object} options\n     */\n    constructor(options)\n    {\n        super(options);\n        /** @type {Object|null} */\n        this.bodyState = null;\n        /** @type {boolean} */\n        this.animationBasedOnPress = options.animationBasedOnPress;\n        /** @type {boolean} */\n        this.diagonalHorizontal = options.diagonalHorizontal;\n        /** @type {Array<Array<number>>|boolean} */\n        this.autoMoving = false;\n        /** @type {Object|boolean} */\n        this.pathFinder = false;\n        /** @type {boolean} */\n        this.isChangingScene = false;\n        /** @type {number|boolean} */\n        this.originalCol = false;\n        /** @type {number|boolean} */\n        this.originalRow = false;\n        /** @type {number} */\n        this.jumpSpeed = sc.get(options, 'jumpSpeed', 540);\n        /** @type {number} */\n        this.jumpTimeMs = sc.get(options, 'jumpTimeMs', 180);\n        /** @type {number} */\n        this.movementSpeed = sc.get(options, 'movementSpeed', 180);\n        /** @type {number} */\n        this.speedThreshold = sc.get(options, 'speedThreshold', 0.1);\n        /** @type {boolean} */\n        this.applySpeedThresholdOnBullets = sc.get(options, 'applySpeedThresholdOnBullets', true);\n        /** @type {number} */\n        this.worldPositionPrecision = sc.get(options, 'worldPositionPrecision', 0);\n        /** @type {number} */\n        this.worldSpeedPrecision = sc.get(options, 'worldSpeedPrecision', 0);\n        /** @type {number} */\n        this.autoMovingResetMaxRetries = sc.get(options, 'autoMovingResetMaxRetries', 5);\n        /** @type {number} */\n        this.autoMovingResetRetries = 0;\n        /** @type {number} */\n        this.moveToOriginalPointWithDelay = sc.get(options, 'moveToOriginalPointWithDelay', 100);\n        /** @type {number|boolean} */\n        this.moveToOriginalPointTimer = false;\n        /** @type {Object} */\n        this.originalSpeed = {x: 0, y: 0};\n        /** @type {number} */\n        this.speedToNextMaxRetries = sc.get(options, 'speedToNextMaxRetries', 3);\n        /** @type {Object} */\n        this.speedToNextRetryCounter = {col: 0, row: 0, retries: 0};\n        /** @type {number|boolean} */\n        this.lastSetCollisionGroup = false;\n        /** @type {Array<number>} */\n        this.blockBodyStates = sc.get(options, 'blockBodyStates', [GameConst.STATUS.DISABLED, GameConst.STATUS.DEATH]);\n    }\n\n    /**\n     * @param {number} dt\n     * @returns {void}\n     */\n    integrate(dt)\n    {\n        if(-1 !== this.blockBodyStates.indexOf(this.bodyState?.inState)){\n            // Logger.debug('Body blocked by state.', {key: this.bodyState?.key, state: this.bodyState?.inState});\n            return;\n        }\n        let minv = this.invMass,\n            f = this.force,\n            pos = this.position,\n            velocity = this.velocity;\n        // save old position\n        vec2.copy(this.previousPosition, this.position);\n        this.previousAngle = this.angle;\n        // velocity update\n        if(!this.fixedRotation){\n            this.angularVelocity += this.angularForce * this.invInertia * dt;\n        }\n        let integrateFhMinv = vec2.create();\n        vec2.scale(integrateFhMinv, f, dt * minv);\n        vec2.multiply(integrateFhMinv, this.massMultiplier, integrateFhMinv);\n        vec2.add(velocity, integrateFhMinv, velocity);\n        // CCD\n        if(!this.integrateToTimeOfImpact(dt)){\n            let integrateVelodt = vec2.create();\n            // regular position update\n            vec2.scale(integrateVelodt, velocity, dt);\n            vec2.add(pos, pos, integrateVelodt);\n            if(!this.fixedRotation){\n                this.angle += this.angularVelocity * dt;\n            }\n        }\n        this.speedToNext();\n        this.aabbNeedsUpdate = true;\n        this.velocity[0] = Math.abs(this.velocity[0]) < 0.0001 ? 0 : sc.roundToPrecision(this.velocity[0], 4);\n        this.velocity[1] = Math.abs(this.velocity[1]) < 0.0001 ? 0 : sc.roundToPrecision(this.velocity[1], 4);\n        if(Math.abs(this.velocity[0]) < 1e-3){\n            this.stopX();\n        }\n        if(Math.abs(this.velocity[1]) < 1e-3){\n            this.stopY();\n        }\n        this.updateBodyState();\n    }\n\n    speedToNext()\n    {\n        if(!this.autoMoving || 0 === this.autoMoving.length){\n            // Logger.debug('Body \"'+this.bodyLogKey()+'\" is not autoMoving.');\n            this.setShapesCollisionGroup(this.originalCollisionGroup);\n            return;\n        }\n        if(!this.autoMoving[0]){\n            Logger.error('Missing autoMoving first index.');\n            this.setShapesCollisionGroup(this.originalCollisionGroup);\n            return;\n        }\n        let autoMovingCurrentCol = this.autoMoving[0][0];\n        let autoMovingCurrentRow = this.autoMoving[0][1];\n        if(\n            0 !== this.speedToNextRetryCounter.col && this.speedToNextRetryCounter.col === autoMovingCurrentCol\n            && 0!== this.speedToNextRetryCounter.row && this.speedToNextRetryCounter.row === autoMovingCurrentRow\n            && 0 !== this.velocity[0]\n            && 0 !== this.velocity[1]\n        ){\n            this.speedToNextRetryCounter.retries++;\n        }\n        if(this.speedToNextMaxRetries === this.speedToNextRetryCounter.retries){\n            /*\n            Logger.debug(\n                'Body \"'+this.bodyLogKey()+'\" speed to next max retries reached: '\n                +this.speedToNextRetryCounter.retries+' / '+this.speedToNextMaxRetries\n            );\n            */\n            this.speedToNextRetryCounter.col = 0;\n            this.speedToNextRetryCounter.row = 0;\n            let fromPoint = this.autoMoving.shift();\n            let toPoint = this.autoMoving.pop();\n            this.stopFull(true);\n            this.alignToTile();\n            this.autoMoving = this.getPathFinder().findPath(fromPoint, toPoint);\n            this.speedToNextRetryCounter.retries = 0;\n            return;\n        }\n        this.speedToNextRetryCounter.col = autoMovingCurrentCol;\n        this.speedToNextRetryCounter.row = autoMovingCurrentRow;\n        /*\n        Logger.debug(\n            'Body \"'+this.bodyLogKey()+'\" speed to next point from > to: '\n            +this.currentCol+' / '+this.currentRow+' > '+autoMovingCurrentCol+' / '+ autoMovingCurrentRow\n            +' - Counters col / row: '+this.speedToNextRetryCounter.col+' / '+this.speedToNextRetryCounter.row\n            +' - Retry: '+this.speedToNextRetryCounter.retries+' / '+this.speedToNextMaxRetries\n        );\n        */\n        if(this.currentCol === autoMovingCurrentCol && this.currentRow === autoMovingCurrentRow){\n            // if the point was reach then remove it to process the next one:\n            this.autoMoving.shift();\n            if(0 === this.autoMoving.length){\n                // if there are no more points to process then stop the body and reset the path:\n                this.stopAutoMoving();\n            }\n            return;\n        }\n        if(this.currentCol === autoMovingCurrentCol && 0 !== this.velocity[0]){\n            this.stopX();\n            // Logger.debug('Body \"'+this.bodyLogKey()+'\" speed to next stop X.');\n            this.alignToTile();\n        }\n        if(this.currentCol > autoMovingCurrentCol){\n            this.initMove(GameConst.LEFT, true);\n        }\n        if(this.currentCol < autoMovingCurrentCol){\n            this.initMove(GameConst.RIGHT, true);\n        }\n        if(this.currentRow === autoMovingCurrentRow && 0 !== this.velocity[1]){\n            this.stopY();\n            // Logger.debug('Body \"'+this.bodyLogKey()+'\" speed to next stop Y.');\n            this.alignToTile();\n        }\n        if(this.currentRow > autoMovingCurrentRow){\n            this.initMove(GameConst.UP, true);\n        }\n        if(this.currentRow < autoMovingCurrentRow){\n            this.initMove(GameConst.DOWN, true);\n        }\n        this.updateCurrentPoints();\n    }\n\n    stopAutoMoving()\n    {\n        this.stopFull();\n        this.resetAuto();\n        this.alignToTile();\n        this.setShapesCollisionGroup(this.originalCollisionGroup);\n        // Logger.debug('Body \"' + this.bodyLogKey() + '\" speed to next ended.');\n    }\n\n    alignToTile()\n    {\n        if(!this.currentCol || !this.currentRow){\n            this.updateCurrentPoints();\n        }\n        let targetX = this.currentCol * this.worldTileWidth;\n        let targetY = this.currentRow * this.worldTileHeight;\n        let tolerance = 0.01;\n        let distX = targetX - this.position[0];\n        let distY = targetY - this.position[1];\n        if(Math.abs(distX) <= tolerance && Math.abs(distY) <= tolerance){\n            // Logger.debug('Aligning to tile col / row: '+this.currentCol+' / '+this.currentRow, {targetX, targetY});\n            this.position[0] = targetX;\n            this.position[1] = targetY;\n        }\n    }\n\n    updateBodyState()\n    {\n        if(!sc.hasOwn(this.bodyState, 'x') || !sc.hasOwn(this.bodyState, 'y')){\n            return;\n        }\n        // only update the body if it moves:\n        if(this.isNotMoving()){\n            // @NOTE: careful this will overload the logs.\n            // Logger.debug('Body \"'+this.bodyLogKey()+'\" is not moving.');\n            this.bodyState.mov = false;\n            return;\n        }\n        let positionX = sc.roundToPrecision(this.position[0], 0);\n        let positionY = sc.roundToPrecision(this.position[1], 0);\n        if(!positionX || !positionY){\n            return;\n        }\n        // update position:\n        if(this.bodyState.x !== positionX){\n            // Logger.debug('Update body \"'+this.bodyLogKey()+'\" state X: '+this.bodyState.x +' / '+ positionX);\n            this.bodyState.x = sc.roundToPrecision(positionX, this.worldPositionPrecision);\n        }\n        if(this.bodyState.y !== positionY){\n            // Logger.debug('Update body \"'+this.bodyLogKey()+'\" state Y: '+this.bodyState.y +' / '+ positionY);\n            this.bodyState.y = sc.roundToPrecision(positionY, this.worldPositionPrecision);\n        }\n        // start or stop animation:\n        let speedX = sc.roundToPrecision(this.velocity[0], this.worldSpeedPrecision);\n        let speedY = sc.roundToPrecision(this.velocity[1], this.worldSpeedPrecision);\n        // Logger.debug('Body \"'+this.bodyLogKey()+'\" speed X / Y: '+speedX+' / '+speedY);\n        this.bodyState.mov = 0 !== speedX || 0 !== speedY;\n        // @NOTE: with the key word \"bullet\" we will refer to bodies that will be created, moved, and  destroyed on\n        // hit or that reach the world boundaries.\n        this.removeInvalidStateBulletBody();\n    }\n\n    /**\n     * @returns {string}\n     */\n    bodyLogKey()\n    {\n        if(this.playerId){\n            return 'PJ-'+this.playerId;\n        }\n        return this.bodyState?.key;\n    }\n\n    removeInvalidStateBulletBody()\n    {\n        if(!this.isBullet){\n            return;\n        }\n        if(this.isOutOfWorldBounds() || this.hasInvalidSpeed()){\n            this.world.removeBodies.push(this);\n            if(this.bodyStateId){\n                this.world.removeBulletsStateIds.push(this.bodyStateId);\n            }\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    hasInvalidSpeed()\n    {\n        if(!this.applySpeedThresholdOnBullets && this.isBullet){\n            return false;\n        }\n        let bodySpeedX = this.isBullet ? this.originalSpeed.x : this.movementSpeed;\n        let bodySpeedY = this.isBullet ? this.originalSpeed.x : this.movementSpeed;\n        let minimumSpeedX = bodySpeedX * this.speedThreshold;\n        let minimumSpeedY = bodySpeedY * this.speedThreshold;\n        let speedX = Math.abs(this.velocity[0]);\n        if(0 < speedX && speedX < minimumSpeedX){\n            Logger.debug('Invalid speed, stopping X:', {speedX, minimumSpeedX});\n            this.stopX(true);\n        }\n        let speedY = Math.abs(this.velocity[1]);\n        if(0 < speedY && speedY < minimumSpeedY){\n            Logger.debug('Invalid speed, stopping Y.', {speedY, minimumSpeedY});\n            this.stopY(true);\n        }\n        return 0 === this.velocity[0] && 0 === this.velocity[1];\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isOutOfWorldBounds()\n    {\n        return 0 > this.position[0]\n            || this.position[0] > (this.worldWidth * this.worldTileWidth)\n            || 0 > this.position[1]\n            || this.position[1] > (this.worldHeight * this.worldTileHeight);\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    isNotMoving()\n    {\n        // @TODO - BETA - Refactor to replace the threshold and accurately consider the normalized speed.\n        let minimumSpeed = this.movementSpeed * this.speedThreshold;\n        let velocityX = sc.roundToPrecision(this.velocity[0]);\n        let velocityY = sc.roundToPrecision(this.velocity[1]);\n        if(this.velocity[0] !== 0 && Math.abs(velocityX) < minimumSpeed){\n            this.position[0] = sc.roundToPrecision(this.position[0] + (0 < velocityX ? 1 : -1));\n            this.stopX(true);\n        }\n        if(this.velocity[1] !== 0 && Math.abs(velocityY) < minimumSpeed && !this.world.applyGravity){\n            this.position[1] = this.position[1] + (0 < velocityY ? 1 : -1);\n            this.stopY(true);\n        }\n        let positionX = sc.roundToPrecision(this.position[0], 0);\n        let positionY = sc.roundToPrecision(this.position[1], 0);\n        return this.bodyState.x === positionX && this.bodyState.y === positionY && velocityX === 0 && velocityY === 0;\n    }\n\n    resetAuto()\n    {\n        this.autoMoving = false;\n    }\n\n    /**\n     * @param {string} direction\n     * @param {boolean} [isAuto]\n     * @returns {void|boolean}\n     */\n    initMove(direction, isAuto = false)\n    {\n        if(!isAuto){\n            // if user moves the player then reset the auto move.\n            this.resetAuto();\n        }\n        if(!this.world){\n            return;\n        }\n        if(this.world.allowSimultaneous){\n            this.simultaneousKeyPressMovement(direction);\n            return;\n        }\n        return this.singleKeyPressMovement(direction);\n    }\n\n    /**\n     * @param {string} direction\n     * @returns {void}\n     */\n    singleKeyPressMovement(direction)\n    {\n        // if body is moving then avoid multiple key press at the same time:\n        if(direction === GameConst.RIGHT && 0 === this.velocity[1]){\n            this.velocity[0] = this.movementSpeed;\n        }\n        if(direction === GameConst.LEFT && 0 === this.velocity[1]){\n            this.velocity[0] = -this.movementSpeed;\n        }\n        if(direction === GameConst.UP && 0 === this.velocity[0]){\n            this.moveUp(this.movementSpeed);\n        }\n        if(direction === GameConst.DOWN && 0 === this.velocity[0] && !this.world.applyGravity){\n            this.velocity[1] = this.movementSpeed;\n        }\n    }\n\n    /**\n     * @param {string} direction\n     * @returns {void}\n     */\n    simultaneousKeyPressMovement(direction)\n    {\n        if(!this.world.applyGravity){\n            this.simultaneousMovementDiagonalSpeedFix(direction, this.movementSpeed);\n            return;\n        }\n        if(direction === GameConst.RIGHT){\n            this.validateAndSetDirection(direction, this.diagonalHorizontal, this.velocity[1]);\n            this.velocity[0] = this.movementSpeed;\n        }\n        if(direction === GameConst.LEFT){\n            this.validateAndSetDirection(direction, this.diagonalHorizontal, this.velocity[1]);\n            this.velocity[0] = -this.movementSpeed;\n        }\n        if(direction === GameConst.UP){\n            this.validateAndSetDirection(direction, !this.diagonalHorizontal, this.velocity[0]);\n            this.moveUp(this.movementSpeed);\n        }\n    }\n\n    /**\n     * @param {string} direction\n     * @param {number} speed\n     * @returns {void}\n     */\n    simultaneousMovementDiagonalSpeedFix(direction, speed)\n    {\n        // @TODO - BETA - calculate normalized speed once and save it in the object to avoid recalculation.\n        let dx = 0 === this.velocity[0] ? 0 : 0 > this.velocity[0] ? -1 : 1;\n        let dy = 0 === this.velocity[1] ? 0 : 0 > this.velocity[1] ? -1 : 1;\n        if(direction === GameConst.RIGHT){\n            dx = 1;\n        }\n        if(direction === GameConst.LEFT){\n            dx = -1;\n        }\n        if(direction === GameConst.UP){\n            dy = -1;\n        }\n        if(direction === GameConst.DOWN){\n            dy = 1;\n        }\n        let normalization = this.normalizeSpeed(dx, dy);\n        this.velocity[0] = speed * dx * normalization;\n        this.velocity[1] = speed * dy * normalization;\n        if(direction === GameConst.RIGHT || direction === GameConst.LEFT){\n            this.validateAndSetDirection(direction, this.diagonalHorizontal, this.velocity[1]);\n        }\n        if(direction === GameConst.UP || direction === GameConst.DOWN){\n            this.validateAndSetDirection(direction, !this.diagonalHorizontal, this.velocity[0]);\n        }\n    }\n\n    /**\n     * @param {number} speed\n     * @returns {void}\n     */\n    moveUp(speed)\n    {\n        if(!this.world.applyGravity){\n            this.velocity[1] = -speed;\n            return;\n        }\n        if(!this.canJump()){\n            return;\n        }\n        this.velocity[1] = -this.jumpSpeed;\n        setTimeout(() => {\n            this.stopY();\n        }, this.jumpTimeMs);\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @returns {number}\n     */\n    calculateMagnitude(x, y)\n    {\n        return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @returns {boolean}\n     */\n    checkNonZeroComponents(x, y)\n    {\n        return Math.abs(x) > 0 || Math.abs(y) > 0;\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @returns {number}\n     */\n    normalizeSpeed(x, y)\n    {\n        return this.checkNonZeroComponents(x, y) ? 1 / this.calculateMagnitude(x, y) : 0;\n    }\n\n    /**\n     * @param {string} direction\n     * @param {boolean} diagonal\n     * @param {number} velocity\n     * @returns {void}\n     */\n    validateAndSetDirection(direction, diagonal, velocity)\n    {\n        if((this.animationBasedOnPress || this.bodyState.autoDirection) && (diagonal || 0 === velocity)){\n            this.bodyState.dir = direction;\n        }\n    }\n\n    stopMove()\n    {\n        this.world && this.world.applyGravity ? this.stopX() : this.stopFull();\n    }\n\n    /**\n     * @param {boolean} [pStop]\n     * @returns {void}\n     */\n    stopFull(pStop = false)\n    {\n        this.velocity[0] = 0;\n        if(!this.world?.applyGravity){\n            this.velocity[1] = 0;\n        }\n        this.angularVelocity = 0;\n        this.angularForce = 0;\n        this.pStop = pStop;\n    }\n\n    /**\n     * @param {boolean} [pStop]\n     * @returns {void}\n     */\n    stopX(pStop = false)\n    {\n        this.velocity[0] = 0;\n        this.angularVelocity = 0;\n        this.angularForce = 0;\n        this.pStop = pStop;\n    }\n\n    /**\n     * @param {boolean} [pStop]\n     * @returns {void}\n     */\n    stopY(pStop = false)\n    {\n        this.velocity[1] = 0;\n        this.angularVelocity = 0;\n        this.angularForce = 0;\n        this.pStop = pStop;\n    }\n\n    /**\n     * @param {Object} toPoint\n     * @returns {Array<Array<number>>|boolean}\n     */\n    moveToPoint(toPoint)\n    {\n        this.resetAuto();\n        this.updateCurrentPoints();\n        let fromPoints = [this.currentCol, this.currentRow];\n        let toPoints = [toPoint.column, toPoint.row];\n        let pathFinder = this.getPathFinder();\n        if(!pathFinder){\n            // Logger.debug('Pathfinder not set in body.', {id: this.id, key: this.bodyState?.key});\n            this.setShapesCollisionGroup(this.originalCollisionGroup);\n            return false;\n        }\n        this.autoMoving = pathFinder.findPath(fromPoints, toPoints);\n        if(!this.autoMoving){\n            this.setShapesCollisionGroup(this.originalCollisionGroup);\n            this.stopMove();\n        }\n        return this.autoMoving;\n    }\n\n    /**\n     * @returns {PhysicalBody|void}\n     */\n    updateCurrentPoints()\n    {\n        // if the player disconnects, and it's the only one on the room the world would be destroyed at this point:\n        if(!this.world){\n            // Logger.debug('Missing world on physical body.', {id: this.id, key: this.bodyState?.key});\n            return;\n        }\n        let {currentCol, currentRow} = this.positionToTiles(this.position[0], this.position[1]);\n        if(!this.originalCol){\n            // Logger.debug('Setting body ID \"'+this.id+'\" (key: \"'+this.bodyState.key+'\") original col: '+currentCol);\n            this.originalCol = currentCol;\n        }\n        if(!this.originalRow){\n            // Logger.debug('Setting body ID \"'+this.id+'\" (key: \"'+this.bodyState.key+'\") original row: '+currentRow);\n            this.originalRow = currentRow;\n        }\n        this.currentCol = currentCol;\n        this.currentRow = currentRow;\n        return this;\n    }\n\n    moveToOriginalPoint()\n    {\n        if(!this.originalCol || !this.originalRow){\n            this.updateCurrentPoints();\n        }\n        /*\n        Logger.debug(\n            'Moving body ID \"'+this.id+'\" (key? \"'+this.bodyState.key+'\") to: '+this.currentCol+' / '+this.currentRow\n        );\n        */\n        if(this.disableObjectsCollisionsOnReturn){\n            this.setShapesCollisionGroup(0);\n        }\n        // stop any current movement before starting a new one:\n        this.stopFull();\n        if(0 === this.moveToOriginalPointWithDelay){\n            this.moveToPoint({column: this.originalCol, row: this.originalRow});\n            return;\n        }\n        // introduce a small delay to ensure collision has resolved:\n        this.moveToOriginalPointTimer = setTimeout(() => {\n            this.moveToPoint({column: this.originalCol, row: this.originalRow});\n        }, this.moveToOriginalPointWithDelay);\n    }\n\n    /**\n     * @param {number} collisionGroup\n     * @returns {void}\n     */\n    setShapesCollisionGroup(collisionGroup)\n    {\n        if(this.lastSetCollisionGroup === collisionGroup){\n            return;\n        }\n        this.lastSetCollisionGroup = collisionGroup;\n        for(let shape of this.shapes){\n            // Logger.debug('Set collision group on \"'+this.bodyLogKey()+'\": '+collisionGroup);\n            shape.collisionGroup = collisionGroup;\n        }\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    canJump()\n    {\n        for(let c of this.world.narrowphase.contactEquations){\n            let player = c.bodyA === this ? c.bodyA : c.bodyB;\n            let wall = c.bodyA.isWall ? c.bodyA : c.bodyB;\n            if(\n                player.playerId && 0 <= Number(Number(player.velocity[1]).toFixed(2))\n                && wall.isWall && !wall.isWorldWall\n                && player.position[1] < wall.position[1]\n            ){\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * @param {number} x\n     * @param {number} y\n     * @returns {Object}\n     */\n    positionToTiles(x, y)\n    {\n        let currentCol = Math.round((x - (this.worldTileWidth/2)) / this.worldTileWidth);\n        currentCol = (currentCol >= 0) ? ((currentCol > this.worldWidth) ? (this.worldWidth) : currentCol) : 0;\n        let currentRow = Math.round((y - (this.worldTileHeight/2)) / this.worldTileHeight);\n        currentRow = (currentRow >= 0) ? ((currentRow > this.worldHeight) ? (this.worldHeight) : currentRow) : 0;\n        return {currentCol, currentRow};\n    }\n\n    /**\n     * @returns {Object|boolean}\n     */\n    getPathFinder()\n    {\n        // @NOTE: body pathfinder is for when the body has its own respawn area and grid, the world pathfinder is for\n        // any object in the room that could be anywhere in the room.\n        return (this.pathFinder ? this.pathFinder : this.world?.pathFinder);\n    }\n\n    /**\n     * @returns {number}\n     */\n    get worldTileWidth()\n    {\n        return this.world?.mapJson?.tilewidth;\n    }\n\n    /**\n     * @returns {number}\n     */\n    get worldTileHeight()\n    {\n        return this.world?.mapJson?.tileheight;\n    }\n\n    /**\n     * @returns {number}\n     */\n    get worldWidth()\n    {\n        return this.world?.mapJson?.width;\n    }\n\n    /**\n     * @returns {number}\n     */\n    get worldHeight()\n    {\n        return this.world?.mapJson?.height;\n    }\n\n}\n\nmodule.exports.PhysicalBody = PhysicalBody;\n"
  },
  {
    "path": "lib/world/server/world-walkable-nodes-around-provider.js",
    "content": "/**\n *\n * Reldens - WorldWalkableNodesAroundProvider\n *\n * Provides walkable node positions around a given world body for target selection and pathfinding.\n *\n */\n\nconst { WorldPositionCalculator } = require('../world-position-calculator');\nconst { Logger } = require('@reldens/utils');\n\nclass WorldWalkableNodesAroundProvider\n{\n\n    /**\n     * @param {Object} worldBody\n     * @param {Object} [pathFinder]\n     * @returns {Array<Object>}\n     */\n    static generateWalkableNodesAround(worldBody, pathFinder)\n    {\n        if(!worldBody){\n            // expected on client disconnection:\n            //Logger.debug('Undefined target object body.');\n            return [];\n        }\n        let { currentCol, currentRow } = worldBody;\n        if(!currentCol || !currentRow){\n            worldBody.updateCurrentPoints();\n            currentCol = worldBody.currentCol;\n            currentRow = worldBody.currentRow;\n            if(!currentCol || !currentRow){\n                //Logger.debug('Missing currentCol and currentCol.', worldBody.currentCol, worldBody.currentRow);\n                return [];\n            }\n        }\n        if(!pathFinder){\n            pathFinder = worldBody.getPathFinder();\n        }\n        if(!pathFinder){\n            Logger.warning('Pathfinder not found.', worldBody);\n            return [];\n        }\n        let nodes = [];\n        let firstWorldPosition = this.fetchFirstWorldPosition(pathFinder, currentCol, currentRow);\n        if(firstWorldPosition){\n            nodes.push(firstWorldPosition);\n        }\n        // @TODO - BETA - Check pathFinder.grid.getNeighbors method.\n        let mapJson = pathFinder.world.mapJson;\n        for(let i = -1; i <= 1; i++){\n            for(let j = -1; j <= 1; j++){\n                let x = currentCol + i;\n                let y = currentRow + j;\n                if(!pathFinder.grid.isInside(x, y)){\n                    Logger.warning('Node outside grid.', {x, y});\n                    continue;\n                }\n                let node = pathFinder.grid.getNodeAt(x, y);\n                if(node && node.walkable){\n                    nodes.push(WorldPositionCalculator.forNode(node, mapJson.tilewidth, mapJson.tileheight));\n                }\n            }\n        }\n        return nodes;\n    }\n\n    /**\n     * @param {Object} pathFinder\n     * @param {number} currentCol\n     * @param {number} currentRow\n     * @returns {Object|boolean}\n     */\n    static fetchFirstWorldPosition(pathFinder, currentCol, currentRow)\n    {\n        if(!pathFinder.grid.isInside(currentCol, currentRow)){\n            Logger.warning('Fetch first position, node outside grid.', {currentCol, currentRow});\n            return false;\n        }\n        let firstNode = pathFinder.grid.getNodeAt(currentCol, currentRow);\n        if(!firstNode){\n            return false;\n        }\n        let mapJson = pathFinder.world.mapJson;\n        return WorldPositionCalculator.forNode(firstNode, mapJson.tilewidth, mapJson.tileheight);\n    }\n\n}\n\nmodule.exports.WorldWalkableNodesAroundProvider = WorldWalkableNodesAroundProvider;\n"
  },
  {
    "path": "lib/world/world-points-validator.js",
    "content": "/**\n *\n * Reldens - WorldPointsValidator\n *\n * Validates and clamps world coordinate points to ensure they stay within the world boundaries.\n *\n */\n\nclass WorldPointsValidator\n{\n\n    /**\n     * @param {number} worldWidth\n     * @param {number} worldHeight\n     */\n    constructor(worldWidth, worldHeight)\n    {\n        /** @type {number} */\n        this.worldWidth = worldWidth;\n        /** @type {number} */\n        this.worldHeight = worldHeight;\n    }\n\n    /**\n     * @param {Object} points\n     * @param {number} points.column\n     * @param {number} points.row\n     * @returns {Object}\n     */\n    makeValidPoints(points)\n    {\n        points.column = points.column < 0 ? 0 : points.column;\n        points.column = points.column > this.worldWidth ? this.worldWidth : points.column;\n        points.row = points.row < 0 ? 0 : points.row;\n        points.row = points.row > this.worldHeight ? this.worldHeight : points.row;\n        return points;\n    }\n\n}\n\nmodule.exports.WorldPointsValidator = WorldPointsValidator;\n"
  },
  {
    "path": "lib/world/world-position-calculator.js",
    "content": "/**\n *\n * Reldens - WorldPositionCalculator\n *\n * Calculates world position coordinates from grid nodes and tile dimensions.\n *\n */\n\nclass WorldPositionCalculator\n{\n\n    /**\n     * @param {Object} node\n     * @param {number} node.x\n     * @param {number} node.y\n     * @param {number} tileWidth\n     * @param {number} tileHeight\n     * @returns {Object}\n     */\n    forNode(node, tileWidth, tileHeight)\n    {\n        return {\n            x: node.x * tileWidth + (tileWidth / 2),\n            y: node.y * tileHeight + (tileHeight / 2)\n        };\n    }\n\n}\n\nmodule.exports.WorldPositionCalculator = new WorldPositionCalculator();\n"
  },
  {
    "path": "lib/world/world-timer.js",
    "content": "/**\n *\n * Reldens - WorldTimer\n *\n * Manages the physics world step timing and callback execution for the game loop.\n *\n */\n\nconst { Logger, sc } = require('@reldens/utils');\n\n/**\n * @typedef {Object} WorldTimerProps\n * @property {Object} [clockInstance]\n * @property {Array<function(): void>} [callbacks]\n */\nclass WorldTimer\n{\n\n    /**\n     * @param {WorldTimerProps} props\n     */\n    constructor(props)\n    {\n        /** @type {Object|boolean} */\n        this.clockInstance = sc.get(props, 'clockInstance', false);\n        /** @type {Array<function(): void>} */\n        this.callbacks = sc.get(props, 'callbacks', []);\n        /** @type {Object} */\n        this.worldTimer = {};\n        /** @type {boolean} */\n        this.paused = false;\n        /** @type {number} */\n        this.lastCallTime = 0;\n        /** @type {number} */\n        this.stepTime = 0;\n        /** @type {number} */\n        this.startedTime = (new Date()).getTime();\n        /** @type {number} */\n        this.currentTime = this.startedTime;\n    }\n\n    /**\n     * @param {Object} world\n     * @returns {void}\n     */\n    startWorldSteps(world)\n    {\n        if(!world){\n            Logger.error('World instance invalid.', {world});\n            return;\n        }\n        this.stepTime = 1000 * world.timeStep;\n        if(this.clockInstance){\n            //Logger.debug('WorldTimes using clock instance.');\n            this.worldTimer = this.clockInstance.setInterval(() => {\n                this.setIntervalCallback(world);\n            }, this.stepTime);\n            return;\n        }\n        //Logger.debug('WorldTimes using setInterval.');\n        this.worldTimer = setInterval(() => {\n            this.setIntervalCallback(world);\n        }, this.stepTime);\n    }\n\n    /**\n     * @param {Object} world\n     * @returns {void}\n     */\n    setIntervalCallback(world)\n    {\n        if(this.paused){\n            return;\n        }\n        this.currentTime += this.stepTime;\n        this.stepWorld(world);\n        this.executeCallbacks();\n    }\n\n    /**\n     * @param {Object} world\n     * @returns {void}\n     */\n    stepWorld(world)\n    {\n        if(world.useFixedWorldStep){\n            world.step(world.timeStep);\n            return;\n        }\n        this.stepWorldWithSubSteps(world);\n    }\n\n    executeCallbacks()\n    {\n        if(0 === this.callbacks.length){\n            return;\n        }\n        for(let callback of this.callbacks){\n            callback();\n        }\n    }\n\n    /**\n     * @param {Object} world\n     * @returns {void}\n     */\n    stepWorldWithSubSteps(world)\n    {\n        let now = Date.now() / 1000;\n        let timeSinceLastCall = now - this.lastCallTime;\n        world.step(world.timeStep, timeSinceLastCall, world.maxSubSteps);\n    }\n\n}\n\nmodule.exports.WorldTimer = WorldTimer;\n"
  },
  {
    "path": "migrations/development/20190923183906_v4.0.0.js",
    "content": "const fs = require('fs');\n\nexports.up = function(knex) {\n    let sql = fs.readFileSync(__dirname+'/reldens-install-v4.0.0.sql').toString();\n    return knex.raw(sql);\n};\n\nexports.down = function(knex) {\n    // nothing to do in the first version.\n};\n"
  },
  {
    "path": "migrations/development/beta.09-sql-update.sql",
    "content": "\n# config values:\n\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'players/size/topOffset', '20', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'players/size/leftOffset', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'rooms/world/onlyWalkable', '1', 'b');\n"
  },
  {
    "path": "migrations/development/beta.12-sql-update.sql",
    "content": "/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET NAMES utf8 */;\n/*!50503 SET NAMES utf8mb4 */;\n/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n\n# config values:\n\nUPDATE `config` SET `value`='140' WHERE `path`='objects/actions/interactionsDistance';\n\nUPDATE `config` SET `value`='100' WHERE `path`='players/initialStats/atk';\nUPDATE `config` SET `value`='100' WHERE `path`='players/initialStats/def';\nUPDATE `config` SET `value`='100' WHERE `path`='enemies/initialStats/atk';\nUPDATE `config` SET `value`='100' WHERE `path`='enemies/initialStats/def';\n\nUPDATE `config` SET `path`='ui/chat/x' WHERE `path`='chat/position/x';\nUPDATE `config` SET `path`='ui/chat/y' WHERE `path`='chat/position/y';\n\nUPDATE `config` SET `value`='430' WHERE `path`='ui/playerStats/x';\nUPDATE `config` SET `value`='20' WHERE `path`='ui/playerStats/y';\n\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/screen/responsive', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/uiTarget/responsiveY', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/uiTarget/responsiveX', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/inventory/enabled', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/inventory/x', '380', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/inventory/y', '450', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/inventory/responsiveY', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/inventory/responsiveX', '100', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/equipment/enabled', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/equipment/x', '430', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/equipment/y', '90', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/equipment/responsiveY', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/equipment/responsiveX', '100', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/uiLifeBar/responsiveY', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/uiLifeBar/responsiveX', '40', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/sceneLabel/responsiveY', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/sceneLabel/responsiveX', '50', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/playerStats/responsiveY', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/playerStats/responsiveX', '100', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/playerName/responsiveY', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/playerName/responsiveX', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/controls/responsiveY', '100', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/controls/responsiveX', '0', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/chat/responsiveY', '100', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/chat/responsiveX', '100', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/chat/enabled', '1', 'b');\n\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/npcDialog/x', '120', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/npcDialog/y', '100', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/npcDialog/responsiveX', '10', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/npcDialog/responsiveY', '10', 'i');\n\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/maximum/x', '1280', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/maximum/y', '720', 'i');\n\n# player stats update:\n\nUPDATE players_stats SET atk=100, def=100;\n\n# rooms updates:\nUPDATE `rooms_change_points` SET `tile_index`='816' WHERE `id`=1;\nUPDATE `rooms_change_points` SET `tile_index`='817' WHERE `id`=2;\nUPDATE `rooms_return_points` SET `x`='548', `y`='615' WHERE `id`=1;\nUPDATE `rooms_return_points` SET `x`='548', `y`='615' WHERE `id`=1;\nUPDATE `rooms_change_points` SET `tile_index`='778' WHERE `id`=3;\nUPDATE `rooms_return_points` SET `x`='640', `y`='600' WHERE `id`=2;\n\n# new objects:\n\n/*!40000 ALTER TABLE `objects` DISABLE KEYS */;\nINSERT INTO `objects` (`id`, `room_id`, `layer_name`, `tile_index`, `object_class_key`, `client_key`, `title`, `private_params`, `client_params`, `enabled`) VALUES\n\t(10, 4, 'house-collisions-over-player', 560, 'npc_3', 'merchant_1', 'Gimly', NULL, NULL, 1),\n\t(12, 4, 'house-collisions-over-player', 562, 'npc_4', 'weapons_master_1', 'Barrik', NULL, NULL, 1);\n/*!40000 ALTER TABLE `objects` ENABLE KEYS */;\n\n/*!40000 ALTER TABLE `objects_assets` DISABLE KEYS */;\nINSERT INTO `objects_assets` (`object_asset_id`, `object_id`, `asset_type`, `asset_key`, `file_1`, `file_2`, `extra_params`) VALUES\n\t(9, 10, 'spritesheet', 'merchant_1', 'people-d-x2', NULL, '{\"frameWidth\":52,\"frameHeight\":71}'),\n\t(10, 12, 'spritesheet', 'weapons_master_1', 'people-c-x2', NULL, '{\"frameWidth\":52,\"frameHeight\":71}');\n/*!40000 ALTER TABLE `objects_assets` ENABLE KEYS */;\n\n# inventory first deploy:\n\nINSERT INTO `features` (`code`, `title`, `is_enabled`) VALUES ('inventory', 'Inventory', 1);\n\nCREATE TABLE IF NOT EXISTS `items_group` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `label` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `description` text COLLATE utf8_unicode_ci,\n  `sort` int(11) DEFAULT NULL,\n  `items_limit` int(1) NOT NULL DEFAULT '0',\n  `limit_per_item` int(1) NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='The group table is to save the groups settings.';\n\n-- Dumping data for table items_group: ~6 rows (approximately)\n/*!40000 ALTER TABLE `items_group` DISABLE KEYS */;\nINSERT INTO `items_group` (`id`, `key`, `label`, `description`, `sort`, `items_limit`, `limit_per_item`) VALUES\n\t(1, 'weapon', 'Weapon', 'All kinds of weapons.', 2, 1, 0),\n\t(2, 'shield', 'Shield', 'Protect with these items.', 3, 1, 0),\n\t(3, 'armor', 'Armor', '', 4, 1, 0),\n\t(4, 'boots', 'Boots', '', 6, 1, 0),\n\t(5, 'gauntlets', 'Gauntlets', '', 5, 1, 0),\n\t(6, 'helmet', 'Helmet', '', 1, 1, 0);\n/*!40000 ALTER TABLE `items_group` ENABLE KEYS */;\n\n-- Dumping structure for table items_inventory\nCREATE TABLE IF NOT EXISTS `items_inventory` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `owner_id` int(11) NOT NULL,\n  `item_id` int(11) NOT NULL,\n  `qty` int(11) NOT NULL DEFAULT '0',\n  `remaining_uses` int(11) DEFAULT NULL,\n  `is_active` int(1) DEFAULT NULL COMMENT 'For example equipped or not equipped items.',\n  PRIMARY KEY (`id`),\n  KEY `FK_items_inventory_items_item` (`item_id`),\n  CONSTRAINT `FK_items_inventory_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Inventory table is to save the items for each owner.';\n\n-- Dumping data for table items_inventory: ~10 rows (approximately)\n/*!40000 ALTER TABLE `items_inventory` DISABLE KEYS */;\nINSERT INTO `items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES\n\t(1, 1, 1, 143, NULL, NULL),\n\t(2, 2, 1, 7, NULL, NULL),\n\t(3, 2, 2, 1, NULL, NULL),\n\t(4, 2, 2, 1, NULL, NULL),\n\t(76, 1, 2, 1, NULL, NULL),\n\t(91, 1, 3, 20, NULL, NULL),\n\t(92, 3, 3, 1, NULL, NULL),\n\t(93, 1, 5, 1, NULL, 0),\n\t(94, 1, 4, 1, NULL, 0),\n\t(95, 2, 4, 1, 0, 1),\n\t(96, 2, 5, 1, 0, 0);\n/*!40000 ALTER TABLE `items_inventory` ENABLE KEYS */;\n\n-- Dumping structure for table items_item\nCREATE TABLE IF NOT EXISTS `items_item` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `group_id` int(11) DEFAULT NULL,\n  `label` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `description` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  `qty_limit` int(11) NOT NULL DEFAULT '0' COMMENT 'Default 0 to unlimited qty.',\n  `uses_limit` int(11) NOT NULL DEFAULT '1' COMMENT 'Default 1 use per item (0 = unlimited).',\n  `useTimeOut` int(11) DEFAULT NULL,\n  `execTimeOut` int(11) DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `id` (`id`),\n  UNIQUE KEY `key` (`key`),\n  KEY `group_id` (`group_id`),\n  CONSTRAINT `FK_items_item_items_group` FOREIGN KEY (`group_id`) REFERENCES `items_group` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='List of all available items in the system.';\n\n-- Dumping data for table items_item: ~5 rows (approximately)\n/*!40000 ALTER TABLE `items_item` DISABLE KEYS */;\nINSERT INTO `items_item` (`id`, `key`, `group_id`, `label`, `description`, `qty_limit`, `uses_limit`, `useTimeOut`, `execTimeOut`) VALUES\n\t(1, 'coins', NULL, 'Coins', NULL, 0, 1, NULL, NULL),\n\t(2, 'branch', NULL, 'Tree branch', 'An useless tree branch (for now)', 0, 1, NULL, NULL),\n\t(3, 'heal_potion_20', NULL, 'Heal Potion', 'A heal potion that will restore 20 HP.', 0, 1, NULL, NULL),\n\t(4, 'axe', 1, 'Axe', 'A short distance but powerful weapon.', 0, 0, NULL, NULL),\n\t(5, 'spear', 1, 'Spear', 'A short distance but powerful weapon.', 0, 0, NULL, NULL);\n/*!40000 ALTER TABLE `items_item` ENABLE KEYS */;\n\n-- Dumping structure for table items_item_modifiers\nCREATE TABLE IF NOT EXISTS `items_item_modifiers` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `item_id` int(11) NOT NULL,\n  `property_key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `operation` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `value` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  PRIMARY KEY (`id`),\n  KEY `item_id` (`item_id`),\n  CONSTRAINT `FK_items_item_modifiers_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Modifiers is the way we will affect the item owner.';\n\n-- Dumping data for table items_item_modifiers: ~0 rows (approximately)\n/*!40000 ALTER TABLE `items_item_modifiers` DISABLE KEYS */;\n/*!40000 ALTER TABLE `items_item_modifiers` ENABLE KEYS */;\n\n/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;\n/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n"
  },
  {
    "path": "migrations/development/beta.15-sql-update.sql",
    "content": "\n# Modify users table for forgot password feature:\n\nALTER TABLE `users` ALTER `status` DROP DEFAULT;\nALTER TABLE `users` CHANGE COLUMN `status` `status` VARCHAR(255) NOT NULL AFTER `role_id`;\n\nINSERT INTO `features` (`code`, `title`, `is_enabled`) VALUES ('firebase', 'Firebase', '1');\n\n# Missing key and fixed operation field type in modifiers table:\n\nALTER TABLE `items_item_modifiers` ADD COLUMN `key` VARCHAR(255) NOT NULL AFTER `item_id`;\nALTER TABLE `items_item_modifiers` ADD COLUMN `maxProperty` VARCHAR(255) NULL DEFAULT NULL AFTER `value`;\nALTER TABLE `items_item_modifiers` CHANGE COLUMN `operation` `operation` INT(11) NOT NULL COLLATE 'utf8_unicode_ci' AFTER `property_key`;\n\nINSERT INTO `items_item_modifiers` (`id`, `item_id`, `key`, `property_key`, `operation`, `value`, `maxProperty`) VALUES (1, 4, 'atk', 'stats/atk', '5', '5', NULL);\nINSERT INTO `items_item_modifiers` (`id`, `item_id`, `key`, `property_key`, `operation`, `value`, `maxProperty`) VALUES (3, 5, 'atk', 'stats/atk', '5', '3', NULL);\nINSERT INTO `items_item_modifiers` (`id`, `item_id`, `key`, `property_key`, `operation`, `value`, `maxProperty`) VALUES (2, 3, 'heal_potion_20', 'stats/hp', '1', '20', 'initialStats/hp');\n"
  },
  {
    "path": "migrations/development/beta.16-sql-update.sql",
    "content": "SET FOREIGN_KEY_CHECKS=0;\n# Config:\nUPDATE `config` SET `path`='rooms/world/onlyWalkable' WHERE `path`='rooms/world/onlyWalkeable';\nUPDATE `config` SET path = 'ui/playerBox/enabled' WHERE path = 'ui/playerName/enabled' LIMIT 1;\nUPDATE `config` SET path = 'ui/playerBox/responsiveX' WHERE path = 'ui/playerName/responsiveX' LIMIT 1;\nUPDATE `config` SET path = 'ui/playerBox/responsiveY' WHERE path = 'ui/playerName/responsiveY' LIMIT 1;\nUPDATE `config` SET path = 'ui/playerBox/x' WHERE path = 'ui/playerName/x' LIMIT 1;\nUPDATE `config` SET path = 'ui/playerBox/y' WHERE path = 'ui/playerName/y' LIMIT 1;\nUPDATE `config` SET path = 'ui/lifeBar/enabled' WHERE path = 'ui/uiLifeBar/enabled';\nUPDATE `config` SET path = 'ui/lifeBar/fixedPosition' WHERE path = 'ui/uiLifeBar/fixedPosition';\nUPDATE `config` SET path = 'ui/lifeBar/height' WHERE path = 'ui/uiLifeBar/height';\nUPDATE `config` SET path = 'ui/lifeBar/responsiveX' WHERE path = 'ui/uiLifeBar/responsiveX';\nUPDATE `config` SET path = 'ui/lifeBar/responsiveY' WHERE path = 'ui/uiLifeBar/responsiveY';\nUPDATE `config` SET path = 'ui/lifeBar/width' WHERE path = 'ui/uiLifeBar/width';\nUPDATE `config` SET path = 'ui/lifeBar/x' WHERE path = 'ui/uiLifeBar/x';\nUPDATE `config` SET path = 'ui/lifeBar/y' WHERE path = 'ui/uiLifeBar/y';\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/chat/defaultOpen', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/chat/notificationBalloon', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/chat/damageMessages', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'players/actions/initialClassPathId', '1', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'enemies/initialStats/aim', '10', 'i');\nUPDATE config SET `value`= 10 WHERE path LIKE '%enemies/initialStats%';\nDELETE FROM config WHERE path LIKE '%players/initialStats/%';\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'actions/skills/affectedProperty', 'hp', 't');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/controls/opacityEffect', '1', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/skills/y', '390', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/skills/x', '230', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/skills/responsiveY', '100', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/skills/responsiveX', '0', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/skills/enabled', '1', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'skills/animations/default_atk', '{\"key\":\"default_atk\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_atk\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":4,\"repeat\":0}}', 'j');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'skills/animations/default_bullet', '{\"key\":\"default_bullet\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_bullet\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":2,\"repeat\":-1,\"rate\":1}}', 'j');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'skills/animations/default_cast', '{\"key\": \"default_cast\",\"animationData\":{\"enabled\":false,\"type\":\"spritesheet\",\"img\":\"default_cast\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":3,\"repeat\":0}}', 'j');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'skills/animations/default_death', '{\"key\":\"default_death\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_death\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":1,\"repeat\":0,\"rate\":1}}', 'j');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'skills/animations/default_hit', '{\"key\":\"default_hit\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_hit\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":3,\"repeat\":0}}', 'j');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/controls/defaultActionKey', 'attackShort', 't');\n\n# Features:\nINSERT INTO `features` (`code`, `title`, `is_enabled`) VALUES ('actions', 'Actions', '1');\nINSERT INTO `features` (`id`, `code`, `title`, `is_enabled`) VALUES (NULL, 'users', 'Users', 1);\n\n# Items:\nUPDATE `items_item_modifiers` SET `maxProperty`='statsBase/hp' WHERE  `key`='heal_potion_20';\nINSERT INTO `items_item` (`id`, `key`, `group_id`, `label`, `description`, `qty_limit`, `uses_limit`, `useTimeOut`, `execTimeOut`) VALUES (6, 'magic_potion_20', NULL, 'Magic Potion', 'A magic potion that will restore 20 MP.', 0, 1, NULL, NULL);\nINSERT INTO `items_item_modifiers` (`id`, `item_id`, `key`, `property_key`, `operation`, `value`, `maxProperty`) VALUES (4, 6, 'magic_potion_20', 'stats/mp', 1, '20', 'statsBase/mp');\n\n#######################################################################################################################\n# Stats:\n\n# RENAME TABLE `players_stats` TO `players_stats_back`;\nDROP TABLE `players_stats`;\n\nCREATE TABLE `stats` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`label` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`description` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`base_value` INT(10) UNSIGNED NOT NULL,\n\t`customData` TEXT NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `key` (`key`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1;\n\nCREATE TABLE `players_stats` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`player_id` INT(10) UNSIGNED NOT NULL,\n\t`stat_id` INT(10) UNSIGNED NOT NULL,\n\t`base_value` INT(10) UNSIGNED NOT NULL,\n\t`value` INT(10) UNSIGNED NOT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `player_id_stat_id` (`player_id`, `stat_id`) USING BTREE,\n\tINDEX `stat_id` (`stat_id`) USING BTREE,\n\tINDEX `user_id` (`player_id`) USING BTREE,\n\tCONSTRAINT `FK_player_current_stats_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT,\n\tCONSTRAINT `FK_players_current_stats_players_stats` FOREIGN KEY (`stat_id`) REFERENCES `stats` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1;\n\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (1, 'hp', 'HP', 'Player life points', 100);\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (2, 'mp', 'MP', 'Player magic points', 100);\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (3, 'atk', 'Atk', 'Player attack points', 100);\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (4, 'def', 'Def', 'Player defense points', 100);\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (5, 'dodge', 'Dodge', 'Player dodge points', 100);\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (6, 'speed', 'Speed', 'Player speed point', 100);\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (7, 'aim', 'Aim', 'Player aim points', 100);\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (8, 'stamina', 'Stamina', 'Player stamina points', 100);\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (9, 'mgk-atk', 'Magic Atk', 'Player magic attack', 100);\nINSERT INTO `stats` (`id`, `key`, `label`, `description`, `base_value`) VALUES (10, 'mgk-def', 'Magic Def', 'Player magic defense', 100);\nUPDATE `stats` SET `customData`='{\"showBase\":true}' WHERE  `key`='hp';\nUPDATE `stats` SET `customData`='{\"showBase\":true}' WHERE  `key`='mp';\nUPDATE `stats` SET `customData`='{\"showBase\":true}' WHERE  `key`='stamina';\n\nINSERT IGNORE INTO players_stats (id, player_id, stat_id, base_value, `value`)\nSELECT NULL, p.id AS playerId, ps.id AS statId, ps.base_value AS statValue, ps.base_value AS currentValue\n    FROM players AS p\n    JOIN stats AS ps;\n\n#######################################################################################################################\n# Skills system:\n#######################################################################################################################\n\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET NAMES utf8 */;\n/*!50503 SET NAMES utf8mb4 */;\n/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n\n-- Dumping structure for table skills_class_path\nCREATE TABLE IF NOT EXISTS `skills_class_path` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `label` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  `levels_set_id` int(11) unsigned NOT NULL,\n  PRIMARY KEY (`id`),\n  KEY `levels_set_id` (`levels_set_id`),\n  CONSTRAINT `FK_skills_class_path_skills_levels_set` FOREIGN KEY (`levels_set_id`) REFERENCES `skills_levels_set` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_class_path_level_labels\nCREATE TABLE IF NOT EXISTS `skills_class_path_level_labels` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `class_path_id` int(11) unsigned NOT NULL,\n  `level_key` int(11) unsigned NOT NULL,\n  `label` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `class_path_id_level_key` (`class_path_id`,`level_key`),\n  KEY `class_path_id` (`class_path_id`),\n  KEY `level_key` (`level_key`),\n  CONSTRAINT `FK__skills_class_path` FOREIGN KEY (`class_path_id`) REFERENCES `skills_class_path` (`id`) ON UPDATE CASCADE,\n  CONSTRAINT `FK_skills_class_path_level_labels_skills_levels` FOREIGN KEY (`level_key`) REFERENCES `skills_levels` (`key`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_class_path_level_skills\nCREATE TABLE IF NOT EXISTS `skills_class_path_level_skills` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `class_path_id` int(11) unsigned NOT NULL,\n  `level_key` int(11) unsigned NOT NULL,\n  `skill_id` int(11) unsigned NOT NULL,\n  PRIMARY KEY (`id`),\n  KEY `class_path_id` (`class_path_id`),\n  KEY `level_key` (`level_key`),\n  KEY `skill_id` (`skill_id`),\n  CONSTRAINT `FK_skills_class_path_level_skills_skills_class_path` FOREIGN KEY (`class_path_id`) REFERENCES `skills_class_path` (`id`) ON UPDATE CASCADE,\n  CONSTRAINT `FK_skills_class_path_level_skills_skills_levels` FOREIGN KEY (`level_key`) REFERENCES `skills_levels` (`key`) ON UPDATE CASCADE,\n  CONSTRAINT `FK_skills_class_path_level_skills_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_groups\nCREATE TABLE IF NOT EXISTS `skills_groups` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `label` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `description` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `sort` int(11) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_levels\nCREATE TABLE IF NOT EXISTS `skills_levels` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `key` int(11) unsigned NOT NULL,\n  `label` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `required_experience` bigint(20) unsigned DEFAULT NULL,\n  `level_set_id` int(11) unsigned NOT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `key` (`key`),\n  KEY `level_set_id` (`level_set_id`),\n  CONSTRAINT `FK_skills_levels_skills_levels_set` FOREIGN KEY (`level_set_id`) REFERENCES `skills_levels_set` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_levels_modifiers\nCREATE TABLE IF NOT EXISTS `skills_levels_modifiers` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `level_key` int(11) unsigned NOT NULL,\n  `key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `property_key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `operation` int(11) unsigned NOT NULL,\n  `value` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `minValue` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  `maxValue` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  `minProperty` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  `maxProperty` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  KEY `level_key` (`level_key`),\n  KEY `modifier_id` (`key`) USING BTREE,\n  CONSTRAINT `FK__skills_levels` FOREIGN KEY (`level_key`) REFERENCES `skills_levels` (`key`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Modifiers table.';\n\n-- Dumping structure for table skills_levels_modifiers_conditions\nCREATE TABLE IF NOT EXISTS `skills_levels_modifiers_conditions` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `levels_modifier_id` int(11) unsigned NOT NULL,\n  `key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `property_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `operation` varchar(50) COLLATE utf32_unicode_ci NOT NULL COMMENT 'eq,ne,lt,gt,le,ge',\n  `value` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `levels_modifier_id` (`levels_modifier_id`) USING BTREE,\n  CONSTRAINT `FK_skills_levels_modifiers_conditions_skills_levels_modifiers` FOREIGN KEY (`levels_modifier_id`) REFERENCES `skills_levels_modifiers` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf32 COLLATE=utf32_unicode_ci;\n\n-- Dumping structure for table skills_levels_set\nCREATE TABLE IF NOT EXISTS `skills_levels_set` (\n  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n  `autoFillRanges` int(1) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_owners_class_path\nCREATE TABLE IF NOT EXISTS `skills_owners_class_path` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `class_path_id` int(11) unsigned NOT NULL,\n  `owner_id` int(11) unsigned NOT NULL,\n  `currentLevel` bigint(20) unsigned NOT NULL DEFAULT '0',\n  `currentExp` bigint(20) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`),\n  KEY `level_set_id` (`class_path_id`) USING BTREE,\n  CONSTRAINT `FK_skills_owners_class_path_skills_class_path` FOREIGN KEY (`class_path_id`) REFERENCES `skills_class_path` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_skill\nCREATE TABLE `skills_skill` (\n\t`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`type` VARCHAR(255) NOT NULL COMMENT 'B: 1, ATK: 2, EFCT: 3, PHYS-ATK: 4, PHYS-EFCT: 5' COLLATE 'utf8_unicode_ci',\n\t`autoValidation` INT(1) NOT NULL,\n\t`skillDelay` INT(11) NOT NULL,\n\t`castTime` INT(11) NOT NULL,\n\t`usesLimit` INT(11) NOT NULL DEFAULT '0',\n\t`range` INT(11) NOT NULL,\n\t`rangeAutomaticValidation` INT(1) NOT NULL,\n\t`rangePropertyX` VARCHAR(255) NOT NULL COMMENT 'Property path' COLLATE 'utf8_unicode_ci',\n\t`rangePropertyY` VARCHAR(255) NOT NULL COMMENT 'Property path' COLLATE 'utf8_unicode_ci',\n\t`rangeTargetPropertyX` VARCHAR(255) NULL DEFAULT NULL COMMENT 'Target property path' COLLATE 'utf8_unicode_ci',\n\t`rangeTargetPropertyY` VARCHAR(255) NULL DEFAULT NULL COMMENT 'Target property path' COLLATE 'utf8_unicode_ci',\n\t`allowSelfTarget` INT(1) NOT NULL,\n\t`criticalChance` INT(11) NULL DEFAULT NULL,\n\t`criticalMultiplier` INT(11) NULL DEFAULT NULL,\n\t`criticalFixedValue` INT(11) NULL DEFAULT NULL,\n\t`customData` TEXT NULL DEFAULT NULL COMMENT 'Any custom data, recommended JSON format.' COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `key` (`key`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\n\n-- Dumping structure for table skills_skill_attack\nCREATE TABLE IF NOT EXISTS `skills_skill_attack` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `skill_id` int(11) unsigned NOT NULL,\n  `affectedProperty` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `allowEffectBelowZero` int(1) unsigned NOT NULL DEFAULT '0',\n  `hitDamage` int(11) unsigned NOT NULL,\n  `applyDirectDamage` int(1) unsigned NOT NULL DEFAULT '0',\n  `attackProperties` text COLLATE utf8_unicode_ci NOT NULL,\n  `defenseProperties` text COLLATE utf8_unicode_ci NOT NULL,\n  `aimProperties` text COLLATE utf8_unicode_ci NOT NULL,\n  `dodgeProperties` text COLLATE utf8_unicode_ci NOT NULL,\n  `dodgeFullEnabled` int(1) NOT NULL DEFAULT '1',\n  `dodgeOverAimSuccess` int(11) NOT NULL DEFAULT '2',\n  `damageAffected` int(1) NOT NULL DEFAULT '0',\n  `criticalAffected` int(1) NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`),\n  KEY `skill_id` (`skill_id`),\n  CONSTRAINT `FK__skills_skill_attack` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_skill_group_relation\nCREATE TABLE IF NOT EXISTS `skills_skill_group_relation` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `skill_id` int(11) unsigned NOT NULL,\n  `group_id` int(11) unsigned NOT NULL,\n  PRIMARY KEY (`id`),\n  KEY `group_id` (`group_id`),\n  KEY `skill_id` (`skill_id`),\n  CONSTRAINT `FK__skills_groups` FOREIGN KEY (`group_id`) REFERENCES `skills_groups` (`id`) ON UPDATE CASCADE,\n  CONSTRAINT `FK__skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_skill_owner_conditions\nCREATE TABLE `skills_skill_owner_conditions` (\n\t`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`skill_id` INT(11) UNSIGNED NOT NULL,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`property_key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`conditional` VARCHAR(50) NOT NULL COMMENT 'eq,ne,lt,gt,le,ge' COLLATE 'utf32_unicode_ci',\n\t`value` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `skill_id` (`skill_id`) USING BTREE,\n\tCONSTRAINT `FK_skills_skill_owner_conditions_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT\n) COLLATE='utf32_unicode_ci' ENGINE=InnoDB;\n\n-- Dumping structure for table skills_skill_owner_effects\nCREATE TABLE IF NOT EXISTS `skills_skill_owner_effects` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `skill_id` int(11) unsigned NOT NULL,\n  `key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `property_key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `operation` int(11) NOT NULL,\n  `value` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `minValue` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `maxValue` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `minProperty` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  `maxProperty` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `skill_id` (`skill_id`) USING BTREE,\n  CONSTRAINT `FK_skills_skill_owner_effects_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Modifiers table.';\n\n-- Dumping structure for table skills_skill_owner_effects_conditions\nCREATE TABLE IF NOT EXISTS `skills_skill_owner_effects_conditions` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `skill_owner_effect_id` int(11) unsigned NOT NULL,\n  `key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `property_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `operation` varchar(50) COLLATE utf32_unicode_ci NOT NULL COMMENT 'eq,ne,lt,gt,le,ge',\n  `value` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `skill_owner_effect_id` (`skill_owner_effect_id`) USING BTREE,\n  CONSTRAINT `FK_skills_skill_owner_effects_conditions_skill_owner_effects` FOREIGN KEY (`skill_owner_effect_id`) REFERENCES `skills_skill_owner_effects` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf32 COLLATE=utf32_unicode_ci;\n\n-- Dumping structure for table skills_skill_physical_data\nCREATE TABLE IF NOT EXISTS `skills_skill_physical_data` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `skill_id` int(11) unsigned NOT NULL,\n  `magnitude` int(11) unsigned NOT NULL,\n  `objectWidth` int(11) unsigned NOT NULL,\n  `objectHeight` int(11) unsigned NOT NULL,\n  `validateTargetOnHit` int(1) unsigned NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`),\n  KEY `attack_skill_id` (`skill_id`) USING BTREE,\n  CONSTRAINT `FK_skills_skill_physical_data_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\n-- Dumping structure for table skills_skill_target_effects\nCREATE TABLE IF NOT EXISTS `skills_skill_target_effects` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `skill_id` int(11) unsigned NOT NULL,\n  `key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `property_key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `operation` int(11) unsigned NOT NULL,\n  `value` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `minValue` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `maxValue` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `minProperty` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  `maxProperty` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `skill_id` (`skill_id`) USING BTREE,\n  CONSTRAINT `FK_skills_skill_effect_modifiers` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Modifiers table.';\n\n-- Dumping structure for table skills_skill_target_effects_conditions\nCREATE TABLE IF NOT EXISTS `skills_skill_target_effects_conditions` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `skill_target_effect_id` int(11) unsigned NOT NULL,\n  `key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `property_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `operation` varchar(50) COLLATE utf32_unicode_ci NOT NULL COMMENT 'eq,ne,lt,gt,le,ge',\n  `value` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `skill_target_effect_id` (`skill_target_effect_id`) USING BTREE,\n  CONSTRAINT `FK_skills_skill_target_effects_conditions_skill_target_effects` FOREIGN KEY (`skill_target_effect_id`) REFERENCES `skills_skill_target_effects` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf32 COLLATE=utf32_unicode_ci;\n\n/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;\n/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n\n#######################################################################################################################\n\n-- Dumping data for table skills_class_path: ~1 rows (approximately)\n/*!40000 ALTER TABLE `skills_class_path` DISABLE KEYS */;\nINSERT INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`) VALUES (1, 'mage', 'Mage', 1);\n/*!40000 ALTER TABLE `skills_class_path` ENABLE KEYS */;\n\n-- Dumping data for table skills_class_path_level_labels: ~2 rows (approximately)\n/*!40000 ALTER TABLE `skills_class_path_level_labels` DISABLE KEYS */;\nINSERT INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_key`, `label`) VALUES\n\t(1, 1, 1, 'Apprentice'),\n\t(2, 1, 4, 'Mage');\nINSERT INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_key`, `label`) VALUES (3, 1, 8, 'Warlock');\n/*!40000 ALTER TABLE `skills_class_path_level_labels` ENABLE KEYS */;\n\n-- Dumping data for table skills_class_path_level_skills: ~2 rows (approximately)\n/*!40000 ALTER TABLE `skills_class_path_level_skills` DISABLE KEYS */;\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_key`, `skill_id`) VALUES\n\t(1, 1, 1, 1),\n\t(2, 1, 1, 2);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_key`, `skill_id`) VALUES (4, 1, 8, 4);\n/*!40000 ALTER TABLE `skills_class_path_level_skills` ENABLE KEYS */;\n-- Dumping data for table skills_levels: ~3 rows (approximately)\n/*!40000 ALTER TABLE `skills_levels` DISABLE KEYS */;\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES\n\t(1, 1, '1', 0, 1),\n\t(2, 4, '4', 100, 1),\n\t(3, 2, '2', 50, 1);\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (4, 5, '5', 200, 1);\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (5, 6, '6', 250, 1);\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (6, 7, '7', 300, 1);\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (7, 8, '8', 500, 1);\n\n/*!40000 ALTER TABLE `skills_levels` ENABLE KEYS */;\n-- Dumping data for table skills_levels_modifiers: ~6 rows (approximately)\n/*!40000 ALTER TABLE `skills_levels_modifiers` DISABLE KEYS */;\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES\n\t(1, 1, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(2, 1, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(3, 4, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(4, 4, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(5, 2, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(6, 2, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (7, 5, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (8, 6, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (9, 7, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (10, 5, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (11, 5, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (12, 8, 'inc_hp', 'statsBase/hp', 1, '40', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (13, 8, 'inc_mp', 'statsBase/mp', 1, '40', NULL, NULL, NULL, NULL);\n/*!40000 ALTER TABLE `skills_levels_modifiers` ENABLE KEYS */;\n-- Dumping data for table skills_levels_set: ~1 rows (approximately)\n/*!40000 ALTER TABLE `skills_levels_set` DISABLE KEYS */;\nINSERT INTO `skills_levels_set` (`id`, `autoFillRanges`) VALUES\n\t(1, 1);\n/*!40000 ALTER TABLE `skills_levels_set` ENABLE KEYS */;\n-- Dumping data for table skills_owners_class_path: ~4 rows (approximately)\n/*!40000 ALTER TABLE `skills_owners_class_path` DISABLE KEYS */;\nINSERT INTO `skills_owners_class_path` (`id`, `class_path_id`, `owner_id`, `currentLevel`, `currentExp`) VALUES\n\t(1, 1, 1, 1, 0),\n\t(2, 1, 2, 1, 0),\n\t(3, 1, 3, 1, 0),\n\t(4, 1, 17, 1, 0);\n/*!40000 ALTER TABLE `skills_owners_class_path` ENABLE KEYS */;\n-- Dumping data for table skills_skill: ~2 rows (approximately)\n/*!40000 ALTER TABLE `skills_skill` DISABLE KEYS */;\nINSERT INTO `skills_skill` (`id`, `key`, `type`, `autoValidation`, `skillDelay`, `castTime`, `usesLimit`, `range`, `rangeAutomaticValidation`, `rangePropertyX`, `rangePropertyY`, `rangeTargetPropertyX`, `rangeTargetPropertyY`, `allowSelfTarget`, `criticalChance`, `criticalMultiplier`, `criticalFixedValue`) VALUES\n\t(1, 'attackBullet', '4', 0, 1000, 0, 0, 250, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0),\n\t(2, 'attackShort', '2', 0, 600, 0, 0, 50, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0);\n/*!40000 ALTER TABLE `skills_skill` ENABLE KEYS */;\n-- Dumping data for table skills_skill_attack: ~2 rows (approximately)\n/*!40000 ALTER TABLE `skills_skill_attack` DISABLE KEYS */;\nINSERT INTO `skills_skill_attack` (`id`, `skill_id`, `affectedProperty`, `allowEffectBelowZero`, `hitDamage`, `applyDirectDamage`, `attackProperties`, `defenseProperties`, `aimProperties`, `dodgeProperties`, `dodgeFullEnabled`, `dodgeOverAimSuccess`, `damageAffected`, `criticalAffected`) VALUES\n\t(1, 1, 'stats/hp', 0, 3, 0, 'stats/atk,stats/stamina,stats/speed', 'stats/def,stats/stamina,stats/speed', 'stats/aim', 'stats/dodge', 1, 2, 0, 0),\n\t(2, 2, 'stats/hp', 0, 5, 0, 'stats/atk,stats/stamina,stats/speed', 'stats/def,stats/stamina,stats/speed', 'stats/aim', 'stats/dodge', 1, 2, 0, 0);\n/*!40000 ALTER TABLE `skills_skill_attack` ENABLE KEYS */;-- Dumping data for table skills_skill_physical_data: ~1 rows (approximately)\n/*!40000 ALTER TABLE `skills_skill_physical_data` DISABLE KEYS */;\nINSERT INTO `skills_skill_physical_data` (`id`, `skill_id`, `magnitude`, `objectWidth`, `objectHeight`, `validateTargetOnHit`) VALUES\n\t(1, 1, 350, 5, 5, 0);\n/*!40000 ALTER TABLE `skills_skill_physical_data` ENABLE KEYS */;\n\n# New ClassPath:\nINSERT INTO skills_owners_class_path (class_path_id, owner_id, currentLevel, currentExp)\n    SELECT 1 AS class_path_id, id AS owner_id, 1 AS currentLevel, 0 AS currentExp\n    FROM players;\n\n# New Fireball:\nINSERT INTO `skills_skill` (`id`, `key`, `type`, `autoValidation`, `skillDelay`, `castTime`, `usesLimit`, `range`, `rangeAutomaticValidation`, `rangePropertyX`, `rangePropertyY`, `rangeTargetPropertyX`, `rangeTargetPropertyY`, `allowSelfTarget`, `criticalChance`, `criticalMultiplier`, `criticalFixedValue`) VALUES (3, 'fireball', '4', 0, 1500, 2000, 0, 280, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0);\nINSERT INTO `skills_skill_attack` (`id`, `skill_id`, `affectedProperty`, `allowEffectBelowZero`, `hitDamage`, `applyDirectDamage`, `attackProperties`, `defenseProperties`, `aimProperties`, `dodgeProperties`, `dodgeFullEnabled`, `dodgeOverAimSuccess`, `damageAffected`, `criticalAffected`) VALUES (3, 3, 'stats/hp', 0, 7, 0, 'stats/atk,stats/stamina,stats/speed', 'stats/def,stats/stamina,stats/speed', 'stats/aim', 'stats/dodge', 1, 2, 0, 0);\nINSERT INTO `skills_skill_physical_data` (`skill_id`, `magnitude`, `objectWidth`, `objectHeight`) VALUES ('3', '550', '5', '5');\nINSERT INTO `skills_class_path_level_skills` (`class_path_id`, `level_key`, `skill_id`) VALUES ('1', '5', '3');\n\n# Bullet:\nINSERT INTO `skills_skill_owner_conditions` (`id`, `skill_id`, `key`, `property_key`, `conditional`, `value`) VALUES (NULL, 3, 'available_mp', 'stats/mp', 'ge', '5');\nINSERT INTO `skills_skill_owner_effects` (`id`, `skill_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 3, 'dec_mp', 'stats/mp', 2, '5', '0', '', NULL, NULL);\n\n# Heal:\nINSERT INTO `skills_skill` (`id`, `key`, `type`, `autoValidation`, `skillDelay`, `castTime`, `usesLimit`, `range`, `rangeAutomaticValidation`, `rangePropertyX`, `rangePropertyY`, `rangeTargetPropertyX`, `rangeTargetPropertyY`, `allowSelfTarget`, `criticalChance`, `criticalMultiplier`, `criticalFixedValue`, `customData`) VALUES (4, 'heal', '3', 0, 1500, 2000, 0, 100, 1, 'state/x', 'state/y', NULL, NULL, 1, 0, 1, 0, NULL);\nINSERT INTO `skills_skill_target_effects` (`id`, `skill_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (1, 4, 'heal', 'stats/hp', 1, '10', '0', '0', NULL, 'statsBase/hp');\n\n# Skills animations:\nCREATE TABLE `skills_skill_animations` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`skill_id` INT(10) UNSIGNED NOT NULL,\n\t`key` VARCHAR(255) NOT NULL COMMENT 'Name conventions [key] + _atk, _cast, _bullet, _hit or _death.' COLLATE 'utf8_unicode_ci',\n\t`classKey` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',\n\t`animationData` TEXT NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `skill_id_key` (`skill_id`, `key`) USING BTREE,\n\tINDEX `id` (`id`) USING BTREE,\n\tINDEX `key` (`key`) USING BTREE,\n\tINDEX `skill_id` (`skill_id`) USING BTREE,\n\tCONSTRAINT `FK_skills_skill_animations_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\n# Skills Animations:\nINSERT INTO `skills_skill_animations` (`id`, `skill_id`, `key`, `classKey`, `animationData`) VALUES (1, 3, 'bullet', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"fireball_bullet\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":3,\"repeat\":-1,\"rate\":1,\"dir\":3}');\nINSERT INTO `skills_skill_animations` (`id`, `skill_id`, `key`, `classKey`, `animationData`) VALUES (2, 3, 'cast', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"fireball_cast\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":3,\"repeat\":-1,\"destroyTime\":2000,\"depthByPlayer\":\"above\"}');\nINSERT INTO `skills_skill_animations` (`id`, `skill_id`, `key`, `classKey`, `animationData`) VALUES (3, 4, 'cast', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"heal_cast\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":3,\"repeat\":-1,\"destroyTime\":2000}');\nINSERT INTO `skills_skill_animations` (`id`, `skill_id`, `key`, `classKey`, `animationData`) VALUES (6, 4, 'hit', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"heal_hit\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":4,\"repeat\":0,\"depthByPlayer\":\"above\"}');\n\n#######################################################################################################################\n\n# Players RESET!\nUPDATE skills_owners_class_path SET currentLevel = 1, currentExp = 0;\nUPDATE players_stats SET `value` = 100, base_value = 100;\nUPDATE items_inventory SET is_active = 0 WHERE is_active = 1;\n\n#######################################################################################################################\nSET FOREIGN_KEY_CHECKS=1;\n"
  },
  {
    "path": "migrations/development/beta.16.5-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n# Config:\n\nUPDATE `config` SET `value`=0 WHERE `path`='ui/chat/defaultOpen';\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'players/animations/collideWorldBounds', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'rooms/world/bulletsStopOnPlayer', '1', 'b');\n\n# Path new room:\nINSERT INTO `rooms` (`id`, `name`, `title`, `map_filename`, `scene_images`, `room_class_key`) VALUES (6, 'ReldensHouse_1b', 'House - 1 - Floor 2', 'reldens-house-1-2d-floor', 'reldens-house-1-2d-floor', NULL);\nINSERT INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES (11, 2, 623, 6);\nINSERT INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES (12, 2, 663, 6);\nINSERT INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES (13, 6, 624, 2);\nINSERT INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES (14, 6, 664, 2);\nINSERT INTO `rooms_return_points` (`id`, `room_id`, `direction`, `x`, `y`, `is_default`, `to_room_id`) VALUES (9, 6, 'right', 820, 500, 0, 2);\nINSERT INTO `rooms_return_points` (`id`, `room_id`, `direction`, `x`, `y`, `is_default`, `to_room_id`) VALUES (10, 6, 'right', 820, 500, 0, 2);\nINSERT INTO `rooms_return_points` (`id`, `room_id`, `direction`, `x`, `y`, `is_default`, `to_room_id`) VALUES (11, 2, 'left', 720, 540, 0, 6);\n\n# Rename field \"to_room_id\" to \"from_room_id\":\nALTER TABLE `rooms_return_points`\n\tDROP FOREIGN KEY `FK_scenes_return_points_rooms_2`;\nALTER TABLE `rooms_return_points`\n\tCHANGE COLUMN `to_room_id` `from_room_id` INT(11) UNSIGNED NULL DEFAULT NULL AFTER `is_default`,\n\tDROP INDEX `FK_scenes_return_points_rooms_2`,\n\tADD INDEX `FK_scenes_return_points_rooms_2` (`from_room_id`) USING BTREE;\nALTER TABLE `rooms_return_points`\n\tADD CONSTRAINT `FK_rooms_return_points_rooms` FOREIGN KEY (`from_room_id`) REFERENCES `rooms` (`id`) ON UPDATE CASCADE;\nALTER TABLE `rooms_return_points`\n\tDROP FOREIGN KEY `FK_scenes_return_points_rooms`;\nALTER TABLE `rooms_return_points`\n\tADD CONSTRAINT `FK_scenes_return_points_rooms` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT;\nALTER TABLE `rooms_return_points`\n\tDROP FOREIGN KEY `FK_rooms_return_points_rooms`,\n\tDROP FOREIGN KEY `FK_scenes_return_points_rooms`;\nALTER TABLE `rooms_return_points`\n\tADD CONSTRAINT `FK_rooms_return_points_rooms_from_room_id` FOREIGN KEY (`from_room_id`) REFERENCES `rooms` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT,\n\tADD CONSTRAINT `FK_rooms_return_points_rooms_room_id` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION;\n\n# Return point update for new room:\nUPDATE `rooms_return_points` SET `is_default`='0', `from_room_id`='4' WHERE  `id`=1 AND `room_id`=2;\n\n# Atk and Def modifiers for level up:\n\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 1, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 1, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 4, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 4, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 2, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 2, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 5, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 6, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_key`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, 7, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\n\n# Config:\n\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'players/animations/fallbackImage', 'player-base', 't');\nUPDATE `config` SET `value`='' WHERE  `path`= 'ui/controls/defaultActionKey';\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'players/multiplePlayers/enabled', '1', 'b');\n\n# Multiple players:\n\nALTER TABLE `players` ADD UNIQUE INDEX `name` (`name`);\n\n# Update skills system:\n\nALTER TABLE `skills_class_path`ADD UNIQUE INDEX `key` (`key`);\n\nUPDATE `skills_class_path` SET `key`='warlock', `label`='Warlock' WHERE  `id`=1;\n\nINSERT INTO `skills_levels_set` (`autoFillRanges`) VALUES ('1');\nINSERT INTO `skills_levels_set` (`autoFillRanges`) VALUES ('1');\nINSERT INTO `skills_levels_set` (`autoFillRanges`) VALUES ('1');\n\nINSERT INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`) VALUES (2, 'sorcerer', 'Sorcerer', 2);\nINSERT INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`) VALUES (3, 'swordsman', 'Swordsman', 3);\nINSERT INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`) VALUES (4, 'warrior', 'Warrior', 4);\n\nDELETE FROM `skills_class_path_level_labels` WHERE `id`=2;\n\nINSERT INTO `skills_class_path_level_skills` (`class_path_id`, `level_key`, `skill_id`) VALUES ('2', '1', '2');\nINSERT INTO `skills_class_path_level_skills` (`class_path_id`, `level_key`, `skill_id`) VALUES ('3', '1', '2');\nINSERT INTO `skills_class_path_level_skills` (`class_path_id`, `level_key`, `skill_id`) VALUES ('4', '1', '2');\nINSERT INTO `skills_class_path_level_skills` (`class_path_id`, `level_key`, `skill_id`) VALUES ('2', '4', '4');\n\nALTER TABLE `skills_levels` DROP INDEX `key`, ADD UNIQUE INDEX `key_level_set_id` (`key`, `level_set_id`);\n\nINSERT INTO `skills_levels` (`key`, `label`, `required_experience`, `level_set_id`) VALUES ('1', '1', '0', '2');\nINSERT INTO `skills_levels` (`key`, `label`, `required_experience`, `level_set_id`) VALUES ('1', '1', '0', '3');\nINSERT INTO `skills_levels` (`key`, `label`, `required_experience`, `level_set_id`) VALUES ('1', '1', '0', '4');\n\nINSERT INTO `skills_levels` (`key`, `label`, `required_experience`, `level_set_id`) VALUES ('4', '4', '200', '2');\nINSERT INTO `skills_levels` (`key`, `label`, `required_experience`, `level_set_id`) VALUES ('4', '4', '200', '3');\nINSERT INTO `skills_levels` (`key`, `label`, `required_experience`, `level_set_id`) VALUES ('4', '4', '200', '4');\n\nALTER TABLE `skills_class_path_level_skills`\n    CHANGE COLUMN `level_key` `level_id` INT(11) UNSIGNED NOT NULL AFTER `class_path_id`,\n\tDROP INDEX `level_key`,\n\tADD INDEX `level_key` (`level_id`) USING BTREE;\n\nDELETE FROM skills_class_path_level_skills;\nDELETE FROM skills_class_path_level_labels;\n\nALTER TABLE `skills_class_path_level_skills`\n    ADD CONSTRAINT `FK_skills_class_path_level_skills_skills_levels_id` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`id`) ON UPDATE CASCADE;\n\nALTER TABLE `skills_class_path_level_labels`\n    CHANGE COLUMN `level_key` `level_id` INT(11) UNSIGNED NOT NULL AFTER `class_path_id`,\n    DROP INDEX `class_path_id_level_key`,\n    ADD UNIQUE INDEX `class_path_id_level_key` (`class_path_id`, `level_id`) USING BTREE,\n    DROP INDEX `level_key`,\n    ADD INDEX `level_key` (`level_id`) USING BTREE,\n    DROP FOREIGN KEY `FK_skills_class_path_level_labels_skills_levels`;\n\nALTER TABLE `skills_class_path_level_labels`\n\tADD CONSTRAINT `FK_skills_class_path_level_labels_skills_levels` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`id`) ON UPDATE CASCADE;\n\nINSERT INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_id`, `label`) VALUES (4, 1, 1, 'Apprentice');\nINSERT INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_id`, `label`) VALUES (5, 1, 4, 'Warlock');\n\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (9, 1, 1, 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (10, 1, 4, 3);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (11, 1, 7, 4);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (12, 2, 9, 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (13, 2, 12, 4);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (14, 3, 10, 2);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (15, 4, 11, 2);\n\nDELETE FROM skills_levels_modifiers;\n\nALTER TABLE `skills_levels_modifiers` DROP FOREIGN KEY `FK__skills_levels`;\n\nALTER TABLE `skills_levels_modifiers`\n\tCHANGE COLUMN `level_key` `level_id` INT(11) UNSIGNED NOT NULL AFTER `id`,\n\tDROP INDEX `level_key`,\n\tADD INDEX `level_key` (`level_id`) USING BTREE,\n\tADD CONSTRAINT `FK_skills_levels_modifiers_skills_levels` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`id`) ON UPDATE CASCADE;\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.17-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Config:\n\nUPDATE `config` SET `value`='940' WHERE `scope` = 'client' AND `path` = 'ui/chat/y';\nUPDATE `config` SET `value`='10' WHERE `scope` = 'client' AND `path` = 'ui/uiTarget/x';\nUPDATE `config` SET `value`='85' WHERE `scope` = 'client' AND `path` = 'ui/uiTarget/y';\nUPDATE `config` SET `type`='s' WHERE `scope` = 'server' AND `path` = 'actions/pvp/timerType';\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'players/gameOver/timeOut', '10000', 'i');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/controls/tabTarget', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/controls/disableContextMenu', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/controls/primaryMove', '1', 'b');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/instructions/enabled', '1', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/instructions/responsiveX', '100', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/instructions/responsiveY', '100', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/instructions/x', '380', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/instructions/y', '940', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/players/showNames', '1', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/players/nameHeight', '15', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/players/nameFill', '#ffffff', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/players/nameStroke', '#000000', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/players/nameStrokeThickness', '4', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/players/nameShadowColor', 'rgba(0,0,0,0.7)', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/players/nameFontFamily', 'Verdana, Geneva, sans-serif', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/players/nameFontSize', '12', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/lifeBar/top', '5', 'i');\nUPDATE `config` SET `value`='{\"key\":\"default_hit\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_hit\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":3,\"repeat\":0,\"depthByPlayer\":\"above\"}}' WHERE `path`='skills/animations/default_hit';\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/enabled', '1', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/showAll', '0', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/font', 'Verdana, Geneva, sans-serif', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/color', '#ff0000', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/duration', '600', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/top', '50', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/fontSize', '14', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/stroke', '#000000', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/strokeThickness', '4', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'actions/damage/shadowColor', 'rgba(0,0,0,0.7)', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/lifeBar/fillStyle', '0xff0000', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/lifeBar/lineStyle', '0xffffff', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/lifeBar/showAllPlayers', '0', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/lifeBar/showEnemies', '1', 'b');\n# Note: these will put the lifeBar fixed below the player data box in the top/left corner.\nUPDATE `config` SET `value`= '5' WHERE `path` = 'ui/lifeBar/x';\nUPDATE `config` SET `value`= '12' WHERE `path` = 'ui/lifeBar/y';\nUPDATE `config` SET `value`= '1' WHERE `path` = 'ui/lifeBar/responsiveX';\nUPDATE `config` SET `value`= '24' WHERE `path` = 'ui/lifeBar/responsiveY';\n\n# Skills level up animations:\n\nCREATE TABLE `skills_class_level_up_animations` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`class_path_id` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`level_id` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`animationData` TEXT NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `class_path_id_level_id` (`class_path_id`, `level_id`) USING BTREE,\n\tINDEX `FK_skills_class_level_up_skills_levels` (`level_id`) USING BTREE,\n\tCONSTRAINT `FK_skills_class_level_up_skills_class_path` FOREIGN KEY (`class_path_id`) REFERENCES `skills_class_path` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT,\n\tCONSTRAINT `FK_skills_class_level_up_skills_levels` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\n# Single level up for all classes and levels:\n\nINSERT INTO `skills_class_level_up_animations` (`animationData`) VALUES ('{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"heal_cast\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":3,\"repeat\":-1,\"destroyTime\":2000,\"depthByPlayer\":\"above\"}');\n\n# Skills module update:\n\nALTER TABLE `skills_levels_set` ADD COLUMN `autoFillExperienceMultiplier` INT(1) UNSIGNED NULL DEFAULT NULL AFTER `autoFillRanges`;\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n\n## -------------------------------------------------------------------------------------------------------------------\n\nSET FOREIGN_KEY_CHECKS=0;\n\nTRUNCATE `skills_class_path`;\nTRUNCATE `skills_levels_set`;\nTRUNCATE `skills_class_path_level_labels`;\nTRUNCATE `skills_class_path_level_skills`;\nTRUNCATE `skills_levels`;\nTRUNCATE `skills_levels_modifiers`;\n\nUPDATE `skills_owners_class_path` SET currentLevel = 1, currentExp = 0;\n\n## -------------------------------------------------------------------------------------------------------------------\n\nSET @attackShort = (SELECT id FROM skills_skill WHERE `key` = 'attackShort');\nSET @attackBullet = (SELECT id FROM skills_skill WHERE `key` = 'attackBullet');\nSET @fireball = (SELECT id FROM skills_skill WHERE `key` = 'fireball');\nSET @heal = (SELECT id FROM skills_skill WHERE `key` = 'heal');\n\n## -------------------------------------------------------------------------------------------------------------------\n\nINSERT INTO `skills_levels_set` (`id`, `autoFillRanges`) VALUES (NULL, 1);\nSET @levelSet = (SELECT id FROM skills_levels_set ORDER BY id DESC LIMIT 1);\n\nINSERT INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`) VALUES (NULL, 'journeyman', 'Journeyman', @levelSet);\nSET @classPath = (SELECT id FROM skills_class_path ORDER BY id DESC LIMIT 1);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 1 - to include the initial skills\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 1, '1', 0, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @attackShort);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 2 - to include the base modifiers\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 2, '2', 100, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 3 & 4 autogenerated\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 5 - new skill and label\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 5, '5', 338, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @attackBullet);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_id`, `label`) VALUES (NULL, @classPath, @currentLevel, 'Old Traveler');\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 10 - for autogenareted levels 6 to 9\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 10, '10', 2570, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @fireball);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @heal);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n## -------------------------------------------------------------------------------------------------------------------\n\nINSERT INTO `skills_levels_set` (`id`, `autoFillRanges`) VALUES (NULL, 1);\nSET @levelSet = (SELECT id FROM skills_levels_set ORDER BY id DESC LIMIT 1);\n\nINSERT INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`) VALUES (NULL, 'sorcerer', 'Sorcerer', @levelSet);\nSET @classPath = (SELECT id FROM skills_class_path ORDER BY id DESC LIMIT 1);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 1 - to include the initial skills\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 1, '1', 0, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @attackBullet);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 2 - to include the base modifiers\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 2, '2', 100, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 3 & 4 autogenerated\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 5 - new skill and label\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 5, '5', 338, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @fireball);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_id`, `label`) VALUES (NULL, @classPath, @currentLevel, 'Fire Master');\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 10 - for autogenareted levels 6 to 9\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 10, '10', 2570, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @heal);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n## -------------------------------------------------------------------------------------------------------------------\n\nINSERT INTO `skills_levels_set` (`id`, `autoFillRanges`) VALUES (NULL, 1);\nSET @levelSet = (SELECT id FROM skills_levels_set ORDER BY id DESC LIMIT 1);\n\nINSERT INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`) VALUES (NULL, 'warlock', 'Warlock', @levelSet);\nSET @classPath = (SELECT id FROM skills_class_path ORDER BY id DESC LIMIT 1);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 1 - to include the initial skills\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 1, '1', 0, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @attackBullet);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 2 - to include the base modifiers\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 2, '2', 100, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 3 & 4 autogenerated\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 5 - new skill and label\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 5, '5', 338, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @fireball);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_id`, `label`) VALUES (NULL, @classPath, @currentLevel, 'Magus');\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 10 - for autogenareted levels 6 to 9\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 10, '10', 2570, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @attackShort);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n## -------------------------------------------------------------------------------------------------------------------\n\nINSERT INTO `skills_levels_set` (`id`, `autoFillRanges`) VALUES (NULL, 1);\nSET @levelSet = (SELECT id FROM skills_levels_set ORDER BY id DESC LIMIT 1);\n\nINSERT INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`) VALUES (NULL, 'swordsman', 'Swordsman', @levelSet);\nSET @classPath = (SELECT id FROM skills_class_path ORDER BY id DESC LIMIT 1);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 1 - to include the initial skills\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 1, '1', 0, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @attackShort);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 2 - to include the base modifiers\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 2, '2', 100, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 3 & 4 autogenerated\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 5 - new skill and label\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 5, '5', 338, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @heal);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_id`, `label`) VALUES (NULL, @classPath, @currentLevel, 'Blade Master');\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 10 - for autogenareted levels 6 to 9\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 10, '10', 2570, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n## -------------------------------------------------------------------------------------------------------------------\n\nINSERT INTO `skills_levels_set` (`id`, `autoFillRanges`) VALUES (NULL, 1);\nSET @levelSet = (SELECT id FROM skills_levels_set ORDER BY id DESC LIMIT 1);\n\nINSERT INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`) VALUES (NULL, 'warrior', 'Warrior', @levelSet);\nSET @classPath = (SELECT id FROM skills_class_path ORDER BY id DESC LIMIT 1);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 1 - to include the initial skills\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 1, '1', 0, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @attackShort);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 2 - to include the base modifiers\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 2, '2', 100, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 3 & 4 autogenerated\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 5 - new skill and label\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 5, '5', 338, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @attackBullet);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_id`, `label`) VALUES (NULL, @classPath, @currentLevel, 'Paladin');\n\n## -------------------------------------------------------------------------------------------------------------------\n\n## Level 10 - for autogenareted levels 6 to 9\nINSERT INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES (NULL, 10, '10', 2570, @levelSet);\nSET @currentLevel = (SELECT id FROM skills_levels ORDER BY id DESC LIMIT 1);\nINSERT INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES (NULL, @classPath, @currentLevel, @heal);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL);\nINSERT INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES (NULL, @currentLevel, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL);\n--\n\n## -------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "migrations/development/beta.18-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Config:\n\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'players/animations/defaultFrames/left/start', 3, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'players/animations/defaultFrames/left/end', 5, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'players/animations/defaultFrames/right/start', 6, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'players/animations/defaultFrames/right/end', 8, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'players/animations/defaultFrames/up/start', 9, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'players/animations/defaultFrames/up/end', 11, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'players/animations/defaultFrames/down/start', 0, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'players/animations/defaultFrames/down/end', 2, 'i');\n\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/enabled', 1, 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/mapWidthDivisor', 1, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/mapHeightDivisor', 1, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/fixedWidth', 450, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/fixedHeight', 450, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/roundMap', 1, 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/camX', 140, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/camY', 10, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/camBackgroundColor', 'rgba(0,0,0,0.6)', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/camZoom', '0.35', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/roundMap', 1, 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/addCircle', 1, 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleX', 220, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleY', 88, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleRadio', 80.35, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleColor', 'rgb(0,0,0)', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleAlpha', 1, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleStrokeLineWidth', 6, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleStrokeColor', 0, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleStrokeAlpha', '0.6', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleFillColor', 1, 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/circleFillAlpha', 0, 'i');\n\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/settings/enabled', 1, 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/settings/responsiveX', '100', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/settings/responsiveY', '100', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/settings/x', '940', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/settings/y', '280', 'i');\n\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/pointer/topOffSet', 16, 'i');\n\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/lifeBar/showOnClick', '1', 'b');\n\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'rooms/selection/allowOnRegistration', '1', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'rooms/selection/allowOnLogin', '1', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'rooms/selection/registrationAvailableRooms', '*', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'rooms/selection/loginLastLocation', '1', 'b');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'rooms/selection/loginLastLocationLabel', 'Last Location', 't');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'rooms/selection/loginAvailableRooms', '*', 't');\n\nUPDATE `config` SET `path` = 'map/tileData/height' WHERE `path` = 'general/tileData/height';\nUPDATE `config` SET `path` = 'map/tileData/margin' WHERE `path` = 'general/tileData/margin';\nUPDATE `config` SET `path` = 'map/tileData/spacing' WHERE `path` = 'general/tileData/spacing';\nUPDATE `config` SET `path` = 'map/tileData/width' WHERE `path` = 'general/tileData/width';\n\n## -------------------------------------------------------------------------------------------------------------------\n\n# Players:\n\nALTER TABLE `players` ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT NOW() AFTER `name`;\n\n## -------------------------------------------------------------------------------------------------------------------\n\n# World feature pack:\n\nINSERT INTO `features` (`code`, `title`, `is_enabled`) VALUES ('rooms', 'Rooms', '1');\n\n## -------------------------------------------------------------------------------------------------------------------\n\n# Objects animations:\n\nCREATE TABLE `objects_animations` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`object_id` INT(10) UNSIGNED NOT NULL,\n\t`animationKey` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`animationData` TEXT NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `object_id_animationKey` (`object_id`, `animationKey`) USING BTREE,\n\tINDEX `id` (`id`) USING BTREE,\n\tINDEX `object_id` (`object_id`) USING BTREE,\n\tCONSTRAINT `FK_objects_animations_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nSET @object_id = (SELECT id FROM objects WHERE `layer_name` = 'respawn-area-monsters-lvl-1-2' AND object_class_key = 'enemy_1');\n\nINSERT INTO `objects_animations` (`id`, `object_id`, `animationKey`, `animationData`) VALUES (NULL, @object_id, CONCAT('respawn-area-monsters-lvl-1-2_', @object_id, '_right'), '{\"start\":6,\"end\":8}');\nINSERT INTO `objects_animations` (`id`, `object_id`, `animationKey`, `animationData`) VALUES (NULL, @object_id, CONCAT('respawn-area-monsters-lvl-1-2_', @object_id, '_down'), '{\"start\":0,\"end\":2}');\nINSERT INTO `objects_animations` (`id`, `object_id`, `animationKey`, `animationData`) VALUES (NULL, @object_id, CONCAT('respawn-area-monsters-lvl-1-2_', @object_id, '_left'), '{\"start\":3,\"end\":5}');\nINSERT INTO `objects_animations` (`id`, `object_id`, `animationKey`, `animationData`) VALUES (NULL, @object_id, CONCAT('respawn-area-monsters-lvl-1-2_', @object_id, '_up'), '{\"start\":9,\"end\":11}');\n\n## -------------------------------------------------------------------------------------------------------------------\n\n# Audio:\n\nINSERT INTO `features` (`code`, `title`, `is_enabled`) VALUES ('audio', 'Audio', '1');\n\nCREATE TABLE IF NOT EXISTS `audio_categories` (\n  `id` int unsigned NOT NULL AUTO_INCREMENT,\n  `category_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `category_label` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `enabled` int NOT NULL DEFAULT '0',\n  `single_audio` int NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `category_key` (`category_key`),\n  UNIQUE KEY `category_label` (`category_label`)\n) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `audio` (\n  `id` int unsigned NOT NULL AUTO_INCREMENT,\n  `audio_key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `files_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `config` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,\n  `room_id` int unsigned DEFAULT NULL,\n  `category_id` int unsigned DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `audio_key` (`audio_key`),\n  KEY `FK_audio_rooms` (`room_id`),\n  KEY `FK_audio_audio_categories` (`category_id`),\n  CONSTRAINT `FK_audio_audio_categories` FOREIGN KEY (`category_id`) REFERENCES `audio_categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,\n  CONSTRAINT `FK_audio_rooms` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON DELETE SET NULL ON UPDATE SET NULL\n) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `audio_markers` (\n  `id` int unsigned NOT NULL AUTO_INCREMENT,\n  `audio_id` int unsigned NOT NULL,\n  `marker_key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,\n  `start` int unsigned NOT NULL,\n  `duration` int unsigned NOT NULL,\n  `config` text COLLATE utf8_unicode_ci,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `audio_id_marker_key` (`audio_id`,`marker_key`),\n  KEY `audio_id` (`audio_id`),\n  CONSTRAINT `FK_audio_markers_audio` FOREIGN KEY (`audio_id`) REFERENCES `audio` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `audio_player_config` (\n  `id` int unsigned NOT NULL AUTO_INCREMENT,\n  `player_id` int unsigned NOT NULL,\n  `category_id` int unsigned DEFAULT NULL,\n  `enabled` int unsigned DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `player_id_category_id` (`player_id`,`category_id`),\n  KEY `FK_audio_player_config_audio_categories` (`category_id`),\n  CONSTRAINT `FK_audio_player_config_audio_categories` FOREIGN KEY (`category_id`) REFERENCES `audio_categories` (`id`) ON UPDATE CASCADE,\n  CONSTRAINT `FK_audio_player_config_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\n\nINSERT INTO `audio_categories` (`id`, `category_key`, `category_label`, `enabled`, `single_audio`) VALUES\n\t(NULL, 'music', 'Music', 1, 1),\n\t(NULL, 'sound', 'Sound', 1, 0);\n\nSET @music_category = (SELECT id FROM audio_categories WHERE `category_key` = 'music');\nSET @sound_category = (SELECT id FROM audio_categories WHERE `category_key` = 'sound');\nSET @reldens_town_room_id = (SELECT id FROM rooms WHERE `name` = 'ReldensTown');\n\nINSERT INTO `audio` (`id`, `audio_key`, `files_name`, `config`, `room_id`, `category_id`) VALUES\n\t(NULL, 'footstep', 'footstep.ogg,footstep.mp3', NULL, NULL, @sound_category),\n\t(NULL, 'ReldensTownAudio', 'reldens-town.ogg,reldens-town.mp3', NULL, @reldens_town_room_id, @music_category),\n\t(NULL, 'intro', 'intro.ogg,intro.mp3', NULL, NULL, @music_category);\n\nSET @reldens_town_audio_id = (SELECT id FROM audio WHERE `audio_key` = 'footstep');\nSET @footstep_audio_id = (SELECT id FROM audio WHERE `audio_key` = 'ReldensTownAudio');\n\nINSERT INTO `audio_markers` (`id`, `audio_id`, `marker_key`, `start`, `duration`, `config`) VALUES\n    (NULL, @reldens_town_audio_id, 'ReldensTown', 0, 41, NULL),\n    (NULL, @footstep_audio_id,'journeyman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'journeyman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'journeyman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'journeyman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_down', 0, 1, NULL);\n\nINSERT IGNORE INTO `audio_player_config` (`id`, `player_id`, `category_id`, `enabled`)\n    SELECT NULL, p.id AS playerId, ac.id AS audioCategoryId, 1\n        FROM players AS p\n        JOIN audio_categories AS ac;\n\n## -------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "migrations/development/beta.18.1-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Config missing:\n\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/responsiveX', '34', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/responsiveY', '2.4', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/x', '180', 'i');\nINSERT INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES (NULL, 'client', 'ui/minimap/y', '10', 'i');\n\n# Audio markers fix:\n\nTRUNCATE audio_markers;\n\nSET @reldens_town_audio_id = (SELECT id FROM audio WHERE `audio_key` = 'ReldensTownAudio');\nSET @footstep_audio_id = (SELECT id FROM audio WHERE `audio_key` = 'footstep');\n\nINSERT INTO `audio_markers` (`id`, `audio_id`, `marker_key`, `start`, `duration`, `config`) VALUES\n    (NULL, @reldens_town_audio_id, 'ReldensTown', 0, 41, NULL),\n    (NULL, @footstep_audio_id,'journeyman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'journeyman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'journeyman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'journeyman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_down', 0, 1, NULL);\n\n## -------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "migrations/development/beta.19-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Admin pack:\n\nINSERT INTO `features` (`code`, `title`, `is_enabled`) VALUES ('admin', 'Admin', '1');\n\n## -------------------------------------------------------------------------------------------------------------------\n\n# Audio improvement:\n\nALTER TABLE `audio` ADD COLUMN `enabled` INT(10) UNSIGNED NULL DEFAULT '1' AFTER `category_id`;\nALTER TABLE `audio` CHANGE COLUMN `files_name` `files_name` TEXT NOT NULL COLLATE 'utf8_unicode_ci' AFTER `audio_key`;\nALTER TABLE `audio_markers` DROP FOREIGN KEY `FK_audio_markers_audio`;\nALTER TABLE `audio_markers` ADD CONSTRAINT `FK_audio_markers_audio` FOREIGN KEY (`audio_id`) REFERENCES `audio` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;\n\n# Audio markers fix:\n\nTRUNCATE audio_markers;\n\nSET @reldens_town_audio_id = (SELECT id FROM audio WHERE `audio_key` = 'ReldensTownAudio');\nSET @footstep_audio_id = (SELECT id FROM audio WHERE `audio_key` = 'footstep');\n\nINSERT INTO `audio_markers` (`id`, `audio_id`, `marker_key`, `start`, `duration`, `config`) VALUES\n    (NULL, @reldens_town_audio_id, 'ReldensTown', 0, 41, NULL),\n    (NULL, @footstep_audio_id,'journeyman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'journeyman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'journeyman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'journeyman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_journeyman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'sorcerer_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_sorcerer_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warlock_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warlock_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'swordsman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_swordsman_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'warrior_down', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_right', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_left', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_up', 0, 1, NULL),\n    (NULL, @footstep_audio_id,'r_warrior_down', 0, 1, NULL);\n\n## -------------------------------------------------------------------------------------------------------------------\n\n# Chat FK fixes:\n\nALTER TABLE `chat`\n\tDROP FOREIGN KEY `FK__players`,\n\tDROP FOREIGN KEY `FK__players_2`,\n\tDROP FOREIGN KEY `FK__scenes`;\n\nALTER TABLE `chat`\n\tADD CONSTRAINT `FK__players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tADD CONSTRAINT `FK__players_2` FOREIGN KEY (`private_player_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tADD CONSTRAINT `FK__scenes` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\n\n## -------------------------------------------------------------------------------------------------------------------\n\n# Items table new fields:\n\nALTER TABLE `items_item`\n\tADD COLUMN `type` INT(10) NOT NULL DEFAULT '0' AFTER `key`,\n\tADD COLUMN `customData` TEXT NULL AFTER `execTimeOut`;\n\n# Items group images:\n\nALTER TABLE `items_group` ADD COLUMN `files_name` TEXT NULL DEFAULT NULL AFTER `description`;\n\n# New test data:\n\nUPDATE `items_group` AS `ig` SET `ig`.`files_name` = CONCAT(`ig`.`key`, '.png');\n\nUPDATE `items_item` AS `i` SET `i`.`type` = 3 WHERE `key` = 'coins';\n\nUPDATE `items_item` AS `i` SET `i`.`type` = 0 WHERE `key` = 'branch';\n\nUPDATE `items_item` AS `i` SET\n    `i`.`type` = 5,\n    `i`.`customData` = '{\"removeAfterUse\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"hide\":true,\"destroyOnComplete\":true,\"usePlayerPosition\":true,\"closeInventoryOnUse\":true,\"followPlayer\":true,\"startsOnTarget\":true}}'\n    WHERE `key` = 'heal_potion_20';\n\nUPDATE `items_item` AS `i` SET\n    `i`.`type` = 5,\n    `i`.`customData` = '{\"removeAfterUse\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"hide\":true,\"destroyOnComplete\":true,\"usePlayerPosition\":true,\"closeInventoryOnUse\":true,\"followPlayer\":true,\"startsOnTarget\":true}}'\n    WHERE `key` = 'magic_potion_20';\n\nUPDATE `items_item` AS `i` SET\n    `i`.`type` = 4,\n    `i`.`customData` = '{\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"hide\":true,\"destroyOnComplete\":true,\"usePlayerPosition\":true,\"closeInventoryOnUse\":true,\"followPlayer\":true,\"startsOnTarget\":true}}'\n    WHERE `key` = 'axe';\n\nUPDATE `items_item` AS `i` SET\n    `i`.`type` = 4,\n    `i`.`customData` = '{\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"hide\":true,\"destroyOnComplete\":true,\"usePlayerPosition\":true,\"closeInventoryOnUse\":true,\"followPlayer\":true,\"startsOnTarget\":true}}'\n    WHERE `key` = 'spear';\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.20-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Audio records:\n\nUPDATE `audio` SET `files_name`='footstep.mp3' WHERE `audio_key`='footstep';\nUPDATE `audio` SET `files_name`='reldens-town.mp3' WHERE `audio_key`='ReldensTownAudio';\n\nDELETE FROM `audio` WHERE `audio_key`='intro';\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.21-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Config:\n\nINSERT INTO `config` VALUES(NULL, 'client', 'players/tapMovement/enabled', '1', 'b');\n\n# Chat:\n\nINSERT INTO `config` VALUES(NULL, 'client', 'chat/messages/characterLimit', '100', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'chat/messages/characterLimitOverhead', '50', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadChat/enabled', '1', 'b');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadChat/isTyping', '1', 'b');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadChat/closeChatBoxAfterSend', '1', 'b');\n\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/fontFamily', 'Verdana, Geneva, sans-serif', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/fontSize', '12px', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/fill', '#ffffff', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/align', 'center', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/stroke', 'rgba(0,0,0,0.7)', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/strokeThickness', '4', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/shadowX', '5', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/shadowY', '5', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/shadowColor', 'rgba(0,0,0,0.7)', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/shadowBlur', '5', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/depth', '200000', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/height', '15', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/textLength', '4', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/topOffset', '20', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/chat/overheadText/timeOut', '5000', 'i');\n\n# Player name:\n\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/fontFamily', 'Verdana, Geneva, sans-serif', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/fontSize', '12px', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/fill', '#ffffff', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/align', 'center', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/stroke', '#000000', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/strokeThickness', '4', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/shadowX', '5', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/shadowY', '5', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/shadowColor', 'rgba(0,0,0,0.7)', 't');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/shadowBlur', '5', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/depth', '200000', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/height', '15', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/players/nameText/textLength', '4', 'i');\n\nDELETE FROM `config` WHERE path IN (\n    'ui/players/nameStrokeThickness',\n    'ui/players/nameStroke',\n    'ui/players/nameShadowColor',\n    'ui/players/nameHeight',\n    'ui/players/nameFontSize',\n    'ui/players/nameFontFamily',\n    'ui/players/nameFill'\n);\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.22-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Config:\nINSERT INTO `config` VALUES(NULL, 'client', 'objects/npc/invalidOptionMessage', 'I do not understand.', 't');\nDELETE FROM `config` WHERE `path` = 'ui/minimap/roundMap';\nINSERT INTO `config` VALUES(NULL, 'client', 'ui/minimap/roundMap', '1', 'b');\n\n# Played Time:\nALTER TABLE `users`\n\tCHANGE COLUMN `email` `email` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci' AFTER `id`,\n\tCHANGE COLUMN `username` `username` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci' AFTER `email`,\n\tCHANGE COLUMN `password` `password` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci' AFTER `username`,\n\tCHANGE COLUMN `status` `status` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci' AFTER `role_id`,\n\tADD COLUMN `played_time` INT(10) NOT NULL DEFAULT 0 AFTER `updated_at`;\n\nINSERT INTO `config` VALUES(NULL, 'client', 'players/playedTime/show', '2', 'i');\nINSERT INTO `config` VALUES(NULL, 'client', 'players/playedTime/label', 'Played Time:<br/>', 't');\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.23-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Config:\nUPDATE `config` SET `value` = 25 WHERE `path` LIKE 'enemies/initialStats/%' AND `value` = 10;\nUPDATE `config` SET `value` = 0 WHERE `path` = 'ui/controls/primaryMove';\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.24-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Config:\nUPDATE `config` SET `value` = '1' WHERE `path` = 'rooms/selection/allowOnLogin';\nUPDATE `config` SET `value` = '1' WHERE `path` = 'rooms/selection/allowOnRegistration';\nUPDATE `config` SET `path` = 'rooms/world/timeStep' WHERE `path` = 'rooms/world/timestep';\nDELETE FROM `config` WHERE `path` = 'rooms/world/gravity_enabled';\nINSERT INTO `config` VALUES (NULL, 'client', 'general/engine/clientInterpolation', '1', 'b');\nINSERT INTO `config` VALUES (NULL, 'client', 'general/engine/interpolationSpeed', '0.4', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'general/engine/experimentalClientPrediction', '0', 'b');\nDELETE FROM `config` WHERE `path` = 'players/size/width' AND `scope` = 'server';\nDELETE FROM `config` WHERE `path` = 'players/size/height' AND `scope` = 'server';\nINSERT INTO `config` VALUES (NULL, 'client', 'players/physicalBody/width', '25', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'players/physicalBody/height', '25', 'i');\nUPDATE `config` SET `scope` = 'client', `path` = 'general/controls/allowSimultaneousKeys'  WHERE `path` = 'general/controls/allow_simultaneous_keys';\nINSERT INTO `config` VALUES (NULL, 'server', 'objects/actions/closeInteractionOnOutOfReach', '1', 'b');\nINSERT INTO `config` VALUES (NULL, 'client', 'trade/players/awaitTimeOut', '1', 'b');\nINSERT INTO `config` VALUES (NULL, 'client', 'trade/players/timeOut', '8000', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/default/responsiveX', '10', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/default/responsiveY', '10', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/default/x', '120', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/default/y', '100', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/trade/responsiveX', '5', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/trade/responsiveY', '5', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/trade/x', '5', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/trade/y', '5', 'i');\n\n# Features:\nINSERT INTO `features` (`code`, `title`, `is_enabled`) VALUES ('prediction', 'Prediction', '0');\n\n# Rooms:\nALTER TABLE `rooms`\tADD COLUMN `customData` TEXT NULL COLLATE 'utf8_unicode_ci' AFTER `room_class_key`;\n\n# Top-Down room demo:\nINSERT INTO `rooms` (`id`, `name`, `title`, `map_filename`, `scene_images`, `room_class_key`, `customData`) VALUES (NULL, 'TopDownRoom', 'Gravity World!', 'reldens-gravity', 'reldens-gravity', NULL, '{\"gravity\":[0,625],\"applyGravity\":true,\"allowPassWallsFromBelow\":true,\"timeStep\":0.012}');\n\nSET @reldens_top_down_demo_room_id = (SELECT `id` FROM `rooms` WHERE `name` = 'TopDownRoom');\nINSERT INTO `rooms_return_points` (`id`, `room_id`, `direction`, `x`, `y`, `is_default`, `from_room_id`) VALUES (NULL, @reldens_top_down_demo_room_id, 'left', 340, 600, 0, NULL);\n\nSET @reldens_house2_room_id = (SELECT `id` FROM `rooms` WHERE `name` = 'ReldensHouse_2');\nINSERT INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES (NULL, @reldens_top_down_demo_room_id, 540, @reldens_house2_room_id);\nINSERT INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES (NULL, @reldens_house2_room_id, 500, @reldens_top_down_demo_room_id);\nINSERT INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES (NULL, @reldens_house2_room_id, 780, @reldens_top_down_demo_room_id);\n\n# Objects:\nSET @reldens_forest_room_id = (SELECT `id` FROM `rooms` WHERE `name` = 'ReldensForest');\nINSERT INTO `objects` (`id`, `room_id`, `layer_name`, `tile_index`, `object_class_key`, `client_key`, `title`, `private_params`, `client_params`, `enabled`) VALUES (NULL, @reldens_forest_room_id, 'forest-collisions', 258, 'npc_5', 'quest_npc_1', 'Miles', NULL, NULL, 1);\n\nSET @reldens_object_alfred_id = (SELECT `id` FROM `objects` WHERE `object_class_key` = 'npc_1' AND `client_key` = 'people_town_1');\nSET @reldens_object_healer_id = (SELECT `id` FROM `objects` WHERE `object_class_key` = 'npc_2' AND `client_key` = 'healer_1');\nSET @reldens_object_merchant_id = (SELECT `id` FROM `objects` WHERE `object_class_key` = 'npc_3' AND `client_key` = 'merchant_1');\nSET @reldens_object_weapons_master_id = (SELECT `id` FROM `objects` WHERE `object_class_key` = 'npc_4' AND `client_key` = 'weapons_master_1');\nSET @reldens_object_quest_npc = (SELECT `id` FROM `objects` WHERE `object_class_key` = 'npc_5' AND `client_key` = 'quest_npc_1');\nSET @enemy_forest_1 = (SELECT `id` FROM `objects` WHERE `object_class_key` = 'enemy_1' AND `client_key` = 'enemy_forest_1');\nSET @enemy_forest_2 = (SELECT `id` FROM `objects` WHERE `object_class_key` = 'enemy_2' AND `client_key` = 'enemy_forest_2');\n\n# Objects assets:\nINSERT INTO `objects_assets` (`object_asset_id`, `object_id`, `asset_type`, `asset_key`, `file_1`, `file_2`, `extra_params`) VALUES (NULL, @reldens_object_quest_npc, 'spritesheet', 'quest_npc_1', 'people-quest-npc', NULL, '{\"frameWidth\":52,\"frameHeight\":71}');\n\n# Objects contents (client_params):\nUPDATE `objects` SET `client_params`='{\"autoStart\":true}' WHERE `id` = @enemy_forest_1;\nUPDATE `objects` SET `client_params`='{\"autoStart\":true}' WHERE `id` = @enemy_forest_2;\nUPDATE `objects` SET `client_params`='{\"content\":\"Hello! My name is Alfred. Go to the forest and kill some monsters! Now... leave me alone!\"}' WHERE `id`= @reldens_object_alfred_id;\nUPDATE `objects` SET `client_params`='{\"content\":\"Hello traveler! I can restore your health, would you like me to do it?\",\"options\":{\"1\":{\"label\":\"Heal HP\",\"value\":1},\"2\":{\"label\":\"Nothing...\",\"value\":2},\"3\":{\"label\":\"Need some MP\",\"value\":3}},\"ui\":true}' WHERE `id` = @reldens_object_healer_id;\nUPDATE `objects` SET `client_params`='{\"content\":\"Hi there! What would you like to do?\",\"options\":{\"buy\":{\"label\":\"Buy\",\"value\":\"buy\"},\"sell\":{\"label\":\"Sell\",\"value\":\"sell\"}}}' WHERE `id`= @reldens_object_merchant_id;\nUPDATE `objects` SET `client_params`='{\"content\":\"Hi, I am the weapons master, choose your weapon and go kill some monsters!\",\"options\":{\"1\":{\"key\":\"axe\",\"label\":\"Axe\",\"value\":1,\"icon\":\"axe\"},\"2\":{\"key\":\"spear\",\"label\":\"Spear\",\"value\":2,\"icon\":\"spear\"}},\"ui\":true}' WHERE  `id`= @reldens_object_weapons_master_id;\nUPDATE `objects` SET `client_params`='{\"content\":\"Hi there! Do you want a coin? I can give you one if you give me a tree branch.\",\"options\":{\"1\":{\"label\":\"Sure!\",\"value\":1},\"2\":{\"label\":\"No, thank you.\",\"value\":2}},\"enabled\":true,\"ui\":true}' WHERE `id`= @reldens_object_quest_npc;\n\n# Object properties (private_params):\nUPDATE `objects` SET `private_params`='{\"runOnAction\":true,\"playerVisible\":true}' WHERE `id` = @reldens_object_alfred_id;\nUPDATE `objects` SET `private_params`='{\"runOnAction\":true,\"playerVisible\":true,\"sendInvalidOptionMessage\":true}' WHERE `id` = @reldens_object_healer_id OR `id` = @reldens_object_merchant_id OR `id` = @reldens_object_weapons_master_id OR `id` = @reldens_object_quest_npc;\n\n# Object new tables:\n\nCREATE TABLE `objects_items_inventory` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`owner_id` INT(10) UNSIGNED NOT NULL,\n\t`item_id` INT(10) NOT NULL,\n\t`qty` INT(10) NOT NULL DEFAULT '0',\n\t`remaining_uses` INT(10) NULL DEFAULT NULL,\n\t`is_active` INT(10) NULL DEFAULT NULL COMMENT 'For example equipped or not equipped items.',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `FK_items_inventory_items_item` (`item_id`) USING BTREE,\n\tINDEX `FK_objects_items_inventory_objects` (`owner_id`) USING BTREE,\n\tCONSTRAINT `FK_objects_items_inventory_objects` FOREIGN KEY (`owner_id`) REFERENCES `objects` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `objects_items_inventory_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION\n) COMMENT='Inventory table is to save the items for each owner.' COLLATE='utf8_unicode_ci' ENGINE=InnoDB ROW_FORMAT=COMPACT AUTO_INCREMENT=0;\n\nCREATE TABLE `objects_items_requirements` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`object_id` INT(10) UNSIGNED NOT NULL,\n\t`item_key` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',\n\t`required_item_key` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',\n\t`required_quantity` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n\t`auto_remove_requirement` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `FK_objects_items_requirements_objects` (`object_id`) USING BTREE,\n\tINDEX `FK_objects_items_requirements_items_item` (`item_key`) USING BTREE,\n\tINDEX `FK_objects_items_requirements_items_item_2` (`required_item_key`) USING BTREE,\n\tCONSTRAINT `FK_objects_items_requirements_items_item` FOREIGN KEY (`item_key`) REFERENCES `items_item` (`key`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `FK_objects_items_requirements_items_item_2` FOREIGN KEY (`required_item_key`) REFERENCES `items_item` (`key`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `FK_objects_items_requirements_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=0;\n\nCREATE TABLE `objects_items_rewards` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`object_id` INT(10) UNSIGNED NOT NULL,\n\t`item_key` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',\n\t`reward_item_key` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',\n\t`reward_quantity` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n\t`reward_item_is_required` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `FK_objects_items_requirements_objects` (`object_id`) USING BTREE,\n\tINDEX `FK_objects_items_rewards_items_item` (`item_key`) USING BTREE,\n\tINDEX `FK_objects_items_rewards_items_item_2` (`reward_item_key`) USING BTREE,\n\tCONSTRAINT `FK_objects_items_rewards_items_item` FOREIGN KEY (`item_key`) REFERENCES `items_item` (`key`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `FK_objects_items_rewards_items_item_2` FOREIGN KEY (`reward_item_key`) REFERENCES `items_item` (`key`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `objects_items_rewards_ibfk_1` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB ROW_FORMAT=COMPACT AUTO_INCREMENT=0;\n\n# Object items, requirements, rewards:\nINSERT INTO `objects_items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES (2, 10, 4, -1, -1, 0);\nINSERT INTO `objects_items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES (3, 10, 5, -1, -1, 0);\nINSERT INTO `objects_items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES (5, 10, 3, -1, 1, 0);\nINSERT INTO `objects_items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES (6, 10, 6, -1, 1, 0);\nINSERT INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES (1, 10, 'axe', 'coins', 5, 1);\nINSERT INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES (2, 10, 'spear', 'coins', 2, 1);\nINSERT INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES (3, 10, 'heal_potion_20', 'coins', 2, 1);\nINSERT INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES (5, 10, 'magic_potion_20', 'coins', 2, 1);\nINSERT INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES (1, 10, 'axe', 'coins', 2, 0);\nINSERT INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES (2, 10, 'spear', 'coins', 1, 0);\nINSERT INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES (3, 10, 'heal_potion_20', 'coins', 1, 0);\nINSERT INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES (5, 10, 'magic_potion_20', 'coins', 1, 0);\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.24.1-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# New configuration:\nDELETE FROM `config` WHERE `scope` = 'client' AND `path` LIKE 'ui/trade/%';\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/trade/responsiveX', '5', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/trade/responsiveY', '5', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/trade/x', '5', 'i');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/trade/y', '5', 'i');\n\n# Missing inserts after beta.24 key error:\nINSERT INTO `objects_items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES (3, 10, 5, -1, -1, 0);\nINSERT INTO `objects_items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES (5, 10, 3, -1, 1, 0);\nINSERT INTO `objects_items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES (6, 10, 6, -1, 1, 0);\nINSERT INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES (1, 10, 'axe', 'coins', 5, 1);\nINSERT INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES (2, 10, 'spear', 'coins', 2, 1);\nINSERT INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES (3, 10, 'heal_potion_20', 'coins', 2, 1);\nINSERT INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES (5, 10, 'magic_potion_20', 'coins', 2, 1);\nINSERT INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES (1, 10, 'axe', 'coins', 2, 0);\nINSERT INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES (2, 10, 'spear', 'coins', 1, 0);\nINSERT INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES (3, 10, 'heal_potion_20', 'coins', 1, 0);\nINSERT INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES (5, 10, 'magic_potion_20', 'coins', 1, 0);\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.25-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Config:\nDELETE FROM `config` WHERE `scope` = 'server' AND `path`='enemies/defaultAttacks/attackBullet';\nINSERT INTO `config` VALUES (NULL, 'server', 'enemies/default/skillKey', 'attackShort', 't');\nINSERT INTO `config` VALUES (NULL, 'server', 'enemies/default/affectedProperty', 'stats/hp', 't');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/chat/effectMessages', '1', 'b');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/chat/dodgeMessages', '1', 'b');\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/chat/totalValidTypes', '2', 'i');\nUPDATE `config` SET `value` = 50 WHERE `path` LIKE 'enemies/initialStats/%';\n\n# Skills:\nSET @heal_skill_id = (SELECT `id` FROM `skills_skill` WHERE `key` = 'heal');\nINSERT INTO `skills_skill_owner_effects` VALUES (NULL, @heal_skill_id, 'dec_mp', 'stats/mp', 2, '2', '0', '', NULL, NULL);\n\nUPDATE `skills_skill_attack` SET `dodgeFullEnabled`=1;\n\n# Room Gravity:\nSET @top_down_room_id = (SELECT `id` FROM `rooms` WHERE `name` = 'TopDownRoom');\nSET @house_2_room_id = (SELECT `id` FROM `rooms` WHERE `name` = 'ReldensHouse_2');\nSET @town_room_id = (SELECT `id` FROM `rooms` WHERE `name` = 'ReldensTown');\nUPDATE `rooms` SET `room_class_key`=NULL, `customData`='{\"gravity\":[0,625],\"applyGravity\":true,\"allowPassWallsFromBelow\":true,\"timeStep\":0.012,\"type\":\"TOP_DOWN_WITH_GRAVITY\",\"useFixedWorldStep\":false,\"maxSubSteps\":5,\"movementSpeed\":200,\"usePathFinder\":false}' WHERE `id`= @top_down_room_id;\nUPDATE `rooms_return_points` SET `from_room_id`=@top_down_room_id WHERE `room_id`=@town_room_id;\nINSERT INTO `rooms_return_points` VALUES (NULL, @house_2_room_id, 'down', 660, 520, 0, @top_down_room_id);\n\n# Features:\nUPDATE `features` SET `is_enabled` = 0 WHERE `code` = 'prediction';\n\n# Objects skills:\nCREATE TABLE `objects_skills` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`object_id` INT(10) UNSIGNED NOT NULL,\n\t`skill_id` INT(10) UNSIGNED NOT NULL,\n\t`target` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1', # '1' === ObjectsConst.DEFAULTS.TARGETS.PLAYER\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `FK_objects_skills_objects` (`object_id`) USING BTREE,\n\tINDEX `FK_objects_skills_skills_skill` (`skill_id`) USING BTREE,\n\tCONSTRAINT `FK_objects_skills_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION,\n\tCONSTRAINT `FK_objects_skills_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\n# Operation Types:\nCREATE TABLE `operation_types` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`label` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',\n    `key` INT(10) UNSIGNED NOT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `key` (`key`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1;\n\nINSERT INTO `operation_types` VALUES (NULL, 'Increment', 1);\nINSERT INTO `operation_types` VALUES (NULL, 'Decrease', 2);\nINSERT INTO `operation_types` VALUES (NULL, 'Divide', 3);\nINSERT INTO `operation_types` VALUES (NULL, 'Multiply', 4);\nINSERT INTO `operation_types` VALUES (NULL, 'Increment Percentage', 5);\nINSERT INTO `operation_types` VALUES (NULL, 'Decrease Percentage', 6);\nINSERT INTO `operation_types` VALUES (NULL, 'Set', 7);\nINSERT INTO `operation_types` VALUES (NULL, 'Method', 8);\nINSERT INTO `operation_types` VALUES (NULL, 'Set Number', 9);\n\nALTER TABLE `skills_skill_owner_effects`\n\tCHANGE COLUMN `operation` `operation` INT(10) UNSIGNED NOT NULL AFTER `property_key`;\n\nALTER TABLE `skills_skill_owner_effects`\n\tADD CONSTRAINT `FK_skills_skill_owner_effects_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE CASCADE ON DELETE NO ACTION;\n\nALTER TABLE `skills_skill_target_effects`\n\tADD CONSTRAINT `FK_skills_skill_target_effects_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE NO ACTION ON DELETE NO ACTION;\n\nALTER TABLE `skills_levels_modifiers`\n\tADD CONSTRAINT `FK_skills_levels_modifiers_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE NO ACTION ON DELETE NO ACTION;\n\n# Target Options:\nCREATE TABLE `target_options` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`target_key` TINYINT(3) UNSIGNED NOT NULL,\n\t`target_label` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `target_key` (`target_key`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nINSERT INTO `target_options` VALUES (NULL, 0, 'Object');\nINSERT INTO `target_options` VALUES (NULL, 1, 'Player');\n\nALTER TABLE `objects_skills`\n\tADD CONSTRAINT `FK_objects_skills_target_options` FOREIGN KEY (`target`) REFERENCES `target_options` (`target_key`) ON UPDATE NO ACTION ON DELETE NO ACTION;\n\n# Objects IDs:\nSET @enemy_forest_1_id = (SELECT `id` FROM `objects` WHERE `client_key` = 'enemy_forest_1');\nSET @enemy_forest_2_id = (SELECT `id` FROM `objects` WHERE `client_key` = 'enemy_forest_2');\n\n# Append new objects skills:\nSET @attack_bullet_skill_id = (SELECT `id` FROM `skills_skill` WHERE `key` = 'attackBullet');\nINSERT INTO `objects_skills` VALUES (NULL, @enemy_forest_1_id, @attack_bullet_skill_id, 1);\n\n# Objects stats:\nCREATE TABLE `objects_stats` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`object_id` INT(10) UNSIGNED NOT NULL,\n\t`stat_id` INT(10) UNSIGNED NOT NULL,\n\t`base_value` INT(10) UNSIGNED NOT NULL,\n\t`value` INT(10) UNSIGNED NOT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `object_id_stat_id` (`object_id`, `stat_id`) USING BTREE,\n\tINDEX `stat_id` (`stat_id`) USING BTREE,\n\tINDEX `user_id` (`object_id`) USING BTREE,\n\tCONSTRAINT `FK_objects_current_stats_objects_stats` FOREIGN KEY (`stat_id`) REFERENCES `stats` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT,\n\tCONSTRAINT `FK_object_current_stats_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=0;\n\nINSERT INTO `objects_stats` SELECT NULL, @enemy_forest_1_id, `id`, 50, 50 FROM `stats`;\nINSERT INTO `objects_stats` SELECT NULL, @enemy_forest_2_id, `id`, 50, 50 FROM `stats`;\n\n# Set aggressive object:\nUPDATE `objects` SET `private_params` = '{\"isAggressive\":true}' WHERE id = @enemy_forest_1_id;\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.26-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Config Types:\nCREATE TABLE `config_types` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`label` VARCHAR(50) NOT NULL DEFAULT '0' COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nINSERT INTO `config_types` VALUES (1, 'string');\nINSERT INTO `config_types` VALUES (2, 'float');\nINSERT INTO `config_types` VALUES (3, 'boolean');\nINSERT INTO `config_types` VALUES (4, 'json');\nINSERT INTO `config_types` VALUES (5, 'comma_separated');\n\nUPDATE `config` SET `type` = 't' WHERE `path` = 'actions/pvp/timerType';\n\nSET @string_id = (SELECT `id` FROM `config_types` WHERE `label` = 'string');\nSET @boolean_id = (SELECT `id` FROM `config_types` WHERE `label` = 'boolean');\nSET @float_id = (SELECT `id` FROM `config_types` WHERE `label` = 'float');\nSET @json_id = (SELECT `id` FROM `config_types` WHERE `label` = 'json');\nSET @comma_separated_id = (SELECT `id` FROM `config_types` WHERE `label` = 'comma_separated');\n\nUPDATE `config` SET `type` = @string_id WHERE `type` = 't';\nUPDATE `config` SET `type` = @boolean_id WHERE `type` = 'b';\nUPDATE `config` SET `type` = @float_id WHERE `type` = 'i';\nUPDATE `config` SET `type` = @json_id WHERE `type` = 'j';\nUPDATE `config` SET `type` = @comma_separated_id WHERE `type` = 'c';\n\nALTER TABLE `config` CHANGE COLUMN `type` `type` INT UNSIGNED NOT NULL COLLATE 'utf8_unicode_ci' AFTER `value`;\nALTER TABLE `config` ADD CONSTRAINT `FK_config_config_types` FOREIGN KEY (`type`) REFERENCES `config_types` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\nALTER TABLE `config` ADD UNIQUE INDEX `scope_path` (`scope`, `path`);\n\n# Config:\nINSERT INTO `config` VALUES (NULL, 'client', 'general/gameEngine/updateGameSizeTimeOut', '500', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/options/acceptOrDecline', '{\"1\":{\"label\":\"Accept\",\"value\":1},\"2\":{\"label\":\"Decline\",\"value\":2}}', @json_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'team/labels/requestFromTitle', 'Team request from:', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'team/labels/leaderNameTitle', 'Team leader: %leaderName', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'team/labels/propertyMaxValue', '/ %propertyMaxValue', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/teams/enabled', '1', @boolean_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/teams/responsiveX', '100', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/teams/responsiveY', '0', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/teams/x', '430', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/teams/y', '100', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/teams/sharedProperties', '{\"hp\":{\"path\":\"stats/hp\",\"pathMax\":\"statsBase/hp\",\"label\":\"HP\"},\"mp\":{\"path\":\"stats/mp\",\"pathMax\":\"statsBase/mp\",\"label\":\"MP\"}}', @json_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'clan/general/openInvites', '0', @boolean_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'clan/labels/requestFromTitle', 'Clan request from:', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'clan/labels/clanTitle', 'Clan: %clanName - Leader: %leaderName', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'clan/labels/propertyMaxValue', '/ %propertyMaxValue', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/clan/enabled', '1', @boolean_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/clan/responsiveX', '100', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/clan/responsiveY', '0', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/clan/x', '430', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/clan/y', '100', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/clan/sharedProperties', '{\"hp\":{\"path\":\"stats/hp\",\"pathMax\":\"statsBase/hp\",\"label\":\"HP\"},\"mp\":{\"path\":\"stats/mp\",\"pathMax\":\"statsBase/mp\",\"label\":\"MP\"}}', @json_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/controls/allowPrimaryTouch', '1', @boolean_id);\nINSERT INTO `config` VALUES (NULL, 'server', 'rewards/actions/interactionsDistance', '40', @float_id);\nINSERT INTO `config` VALUES (NULL, 'server', 'rewards/actions/disappearTime', '1800000', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'rewards/titles/rewardMessage', 'You obtained %dropQuantity %itemLabel', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'login/termsAndConditions/link', 'Accept our Terms and Conditions (click here).', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'login/termsAndConditions/heading', 'Terms and conditions', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'login/termsAndConditions/body', 'This is our test terms and conditions content.', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'login/termsAndConditions/checkboxLabel', 'Accept terms and conditions', @string_id);\nUPDATE `config` SET `value` = 'Played time %playedTimeInHs hs' WHERE `path` = 'players/playedTime/label';\n\n# Features:\nINSERT INTO `features` VALUES (NULL, 'teams', 'Teams', 1);\nINSERT INTO `features` VALUES (NULL, 'rewards', 'Rewards', 1);\n\n# Rooms return positions fix:\nDELETE FROM `rooms_return_points` WHERE `id` = 6 OR `id` = 8 OR `id` = 10;\nUPDATE `rooms_return_points` SET `is_default` = 1 WHERE `id` = 1;\nUPDATE `rooms_return_points` SET `from_room_id` = 4 WHERE `id` = 2;\nUPDATE `rooms_return_points` SET `from_room_id` = 2 WHERE `id` = 3;\nUPDATE `rooms_return_points` SET `from_room_id` = 3 WHERE `id` = 4;\nUPDATE `rooms_return_points` SET `from_room_id` = 5 WHERE `id` = 7;\n\n# Clan and members:\nCREATE TABLE `clan_levels` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`key` INT(10) UNSIGNED NOT NULL,\n\t`label` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`required_experience` BIGINT(20) UNSIGNED NULL DEFAULT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `key` (`key`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1;\n\nINSERT INTO `clan_levels` VALUES (NULL, 1, '1', 0);\n\nCREATE TABLE `clan` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`owner_id` INT(10) UNSIGNED NOT NULL,\n\t`name` VARCHAR(50) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',\n\t`points` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n\t`level` INT(10) UNSIGNED NOT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `owner_id` (`owner_id`) USING BTREE,\n\tUNIQUE INDEX `name` (`name`) USING BTREE,\n\tINDEX `FK_clan_clan_levels` (`level`) USING BTREE,\n\tCONSTRAINT `FK_clan_clan_levels` FOREIGN KEY (`level`) REFERENCES `clan_levels` (`key`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `FK_clan_players` FOREIGN KEY (`owner_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1;\n\nCREATE TABLE `clan_members` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`clan_id` INT(10) UNSIGNED NOT NULL,\n\t`player_id` INT(10) UNSIGNED NOT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `clan_id_player_id` (`clan_id`, `player_id`) USING BTREE,\n\tUNIQUE INDEX `player_id` (`player_id`) USING BTREE,\n\tINDEX `FK__clan` (`clan_id`) USING BTREE,\n\tINDEX `FK__players` (`player_id`) USING BTREE,\n\tCONSTRAINT `FK_clan_members_clan` FOREIGN KEY (`clan_id`) REFERENCES `clan` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `FK_clan_members_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nCREATE TABLE `clan_levels_modifiers` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`level_id` INT(10) UNSIGNED NOT NULL,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`property_key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`operation` INT(10) UNSIGNED NOT NULL,\n\t`value` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`minValue` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',\n\t`maxValue` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',\n\t`minProperty` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',\n\t`maxProperty` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `modifier_id` (`key`) USING BTREE,\n\tINDEX `level_key` (`level_id`) USING BTREE,\n\tINDEX `FK_clan_levels_modifiers_operation_types` (`operation`) USING BTREE,\n\tCONSTRAINT `FK_clan_levels_modifiers_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `FK_clan_levels_modifiers_clan_levels` FOREIGN KEY (`level_id`) REFERENCES `clan_levels` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1;\n\n# Inventory tables fix:\nALTER TABLE `items_inventory` DROP FOREIGN KEY `FK_items_inventory_items_item`;\nALTER TABLE `items_item` DROP FOREIGN KEY `FK_items_item_items_group`;\nALTER TABLE `items_item_modifiers` DROP FOREIGN KEY `FK_items_item_modifiers_items_item`;\nALTER TABLE `objects_items_inventory` DROP FOREIGN KEY  `objects_items_inventory_ibfk_1`;\n\nALTER TABLE `items_group`\n    CHANGE COLUMN `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST;\nALTER TABLE `items_inventory`\n\tCHANGE COLUMN `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST,\n\tCHANGE COLUMN `owner_id` `owner_id` INT(10) UNSIGNED NOT NULL AFTER `id`,\n\tCHANGE COLUMN `item_id` `item_id` INT(10) UNSIGNED NOT NULL AFTER `owner_id`;\nALTER TABLE `items_item`\n\tCHANGE COLUMN `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST,\n\tCHANGE COLUMN `group_id` `group_id` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `type`;\nALTER TABLE `items_item_modifiers`\n\tCHANGE COLUMN `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT FIRST,\n\tCHANGE COLUMN `item_id` `item_id` INT(10) UNSIGNED NOT NULL AFTER `id`;\nALTER TABLE `objects_items_inventory`\n\tCHANGE COLUMN `item_id` `item_id` INT(10) UNSIGNED NOT NULL AFTER `owner_id`;\nALTER TABLE `features`\n\tCHANGE COLUMN `is_enabled` `is_enabled` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 AFTER `title`;\n\nALTER TABLE `items_inventory` ADD CONSTRAINT `FK_items_inventory_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\nALTER TABLE `items_item` ADD CONSTRAINT `FK_items_item_items_group` FOREIGN KEY (`group_id`) REFERENCES `items_group` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\nALTER TABLE `items_item_modifiers` ADD CONSTRAINT `FK_items_item_modifiers_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\nALTER TABLE `objects_items_inventory` ADD CONSTRAINT `FK_objects_items_inventory_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\n\n# Rewards:\nCREATE TABLE `rewards_modifiers` (\n  `id` int unsigned NOT NULL AUTO_INCREMENT,\n  `key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `property_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `operation` int unsigned NOT NULL,\n  `value` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\n  `minValue` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,\n  `maxValue` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,\n  `minProperty` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,\n  `maxProperty` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  KEY `modifier_id` (`key`) USING BTREE\n) ENGINE=InnoDB COLLATE='utf8_unicode_ci';\n\nCREATE TABLE `rewards` (\n    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n    `object_id` INT(10) UNSIGNED NOT NULL,\n    `item_id` INT(10) UNSIGNED NULL DEFAULT NULL,\n    `modifier_id` INT(10) UNSIGNED NULL DEFAULT NULL,\n    `experience` INT(11) UNSIGNED NOT NULL DEFAULT 0,\n    `drop_rate` INT(10) UNSIGNED NOT NULL,\n    `drop_quantity` INT(10) UNSIGNED NOT NULL,\n    `is_unique` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,\n    `was_given` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,\n    `has_drop_body` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,\n    PRIMARY KEY (`id`) USING BTREE,\n    INDEX `FK_rewards_items_item` (`item_id`) USING BTREE,\n    INDEX `FK_rewards_objects` (`object_id`) USING BTREE,\n    CONSTRAINT `FK_rewards_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n    CONSTRAINT `FK_rewards_rewards_modifiers` FOREIGN KEY (`modifier_id`) REFERENCES `rewards_modifiers` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n    CONSTRAINT `FK_rewards_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nCREATE TABLE `objects_items_rewards_animations` (\n    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n    `reward_id` INT(10) UNSIGNED NOT NULL,\n    `asset_type` varchar(255) NOT NULL,\n    `asset_key` varchar(255) NOT NULL,\n    `file` varchar(255) NOT NULL,\n    `extra_params` TEXT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    INDEX `FK_objects_items_rewards_animations_rewards` (`reward_id`) USING BTREE,\n    CONSTRAINT `FK_objects_items_rewards_animations_rewards` FOREIGN KEY (`reward_id`) REFERENCES `rewards` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nINSERT INTO `rewards` VALUES\n    (1, 7, 2, null, 10, 100, 1, 0, 0, 1),\n    (2, 6, 2, null, 10, 100, 3, 0, 0, 1);\n\nINSERT INTO `objects_items_rewards_animations` VALUES\n    (1, 2, 'spritesheet', 'branch-sprite', 'branch-sprite', '{\"start\":0,\"end\":2,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n    (2, 1, 'spritesheet', 'branch-sprite', 'branch-sprite', '{\"start\":0,\"end\":2,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}');\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.27-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\nSET @string_id = (SELECT `id` FROM `config_types` WHERE `label` = 'string');\nSET @boolean_id = (SELECT `id` FROM `config_types` WHERE `label` = 'boolean');\nSET @float_id = (SELECT `id` FROM `config_types` WHERE `label` = 'float');\nSET @json_id = (SELECT `id` FROM `config_types` WHERE `label` = 'json');\nSET @comma_separated_id = (SELECT `id` FROM `config_types` WHERE `label` = 'comma_separated');\n\n# Config:\nINSERT INTO `config` VALUES (NULL, 'client', 'ui/chat/showTabs', '1', @boolean_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ads/general/providers/crazyGames/enabled', '1', @boolean_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ads/general/providers/crazyGames/sdkUrl', 'https://sdk.crazygames.com/crazygames-sdk-v2.js', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ads/general/providers/crazyGames/videoMinimumDuration', '3000', @float_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ads/general/providers/gameMonetize/enabled', '0', @boolean_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ads/general/providers/gameMonetize/sdkUrl', 'https://api.gamemonetize.com/sdk.js', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'ads/general/providers/gameMonetize/gameId', 'your-game-id-should-be-here', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'login/termsAndConditions/es/body', 'Este es el contenido de nuestros términos y condiciones de prueba.', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'login/termsAndConditions/es/checkboxLabel', 'Aceptar terminos y condiciones', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'login/termsAndConditions/es/heading', 'Términos y condiciones', @string_id);\nINSERT INTO `config` VALUES (NULL, 'client', 'login/termsAndConditions/es/link', 'Acepta nuestros Términos y Condiciones (haz clic aquí).', @string_id);\nUPDATE `config` SET `value` = '0.15' WHERE `scope` = 'client' AND `path` = 'ui/minimap/camZoom';\n\n# Snippets:\nCREATE TABLE `locale` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`locale` VARCHAR(5) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`language_code` VARCHAR(2) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`country_code` VARCHAR(2) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',\n\t`enabled` INT(10) UNSIGNED NOT NULL DEFAULT '1',\n\tPRIMARY KEY (`id`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nCREATE TABLE `snippets` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`locale_id` INT(10) UNSIGNED NOT NULL,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`value` TEXT NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `locale_id` (`locale_id`) USING BTREE,\n\tCONSTRAINT `FK_snippets_locale` FOREIGN KEY (`locale_id`) REFERENCES `locale` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nCREATE TABLE `users_locale` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`locale_id` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `locale_id_player_id` (`locale_id`, `user_id`) USING BTREE,\n\tINDEX `locale_id` (`locale_id`) USING BTREE,\n\tINDEX `player_id` (`user_id`) USING BTREE,\n\tCONSTRAINT `FK_users_locale_locale` FOREIGN KEY (`locale_id`) REFERENCES `locale` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `FK_users_locale_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=2;\n\nINSERT INTO `locale` VALUES (1, 'en_US', 'en', 'US', true);\nINSERT INTO `users_locale` (`id`, `locale_id`, `user_id`) VALUES (1, 1, 1);\n\n# Features:\nALTER TABLE `features` ADD UNIQUE INDEX `code` (`code`);\n\nINSERT INTO `features` VALUES (NULL, 'snippets', 'Snippets', 1);\nINSERT INTO `features` VALUES (NULL, 'ads', 'Ads', 1);\n\n# Chat UI:\nCREATE TABLE `chat_message_types` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`key` VARCHAR(50) NOT NULL COLLATE 'utf8mb3_unicode_ci',\n\t`show_tab` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n\t`also_show_in_type` INT(10) UNSIGNED NULL DEFAULT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `FK_chat_message_types_chat_message_types` (`also_show_in_type`) USING BTREE,\n\tCONSTRAINT `FK_chat_message_types_chat_message_types` FOREIGN KEY (`also_show_in_type`) REFERENCES `chat_message_types` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nINSERT INTO `chat_message_types` VALUES (1, 'message', 1, 0);\nINSERT INTO `chat_message_types` VALUES (2, 'joined', 0, 1);\nINSERT INTO `chat_message_types` VALUES (3, 'system', 0, 1);\nINSERT INTO `chat_message_types` VALUES (4, 'private', 1, 1);\nINSERT INTO `chat_message_types` VALUES (5, 'damage', 0, 1);\nINSERT INTO `chat_message_types` VALUES (6, 'reward', 0, 1);\nINSERT INTO `chat_message_types` VALUES (7, 'skill', 0, 1);\nINSERT INTO `chat_message_types` VALUES (8, 'teams', 1, 1);\nINSERT INTO `chat_message_types` VALUES (9, 'global', 1, 1);\nINSERT INTO `chat_message_types` VALUES (10, 'error', 0, 1);\n\nSET @message_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'message');\nSET @joined_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'joined');\nSET @system_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'system');\nSET @private_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'private');\nSET @damage_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'damage');\nSET @reward_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'reward');\nSET @skill_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'skill');\nSET @teams_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'teams');\nSET @global_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'global');\n\nUPDATE `chat` SET `message_type` = @message_id WHERE `message_type` = 'm';\nUPDATE `chat` SET `message_type` = @joined_id WHERE `message_type` = 'j';\nUPDATE `chat` SET `message_type` = @system_id WHERE `message_type` = 's';\nUPDATE `chat` SET `message_type` = @private_id WHERE `message_type` = 'p';\nUPDATE `chat` SET `message_type` = @damage_id WHERE `message_type` = 'd';\nUPDATE `chat` SET `message_type` = @reward_id WHERE `message_type` = 'r';\nUPDATE `chat` SET `message_type` = @skill_id WHERE `message_type` = 'ss';\nUPDATE `chat` SET `message_type` = @teams_id WHERE `message_type` = 'ct';\nUPDATE `chat` SET `message_type` = @global_id WHERE `message_type` = 'ct';\n\nALTER TABLE `chat` CHANGE COLUMN `message_type` `message_type` INT(10) UNSIGNED NULL AFTER `private_player_id`;\nALTER TABLE `chat` ADD CONSTRAINT `FK_chat_chat_message_types` FOREIGN KEY (`message_type`) REFERENCES `chat_message_types` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\n\n# Items types:\nCREATE TABLE `items_types` (\n\t`id` INT(10) NOT NULL AUTO_INCREMENT,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `key` (`key`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nINSERT INTO `items_types` VALUES(1, 'equipment');\nINSERT INTO `items_types` VALUES(2, 'usable');\nINSERT INTO `items_types` VALUES(3, 'single');\nINSERT INTO `items_types` VALUES(4, 'single_equipment');\nINSERT INTO `items_types` VALUES(5, 'single_usable');\nINSERT INTO `items_types` VALUES(10, 'base');\n\nUPDATE `items_item` SET `type` = 10 WHERE `type` = 0;\n\nALTER TABLE `items_item`\n\tADD INDEX `type` (`type`),\n\tADD CONSTRAINT `FK_items_item_items_types` FOREIGN KEY (`type`) REFERENCES `items_types` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION;\n\n# Items fix:\nUPDATE `items_item`\n    SET `customData` = '{\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"hide\":true,\"usePlayerPosition\":true,\"closeInventoryOnUse\":true,\"followPlayer\":true,\"startsOnTarget\":true},\"removeAfterUse\":true}'\n    WHERE `key` = 'heal_potion_20';\n\nUPDATE `items_item`\n    SET `customData` = '{\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"hide\":true,\"usePlayerPosition\":true,\"closeInventoryOnUse\":true,\"followPlayer\":true,\"startsOnTarget\":true},\"removeAfterUse\":true}'\n    WHERE `key` = 'magic_potion_20';\n\n# Objects fix:\nUPDATE `objects`\n    SET `private_params`='{\"runOnHit\":true,\"roomVisible\":true,\"yFix\":6}',\n        `client_params`='{\"positionFix\":{\"y\":-18},\"frameStart\":0,\"frameEnd\":3,\"repeat\":0,\"hideOnComplete\":false,\"autoStart\":false,\"restartTime\":2000}'\n    WHERE `object_class_key`='door_1' OR `object_class_key`='door_2';\n\nALTER TABLE `objects` ADD COLUMN `class_type` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `tile_index`;\n\nCREATE TABLE `objects_types` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `key` (`key`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nINSERT INTO `objects_types` VALUES (1, 'base');\nINSERT INTO `objects_types` VALUES (2, 'animation');\nINSERT INTO `objects_types` VALUES (3, 'npc');\nINSERT INTO `objects_types` VALUES (4, 'enemy');\nINSERT INTO `objects_types` VALUES (5, 'trader');\nINSERT INTO `objects_types` VALUES (6, 'drop');\nINSERT INTO `objects_types` VALUES (7, 'multiple');\n\nALTER TABLE `objects` ADD INDEX `class_type` (`class_type`);\n\nALTER TABLE `objects` ADD CONSTRAINT `FK_objects_objects_types` FOREIGN KEY (`class_type`) REFERENCES `objects_types` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION;\n\nUPDATE `objects` SET `class_type`=2 WHERE `object_class_key` = 'door_1' AND `client_key`='door_house_1';\nUPDATE `objects` SET `class_type`=2 WHERE `object_class_key` = 'door_2' AND `client_key`='door_house_2';\nUPDATE `objects` SET `class_type`=3 WHERE `object_class_key` = 'npc_1' AND `client_key`='people_town_1';\nUPDATE `objects` SET `class_type`=7, `private_params` = '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true}' WHERE `object_class_key` = 'enemy_1' AND `client_key`='enemy_forest_1';\nUPDATE `objects` SET `class_type`=7, `private_params` = '{\"shouldRespawn\":true,\"childObjectType\":4}' WHERE `object_class_key` = 'enemy_2' AND `client_key`='enemy_forest_2';\nUPDATE `objects` SET `class_type`=3 WHERE `object_class_key` = 'npc_2' AND `client_key`='healer_1';\nUPDATE `objects` SET `class_type`=5 WHERE `object_class_key` = 'npc_3' AND `client_key`='merchant_1';\nUPDATE `objects` SET `class_type`=3 WHERE `object_class_key` = 'npc_4' AND `client_key`='weapons_master_1';\nUPDATE `objects` SET `class_type`=3 WHERE `object_class_key` = 'npc_5' AND `client_key`='quest_npc_1';\n\n# Ads:\nCREATE TABLE `ads_providers` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`enabled` INT(10) UNSIGNED NOT NULL DEFAULT '1',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `key` (`key`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1;\n\nCREATE TABLE `ads_types` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `key` (`key`) USING BTREE\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nCREATE TABLE `ads` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`provider_id` INT(10) UNSIGNED NOT NULL,\n\t`type_id` INT(10) UNSIGNED NOT NULL,\n\t`width` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`height` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`position` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',\n\t`top` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`bottom` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`left` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`right` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`replay` INT(10) UNSIGNED NULL DEFAULT NULL,\n\t`enabled` INT(10) UNSIGNED NOT NULL DEFAULT '0',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `key` (`key`) USING BTREE,\n\tINDEX `provider_id` (`provider_id`) USING BTREE,\n\tINDEX `type_id` (`type_id`) USING BTREE,\n\tCONSTRAINT `FK_ads_ads_providers` FOREIGN KEY (`provider_id`) REFERENCES `ads_providers` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `FK_ads_ads_types` FOREIGN KEY (`type_id`) REFERENCES `ads_types` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1;\n\nCREATE TABLE `ads_event_video` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`ads_id` INT(10) UNSIGNED NOT NULL,\n\t`event_key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',\n\t`event_data` TEXT NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `ads_id` (`ads_id`) USING BTREE,\n\tINDEX `ad_id` (`ads_id`) USING BTREE,\n\tINDEX `room_id` (`event_key`) USING BTREE,\n\tCONSTRAINT `FK_ads_scene_change_video_ads` FOREIGN KEY (`ads_id`) REFERENCES `ads` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nCREATE TABLE `ads_banner` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`ads_id` INT(10) UNSIGNED NOT NULL,\n\t`banner_data` TEXT NOT NULL COLLATE 'utf8_unicode_ci',\n\tPRIMARY KEY (`id`) USING BTREE,\n\tUNIQUE INDEX `ads_id` (`ads_id`) USING BTREE,\n\tCONSTRAINT `FK_ads_banner_ads` FOREIGN KEY (`ads_id`) REFERENCES `ads` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB;\n\nCREATE TABLE `ads_played` (\n\t`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`ads_id` INT(10) UNSIGNED NOT NULL,\n\t`player_id` INT(10) UNSIGNED NOT NULL,\n\t`started_at` DATETIME NOT NULL DEFAULT '0',\n\t`ended_at` DATETIME NULL DEFAULT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `ads_id` (`ads_id`) USING BTREE,\n\tINDEX `player_id` (`player_id`) USING BTREE,\n\tCONSTRAINT `FK_ads_played_ads` FOREIGN KEY (`ads_id`) REFERENCES `ads` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tCONSTRAINT `FK_ads_played_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) COLLATE='utf8_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=1;\n\n# Ads sample data:\nINSERT INTO `ads_providers` (`key`) VALUES ('crazyGames');\nINSERT INTO `ads_providers` (`key`) VALUES ('gameMonetize');\n\nSET @crazyGames_id = (SELECT `id` FROM `ads_providers` WHERE `key` = 'crazyGames');\nSET @gameMonetize_id = (SELECT `id` FROM `ads_providers` WHERE `key` = 'gameMonetize');\n\nINSERT INTO `ads_types` (`id`, `key`) VALUES (NULL, 'banner');\nINSERT INTO `ads_types` (`id`, `key`) VALUES (NULL, 'eventVideo');\n\nSET @adTypeBanner_id = (SELECT `id` FROM `ads_types` WHERE `key` = 'banner');\nSET @adTypeEventVideo_id = (SELECT `id` FROM `ads_types` WHERE `key` = 'eventVideo');\n\nINSERT INTO `ads` (`id`, `key`, `provider_id`, `type_id`, `width`, `height`, `position`, `top`, `bottom`, `left`, `right`, `replay`, `enabled`) VALUES (1, 'fullTimeBanner', @crazyGames_id, @adTypeBanner_id, 320, 50, NULL, NULL, 0, NULL, 80, NULL, 0);\nINSERT INTO `ads` (`id`, `key`, `provider_id`, `type_id`, `width`, `height`, `position`, `top`, `bottom`, `left`, `right`, `replay`, `enabled`) VALUES (2, 'ui-banner', @crazyGames_id, @adTypeBanner_id, 320, 50, NULL, NULL, 80, NULL, 80, NULL, 1);\nINSERT INTO `ads` (`id`, `key`, `provider_id`, `type_id`, `width`, `height`, `position`, `top`, `bottom`, `left`, `right`, `replay`, `enabled`) VALUES (3, 'crazy-games-sample-video', @crazyGames_id, @adTypeEventVideo_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 1);\nINSERT INTO `ads` (`id`, `key`, `provider_id`, `type_id`, `width`, `height`, `position`, `top`, `bottom`, `left`, `right`, `replay`, `enabled`) VALUES (4, 'game-monetize-sample-video', @gameMonetize_id, @adTypeEventVideo_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0);\n\nINSERT INTO `ads_banner` (`id`, `ads_id`, `banner_data`) VALUES (NULL, 1, '{\"fullTime\": true}');\nINSERT INTO `ads_banner` (`id`, `ads_id`, `banner_data`) VALUES (NULL, 2, '{\"uiReferenceIds\":[\"box-open-clan\",\"equipment-open\",\"inventory-open\",\"player-stats-open\"]}');\nINSERT INTO `ads_event_video` (`id`, `ads_id`, `event_key`, `event_data`) VALUES (NULL, 3, 'reldens.activatedRoom_ReldensTown', '{\"rewardItemKey\":\"coins\",\"rewardItemQty\":1}');\nINSERT INTO `ads_event_video` (`id`, `ads_id`, `event_key`, `event_data`) VALUES (NULL, 4, 'reldens.activatedRoom_ReldensForest', '{\"rewardItemKey\":\"coins\",\"rewardItemQty\":1}');\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.28-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Fix chat message types:\nSET @global_id = (SELECT `id` FROM `chat_message_types` WHERE `key` = 'global');\nUPDATE `chat` SET `message_type` = @global_id WHERE `message_type` = 'g';\nUPDATE `chat` SET `message_type` = @global_id WHERE `message_type` = NULL;\nUPDATE `chat` SET `message_type` = @global_id WHERE `message_type` IS NULL;\n\n# Disable ads by default:\nUPDATE `ads_providers` SET `enabled` = 0;\nUPDATE `ads` SET `enabled` = 0;\n\nUPDATE `config` SET `value` = 0 WHERE `path` = 'ads/general/providers/gameMonetize/enabled' OR `path` = 'ads/general/providers/crazyGames/enabled';\nUPDATE `config` SET `value` = 250 WHERE `path` = 'ui/minimap/x' OR `path` = 'ui/minimap/circleX';\n\n# Group walls config:\nSET @boolean_id = (SELECT `id` FROM `config_types` WHERE `label` = 'boolean');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'rooms/world/groupWallsHorizontally', '1', @boolean_id);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'rooms/world/groupWallsVertically', '0', @boolean_id);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'world/debug/enabled', '0', @boolean_id);\n\n# Features:\nINSERT INTO `features` VALUES (NULL, 'world', 'World', 1);\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.30-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Append extensions on rooms files:\nUPDATE `rooms` SET\n    `map_filename` = CONCAT(`map_filename`, '.json'),\n    `scene_images` = REPLACE(CONCAT(`scene_images`, '.png'), ',', '.png,');\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.31-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Sample player fix:\nREPLACE INTO `players_state` (`id`, `player_id`, `room_id`, `x`, `y`, `dir`) VALUES\n\t(1, 1, 5, 332, 288, 'down');\n\nREPLACE INTO `players_stats` (`id`, `player_id`, `stat_id`, `base_value`, `value`) VALUES\n\t(1, 1, 1, 280, 81),\n\t(2, 1, 2, 280, 85),\n\t(3, 1, 3, 280, 400),\n\t(4, 1, 4, 280, 280),\n\t(5, 1, 5, 100, 100),\n\t(6, 1, 6, 100, 100),\n\t(7, 1, 7, 100, 100),\n\t(8, 1, 8, 100, 100),\n\t(9, 1, 9, 100, 100),\n\t(10, 1, 10, 100, 100);\n\n# Config:\nSET @boolean_id = (SELECT `id` FROM `config_types` WHERE `label` = 'boolean');\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'players/physicsBody/usePlayerSpeedConfig', '0', @boolean_id);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'players/physicsBody/usePlayerSpeedProperty', '0', @boolean_id);\n\n# Rooms:\nUPDATE `rooms` SET `name` = 'reldens-forest' WHERE `name` = 'ReldensForest';\nUPDATE `rooms` SET `name` = 'reldens-house-1' WHERE `name` = 'ReldensHouse_1';\nUPDATE `rooms` SET `name` = 'reldens-house-2' WHERE `name` = 'ReldensHouse_2';\nUPDATE `rooms` SET `name` = 'reldens-town' WHERE `name` = 'ReldensTown';\nUPDATE `rooms` SET `name` = 'reldens-house-1-2d-floor' WHERE `name` = 'ReldensHouse_1b';\nUPDATE `rooms` SET `name` = 'reldens-gravity' WHERE `name` = 'TopDownRoom';\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.34-sql-update.sql",
    "content": "#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n#######################################################################################################################\n\n# Class Path new column fix:\nALTER TABLE `skills_class_path` ADD COLUMN `enabled` INT(1) UNSIGNED NOT NULL DEFAULT '0' AFTER `levels_set_id`;\n\nUPDATE skills_class_path SET `enabled` = 1;\n\n\n#######################################################################################################################\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n#######################################################################################################################\n"
  },
  {
    "path": "migrations/development/beta.35-sql-update.sql",
    "content": "--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\n-- Config:\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'general/users/allowRegistration', '1', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'general/users/allowGuest', '1', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'players/guestUser/roleId', '2', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'gameEngine/banner', '0', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'players/guestUser/allowOnRooms', '1', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'objects/drops/disappearTime', '1800000', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'players/drop/percent', '20', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'players/drop/quantity', '2', 2);\nUPDATE `config` SET `value` = '{\"key\":\"default_bullet\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_bullet\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":2,\"repeat\":-1,\"frameRate\":1}}' WHERE `scope` = 'client' AND `path` = 'skills/animations/default_bullet';\nUPDATE `config` SET `value` = '{\"key\":\"default_death\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_death\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":1,\"repeat\":0,\"frameRate\":1}}' WHERE `scope` = 'client' AND `path` = 'skills/animations/default_death';\n\n-- Config types:\nALTER TABLE `config`\n\tDROP FOREIGN KEY `FK_config_config_types`;\nALTER TABLE `config`\n\tADD CONSTRAINT `FK_config_config_types` FOREIGN KEY (`type`) REFERENCES `config_types` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\n\n-- Objects:\nALTER TABLE `objects`\n\tDROP INDEX `id`,\n\tDROP INDEX `object_class_key`,\n\tADD UNIQUE INDEX `object_class_key` (`object_class_key`);\n\nALTER TABLE `objects_skills`\n\tCHANGE COLUMN `target` `target_id` TINYINT(3) UNSIGNED NOT NULL AFTER `skill_id`,\n\tDROP INDEX `FK_objects_skills_target_options`,\n\tADD INDEX `FK_objects_skills_target_options` (`target_id`) USING BTREE;\nALTER TABLE `objects_skills`\n\tDROP FOREIGN KEY `FK_objects_skills_target_options`;\nALTER TABLE `objects_skills`\n\tCHANGE COLUMN `target_id` `target_id` INT(10) UNSIGNED NOT NULL AFTER `skill_id`,\n\tADD CONSTRAINT `FK_objects_skills_target_options` FOREIGN KEY (`target_id`) REFERENCES `target_options` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\n\nALTER TABLE `objects_skills`\n\tDROP FOREIGN KEY `FK_objects_skills_objects`,\n\tDROP FOREIGN KEY `FK_objects_skills_skills_skill`;\nALTER TABLE `objects_skills`\n\tADD CONSTRAINT `FK_objects_skills_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tADD CONSTRAINT `FK_objects_skills_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\n\nRENAME TABLE `objects_items_rewards_animations` TO `drops_animations`;\nALTER TABLE `drops_animations`\n\tDROP INDEX `FK_objects_items_rewards_animations_rewards`,\n\tDROP FOREIGN KEY `FK_objects_items_rewards_animations_rewards`;\nALTER TABLE `drops_animations`\n\tCHANGE COLUMN `reward_id` `item_id` INT(10) UNSIGNED NOT NULL AFTER `id`;\nALTER TABLE `drops_animations`\n\tADD INDEX `item_id` (`item_id`);\nALTER TABLE `drops_animations`\n\tADD CONSTRAINT `FK_drops_animations_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\nALTER TABLE `drops_animations`\n\tCHANGE COLUMN `asset_type` `asset_type` VARCHAR(255) NULL COLLATE 'utf8mb4_unicode_ci' AFTER `item_id`;\n\n-- Targets:\nALTER TABLE `target_options`\n\tCHANGE COLUMN `target_key` `target_key` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `id`;\n\nUPDATE `target_options` SET `target_key` = 'object' WHERE `target_label` = 'Object';\nUPDATE `target_options` SET `target_key` = 'player' WHERE `target_label` = 'Player';\n\n-- Skills:\nUPDATE `skills_skill_animations` SET `animationData` = '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"fireball_bullet\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":3,\"repeat\":-1,\"frameRate\":1,\"dir\":3}' WHERE `key` = 'bullet';\nUPDATE `skills_skill` SET `skillDelay`=5000 WHERE `key` = 'fireball' OR `key` = 'heal';\n\nALTER TABLE `skills_skill_attack`\n\tCHANGE COLUMN `attackProperties` `attackProperties` TEXT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `applyDirectDamage`,\n\tCHANGE COLUMN `defenseProperties` `defenseProperties` TEXT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `attackProperties`,\n\tCHANGE COLUMN `aimProperties` `aimProperties` TEXT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `defenseProperties`,\n\tCHANGE COLUMN `dodgeProperties` `dodgeProperties` TEXT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `aimProperties`;\n\nALTER TABLE `skills_skill_owner_conditions`\n    ADD UNIQUE INDEX `key` (`key`),\n    ADD UNIQUE INDEX `skill_id_property_key` (`skill_id`, `property_key`);\n\nALTER TABLE `skills_class_path_level_skills`\n\tADD UNIQUE INDEX `class_path_id_level_id_skill_id` (`class_path_id`, `level_id`, `skill_id`);\nALTER TABLE `skills_class_path_level_skills`\n\tDROP FOREIGN KEY `FK_skills_class_path_level_skills_skills_class_path`,\n\tDROP FOREIGN KEY `FK_skills_class_path_level_skills_skills_levels`,\n\tDROP FOREIGN KEY `FK_skills_class_path_level_skills_skills_levels_id`,\n\tDROP FOREIGN KEY `FK_skills_class_path_level_skills_skills_skill`;\nALTER TABLE `skills_class_path_level_skills`\n\tADD CONSTRAINT `FK_skills_class_path_level_skills_skills_class_path` FOREIGN KEY (`class_path_id`) REFERENCES `skills_class_path` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tADD CONSTRAINT `FK_skills_class_path_level_skills_skills_levels` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`key`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tADD CONSTRAINT `FK_skills_class_path_level_skills_skills_levels_id` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n\tADD CONSTRAINT `FK_skills_class_path_level_skills_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION;\nALTER TABLE `skills_class_path_level_skills`\n\tDROP FOREIGN KEY `FK_skills_class_path_level_skills_skills_levels`;\n\nALTER TABLE `skills_class_path`\n    ADD COLUMN `enabled` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `levels_set_id`;\n\nUPDATE `skills_class_path` SET `enabled` = 1;\n\n-- Rooms:\nUPDATE `rooms` SET `customData` = '{\"allowGuest\":true}' WHERE `name` IN ('reldens-house-1', 'reldens-town', 'reldens-forest');\nUPDATE `rooms` SET `customData` = NULL WHERE `name` = 'reldens-house-1-2d-floor';\nUPDATE `rooms` SET `customData` = '{\"allowGuest\":true,\"gravity\":[0,625],\"applyGravity\":true,\"allowPassWallsFromBelow\":true,\"timeStep\":0.012,\"type\":\"TOP_DOWN_WITH_GRAVITY\",\"useFixedWorldStep\":false,\"maxSubSteps\":2,\"movementSpeed\":160,\"usePathFinder\":false}' WHERE `name` = 'reldens-gravity';\n\n-- Rewards assets fix:\nUPDATE `drops_animations` SET `file` = CONCAT(`file`, '.png') WHERE `file` NOT LIKE '%.png';\n\n-- Items close inventory fix:\nUPDATE items_item SET customData = JSON_REMOVE(customData, '$.animationData.closeInventoryOnUse') WHERE JSON_CONTAINS(customData, '{\"animationData\":{\"closeInventoryOnUse\":true}}');\n\n-- Items isDroppable inclusion:\nUPDATE `items_item` SET `customData` = JSON_SET(`customData`, '$.canBeDropped', true);\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "migrations/development/beta.36-sql-update.sql",
    "content": "--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\n-- Config:\nUPDATE `config` SET `value` = '/css/reldens-admin-client.css' WHERE `scope` = 'server' AND `path` = 'admin/stylesPath';\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "migrations/development/beta.38-sql-update.sql",
    "content": "--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\n-- Config:\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'scores/obtainedScorePerPlayer', '10', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'scores/obtainedScorePerNpc', '5', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'scores/useNpcCustomScore', '1', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'scores/fullTableView/enabled', '1', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/scores/enabled', '1', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/scores/responsiveX', '100', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/scores/responsiveY', '0', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/scores/x', '430', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/scores/y', '150', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'rewards/loginReward/enabled', '1', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'rewards/playedTimeReward/enabled', '1', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'rewards/playedTimeReward/time', '30000', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/rewards/enabled', '1', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/rewards/responsiveX', '100', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/rewards/responsiveY', '0', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/rewards/x', '430', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('client', 'ui/rewards/y', '200', 2);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'rooms/world/disableObjectsCollisionsOnChase', '0', 3);\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES ('server', 'rooms/world/disableObjectsCollisionsOnReturn', '1', 3);\nUPDATE `config` SET `value` = '240' WHERE `scope` = 'client' AND `path` = 'ui/minimap/camX';\nUPDATE `config` SET `value` = '42' WHERE `scope` = 'client' AND `path` = 'ui/minimap/responsiveX';\nUPDATE `config` SET `value` = '330' WHERE `scope` = 'client' AND `path` = 'ui/minimap/x';\nUPDATE `config` SET `value` = '320' WHERE `scope` = 'client' AND `path` = 'ui/minimap/circleX';\n\n-- Audio:\nUPDATE `audio` SET `config` = '{\"onlyCurrentPlayer\":true}' WHERE `audio_key` = 'footstep';\n\n-- Features:\nINSERT INTO `features` (`code`, `title`, `is_enabled`) VALUES ('scores', 'Scores', 1);\n\n-- Scores:\nCREATE TABLE IF NOT EXISTS `scores` (\n\t`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`player_id` INT UNSIGNED NOT NULL,\n\t`total_score` INT UNSIGNED NOT NULL,\n\t`players_kills_count` INT UNSIGNED NOT NULL,\n\t`npcs_kills_count` INT UNSIGNED NOT NULL,\n\t`last_player_kill_time` DATETIME DEFAULT NULL,\n\t`last_npc_kill_time` DATETIME DEFAULT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `player_id` (`player_id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE='utf8mb4_unicode_ci';\n\nCREATE TABLE IF NOT EXISTS `scores_detail` (\n\t`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n\t`player_id` INT UNSIGNED NOT NULL,\n\t`obtained_score` INT UNSIGNED NOT NULL,\n\t`kill_time` DATETIME NOT NULL,\n\t`kill_player_id` INT UNSIGNED NULL DEFAULT NULL,\n\t`kill_npc_id` INT UNSIGNED NULL DEFAULT NULL,\n\tPRIMARY KEY (`id`) USING BTREE,\n\tINDEX `player_id` (`player_id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE='utf8mb4_unicode_ci';\n\n-- Login:\nALTER TABLE `users` ADD COLUMN `login_count` INT NOT NULL DEFAULT '0' AFTER `played_time`;\n\nCREATE TABLE IF NOT EXISTS `users_login` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `user_id` INT UNSIGNED NOT NULL,\n    `login_date` TIMESTAMP NOT NULL DEFAULT (now()),\n    `logout_date` TIMESTAMP NULL DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    INDEX `user_id` (`user_id`) USING BTREE,\n    CONSTRAINT `FK_users_login_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE='utf8mb4_unicode_ci';\n\n-- Rewards Events:\nCREATE TABLE IF NOT EXISTS `rewards_events` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `label` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',\n    `description` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',\n    `handler_key` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',\n    `event_key` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',\n    `event_data` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_unicode_ci',\n    `position` INT UNSIGNED NOT NULL DEFAULT '0',\n    `enabled` TINYINT NOT NULL DEFAULT '0',\n    `active_from` DATETIME NULL DEFAULT NULL,\n    `active_to` DATETIME NULL DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    INDEX `event_key` (`event_key`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE='utf8mb4_unicode_ci';\n\nCREATE TABLE IF NOT EXISTS `rewards_events_state` (\n\t`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `rewards_events_id` INT UNSIGNED NOT NULL,\n    `player_id` INT UNSIGNED NOT NULL,\n    `state` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',\n    PRIMARY KEY (`id`) USING BTREE,\n    INDEX `rewards_events_id` (`rewards_events_id`) USING BTREE,\n    INDEX `user_id` (`player_id`) USING BTREE,\n    CONSTRAINT `FK_rewards_events_state_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n    CONSTRAINT `FK__rewards_events` FOREIGN KEY (`rewards_events_id`) REFERENCES `rewards_events` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE='utf8mb4_unicode_ci';\n\nREPLACE INTO `rewards_events` (`id`, `label`, `description`, `handler_key`, `event_key`, `event_data`, `position`, `enabled`, `active_from`, `active_to`) VALUES\n    (1, 'rewards.dailyLogin', 'rewards.dailyDescription', 'login', 'reldens.joinRoomEnd', '{\"action\":\"dailyLogin\",\"items\":{\"coins\":1}}', 0, 1, NULL, NULL),\n    (2, 'rewards.straightDaysLogin', 'rewards.straightDaysDescription', 'login', 'reldens.joinRoomEnd', '{\"action\":\"straightDaysLogin\",\"days\":2,\"items\":{\"coins\":10}}', 0, 1, NULL, NULL);\n\n-- Bots Test Rooms:\nINSERT INTO `rooms` (`id`,`name`, `title`, `map_filename`, `scene_images`, `room_class_key`, `customData`) VALUES\n    (9, 'reldens-bots-forest', 'Bots Forest', 'reldens-bots-forest.json', 'reldens-bots-forest.png', NULL, '{\"allowGuest\":true,\"joinInRandomPlace\":true,\"joinInRandomPlaceGuestAlways\":true}'),\n    (10, 'reldens-bots-forest-house-01-n0', 'Bots Forest - House 1-0', 'reldens-bots-forest-house-01-n0.json', 'reldens-bots-forest-house-01-n0.png', NULL, '{\"allowGuest\":true}');\n\nINSERT INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES\n    (NULL, 9, 20349, 10),\n    (NULL, 10, 381, 9),\n    (NULL, 10, 382, 9);\n\nINSERT INTO `rooms_return_points` (`id`, `room_id`, `direction`, `x`, `y`, `is_default`, `from_room_id`) VALUES\n    (NULL, 9, 'down', 4500, 985, 1, NULL),\n    (NULL, 9, 'down', 1600, 4544, 0, 10),\n    (NULL, 10, 'up', 64, 544, 1, 9);\n\nINSERT INTO `objects` (`id`, `room_id`, `layer_name`, `tile_index`, `class_type`, `object_class_key`, `client_key`, `title`, `private_params`, `client_params`, `enabled`) VALUES\n\t(14, 9, 'ground-respawn-area', NULL, 7, 'enemy_bot_b1', 'enemy_forest_1', 'Tree', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true,\"interactionRadio\":120}', '{\"autoStart\":true}', 0),\n\t(15, 9, 'ground-respawn-area', NULL, 7, 'enemy_bot_b2', 'enemy_forest_2', 'Tree Punch', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true,\"interactionRadio\":70}', '{\"autoStart\":true}', 0);\n\nUPDATE `objects` SET `private_params` = '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true,\"interactionRadio\":70}' WHERE `layer_name` = 'respawn-area-monsters-lvl-1-2' AND `object_class_key` = 'enemy_2';\n\nINSERT INTO `objects_assets` (`object_asset_id`, `object_id`, `asset_type`, `asset_key`, `asset_file`, `extra_params`) VALUES\n\t(12, 14, 'spritesheet', 'enemy_forest_1', 'monster-treant.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n    (13, 15, 'spritesheet', 'enemy_forest_2', 'monster-golem2.png', '{\"frameWidth\":47,\"frameHeight\":50}');\n\nREPLACE INTO `objects_stats` (`id`, `object_id`, `stat_id`, `base_value`, `value`) VALUES\n\t(1, 2, 1, 50, 50),\n    (2, 2, 2, 50, 50),\n    (3, 2, 3, 50, 50),\n    (4, 2, 4, 50, 50),\n    (5, 2, 5, 50, 50),\n    (6, 2, 6, 50, 50),\n    (7, 2, 7, 50, 50),\n    (8, 2, 8, 50, 50),\n    (9, 2, 9, 50, 50),\n    (10, 2, 10, 50, 50),\n    (11, 3, 1, 50, 50),\n    (12, 3, 2, 50, 50),\n    (13, 3, 3, 50, 50),\n    (14, 3, 4, 50, 50),\n    (15, 3, 5, 50, 50),\n    (16, 3, 6, 50, 50),\n    (17, 3, 7, 50, 50),\n    (18, 3, 8, 50, 50),\n    (19, 3, 9, 50, 50),\n    (20, 3, 10, 50, 50),\n    (21, 6, 1, 50, 50),\n    (22, 6, 2, 50, 50),\n    (23, 6, 3, 50, 50),\n    (24, 6, 4, 50, 50),\n    (25, 6, 5, 50, 50),\n    (26, 6, 6, 50, 50),\n    (27, 6, 7, 50, 50),\n    (28, 6, 8, 50, 50),\n    (29, 6, 9, 50, 50),\n    (30, 6, 10, 50, 50),\n    (31, 7, 1, 50, 50),\n    (32, 7, 2, 50, 50),\n    (33, 7, 3, 50, 50),\n    (34, 7, 4, 50, 50),\n    (35, 7, 5, 50, 50),\n    (36, 7, 6, 50, 50),\n    (37, 7, 7, 50, 50),\n    (38, 7, 8, 50, 50),\n    (39, 7, 9, 50, 50),\n    (40, 7, 10, 50, 50),\n    (41, 14, 1, 50, 50),\n    (42, 14, 2, 50, 50),\n    (43, 14, 3, 50, 50),\n    (44, 14, 4, 50, 50),\n    (45, 14, 5, 50, 50),\n    (46, 14, 6, 50, 50),\n    (47, 14, 7, 50, 50),\n    (48, 14, 8, 50, 50),\n    (49, 14, 9, 50, 50),\n    (50, 14, 10, 50, 50),\n    (51, 15, 1, 50, 50),\n    (52, 15, 2, 50, 50),\n    (53, 15, 3, 50, 50),\n    (54, 15, 4, 50, 50),\n    (55, 15, 5, 50, 50),\n    (56, 15, 6, 50, 50),\n    (57, 15, 7, 50, 50),\n    (58, 15, 8, 50, 50),\n    (59, 15, 9, 50, 50),\n    (60, 15, 10, 50, 50);\n\nINSERT INTO `respawn` (`id`, `object_id`, `respawn_time`, `instances_limit`, `layer`) VALUES\n    (5, 14, 20000, 200, 'ground-respawn-area'),\n    (6, 15, 10000, 200, 'ground-respawn-area');\n\n-- Rewards per object:\nREPLACE INTO `rewards` (`id`, `object_id`, `item_id`, `modifier_id`, `experience`, `drop_rate`, `drop_quantity`, `is_unique`, `was_given`, `has_drop_body`) VALUES\n\t(1, 2, 2, NULL, 10, 100, 3, 0, 0, 1),\n\t(2, 3, 2, NULL, 10, 100, 1, 0, 0, 1),\n\t(3, 6, 2, NULL, 10, 100, 3, 0, 0, 1),\n\t(4, 7, 2, NULL, 10, 100, 1, 0, 0, 1),\n\t(5, 14, 2, NULL, 10, 100, 3, 0, 0, 1),\n\t(6, 15, 2, NULL, 10, 100, 1, 0, 0, 1);\n\n-- Rooms server URL:\nALTER TABLE `rooms` ADD COLUMN `server_url` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `room_class_key`;\n\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "migrations/development/beta.38.3-sql-update.sql",
    "content": "--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\n-- Unique Player name by user:\nALTER TABLE `players` DROP INDEX `name`, ADD UNIQUE INDEX `user_id_name` (`user_id`, `name`);\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "migrations/development/beta.39-sql-update.sql",
    "content": "--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\n-- Config:\nINSERT INTO `config` (`scope`, `path`, `value`, `type`)\nVALUES\n    ('client', 'gameEngine/banner', '0', 3),\n    ('client', 'gameEngine/dom/createContainer', '1', 3),\n    ('client', 'gameEngine/height', '1280', 2),\n    ('client', 'gameEngine/parent', 'reldens', 1),\n    ('client', 'gameEngine/physics/arcade/debug', 'false', 3),\n    ('client', 'gameEngine/physics/arcade/gravity/x', '0', 2),\n    ('client', 'gameEngine/physics/arcade/gravity/y', '0', 2),\n    ('client', 'gameEngine/physics/default', 'arcade', 1),\n    ('client', 'gameEngine/scale/autoCenter', '1', 2),\n    ('client', 'gameEngine/scale/max/height', '1280', 2),\n    ('client', 'gameEngine/scale/max/width', '1280', 2),\n    ('client', 'gameEngine/scale/min/height', '360', 2),\n    ('client', 'gameEngine/scale/min/width', '360', 2),\n    ('client', 'gameEngine/scale/mode', '5', 2),\n    ('client', 'gameEngine/scale/parent', 'reldens', 1),\n    ('client', 'gameEngine/scale/zoom', '1', 2),\n    ('client', 'gameEngine/type', '0', 2),\n    ('client', 'gameEngine/width', '1280', 2),\n    ('client', 'general/gameEngine/updateGameSizeTimeOut', '500', 2),\n    ('client', 'ui/maximum/x', '1280', 2),\n    ('client', 'ui/maximum/y', '1280', 2),\n    ('client', 'ui/screen/responsive', '1', 3),\n    ('client', 'ui/minimap/camZoom', '0.08', 2)\n    AS new_config\nON DUPLICATE KEY UPDATE `value` = new_config.`value`, `type` = new_config.`type`;\n\nINSERT INTO `config` (`scope`, `path`, `value`, `type`)\nVALUES\n    ('client', 'gameEngine/scale/autoRound', 0, 3),\n    ('client', 'general/users/allowGuest', '1', 3),\n    ('client', 'general/users/allowRegistration', '1', 3),\n    ('client', 'ui/fullScreenButton/enabled', '1', 3),\n    ('client', 'ui/fullScreenButton/responsiveX', '100', 2),\n    ('client', 'ui/fullScreenButton/responsiveY', '0', 2),\n    ('client', 'ui/fullScreenButton/x', '380', 2),\n    ('client', 'ui/fullScreenButton/y', '20', 2)\nON DUPLICATE KEY UPDATE `value` = VALUES(`value`), `type` = VALUES(`type`);\n\n-- Delete incorrect config records that should not exist:\nDELETE FROM `config` WHERE `scope` = 'client' AND `path` = 'gameEngine/scale/height';\nDELETE FROM `config` WHERE `scope` = 'client' AND `path` = 'gameEngine/scale/width';\n\n-- Fix incorrect config values:\nUPDATE `config` SET `value` = '32' WHERE `scope` = 'client' AND `path` = 'map/tileData/height';\nUPDATE `config` SET `value` = '32' WHERE `scope` = 'client' AND `path` = 'map/tileData/width';\nUPDATE `config` SET `value` = '40' WHERE `scope` = 'client' AND `path` = 'ui/minimap/responsiveX';\nUPDATE `config` SET `value` = '0' WHERE `scope` = 'server' AND `path` = 'rooms/world/tryClosestPath';\n\nUPDATE `stats` SET `key` = 'mAtk' WHERE `key` = 'mgk-atk';\nUPDATE `stats` SET `key` = 'mDef' WHERE `key` = 'mgk-def';\n\n-- Skills owners table fix:\nALTER TABLE `skills_skill_owner_conditions` DROP INDEX `key`;\n\n-- Level set table fix:\nALTER TABLE `skills_levels_set`\n    ADD COLUMN `key` VARCHAR(255) NULL DEFAULT NULL AFTER `id`,\n\tADD COLUMN `label` VARCHAR(255) NULL DEFAULT NULL AFTER `key`,\n\tADD UNIQUE INDEX `key` (`key`);\n\n-- Skills label fix:\nALTER TABLE `skills_skill`\n    ADD COLUMN `label` VARCHAR(255) NULL DEFAULT NULL AFTER `type`;\n\n-- New fields created_at and updated_at:\nALTER TABLE `ads`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `enabled`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `audio`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `enabled`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `audio_categories`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `single_audio`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `clan`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `level`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `items_item`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `customData`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `objects`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `enabled`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `players`\n    ADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `respawn`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `layer`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `rewards`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `has_drop_body`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `rooms`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `customData`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `scores`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `last_npc_kill_time`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `skills_class_path`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `enabled`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `skills_levels_set`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `autoFillExperienceMultiplier`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `skills_skill`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `customData`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `snippets`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `value`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\nALTER TABLE `stats`\n    ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) AFTER `customData`,\n\tADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT (CURRENT_TIMESTAMP) ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;\n\n-- Update root user password:\nUPDATE `users` SET `password`='879abc0494b36a09f184fd8308ea18f2643d71263f145b1e40e2ec3546d42202:6a186aff4d69daadcd7940a839856b394b12f0aec64a5df745c83cf9d881dc9dcb121b03d946872571f214228684216df097305b68417a56403299b8b2388db3' WHERE `username` = 'root';\n\n-- Fix operation types:\nALTER TABLE `operation_types` CHANGE COLUMN `label` `label` VARCHAR(50) NULL COLLATE 'utf8mb4_unicode_ci' AFTER `id`;\nALTER TABLE `skills_levels_modifiers` DROP FOREIGN KEY `FK_skills_levels_modifiers_operation_types`;\nALTER TABLE `skills_levels_modifiers` ADD CONSTRAINT `FK_skills_levels_modifiers_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE CASCADE ON DELETE NO ACTION;\nALTER TABLE `skills_skill_target_effects` DROP FOREIGN KEY `FK_skills_skill_target_effects_operation_types`;\nALTER TABLE `skills_skill_target_effects` ADD CONSTRAINT `FK_skills_skill_target_effects_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE CASCADE ON DELETE NO ACTION;\nALTER TABLE `clan_levels_modifiers` DROP FOREIGN KEY `FK_clan_levels_modifiers_operation_types`;\nALTER TABLE `clan_levels_modifiers` ADD CONSTRAINT `FK_clan_levels_modifiers_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE CASCADE ON DELETE NO ACTION;\n\n-- Fix target options:\nALTER TABLE `target_options` CHANGE COLUMN `target_label` `target_label` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci' AFTER `target_key`;\n\n-- Fix scores FK:\nALTER TABLE `scores` ADD CONSTRAINT `FK_scores_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;\n\n-- Fix drops animations KF:\nALTER TABLE `drops_animations` DROP FOREIGN KEY `FK_drops_animations_items_item`;\nALTER TABLE `drops_animations` ADD CONSTRAINT `FK_drops_animations_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;\n\n-- Apply missing unique constraints:\nALTER TABLE `players_state` ADD UNIQUE INDEX `player_id` (`player_id`); -- players can describe only in one place\nALTER TABLE `skills_skill_attack` ADD UNIQUE INDEX `skill_id_unique` (`skill_id`); -- skills attack data is in a single entity\nALTER TABLE `skills_skill_group_relation` ADD UNIQUE INDEX `skill_id_unique` (`skill_id`); -- skills can only be related to one group\nALTER TABLE `skills_skill_physical_data` ADD UNIQUE INDEX `skill_id` (`skill_id`); -- skill physical data is in a single entity\nALTER TABLE `drops_animations` ADD UNIQUE INDEX `item_id_unique` (`item_id`); -- an item can only have one drop animation\n\n-- Fix kill_time default value:\nALTER TABLE `scores_detail` MODIFY COLUMN `kill_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;\n\n-- Fix data types: INT to TINYINT\nALTER TABLE `locale` MODIFY COLUMN `enabled` TINYINT UNSIGNED DEFAULT NULL;\n\nALTER TABLE `ads_providers` MODIFY COLUMN `enabled` TINYINT UNSIGNED NOT NULL DEFAULT (1);\n\nALTER TABLE `ads` MODIFY COLUMN `enabled` TINYINT UNSIGNED NOT NULL DEFAULT '0';\n\nALTER TABLE `audio_categories`\n    MODIFY COLUMN `enabled` TINYINT DEFAULT NULL,\n    MODIFY COLUMN `single_audio` TINYINT DEFAULT NULL;\n\nALTER TABLE `audio` MODIFY COLUMN `enabled` TINYINT UNSIGNED DEFAULT NULL;\n\nALTER TABLE `chat_message_types` MODIFY COLUMN `show_tab` TINYINT UNSIGNED DEFAULT NULL;\n\nALTER TABLE `features` MODIFY COLUMN `is_enabled` TINYINT UNSIGNED DEFAULT NULL;\n\nALTER TABLE `items_inventory` MODIFY COLUMN `is_active` TINYINT NULL DEFAULT NULL;\n\nALTER TABLE `objects` MODIFY COLUMN `enabled` TINYINT DEFAULT NULL;\n\nALTER TABLE `objects_items_inventory` MODIFY COLUMN `is_active` TINYINT DEFAULT NULL;\n\nALTER TABLE `objects_items_requirements` MODIFY COLUMN `auto_remove_requirement` TINYINT UNSIGNED DEFAULT NULL;\n\nALTER TABLE `objects_items_rewards` MODIFY COLUMN `reward_item_is_required` TINYINT UNSIGNED DEFAULT NULL;\n\nALTER TABLE `rooms_return_points` MODIFY COLUMN `is_default` TINYINT UNSIGNED DEFAULT NULL;\n\nALTER TABLE `skills_levels_set` MODIFY COLUMN `autoFillRanges` TINYINT UNSIGNED DEFAULT NULL;\n\nALTER TABLE `skills_skill`\n    MODIFY COLUMN `autoValidation` TINYINT DEFAULT NULL,\n    MODIFY COLUMN `rangeAutomaticValidation` TINYINT DEFAULT NULL,\n    MODIFY COLUMN `allowSelfTarget` TINYINT DEFAULT NULL;\n\nALTER TABLE `skills_class_path` MODIFY COLUMN `enabled` TINYINT UNSIGNED DEFAULT NULL;\n\nALTER TABLE `skills_skill_attack`\n    MODIFY COLUMN `allowEffectBelowZero` TINYINT UNSIGNED NULL DEFAULT NULL,\n    MODIFY COLUMN `applyDirectDamage` TINYINT UNSIGNED NULL DEFAULT NULL,\n    MODIFY COLUMN `dodgeFullEnabled` TINYINT NULL DEFAULT '1',\n    MODIFY COLUMN `dodgeOverAimSuccess` TINYINT NULL DEFAULT '1',\n    MODIFY COLUMN `damageAffected` TINYINT NULL DEFAULT NULL,\n    MODIFY COLUMN `criticalAffected` TINYINT NULL DEFAULT NULL;\n\nALTER TABLE `skills_skill_physical_data` MODIFY COLUMN `validateTargetOnHit` TINYINT UNSIGNED NULL DEFAULT NULL;\n\nALTER TABLE `rewards_events` MODIFY COLUMN `enabled` TINYINT DEFAULT NULL;\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "migrations/development/beta.39.7-sql-update.sql",
    "content": "--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\n-- Player stats bars configuration\nINSERT INTO `config` (`scope`, `path`, `value`, `type`) VALUES\n('client', 'players/barsProperties', '{\"hp\":{\"enabled\":true,\"label\":\"HP\",\"activeColor\":\"#d53434\",\"inactiveColor\":\"#330000\"},\"mp\":{\"enabled\":true,\"label\":\"MP\",\"activeColor\":\"#5959fb\",\"inactiveColor\":\"#000033\"}}', 4);\n\n-- Update config\nUPDATE `config` SET `value` = '0' WHERE `path` = 'gameEngine/scale/autoRound';\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "migrations/development/beta.39.8-sql-update.sql",
    "content": "--\n-- Reldens - Version beta.39.8 - SQL Update\n-- Fix FK CASCADE for room deletions\n--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- Drop existing FK constraints on rooms_change_points\nALTER TABLE `rooms_change_points`\nDROP FOREIGN KEY `FK_rooms_change_points_rooms`,\nDROP FOREIGN KEY `FK_rooms_change_points_rooms_2`;\n\n-- Add FK constraints with CASCADE on DELETE for rooms_change_points\nALTER TABLE `rooms_change_points`\nADD CONSTRAINT `FK_rooms_change_points_rooms` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,\nADD CONSTRAINT `FK_rooms_change_points_rooms_2` FOREIGN KEY (`next_room_id`) REFERENCES `rooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;\n\n-- Drop existing FK constraints on rooms_return_points\nALTER TABLE `rooms_return_points`\nDROP FOREIGN KEY `FK_rooms_return_points_rooms_from_room_id`,\nDROP FOREIGN KEY `FK_rooms_return_points_rooms_room_id`;\n\n-- Add FK constraints with CASCADE on DELETE for rooms_return_points\nALTER TABLE `rooms_return_points`\nADD CONSTRAINT `FK_rooms_return_points_rooms_from_room_id` FOREIGN KEY (`from_room_id`) REFERENCES `rooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,\nADD CONSTRAINT `FK_rooms_return_points_rooms_room_id` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;\n\nSET FOREIGN_KEY_CHECKS = 1;\n"
  },
  {
    "path": "migrations/development/reldens-test-sample-data-v4.0.0.sql",
    "content": "--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\nTRUNCATE `ads`;\nTRUNCATE `ads_banner`;\nTRUNCATE `ads_event_video`;\nTRUNCATE `ads_providers`;\nTRUNCATE `audio`;\nTRUNCATE `audio_categories`;\nTRUNCATE `audio_markers`;\nTRUNCATE `audio_player_config`;\nTRUNCATE `chat`;\nTRUNCATE `clan`;\nTRUNCATE `clan_levels_modifiers`;\nTRUNCATE `clan_members`;\nTRUNCATE `drops_animations`;\nTRUNCATE `items_group`;\nTRUNCATE `items_inventory`;\nTRUNCATE `items_item`;\nTRUNCATE `items_item_modifiers`;\nTRUNCATE `objects`;\nTRUNCATE `objects_animations`;\nTRUNCATE `objects_assets`;\nTRUNCATE `objects_items_inventory`;\nTRUNCATE `objects_items_requirements`;\nTRUNCATE `objects_items_rewards`;\nTRUNCATE `objects_skills`;\nTRUNCATE `objects_stats`;\nTRUNCATE `players`;\nTRUNCATE `players_state`;\nTRUNCATE `players_stats`;\nTRUNCATE `respawn`;\nTRUNCATE `rewards`;\nTRUNCATE `rewards_modifiers`;\nTRUNCATE `rewards_events`;\nTRUNCATE `rewards_events_state`;\nTRUNCATE `rooms`;\nTRUNCATE `rooms_change_points`;\nTRUNCATE `rooms_return_points`;\nTRUNCATE `skills_class_level_up_animations`;\nTRUNCATE `skills_class_path`;\nTRUNCATE `skills_class_path_level_labels`;\nTRUNCATE `skills_class_path_level_skills`;\nTRUNCATE `skills_groups`;\nTRUNCATE `skills_levels`;\nTRUNCATE `skills_levels_modifiers`;\nTRUNCATE `skills_levels_modifiers_conditions`;\nTRUNCATE `skills_levels_set`;\nTRUNCATE `skills_owners_class_path`;\nTRUNCATE `skills_skill`;\nTRUNCATE `skills_skill_animations`;\nTRUNCATE `skills_skill_attack`;\nTRUNCATE `skills_skill_group_relation`;\nTRUNCATE `skills_skill_owner_conditions`;\nTRUNCATE `skills_skill_owner_effects`;\nTRUNCATE `skills_skill_owner_effects_conditions`;\nTRUNCATE `skills_skill_physical_data`;\nTRUNCATE `skills_skill_target_effects`;\nTRUNCATE `skills_skill_target_effects_conditions`;\nTRUNCATE `snippets`;\nTRUNCATE `stats`;\nTRUNCATE `users`;\nTRUNCATE `users_locale`;\n\n-- ENTITIES WITHOUT REQUIRED FK (Category 1): ads, config, features, snippets, users\n\nREPLACE INTO `ads` (`id`, `key`, `provider_id`, `type_id`, `width`, `height`, `position`, `top`, `bottom`, `left`, `right`, `replay`, `enabled`) VALUES\n\t(3, 'fullTimeBanner', 1, 1, 320, 50, NULL, NULL, 0, NULL, 80, NULL, 0),\n\t(4, 'ui-banner', 1, 1, 320, 50, NULL, NULL, 80, NULL, 80, NULL, 0),\n\t(5, 'crazy-games-sample-video', 1, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0),\n\t(6, 'game-monetize-sample-video', 2, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0),\n\t(100, 'test-ad-list', 1, 1, 300, 100, NULL, 10, NULL, 10, NULL, NULL, 1),\n\t(101, 'test-ad-edit', 1, 1, 250, 80, NULL, 20, NULL, 20, NULL, NULL, 1),\n\t(102, 'test-ad-delete', 1, 1, 200, 60, NULL, 30, NULL, 30, NULL, NULL, 1);\n\nREPLACE INTO `ads_banner` (`id`, `ads_id`, `banner_data`) VALUES\n\t(1, 3, '{\"fullTime\": true}'),\n\t(2, 4, '{\"uiReferenceIds\":[\"box-open-clan\",\"equipment-open\",\"inventory-open\",\"player-stats-open\"]}');\n\nREPLACE INTO `ads_event_video` (`id`, `ads_id`, `event_key`, `event_data`) VALUES\n\t(1, 5, 'activatedRoom_ReldensTown', '{\"rewardItemKey\":\"coins\",\"rewardItemQty\":1}'),\n\t(2, 6, 'activatedRoom_ReldensForest', '{\"rewardItemKey\":\"coins\",\"rewardItemQty\":1}');\n\nREPLACE INTO `ads_providers` (`id`, `key`, `enabled`) VALUES\n\t(1, 'crazyGames', 0),\n\t(2, 'gameMonetize', 0);\n\n-- Config test data (category 1)\nREPLACE INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES\n\t(1001, 'client', 'ui.players.allowGuest', 'true', 1),\n\t(1002, 'server', 'players.initialStats.hp', '100', 2),\n\t(1003, 'test', 'config.list.test', 'List test value', 1),\n\t(1004, 'test', 'config.edit.test', 'Edit test value', 1),\n\t(1005, 'test', 'config.delete.test', 'Delete test value', 1);\n\n-- Features test data (category 1)\nREPLACE INTO `features` (`id`, `code`, `title`, `is_enabled`) VALUES\n\t(1001, 'chat', 'Chat System', 1),\n\t(1002, 'inventory', 'Inventory System', 1),\n\t(1003, 'test-feature-list', 'Test Feature List', 1),\n\t(1004, 'test-feature-edit', 'Test Feature Edit', 1),\n\t(1005, 'test-feature-delete', 'Test Feature Delete', 1);\n\n-- Users test data (category 1)\nREPLACE INTO `users` (`id`, `email`, `username`, `password`, `role_id`, `status`, `created_at`, `updated_at`, `played_time`) VALUES\n\t(1, 'root@yourgame.com', 'root', '879abc0494b36a09f184fd8308ea18f2643d71263f145b1e40e2ec3546d42202:6a186aff4d69daadcd7940a839856b394b12f0aec64a5df745c83cf9d881dc9dcb121b03d946872571f214228684216df097305b68417a56403299b8b2388db3', 99, '1', '2022-03-17 18:57:44', '2023-10-21 16:51:55', 0),\n\t(1001, 'test-list@test.com', 'test-user-list', 'test-password-hash', 1, '1', '2025-01-01 00:00:00', '2025-01-01 00:00:00', 100),\n\t(1002, 'test-edit@test.com', 'test-user-edit', 'test-password-hash', 1, '1', '2025-01-01 01:00:00', '2025-01-01 01:00:00', 200),\n\t(1003, 'test-delete@test.com', 'test-user-delete', 'test-password-hash', 1, '1', '2025-01-01 02:00:00', '2025-01-01 02:00:00', 300),\n\t(1004, 'test-locale-main@test.com', 'test-user-locale-main', 'test-password-hash', 1, '1', '2025-01-01 03:00:00', '2025-01-01 03:00:00', 400),\n\t(1005, 'test-locale-delete@test.com', 'test-user-locale-delete', 'test-password-hash', 1, '1', '2025-01-01 04:00:00', '2025-01-01 04:00:00', 500);\n\nREPLACE INTO `users_locale` (`id`, `locale_id`, `user_id`) VALUES\n\t(1, 1, 1),\n\t(1001, 1, 1001),\n\t(1002, 1, 1002),\n\t(1003, 1, 1003);\n\n-- Snippets test data (category 1)\nREPLACE INTO `snippets` (`id`, `locale_id`, `key`, `value`) VALUES\n\t(1001, 1, 'test.snippet.list', 'Test snippet for list validation'),\n\t(1002, 1, 'test.snippet.edit', 'Test snippet for edit validation'),\n\t(1003, 1, 'test.snippet.delete', 'Test snippet for delete validation');\n\n-- ENTITIES WITH UPLOADS BUT WITHOUT REQUIRED FK (Category 3): items\n\nREPLACE INTO `items_group` (`id`, `key`, `label`, `description`, `files_name`, `sort`, `items_limit`, `limit_per_item`) VALUES\n\t(1, 'weapon', 'Weapon', 'All kinds of weapons.', 'weapon.png', 2, 1, 0),\n\t(2, 'shield', 'Shield', 'Protect with these items.', 'shield.png', 3, 1, 0),\n\t(3, 'armor', 'Armor', '', 'armor.png', 4, 1, 0),\n\t(4, 'boots', 'Boots', '', 'boots.png', 6, 1, 0),\n\t(5, 'gauntlets', 'Gauntlets', '', 'gauntlets.png', 5, 1, 0),\n\t(6, 'helmet', 'Helmet', '', 'helmet.png', 1, 1, 0);\n\nREPLACE INTO `items_item` (`id`, `key`, `type`, `group_id`, `label`, `description`, `qty_limit`, `uses_limit`, `useTimeOut`, `execTimeOut`, `customData`) VALUES\n\t(1, 'coins', 3, NULL, 'Coins', NULL, 0, 1, NULL, NULL, '{\"canBeDropped\": true}'),\n\t(2, 'branch', 10, NULL, 'Tree branch', 'An useless tree branch (for now)', 0, 1, NULL, NULL, '{\"canBeDropped\": true}'),\n\t(3, 'heal_potion_20', 5, NULL, 'Heal Potion', 'A heal potion that will restore 20 HP.', 0, 1, NULL, NULL, '{\"canBeDropped\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"usePlayerPosition\":true,\"followPlayer\":true,\"startsOnTarget\":true},\"removeAfterUse\":true}'),\n\t(4, 'axe', 1, 1, 'Axe', 'A short distance but powerful weapon.', 0, 0, NULL, NULL, '{\"canBeDropped\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"destroyOnComplete\":true,\"usePlayerPosition\":true,\"followPlayer\":true,\"startsOnTarget\":true}}'),\n\t(5, 'spear', 1, 1, 'Spear', 'A short distance but powerful weapon.', 0, 0, NULL, NULL, '{\"canBeDropped\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"destroyOnComplete\":true,\"usePlayerPosition\":true,\"followPlayer\":true,\"startsOnTarget\":true}}'),\n\t(6, 'magic_potion_20', 5, NULL, 'Magic Potion', 'A magic potion that will restore 20 MP.', 0, 1, NULL, NULL, '{\"canBeDropped\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"usePlayerPosition\":true,\"followPlayer\":true,\"startsOnTarget\":true},\"removeAfterUse\":true}'),\n\t(1001, 'test-item-list', 1, 1, 'Test Item List', 'Test item for list validation', 0, 1, NULL, NULL, '{\"canBeDropped\": true}'),\n\t(1002, 'test-item-edit', 1, 1, 'Test Item Edit', 'Test item for edit validation', 0, 1, NULL, NULL, '{\"canBeDropped\": true}'),\n\t(1003, 'test-item-delete', 1, 1, 'Test Item Delete', 'Test item for delete validation', 0, 1, NULL, NULL, '{\"canBeDropped\": true}'),\n\t(1004, 'test-drop-anim-main', 1, 1, 'Test Drop Anim Main', 'Test item for drop animation main', 0, 1, NULL, NULL, '{\"canBeDropped\": true}'),\n\t(1005, 'test-drop-anim-delete', 1, 1, 'Test Drop Anim Delete', 'Test item for drop animation delete', 0, 1, NULL, NULL, '{\"canBeDropped\": true}'),\n\t(1006, 'test-drop-anim-editfail', 1, 1, 'Test Drop Anim EditFail', 'Test item for drop animation edit fail', 0, 1, NULL, NULL, '{\"canBeDropped\": true}');\n\nREPLACE INTO `items_item_modifiers` (`id`, `item_id`, `key`, `property_key`, `operation`, `value`, `maxProperty`) VALUES\n\t(1, 4, 'atk', 'stats/atk', 5, '5', NULL),\n\t(2, 3, 'heal_potion_20', 'stats/hp', 1, '20', 'statsBase/hp'),\n\t(3, 5, 'atk', 'stats/atk', 5, '3', NULL),\n\t(4, 6, 'magic_potion_20', 'stats/mp', 1, '20', 'statsBase/mp');\n\n-- ENTITIES WITH UPLOADS AND FK (Category 4): rooms\n\nREPLACE INTO `rooms` (`id`, `name`, `title`, `map_filename`, `scene_images`, `room_class_key`, `customData`) VALUES\n\t(2, 'reldens-house-1', 'House - 1', 'reldens-house-1.json', 'reldens-house-1.png', NULL, '{\"allowGuest\":true}'),\n\t(3, 'reldens-house-2', 'House - 2', 'reldens-house-2.json', 'reldens-house-2.png', NULL, '{\"allowGuest\":true}'),\n\t(4, 'reldens-town', 'Town', 'reldens-town.json', 'reldens-town.png', NULL, '{\"allowGuest\":true}'),\n\t(5, 'reldens-forest', 'Forest', 'reldens-forest.json', 'reldens-forest.png', NULL, '{\"allowGuest\":true}'),\n\t(6, 'reldens-house-1-2d-floor', 'House - 1 - Floor 2', 'reldens-house-1-2d-floor.json', 'reldens-house-1-2d-floor.png', NULL, NULL),\n\t(7, 'reldens-gravity', 'Gravity World!', 'reldens-gravity.json', 'reldens-gravity.png', NULL, '{\"allowGuest\":true,\"gravity\":[0,625],\"applyGravity\":true,\"allowPassWallsFromBelow\":true,\"timeStep\":0.012,\"type\":\"TOP_DOWN_WITH_GRAVITY\",\"useFixedWorldStep\":false,\"maxSubSteps\":2,\"movementSpeed\":160,\"usePathFinder\":false}'),\n    (8, 'reldens-bots', 'Bots Test', 'reldens-bots.json', 'reldens-forest.png', NULL, '{\"allowGuest\":true}'),\n    (9, 'reldens-bots-forest', 'Bots Forest', 'reldens-bots-forest.json', 'reldens-bots-forest.png', NULL, '{\"allowGuest\":true,\"joinInRandomPlace\":true,\"joinInRandomPlaceGuestAlways\":true}'),\n    (10, 'reldens-bots-forest-house-01-n0', 'Bots Forest - House 1-0', 'reldens-bots-forest-house-01-n0.json', 'reldens-bots-forest-house-01-n0.png', NULL, '{\"allowGuest\":true}'),\n    (1001, 'test-room-list', 'Test Room List', 'test-room-list.json', 'test-room-list.png', NULL, '{\"allowGuest\":true}'),\n    (1002, 'test-room-edit', 'Test Room Edit', 'test-room-edit.json', 'test-room-edit.png', NULL, '{\"allowGuest\":true}'),\n    (1003, 'test-room-delete', 'Test Room Delete', 'test-room-delete.json', 'test-room-delete.png', NULL, '{\"allowGuest\":true}');\n\nREPLACE INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES\n\t(1, 2, 816, 4),\n\t(2, 2, 817, 4),\n\t(3, 3, 778, 4),\n\t(4, 3, 779, 4),\n\t(5, 4, 444, 2),\n\t(6, 4, 951, 3),\n\t(7, 4, 18, 5),\n\t(8, 4, 19, 5),\n\t(9, 5, 1315, 4),\n\t(10, 5, 1316, 4),\n\t(11, 2, 623, 6),\n\t(12, 2, 663, 6),\n\t(13, 6, 624, 2),\n\t(14, 6, 664, 2),\n\t(15, 7, 540, 3),\n\t(16, 3, 500, 7),\n\t(17, 3, 780, 4),\n    (18, 9, 20349, 10),\n    (19, 10, 381, 9),\n    (20, 10, 382, 9);\n\nREPLACE INTO `rooms_return_points` (`id`, `room_id`, `direction`, `x`, `y`, `is_default`, `from_room_id`) VALUES\n\t(1, 2, 'up', 548, 615, 1, 4),\n\t(2, 3, 'up', 640, 600, 1, 4),\n\t(3, 4, 'down', 400, 345, 1, 2),\n\t(4, 4, 'down', 1266, 670, 0, 3),\n\t(5, 5, 'up', 640, 768, 0, 4),\n\t(6, 8, 'up', 640, 768, 0, 4),\n\t(7, 4, 'down', 615, 64, 0, 5),\n\t(9, 6, 'right', 820, 500, 0, 2),\n\t(11, 2, 'left', 720, 540, 0, 6),\n\t(12, 7, 'left', 340, 600, 0, NULL),\n\t(13, 3, 'down', 660, 520, 0, 7),\n\t(14, 9, 'down', 4500, 985, 1, NULL),\n    (15, 9, 'down', 1600, 4544, 0, 10),\n    (16, 10, 'up', 64, 544, 1, 9),\n    (1001, 1001, 'down', 100, 100, 1, NULL),\n    (1002, 1002, 'down', 200, 200, 1, NULL),\n    (1003, 1003, 'down', 300, 300, 1, NULL);\n\n-- ENTITIES WITH REQUIRED FK (Category 2): audio, objects, chat, respawn, rewards\n\nREPLACE INTO `audio_categories` (`id`, `category_key`, `category_label`, `enabled`, `single_audio`) VALUES\n\t(1, 'music', 'Music', 1, 1),\n\t(3, 'sound', 'Sound', 1, 0);\n\nREPLACE INTO `audio` (`id`, `audio_key`, `files_name`, `config`, `room_id`, `category_id`, `enabled`) VALUES\n\t(3, 'footstep', 'footstep.mp3', '{\"onlyCurrentPlayer\":true}', NULL, 3, 1),\n\t(4, 'reldens-town', 'reldens-town.mp3', '', 4, 1, 1),\n\t(1001, 'test-audio-list', 'test-audio-list.mp3', '{\"test\":true}', 4, 1, 1),\n\t(1002, 'test-audio-edit', 'test-audio-edit.mp3', '{\"test\":true}', 4, 1, 1),\n\t(1003, 'test-audio-delete', 'test-audio-delete.mp3', '{\"test\":true}', 4, 1, 1);\n\nREPLACE INTO `audio_markers` (`id`, `audio_id`, `marker_key`, `start`, `duration`, `config`) VALUES\n\t(1, 4, 'ReldensTown', 0, 41, NULL),\n\t(2, 3, 'journeyman_right', 0, 1, NULL),\n\t(3, 3, 'journeyman_left', 0, 1, NULL),\n\t(4, 3, 'journeyman_up', 0, 1, NULL),\n\t(5, 3, 'journeyman_down', 0, 1, NULL),\n\t(6, 3, 'r_journeyman_right', 0, 1, NULL),\n\t(7, 3, 'r_journeyman_left', 0, 1, NULL),\n\t(8, 3, 'r_journeyman_up', 0, 1, NULL),\n\t(9, 3, 'r_journeyman_down', 0, 1, NULL),\n\t(10, 3, 'sorcerer_right', 0, 1, NULL),\n\t(11, 3, 'sorcerer_left', 0, 1, NULL),\n\t(12, 3, 'sorcerer_up', 0, 1, NULL),\n\t(13, 3, 'sorcerer_down', 0, 1, NULL),\n\t(14, 3, 'r_sorcerer_right', 0, 1, NULL),\n\t(15, 3, 'r_sorcerer_left', 0, 1, NULL),\n\t(16, 3, 'r_sorcerer_up', 0, 1, NULL),\n\t(17, 3, 'r_sorcerer_down', 0, 1, NULL),\n\t(18, 3, 'warlock_right', 0, 1, NULL),\n\t(19, 3, 'warlock_left', 0, 1, NULL),\n\t(20, 3, 'warlock_up', 0, 1, NULL),\n\t(21, 3, 'warlock_down', 0, 1, NULL),\n\t(22, 3, 'r_warlock_right', 0, 1, NULL),\n\t(23, 3, 'r_warlock_left', 0, 1, NULL),\n\t(24, 3, 'r_warlock_up', 0, 1, NULL),\n\t(25, 3, 'r_warlock_down', 0, 1, NULL),\n\t(26, 3, 'swordsman_right', 0, 1, NULL),\n\t(27, 3, 'swordsman_left', 0, 1, NULL),\n\t(28, 3, 'swordsman_up', 0, 1, NULL),\n\t(29, 3, 'swordsman_down', 0, 1, NULL),\n\t(30, 3, 'r_swordsman_right', 0, 1, NULL),\n\t(31, 3, 'r_swordsman_left', 0, 1, NULL),\n\t(32, 3, 'r_swordsman_up', 0, 1, NULL),\n\t(33, 3, 'r_swordsman_down', 0, 1, NULL),\n\t(34, 3, 'warrior_right', 0, 1, NULL),\n\t(35, 3, 'warrior_left', 0, 1, NULL),\n\t(36, 3, 'warrior_up', 0, 1, NULL),\n\t(37, 3, 'warrior_down', 0, 1, NULL),\n\t(38, 3, 'r_warrior_right', 0, 1, NULL),\n\t(39, 3, 'r_warrior_left', 0, 1, NULL),\n\t(40, 3, 'r_warrior_up', 0, 1, NULL),\n\t(41, 3, 'r_warrior_down', 0, 1, NULL);\n\nREPLACE INTO `objects` (`id`, `room_id`, `layer_name`, `tile_index`, `class_type`, `object_class_key`, `client_key`, `title`, `private_params`, `client_params`, `enabled`) VALUES\n\t(1, 4, 'ground-collisions', 444, 2, 'door_1', 'door_house_1', '', '{\"runOnHit\":true,\"roomVisible\":true,\"yFix\":6}', '{\"positionFix\":{\"y\":-18},\"frameStart\":0,\"frameEnd\":3,\"repeat\":0,\"hideOnComplete\":false,\"autoStart\":false,\"restartTime\":2000}', 1),\n\t(2, 8, 'respawn-area-monsters-lvl-1-2', NULL, 7, 'enemy_bot_1', 'enemy_forest_1', 'Tree', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true}', '{\"autoStart\":true}', 0),\n\t(3, 8, 'respawn-area-monsters-lvl-1-2', NULL, 7, 'enemy_bot_2', 'enemy_forest_2', 'Tree Punch', '{\"shouldRespawn\":true,\"childObjectType\":4}', '{\"autoStart\":true}', 0),\n\t(4, 4, 'ground-collisions', 951, 2, 'door_2', 'door_house_2', '', '{\"runOnHit\":true,\"roomVisible\":true,\"yFix\":6}', '{\"positionFix\":{\"y\":-18},\"frameStart\":0,\"frameEnd\":3,\"repeat\":0,\"hideOnComplete\":false,\"autoStart\":false,\"restartTime\":2000}', 1),\n\t(5, 4, 'house-collisions-over-player', 535, 3, 'npc_1', 'people_town_1', 'Alfred', '{\"runOnAction\":true,\"playerVisible\":true}', '{\"content\":\"Hello! My name is Alfred. Go to the forest and kill some monsters! Now... leave me alone!\"}', 1),\n\t(6, 5, 'respawn-area-monsters-lvl-1-2', NULL, 7, 'enemy_1', 'enemy_forest_1', 'Tree', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true}', '{\"autoStart\":true}', 1),\n\t(7, 5, 'respawn-area-monsters-lvl-1-2', NULL, 7, 'enemy_2', 'enemy_forest_2', 'Tree Punch', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true,\"interactionRadio\":70}', '{\"autoStart\":true}', 1),\n\t(8, 4, 'house-collisions-over-player', 538, 3, 'npc_2', 'healer_1', 'Mamon', '{\"runOnAction\":true,\"playerVisible\":true,\"sendInvalidOptionMessage\":true}', '{\"content\":\"Hello traveler! I can restore your health, would you like me to do it?\",\"options\":{\"1\":{\"label\":\"Heal HP\",\"value\":1},\"2\":{\"label\":\"Nothing...\",\"value\":2},\"3\":{\"label\":\"Need some MP\",\"value\":3}},\"ui\":true}', 1),\n\t(10, 4, 'house-collisions-over-player', 560, 5, 'npc_3', 'merchant_1', 'Gimly', '{\"runOnAction\":true,\"playerVisible\":true,\"sendInvalidOptionMessage\":true}', '{\"content\":\"Hi there! What would you like to do?\",\"options\":{\"buy\":{\"label\":\"Buy\",\"value\":\"buy\"},\"sell\":{\"label\":\"Sell\",\"value\":\"sell\"}}}', 1),\n\t(12, 4, 'house-collisions-over-player', 562, 3, 'npc_4', 'weapons_master_1', 'Barrik', '{\"runOnAction\":true,\"playerVisible\":true,\"sendInvalidOptionMessage\":true}', '{\"content\":\"Hi, I am the weapons master, choose your weapon and go kill some monsters!\",\"options\":{\"1\":{\"key\":\"axe\",\"label\":\"Axe\",\"value\":1,\"icon\":\"axe\"},\"2\":{\"key\":\"spear\",\"label\":\"Spear\",\"value\":2,\"icon\":\"spear\"}},\"ui\":true}', 1),\n\t(13, 5, 'forest-collisions', 258, 3, 'npc_5', 'quest_npc_1', 'Miles', '{\"runOnAction\":true,\"playerVisible\":true,\"sendInvalidOptionMessage\":true}', '{\"content\":\"Hi there! Do you want a coin? I can give you one if you give me a tree branch.\",\"options\":{\"1\":{\"label\":\"Sure!\",\"value\":1},\"2\":{\"label\":\"No, thank you.\",\"value\":2}},\"ui\":true}', 1),\n\t(14, 9, 'ground-respawn-area', NULL, 7, 'enemy_bot_b1', 'enemy_forest_1', 'Tree', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true,\"interactionRadio\":120}', '{\"autoStart\":true}', 1),\n\t(15, 9, 'ground-respawn-area', NULL, 7, 'enemy_bot_b2', 'enemy_forest_2', 'Tree Punch', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true,\"interactionRadio\":70}', '{\"autoStart\":true}', 1),\n\t(1001, 4, 'test-layer', 100, 3, 'test-object-list', 'test_object_list', 'Test Object List', '{\"runOnAction\":true}', '{\"content\":\"Test object for list validation\"}', 1),\n\t(1002, 4, 'test-layer', 101, 3, 'test-object-edit', 'test_object_edit', 'Test Object Edit', '{\"runOnAction\":true}', '{\"content\":\"Test object for edit validation\"}', 1),\n\t(1003, 4, 'test-layer', 102, 3, 'test-object-delete', 'test_object_delete', 'Test Object Delete', '{\"runOnAction\":true}', '{\"content\":\"Test object for delete validation\"}', 1);\n\nREPLACE INTO `objects_animations` (`id`, `object_id`, `animationKey`, `animationData`) VALUES\n\t(5, 6, 'respawn-area-monsters-lvl-1-2_6_right', '{\"start\":6,\"end\":8}'),\n\t(6, 6, 'respawn-area-monsters-lvl-1-2_6_down', '{\"start\":0,\"end\":2}'),\n\t(7, 6, 'respawn-area-monsters-lvl-1-2_6_left', '{\"start\":3,\"end\":5}'),\n\t(8, 6, 'respawn-area-monsters-lvl-1-2_6_up', '{\"start\":9,\"end\":11}');\n\nREPLACE INTO `objects_assets` (`object_asset_id`, `object_id`, `asset_type`, `asset_key`, `asset_file`, `extra_params`) VALUES\n\t(1, 1, 'spritesheet', 'door_house_1', 'door-a-x2.png', '{\"frameWidth\":32,\"frameHeight\":58}'),\n\t(2, 4, 'spritesheet', 'door_house_2', 'door-a-x2.png', '{\"frameWidth\":32,\"frameHeight\":58}'),\n\t(3, 5, 'spritesheet', 'people_town_1', 'people-b-x2.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n\t(4, 2, 'spritesheet', 'enemy_forest_1', 'monster-treant.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n\t(5, 6, 'spritesheet', 'enemy_forest_1', 'monster-treant.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n\t(6, 7, 'spritesheet', 'enemy_forest_2', 'monster-golem2.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n\t(7, 5, 'spritesheet', 'healer_1', 'healer-1.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n\t(8, 3, 'spritesheet', 'enemy_forest_2', 'monster-golem2.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n\t(9, 10, 'spritesheet', 'merchant_1', 'people-d-x2.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n\t(10, 12, 'spritesheet', 'weapons_master_1', 'people-c-x2.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n\t(11, 13, 'spritesheet', 'quest_npc_1', 'people-quest-npc.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n    (12, 14, 'spritesheet', 'enemy_forest_1', 'monster-treant.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n    (13, 15, 'spritesheet', 'enemy_forest_2', 'monster-golem2.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n    (1001, 1001, 'spritesheet', 'test_object_list', 'test-object.png', '{\"frameWidth\":32,\"frameHeight\":32}'),\n    (1002, 1002, 'spritesheet', 'test_object_edit', 'test-object.png', '{\"frameWidth\":32,\"frameHeight\":32}'),\n    (1003, 1003, 'spritesheet', 'test_object_delete', 'test-object.png', '{\"frameWidth\":32,\"frameHeight\":32}');\n\nREPLACE INTO `objects_items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES\n\t(2, 10, 4, -1, -1, 0),\n\t(3, 10, 5, -1, -1, 0),\n\t(5, 10, 3, -1, 1, 0),\n\t(6, 10, 6, -1, 1, 0);\n\nREPLACE INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES\n\t(1, 10, 'axe', 'coins', 5, 1),\n\t(2, 10, 'spear', 'coins', 2, 1),\n\t(3, 10, 'heal_potion_20', 'coins', 2, 1),\n\t(5, 10, 'magic_potion_20', 'coins', 2, 1);\n\nREPLACE INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES\n\t(1, 10, 'axe', 'coins', 2, 0),\n\t(2, 10, 'spear', 'coins', 1, 0),\n\t(3, 10, 'heal_potion_20', 'coins', 1, 0),\n\t(5, 10, 'magic_potion_20', 'coins', 1, 0);\n\nREPLACE INTO `drops_animations` (`id`, `item_id`, `asset_type`, `asset_key`, `file`, `extra_params`) VALUES\n    (1, 1, NULL, 'coins', 'coins.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n\t(2, 2, NULL, 'branch', 'branch.png', '{\"start\":0,\"end\":2,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n    (3, 3, NULL, 'heal-potion-20', 'heal-potion-20.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n\t(4, 4, NULL, 'axe', 'axe.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n    (5, 5, NULL, 'spear', 'spear.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n    (6, 6, NULL, 'magic-potion-20', 'magic-potion-20.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}');\n\nREPLACE INTO `objects_skills` (`id`, `object_id`, `skill_id`, `target_id`) VALUES\n\t(1, 6, 1, 2);\n\nREPLACE INTO `objects_stats` (`id`, `object_id`, `stat_id`, `base_value`, `value`) VALUES\n\t(1, 2, 1, 50, 50),\n    (2, 2, 2, 50, 50),\n    (3, 2, 3, 50, 50),\n    (4, 2, 4, 50, 50),\n    (5, 2, 5, 50, 50),\n    (6, 2, 6, 50, 50),\n    (7, 2, 7, 50, 50),\n    (8, 2, 8, 50, 50),\n    (9, 2, 9, 50, 50),\n    (10, 2, 10, 50, 50),\n    (11, 3, 1, 50, 50),\n    (12, 3, 2, 50, 50),\n    (13, 3, 3, 50, 50),\n    (14, 3, 4, 50, 50),\n    (15, 3, 5, 50, 50),\n    (16, 3, 6, 50, 50),\n    (17, 3, 7, 50, 50),\n    (18, 3, 8, 50, 50),\n    (19, 3, 9, 50, 50),\n    (20, 3, 10, 50, 50),\n    (21, 6, 1, 50, 50),\n    (22, 6, 2, 50, 50),\n    (23, 6, 3, 50, 50),\n    (24, 6, 4, 50, 50),\n    (25, 6, 5, 50, 50),\n    (26, 6, 6, 50, 50),\n    (27, 6, 7, 50, 50),\n    (28, 6, 8, 50, 50),\n    (29, 6, 9, 50, 50),\n    (30, 6, 10, 50, 50),\n    (31, 7, 1, 50, 50),\n    (32, 7, 2, 50, 50),\n    (33, 7, 3, 50, 50),\n    (34, 7, 4, 50, 50),\n    (35, 7, 5, 50, 50),\n    (36, 7, 6, 50, 50),\n    (37, 7, 7, 50, 50),\n    (38, 7, 8, 50, 50),\n    (39, 7, 9, 50, 50),\n    (40, 7, 10, 50, 50),\n    (41, 14, 1, 50, 50),\n    (42, 14, 2, 50, 50),\n    (43, 14, 3, 50, 50),\n    (44, 14, 4, 50, 50),\n    (45, 14, 5, 50, 50),\n    (46, 14, 6, 50, 50),\n    (47, 14, 7, 50, 50),\n    (48, 14, 8, 50, 50),\n    (49, 14, 9, 50, 50),\n    (50, 14, 10, 50, 50),\n    (51, 15, 1, 50, 50),\n    (52, 15, 2, 50, 50),\n    (53, 15, 3, 50, 50),\n    (54, 15, 4, 50, 50),\n    (55, 15, 5, 50, 50),\n    (56, 15, 6, 50, 50),\n    (57, 15, 7, 50, 50),\n    (58, 15, 8, 50, 50),\n    (59, 15, 9, 50, 50),\n    (60, 15, 10, 50, 50);\n\n-- Players data for FK relationships\nREPLACE INTO `players` (`id`, `user_id`, `name`, `created_at`) VALUES\n\t(1, 1, 'ImRoot', '2022-03-17 19:57:50'),\n\t(1001, 1001, 'TestPlayerList', '2025-01-01 00:00:00'),\n\t(1002, 1002, 'TestPlayerEdit', '2025-01-01 01:00:00'),\n\t(1003, 1003, 'TestPlayerDelete', '2025-01-01 02:00:00'),\n\t(1004, 1001, 'TestPlayerStateMain', '2025-01-01 03:00:00'),\n\t(1005, 1001, 'TestPlayerStateDelete', '2025-01-01 04:00:00'),\n\t(1006, 1001, 'TestPlayerStateEditFail', '2025-01-01 05:00:00');\n\nREPLACE INTO `players_state` (`id`, `player_id`, `room_id`, `x`, `y`, `dir`) VALUES\n\t(1, 1, 5, 332, 288, 'down'),\n\t(1001, 1001, 4, 100, 100, 'down'),\n\t(1002, 1002, 4, 200, 200, 'down'),\n\t(1003, 1003, 4, 300, 300, 'down');\n\nREPLACE INTO `players_stats` (`id`, `player_id`, `stat_id`, `base_value`, `value`) VALUES\n\t(1, 1, 1, 280, 81),\n\t(2, 1, 2, 280, 85),\n\t(3, 1, 3, 280, 400),\n\t(4, 1, 4, 280, 280),\n\t(5, 1, 5, 100, 100),\n\t(6, 1, 6, 100, 100),\n\t(7, 1, 7, 100, 100),\n\t(8, 1, 8, 100, 100),\n\t(9, 1, 9, 100, 100),\n\t(10, 1, 10, 100, 100);\n\n-- Chat test data (requires player_id and room_id FK)\nREPLACE INTO `chat` (`id`, `player_id`, `room_id`, `message`, `private_player_id`, `message_type`, `message_time`) VALUES\n\t(1001, 1001, 4, 'Test message for list validation', NULL, 1, '2025-01-01 10:00:00'),\n\t(1002, 1002, 4, 'Test message for edit validation', NULL, 1, '2025-01-01 11:00:00'),\n\t(1003, 1003, 4, 'Test message for delete validation', NULL, 1, '2025-01-01 12:00:00');\n\n-- Respawn test data (requires object_id FK)\nREPLACE INTO `respawn` (`id`, `object_id`, `respawn_time`, `instances_limit`, `layer`) VALUES\n    (1, 2, 20000, 10, 'respawn-area-monsters-lvl-1-2'),\n    (2, 3, 10000, 20, 'respawn-area-monsters-lvl-1-2'),\n\t(3, 6, 20000, 2, 'respawn-area-monsters-lvl-1-2'),\n\t(4, 7, 10000, 3, 'respawn-area-monsters-lvl-1-2'),\n    (5, 14, 20000, 100, 'ground-respawn-area'),\n    (6, 15, 10000, 200, 'ground-respawn-area'),\n    (1001, 1001, 5000, 5, 'test-layer'),\n    (1002, 1002, 6000, 6, 'test-layer'),\n    (1003, 1003, 7000, 7, 'test-layer');\n\n-- Rewards test data (requires object_id and item_id FK)\nREPLACE INTO `rewards` (`id`, `object_id`, `item_id`, `modifier_id`, `experience`, `drop_rate`, `drop_quantity`, `is_unique`, `was_given`, `has_drop_body`) VALUES\n\t(1, 2, 2, NULL, 10, 100, 3, 0, 0, 1),\n\t(2, 3, 2, NULL, 10, 100, 1, 0, 0, 1),\n\t(3, 6, 2, NULL, 10, 100, 3, 0, 0, 1),\n\t(4, 7, 2, NULL, 10, 100, 1, 0, 0, 1),\n\t(5, 14, 2, NULL, 10, 100, 3, 0, 0, 1),\n\t(6, 15, 2, NULL, 10, 100, 1, 0, 0, 1),\n\t(1001, 1001, 1, NULL, 50, 100, 1, 0, 0, 1),\n\t(1002, 1002, 1, NULL, 60, 100, 2, 0, 0, 1),\n\t(1003, 1003, 1, NULL, 70, 100, 3, 0, 0, 1);\n\nREPLACE INTO `rewards_events` (`id`, `label`, `description`, `handler_key`, `event_key`, `event_data`, `position`, `enabled`, `active_from`, `active_to`) VALUES\n    (1, 'rewards.dailyLogin', 'rewards.dailyDescription', 'login', 'reldens.joinRoomEnd', '{\"action\":\"dailyLogin\",\"items\":{\"coins\":1}}', 0, 1, NULL, NULL),\n    (2, 'rewards.straightDaysLogin', 'rewards.straightDaysDescription', 'login', 'reldens.joinRoomEnd', '{\"action\":\"straightDaysLogin\",\"days\":2,\"items\":{\"coins\":10}}', 0, 1, NULL, NULL);\n\n-- Skills, levels, and stats data required for FK relationships\nREPLACE INTO `skills_class_level_up_animations` (`id`, `class_path_id`, `level_id`, `animationData`) VALUES\n\t(1, NULL, NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"heal_cast\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":3,\"repeat\":-1,\"destroyTime\":2000,\"depthByPlayer\":\"above\"}');\n\nREPLACE INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`, `enabled`) VALUES\n\t(1, 'journeyman', 'Journeyman', 1, 1),\n\t(2, 'sorcerer', 'Sorcerer', 2, 1),\n\t(3, 'warlock', 'Warlock', 3, 1),\n\t(4, 'swordsman', 'Swordsman', 4, 1),\n\t(5, 'warrior', 'Warrior', 5, 1);\n\nREPLACE INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_id`, `label`) VALUES\n\t(1, 1, 3, 'Old Traveler'),\n\t(2, 2, 7, 'Fire Master'),\n\t(3, 3, 11, 'Magus'),\n\t(4, 4, 15, 'Blade Master'),\n\t(5, 5, 19, 'Palading');\n\nREPLACE INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES\n\t(1, 1, 1, 2),\n\t(2, 1, 3, 1),\n\t(3, 1, 4, 3),\n\t(4, 1, 4, 4),\n\t(5, 2, 5, 1),\n\t(6, 2, 7, 3),\n\t(7, 2, 8, 4),\n\t(8, 3, 9, 1),\n\t(9, 3, 11, 3),\n\t(10, 3, 12, 2),\n\t(11, 4, 13, 2),\n\t(12, 4, 15, 4),\n\t(13, 5, 17, 2),\n\t(14, 5, 19, 1),\n\t(15, 5, 20, 4);\n\nREPLACE INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES\n\t(1, 1, '1', 0, 1),\n\t(2, 2, '2', 100, 1),\n\t(3, 5, '5', 338, 1),\n\t(4, 10, '10', 2570, 1),\n\t(5, 1, '1', 0, 2),\n\t(6, 2, '2', 100, 2),\n\t(7, 5, '5', 338, 2),\n\t(8, 10, '10', 2570, 2),\n\t(9, 1, '1', 0, 3),\n\t(10, 2, '2', 100, 3),\n\t(11, 5, '5', 338, 3),\n\t(12, 10, '10', 2570, 3),\n\t(13, 1, '1', 0, 4),\n\t(14, 2, '2', 100, 4),\n\t(15, 5, '5', 338, 4),\n\t(16, 10, '10', 2570, 4),\n\t(17, 1, '1', 0, 5),\n\t(18, 2, '2', 100, 5),\n\t(19, 5, '5', 338, 5),\n\t(20, 10, '10', 2570, 5);\n\nREPLACE INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES\n\t(1, 2, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(2, 2, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(3, 2, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(4, 2, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(5, 2, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(6, 2, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(7, 2, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(8, 2, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(9, 3, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(10, 3, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(11, 3, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(12, 3, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(13, 3, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(14, 3, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(15, 3, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(16, 3, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(17, 4, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(18, 4, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(19, 4, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(20, 4, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(21, 4, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(22, 4, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(23, 4, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(24, 4, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(25, 6, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(26, 6, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(27, 6, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(28, 6, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(29, 6, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(30, 6, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(31, 6, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(32, 6, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(33, 7, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(34, 7, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(35, 7, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(36, 7, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(37, 7, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(38, 7, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(39, 7, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(40, 7, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(41, 8, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(42, 8, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(43, 8, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(44, 8, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(45, 8, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(46, 8, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(47, 8, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(48, 8, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(49, 10, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(50, 10, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(51, 10, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(52, 10, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(53, 10, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(54, 10, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(55, 10, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(56, 10, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(57, 11, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(58, 11, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(59, 11, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(60, 11, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(61, 11, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(62, 11, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(63, 11, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(64, 11, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(65, 12, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(66, 12, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(67, 12, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(68, 12, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(69, 12, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(70, 12, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(71, 12, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(72, 12, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(73, 14, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(74, 14, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(75, 14, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(76, 14, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(77, 14, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(78, 14, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(79, 14, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(80, 14, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(81, 15, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(82, 15, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(83, 15, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(84, 15, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(85, 15, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(86, 15, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(87, 15, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(88, 15, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(89, 16, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(90, 16, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(91, 16, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(92, 16, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(93, 16, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(94, 16, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(95, 16, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(96, 16, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(97, 18, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(98, 18, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(99, 18, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(100, 18, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(101, 18, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(102, 18, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(103, 18, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(104, 18, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(105, 19, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(106, 19, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(107, 19, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(108, 19, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(109, 19, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(110, 19, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(111, 19, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(112, 19, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(113, 20, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(114, 20, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(115, 20, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(116, 20, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(117, 20, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(118, 20, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(119, 20, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(120, 20, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL);\n\nREPLACE INTO `skills_levels_set` (`id`, `autoFillRanges`, `autoFillExperienceMultiplier`) VALUES\n\t(1, 1, NULL),\n\t(2, 1, NULL),\n\t(3, 1, NULL),\n\t(4, 1, NULL),\n\t(5, 1, NULL);\n\nREPLACE INTO `skills_owners_class_path` (`id`, `class_path_id`, `owner_id`, `currentLevel`, `currentExp`) VALUES\n\t(1, 1, 1, 10, 9080);\n\nREPLACE INTO `skills_skill` (`id`, `key`, `type`, `autoValidation`, `skillDelay`, `castTime`, `usesLimit`, `range`, `rangeAutomaticValidation`, `rangePropertyX`, `rangePropertyY`, `rangeTargetPropertyX`, `rangeTargetPropertyY`, `allowSelfTarget`, `criticalChance`, `criticalMultiplier`, `criticalFixedValue`, `customData`) VALUES\n\t(1, 'attackBullet', '4', 0, 1000, 0, 0, 250, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0, NULL),\n\t(2, 'attackShort', '2', 0, 600, 0, 0, 50, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0, NULL),\n\t(3, 'fireball', '4', 0, 5000, 2000, 0, 280, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0, NULL),\n\t(4, 'heal', '3', 0, 5000, 2000, 0, 100, 1, 'state/x', 'state/y', NULL, NULL, 1, 0, 1, 0, NULL),\n\t(1001, 'testSkillAttackMain', '1', 0, 1000, 0, 0, 100, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0, NULL),\n\t(1002, 'testSkillAttackDelete', '1', 0, 1000, 0, 0, 100, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0, NULL),\n\t(1003, 'testSkillAttackEditFail', '1', 0, 1000, 0, 0, 100, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0, NULL);\n\nREPLACE INTO `skills_skill_animations` (`id`, `skill_id`, `key`, `classKey`, `animationData`) VALUES\n\t(1, 3, 'bullet', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"fireball_bullet\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":3,\"repeat\":-1,\"frameRate\":1,\"dir\":3}'),\n\t(2, 3, 'cast', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"fireball_cast\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":3,\"repeat\":-1,\"destroyTime\":2000,\"depthByPlayer\":\"above\"}'),\n\t(3, 4, 'cast', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"heal_cast\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":3,\"repeat\":-1,\"destroyTime\":2000}'),\n\t(4, 4, 'hit', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"heal_hit\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":4,\"repeat\":0,\"depthByPlayer\":\"above\"}');\n\nREPLACE INTO `skills_skill_attack` (`id`, `skill_id`, `affectedProperty`, `allowEffectBelowZero`, `hitDamage`, `applyDirectDamage`, `attackProperties`, `defenseProperties`, `aimProperties`, `dodgeProperties`, `dodgeFullEnabled`, `dodgeOverAimSuccess`, `damageAffected`, `criticalAffected`) VALUES\n\t(1, 1, 'stats/hp', 0, 3, 0, 'stats/atk,stats/speed', 'stats/def,stats/speed', 'stats/aim', 'stats/dodge', 0, 1, 0, 0),\n\t(2, 2, 'stats/hp', 0, 5, 0, 'stats/atk,stats/speed', 'stats/def,stats/speed', 'stats/aim', 'stats/dodge', 0, 1, 0, 0),\n\t(3, 3, 'stats/hp', 0, 7, 0, 'stats/mgk-atk,stats/speed', 'stats/mgk-def,stats/speed', 'stats/aim', 'stats/dodge', 0, 1, 0, 0);\n\nREPLACE INTO `skills_skill_owner_conditions` (`id`, `skill_id`, `key`, `property_key`, `conditional`, `value`) VALUES\n\t(1, 3, 'available_mp', 'stats/mp', 'ge', '5');\n\nREPLACE INTO `skills_skill_owner_effects` (`id`, `skill_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES\n\t(2, 3, 'dec_mp', 'stats/mp', 2, '5', '0', ' ', NULL, NULL),\n\t(3, 4, 'dec_mp', 'stats/mp', 2, '2', '0', '', NULL, NULL);\n\nREPLACE INTO `skills_skill_physical_data` (`id`, `skill_id`, `magnitude`, `objectWidth`, `objectHeight`, `validateTargetOnHit`) VALUES\n\t(1, 1, 350, 5, 5, 0),\n\t(2, 3, 550, 5, 5, 0);\n\nREPLACE INTO `skills_skill_target_effects` (`id`, `skill_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES\n\t(1, 4, 'heal', 'stats/hp', 1, '10', '0', '0', NULL, 'statsBase/hp');\n\nREPLACE INTO `stats` (`id`, `key`, `label`, `description`, `base_value`, `customData`) VALUES\n\t(1, 'hp', 'HP', 'Player life points', 100, '{\"showBase\":true}'),\n\t(2, 'mp', 'MP', 'Player magic points', 100, '{\"showBase\":true}'),\n\t(3, 'atk', 'Atk', 'Player attack points', 100, NULL),\n\t(4, 'def', 'Def', 'Player defense points', 100, NULL),\n\t(5, 'dodge', 'Dodge', 'Player dodge points', 100, NULL),\n\t(6, 'speed', 'Speed', 'Player speed point', 100, NULL),\n\t(7, 'aim', 'Aim', 'Player aim points', 100, NULL),\n\t(8, 'stamina', 'Stamina', 'Player stamina points', 100, '{\"showBase\":true}'),\n\t(9, 'mAtk', 'Magic Atk', 'Player magic attack', 100, NULL),\n\t(10, 'mDef', 'Magic Def', 'Player magic defense', 100, NULL);\n\nREPLACE INTO `skills_groups` (`id`, `key`, `label`, `description`, `sort`) VALUES\n\t(1, 'combat', 'Combat Skills', 'Combat related skills', 1);\n\nREPLACE INTO `clan_levels` (`id`, `key`, `label`, `required_experience`) VALUES\n\t(1, 1, 'Novice', 0),\n\t(2, 2, 'Veteran', 1000);\n\n\n\n-- Locale data (category 1 - no required FK)\nREPLACE INTO `locale` (`id`, `locale`, `language_code`, `country_code`) VALUES\n\t(1, 'en_US', 'en', 'US'),\n\t(1001, 'te_TS', 'te', 'TS'),\n\t(1002, 'te_ED', 'te', 'TS'),\n\t(1003, 'te_DL', 'te', 'TS');\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "migrations/production/20190923181825_v4.0.0.js",
    "content": "const fs = require('fs');\n\nexports.up = function(knex) {\n    let sql = fs.readFileSync(__dirname+'/reldens-install-v4.0.0.sql').toString();\n    return knex.raw(sql);\n};\n\n// eslint-disable-next-line no-unused-vars\nexports.down = function(knex) {\n    // nothing to do in the first version.\n};\n"
  },
  {
    "path": "migrations/production/mongo-db-install.js",
    "content": "// @TODO - BETA - Create installation script for MongoDB."
  },
  {
    "path": "migrations/production/reldens-basic-config-v4.0.0.sql",
    "content": "--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\nTRUNCATE `ads_types`;\nTRUNCATE `chat_message_types`;\nTRUNCATE `clan_levels`;\nTRUNCATE `config_types`;\nTRUNCATE `config`;\nTRUNCATE `features`;\nTRUNCATE `items_types`;\nTRUNCATE `locale`;\nTRUNCATE `objects_types`;\nTRUNCATE `operation_types`;\nTRUNCATE `skills_skill_type`;\nTRUNCATE `target_options`;\n\nREPLACE INTO `ads_types` (`id`, `key`) VALUES\n\t(1, 'banner'),\n\t(2, 'eventVideo');\n\nREPLACE INTO `chat_message_types` (`id`, `key`, `show_tab`, `also_show_in_type`) VALUES\n\t(1, 'message', 1, NULL),\n\t(2, 'joined', 0, 1),\n\t(3, 'system', 0, 1),\n\t(4, 'private', 1, 1),\n\t(5, 'damage', 0, 1),\n\t(6, 'reward', 0, 1),\n\t(7, 'skill', 0, 1),\n\t(8, 'teams', 1, 1),\n\t(9, 'global', 1, 1),\n\t(10, 'error', 0, 1);\n\nREPLACE INTO `clan_levels` (`id`, `key`, `label`, `required_experience`) VALUES\n\t(1, 1, '1', 0);\n\nREPLACE INTO `config_types` (`id`, `label`) VALUES\n    (1, 'string'),\n    (2, 'float'),\n    (3, 'boolean'),\n    (4, 'json'),\n    (5, 'comma_separated');\n\nREPLACE INTO `config` (`id`, `scope`, `path`, `value`, `type`) VALUES\n\t(1, 'client', 'actions/damage/color', '#ff0000', 1),\n\t(2, 'client', 'actions/damage/duration', '600', 2),\n\t(3, 'client', 'actions/damage/enabled', '1', 3),\n\t(4, 'client', 'actions/damage/font', 'Verdana, Geneva, sans-serif', 1),\n\t(5, 'client', 'actions/damage/fontSize', '14', 2),\n\t(6, 'client', 'actions/damage/shadowColor', 'rgba(0,0,0,0.7)', 1),\n\t(7, 'client', 'actions/damage/showAll', '0', 3),\n\t(8, 'client', 'actions/damage/stroke', '#000000', 1),\n\t(9, 'client', 'actions/damage/strokeThickness', '4', 2),\n\t(10, 'client', 'actions/damage/top', '50', 2),\n\t(11, 'client', 'actions/skills/affectedProperty', 'hp', 1),\n\t(12, 'client', 'ads/general/providers/crazyGames/enabled', '0', 3),\n\t(13, 'client', 'ads/general/providers/crazyGames/sdkUrl', 'https://sdk.crazygames.com/crazygames-sdk-v2.js', 1),\n\t(14, 'client', 'ads/general/providers/crazyGames/videoMinimumDuration', '3000', 2),\n\t(15, 'client', 'ads/general/providers/gameMonetize/enabled', '0', 3),\n\t(16, 'client', 'ads/general/providers/gameMonetize/gameId', 'your-game-id-should-be-here', 1),\n\t(17, 'client', 'ads/general/providers/gameMonetize/sdkUrl', 'https://api.gamemonetize.com/sdk.js', 1),\n\t(18, 'client', 'chat/messages/characterLimit', '100', 2),\n\t(19, 'client', 'chat/messages/characterLimitOverhead', '30', 2),\n\t(20, 'client', 'clan/general/openInvites', '0', 3),\n\t(21, 'client', 'clan/labels/clanTitle', 'Clan: %clanName - Leader: %leaderName', 1),\n\t(22, 'client', 'clan/labels/propertyMaxValue', '/ %propertyMaxValue', 1),\n\t(23, 'client', 'clan/labels/requestFromTitle', 'Clan request from:', 1),\n\t(24, 'client', 'gameEngine/banner', '0', 3),\n\t(25, 'client', 'gameEngine/dom/createContainer', '1', 3),\n\t(26, 'client', 'gameEngine/height', '1280', 2),\n\t(27, 'client', 'gameEngine/parent', 'reldens', 1),\n\t(28, 'client', 'gameEngine/physics/arcade/debug', 'false', 3),\n\t(29, 'client', 'gameEngine/physics/arcade/gravity/x', '0', 2),\n\t(30, 'client', 'gameEngine/physics/arcade/gravity/y', '0', 2),\n\t(31, 'client', 'gameEngine/physics/default', 'arcade', 1),\n\t(32, 'client', 'gameEngine/scale/autoCenter', '1', 2),\n\t(33, 'client', 'gameEngine/scale/autoRound', '0', 3),\n\t(34, 'client', 'gameEngine/scale/max/height', '1280', 2),\n\t(35, 'client', 'gameEngine/scale/max/width', '1280', 2),\n\t(36, 'client', 'gameEngine/scale/min/height', '360', 2),\n\t(37, 'client', 'gameEngine/scale/min/width', '360', 2),\n\t(38, 'client', 'gameEngine/scale/mode', '5', 2),\n\t(39, 'client', 'gameEngine/scale/parent', 'reldens', 1),\n\t(40, 'client', 'gameEngine/scale/zoom', '1', 2),\n\t(41, 'client', 'gameEngine/type', '0', 2),\n\t(42, 'client', 'gameEngine/width', '1280', 2),\n\t(43, 'client', 'general/animations/frameRate', '10', 2),\n\t(44, 'client', 'general/assets/arrowDownPath', '/assets/sprites/arrow-down.png', 1),\n\t(45, 'client', 'general/assets/statsIconPath', '/assets/icons/book.png', 1),\n\t(46, 'client', 'general/controls/action_button_hold', '0', 3),\n\t(47, 'client', 'general/controls/allowSimultaneousKeys', '1', 3),\n\t(48, 'client', 'general/engine/clientInterpolation', '1', 3),\n\t(49, 'client', 'general/engine/experimentalClientPrediction', '0', 3),\n\t(50, 'client', 'general/engine/interpolationSpeed', '0.4', 2),\n\t(51, 'client', 'general/gameEngine/updateGameSizeTimeOut', '500', 2),\n\t(52, 'client', 'general/users/allowGuest', '1', 3),\n\t(53, 'client', 'general/users/allowRegistration', '1', 3),\n\t(54, 'client', 'login/termsAndConditions/body', 'This is our test terms and conditions content.', 1),\n\t(55, 'client', 'login/termsAndConditions/checkboxLabel', 'Accept terms and conditions', 1),\n\t(56, 'client', 'login/termsAndConditions/es/body', 'Este es el contenido de nuestros términos y condiciones de prueba.', 1),\n\t(57, 'client', 'login/termsAndConditions/es/checkboxLabel', 'Aceptar terminos y condiciones', 1),\n\t(58, 'client', 'login/termsAndConditions/es/heading', 'Términos y condiciones', 1),\n\t(59, 'client', 'login/termsAndConditions/es/link', 'Acepta nuestros Términos y Condiciones (haz clic aquí).', 1),\n\t(60, 'client', 'login/termsAndConditions/heading', 'Terms and conditions', 1),\n\t(61, 'client', 'login/termsAndConditions/link', 'Accept our Terms and Conditions (click here).', 1),\n\t(62, 'client', 'map/layersDepth/belowPlayer', '0', 2),\n\t(63, 'client', 'map/layersDepth/changePoints', '0', 2),\n\t(64, 'client', 'map/tileData/height', '32', 2),\n\t(65, 'client', 'map/tileData/margin', '1', 2),\n\t(66, 'client', 'map/tileData/spacing', '2', 2),\n\t(67, 'client', 'map/tileData/width', '32', 2),\n\t(68, 'client', 'objects/npc/invalidOptionMessage', 'I do not understand.', 1),\n\t(69, 'client', 'players/animations/basedOnPress', '1', 3),\n\t(70, 'client', 'players/animations/collideWorldBounds', '1', 3),\n\t(71, 'client', 'players/animations/defaultFrames/down/end', '2', 2),\n\t(72, 'client', 'players/animations/defaultFrames/down/start', '0', 2),\n\t(73, 'client', 'players/animations/defaultFrames/left/end', '5', 2),\n\t(74, 'client', 'players/animations/defaultFrames/left/start', '3', 2),\n\t(75, 'client', 'players/animations/defaultFrames/right/end', '8', 2),\n\t(76, 'client', 'players/animations/defaultFrames/right/start', '6', 2),\n\t(77, 'client', 'players/animations/defaultFrames/up/end', '11', 2),\n\t(78, 'client', 'players/animations/defaultFrames/up/start', '9', 2),\n\t(79, 'client', 'players/animations/diagonalHorizontal', '1', 3),\n\t(80, 'client', 'players/animations/fadeDuration', '1000', 2),\n\t(81, 'client', 'players/animations/fallbackImage', 'player-base.png', 1),\n\t(82, 'client', 'players/barsProperties', '{\"hp\":{\"enabled\":true,\"label\":\"HP\",\"activeColor\":\"#d53434\",\"inactiveColor\":\"#330000\"},\"mp\":{\"enabled\":true,\"label\":\"MP\",\"activeColor\":\"#5959fb\",\"inactiveColor\":\"#000033\"}}', 4),\n    (83, 'client', 'players/multiplePlayers/enabled', '1', 3),\n\t(84, 'client', 'players/physicalBody/height', '25', 2),\n\t(85, 'client', 'players/physicalBody/width', '25', 2),\n\t(86, 'client', 'players/playedTime/label', 'Played time %playedTimeInHs hs', 1),\n\t(87, 'client', 'players/playedTime/show', '2', 2),\n\t(88, 'client', 'players/size/height', '71', 2),\n\t(89, 'client', 'players/size/leftOffset', '0', 2),\n\t(90, 'client', 'players/size/topOffset', '20', 2),\n\t(91, 'client', 'players/size/width', '52', 2),\n\t(92, 'client', 'players/tapMovement/enabled', '1', 3),\n\t(93, 'client', 'rewards/titles/rewardMessage', 'You obtained %dropQuantity %itemLabel', 1),\n\t(94, 'client', 'rooms/selection/allowOnLogin', '1', 3),\n\t(95, 'client', 'rooms/selection/allowOnRegistration', '1', 3),\n\t(96, 'client', 'rooms/selection/loginAvailableRooms', '*', 1),\n\t(97, 'client', 'rooms/selection/loginLastLocation', '1', 3),\n\t(98, 'client', 'rooms/selection/loginLastLocationLabel', 'Last Location', 1),\n\t(99, 'client', 'rooms/selection/registrationAvailableRooms', '*', 1),\n\t(100, 'client', 'skills/animations/default_atk', '{\"key\":\"default_atk\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_atk\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":4,\"repeat\":0}}', 4),\n\t(101, 'client', 'skills/animations/default_bullet', '{\"key\":\"default_bullet\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_bullet\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":2,\"repeat\":-1,\"frameRate\":1}}', 4),\n\t(102, 'client', 'skills/animations/default_cast', '{\"key\": \"default_cast\",\"animationData\":{\"enabled\":false,\"type\":\"spritesheet\",\"img\":\"default_cast\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":3,\"repeat\":0}}', 4),\n\t(103, 'client', 'skills/animations/default_death', '{\"key\":\"default_death\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_death\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":1,\"repeat\":0,\"frameRate\":1}}', 4),\n\t(104, 'client', 'skills/animations/default_hit', '{\"key\":\"default_hit\",\"animationData\":{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"default_hit\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":3,\"repeat\":0,\"depthByPlayer\":\"above\"}}', 4),\n\t(105, 'client', 'team/labels/leaderNameTitle', 'Team leader: %leaderName', 1),\n\t(106, 'client', 'team/labels/propertyMaxValue', '/ %propertyMaxValue', 1),\n\t(107, 'client', 'team/labels/requestFromTitle', 'Team request from:', 1),\n\t(108, 'client', 'trade/players/awaitTimeOut', '1', 3),\n\t(109, 'client', 'trade/players/timeOut', '8000', 2),\n\t(110, 'client', 'ui/chat/damageMessages', '1', 3),\n\t(111, 'client', 'ui/chat/defaultOpen', '0', 3),\n\t(112, 'client', 'ui/chat/dodgeMessages', '1', 3),\n\t(113, 'client', 'ui/chat/effectMessages', '1', 3),\n\t(114, 'client', 'ui/chat/enabled', '1', 3),\n\t(115, 'client', 'ui/chat/notificationBalloon', '1', 3),\n\t(116, 'client', 'ui/chat/overheadChat/closeChatBoxAfterSend', '1', 3),\n\t(117, 'client', 'ui/chat/overheadChat/enabled', '1', 3),\n\t(118, 'client', 'ui/chat/overheadChat/isTyping', '1', 3),\n\t(119, 'client', 'ui/chat/overheadText/align', 'center', 1),\n\t(120, 'client', 'ui/chat/overheadText/depth', '200000', 2),\n\t(121, 'client', 'ui/chat/overheadText/fill', '#ffffff', 1),\n\t(122, 'client', 'ui/chat/overheadText/fontFamily', 'Verdana, Geneva, sans-serif', 1),\n\t(123, 'client', 'ui/chat/overheadText/fontSize', '12px', 1),\n\t(124, 'client', 'ui/chat/overheadText/height', '15', 2),\n\t(125, 'client', 'ui/chat/overheadText/shadowBlur', '5', 2),\n\t(126, 'client', 'ui/chat/overheadText/shadowColor', 'rgba(0,0,0,0.7)', 1),\n\t(127, 'client', 'ui/chat/overheadText/shadowX', '5', 2),\n\t(128, 'client', 'ui/chat/overheadText/shadowY', '5', 2),\n\t(129, 'client', 'ui/chat/overheadText/stroke', 'rgba(0,0,0,0.7)', 1),\n\t(130, 'client', 'ui/chat/overheadText/strokeThickness', '20', 2),\n\t(131, 'client', 'ui/chat/overheadText/textLength', '4', 2),\n\t(132, 'client', 'ui/chat/overheadText/timeOut', '5000', 2),\n\t(133, 'client', 'ui/chat/overheadText/topOffset', '20', 2),\n\t(134, 'client', 'ui/chat/responsiveX', '100', 2),\n\t(135, 'client', 'ui/chat/responsiveY', '100', 2),\n\t(136, 'client', 'ui/chat/showTabs', '1', 3),\n\t(137, 'client', 'ui/chat/totalValidTypes', '2', 2),\n\t(138, 'client', 'ui/chat/x', '440', 2),\n\t(139, 'client', 'ui/chat/y', '940', 2),\n\t(140, 'client', 'ui/clan/enabled', '1', 3),\n\t(141, 'client', 'ui/clan/responsiveX', '100', 2),\n\t(142, 'client', 'ui/clan/responsiveY', '0', 2),\n\t(143, 'client', 'ui/clan/sharedProperties', '{\"hp\":{\"path\":\"stats/hp\",\"pathMax\":\"statsBase/hp\",\"label\":\"HP\"},\"mp\":{\"path\":\"stats/mp\",\"pathMax\":\"statsBase/mp\",\"label\":\"MP\"}}', 4),\n\t(144, 'client', 'ui/clan/x', '430', 2),\n\t(145, 'client', 'ui/clan/y', '100', 2),\n\t(146, 'client', 'ui/controls/allowPrimaryTouch', '1', 3),\n\t(147, 'client', 'ui/controls/defaultActionKey', '', 1),\n\t(148, 'client', 'ui/controls/disableContextMenu', '1', 3),\n\t(149, 'client', 'ui/controls/enabled', '1', 3),\n\t(150, 'client', 'ui/controls/opacityEffect', '1', 3),\n\t(151, 'client', 'ui/controls/primaryMove', '0', 3),\n\t(152, 'client', 'ui/controls/responsiveX', '0', 2),\n\t(153, 'client', 'ui/controls/responsiveY', '100', 2),\n\t(154, 'client', 'ui/controls/tabTarget', '1', 3),\n\t(155, 'client', 'ui/controls/x', '120', 2),\n\t(156, 'client', 'ui/controls/y', '390', 2),\n\t(157, 'client', 'ui/default/responsiveX', '10', 2),\n\t(158, 'client', 'ui/default/responsiveY', '10', 2),\n\t(159, 'client', 'ui/default/x', '120', 2),\n\t(160, 'client', 'ui/default/y', '100', 2),\n\t(161, 'client', 'ui/equipment/enabled', '1', 3),\n\t(162, 'client', 'ui/equipment/responsiveX', '100', 2),\n\t(163, 'client', 'ui/equipment/responsiveY', '0', 2),\n\t(164, 'client', 'ui/equipment/x', '430', 2),\n\t(165, 'client', 'ui/equipment/y', '90', 2),\n\t(166, 'client', 'ui/fullScreenButton/enabled', '1', 3),\n\t(167, 'client', 'ui/fullScreenButton/responsiveX', '100', 2),\n\t(168, 'client', 'ui/fullScreenButton/responsiveY', '0', 2),\n\t(169, 'client', 'ui/fullScreenButton/x', '380', 2),\n\t(170, 'client', 'ui/fullScreenButton/y', '20', 2),\n\t(171, 'client', 'ui/instructions/enabled', '1', 3),\n\t(172, 'client', 'ui/instructions/responsiveX', '100', 2),\n\t(173, 'client', 'ui/instructions/responsiveY', '100', 2),\n\t(174, 'client', 'ui/instructions/x', '380', 2),\n\t(175, 'client', 'ui/instructions/y', '940', 2),\n\t(176, 'client', 'ui/inventory/enabled', '1', 3),\n\t(177, 'client', 'ui/inventory/responsiveX', '100', 2),\n\t(178, 'client', 'ui/inventory/responsiveY', '0', 2),\n\t(179, 'client', 'ui/inventory/x', '380', 2),\n\t(180, 'client', 'ui/inventory/y', '450', 2),\n\t(181, 'client', 'ui/lifeBar/enabled', '1', 3),\n\t(182, 'client', 'ui/lifeBar/fillStyle', '0xff0000', 1),\n\t(183, 'client', 'ui/lifeBar/fixedPosition', '0', 3),\n\t(184, 'client', 'ui/lifeBar/height', '5', 2),\n\t(185, 'client', 'ui/lifeBar/lineStyle', '0xffffff', 1),\n\t(186, 'client', 'ui/lifeBar/responsiveX', '1', 2),\n\t(187, 'client', 'ui/lifeBar/responsiveY', '24', 2),\n\t(188, 'client', 'ui/lifeBar/showAllPlayers', '0', 3),\n\t(189, 'client', 'ui/lifeBar/showEnemies', '1', 3),\n\t(190, 'client', 'ui/lifeBar/showOnClick', '1', 3),\n\t(191, 'client', 'ui/lifeBar/top', '5', 2),\n\t(192, 'client', 'ui/lifeBar/width', '50', 2),\n\t(193, 'client', 'ui/lifeBar/x', '5', 2),\n\t(194, 'client', 'ui/lifeBar/y', '12', 2),\n\t(195, 'client', 'ui/loading/assetsColor', '#ffffff', 1),\n\t(196, 'client', 'ui/loading/assetsSize', '18px', 1),\n\t(197, 'client', 'ui/loading/font', 'Verdana, Geneva, sans-serif', 1),\n\t(198, 'client', 'ui/loading/fontSize', '20px', 1),\n\t(199, 'client', 'ui/loading/loadingColor', '#ffffff', 1),\n\t(200, 'client', 'ui/loading/percentColor', '#666666', 1),\n\t(201, 'client', 'ui/loading/showAssets', '1', 3),\n\t(202, 'client', 'ui/maximum/x', '1280', 2),\n\t(203, 'client', 'ui/maximum/y', '1280', 2),\n\t(204, 'client', 'ui/minimap/addCircle', '1', 3),\n\t(205, 'client', 'ui/minimap/camBackgroundColor', 'rgba(0,0,0,0.6)', 1),\n\t(206, 'client', 'ui/minimap/camX', '240', 2),\n\t(207, 'client', 'ui/minimap/camY', '10', 2),\n\t(208, 'client', 'ui/minimap/camZoom', '0.08', 2),\n\t(209, 'client', 'ui/minimap/circleAlpha', '1', 2),\n\t(210, 'client', 'ui/minimap/circleColor', 'rgb(0,0,0)', 1),\n\t(211, 'client', 'ui/minimap/circleFillAlpha', '0', 2),\n\t(212, 'client', 'ui/minimap/circleFillColor', '1', 2),\n\t(213, 'client', 'ui/minimap/circleRadio', '80.35', 2),\n\t(214, 'client', 'ui/minimap/circleStrokeAlpha', '0.6', 2),\n\t(215, 'client', 'ui/minimap/circleStrokeColor', '0', 2),\n\t(216, 'client', 'ui/minimap/circleStrokeLineWidth', '6', 2),\n\t(217, 'client', 'ui/minimap/circleX', '320', 2),\n\t(218, 'client', 'ui/minimap/circleY', '88', 2),\n\t(219, 'client', 'ui/minimap/enabled', '1', 3),\n\t(220, 'client', 'ui/minimap/fixedHeight', '450', 2),\n\t(221, 'client', 'ui/minimap/fixedWidth', '450', 2),\n\t(222, 'client', 'ui/minimap/mapHeightDivisor', '1', 2),\n\t(223, 'client', 'ui/minimap/mapWidthDivisor', '1', 2),\n\t(224, 'client', 'ui/minimap/responsiveX', '40', 2),\n\t(225, 'client', 'ui/minimap/responsiveY', '2.4', 2),\n\t(226, 'client', 'ui/minimap/roundMap', '1', 3),\n\t(227, 'client', 'ui/minimap/x', '330', 2),\n\t(228, 'client', 'ui/minimap/y', '10', 2),\n\t(229, 'client', 'ui/npcDialog/responsiveX', '10', 2),\n\t(230, 'client', 'ui/npcDialog/responsiveY', '10', 2),\n\t(231, 'client', 'ui/npcDialog/x', '120', 2),\n\t(232, 'client', 'ui/npcDialog/y', '100', 2),\n\t(233, 'client', 'ui/options/acceptOrDecline', '{\"1\":{\"label\":\"Accept\",\"value\":1},\"2\":{\"label\":\"Decline\",\"value\":2}}', 4),\n\t(234, 'client', 'ui/playerBox/enabled', '1', 3),\n\t(235, 'client', 'ui/playerBox/responsiveX', '0', 2),\n\t(236, 'client', 'ui/playerBox/responsiveY', '0', 2),\n\t(237, 'client', 'ui/playerBox/x', '50', 2),\n\t(238, 'client', 'ui/playerBox/y', '30', 2),\n\t(239, 'client', 'ui/players/nameText/align', 'center', 1),\n\t(240, 'client', 'ui/players/nameText/depth', '200000', 2),\n\t(241, 'client', 'ui/players/nameText/fill', '#ffffff', 1),\n\t(242, 'client', 'ui/players/nameText/fontFamily', 'Verdana, Geneva, sans-serif', 1),\n\t(243, 'client', 'ui/players/nameText/fontSize', '12px', 1),\n\t(244, 'client', 'ui/players/nameText/height', '-90', 2),\n\t(245, 'client', 'ui/players/nameText/shadowBlur', '5', 2),\n\t(246, 'client', 'ui/players/nameText/shadowColor', 'rgba(0,0,0,0.7)', 1),\n\t(247, 'client', 'ui/players/nameText/shadowX', '5', 2),\n\t(248, 'client', 'ui/players/nameText/shadowY', '5', 2),\n\t(249, 'client', 'ui/players/nameText/stroke', '#000000', 1),\n\t(250, 'client', 'ui/players/nameText/strokeThickness', '4', 2),\n\t(251, 'client', 'ui/players/nameText/textLength', '4', 2),\n\t(252, 'client', 'ui/players/showNames', '1', 3),\n\t(253, 'client', 'ui/playerStats/enabled', '1', 3),\n\t(254, 'client', 'ui/playerStats/responsiveX', '100', 2),\n\t(255, 'client', 'ui/playerStats/responsiveY', '0', 2),\n\t(256, 'client', 'ui/playerStats/x', '430', 2),\n\t(257, 'client', 'ui/playerStats/y', '20', 2),\n\t(258, 'client', 'ui/pointer/show', '1', 3),\n\t(259, 'client', 'ui/pointer/topOffSet', '16', 2),\n\t(260, 'client', 'ui/rewards/enabled', '1', 3),\n\t(261, 'client', 'ui/rewards/responsiveX', '100', 2),\n\t(262, 'client', 'ui/rewards/responsiveY', '0', 2),\n\t(263, 'client', 'ui/rewards/x', '430', 2),\n\t(264, 'client', 'ui/rewards/y', '200', 2),\n\t(265, 'client', 'ui/sceneLabel/enabled', '1', 3),\n\t(266, 'client', 'ui/sceneLabel/responsiveX', '50', 2),\n\t(267, 'client', 'ui/sceneLabel/responsiveY', '0', 2),\n\t(268, 'client', 'ui/sceneLabel/x', '250', 2),\n\t(269, 'client', 'ui/sceneLabel/y', '20', 2),\n\t(270, 'client', 'ui/scores/enabled', '1', 3),\n\t(271, 'client', 'ui/scores/responsiveX', '100', 2),\n\t(272, 'client', 'ui/scores/responsiveY', '0', 2),\n\t(273, 'client', 'ui/scores/x', '430', 2),\n\t(274, 'client', 'ui/scores/y', '150', 2),\n\t(275, 'client', 'ui/screen/responsive', '1', 3),\n\t(276, 'client', 'ui/settings/enabled', '1', 3),\n\t(277, 'client', 'ui/settings/responsiveX', '100', 2),\n\t(278, 'client', 'ui/settings/responsiveY', '100', 2),\n\t(279, 'client', 'ui/settings/x', '940', 2),\n\t(280, 'client', 'ui/settings/y', '280', 2),\n\t(281, 'client', 'ui/skills/enabled', '1', 3),\n\t(282, 'client', 'ui/skills/responsiveX', '0', 2),\n\t(283, 'client', 'ui/skills/responsiveY', '100', 2),\n\t(284, 'client', 'ui/skills/x', '230', 2),\n\t(285, 'client', 'ui/skills/y', '390', 2),\n\t(286, 'client', 'ui/teams/enabled', '1', 3),\n\t(287, 'client', 'ui/teams/responsiveX', '100', 2),\n\t(288, 'client', 'ui/teams/responsiveY', '0', 2),\n\t(289, 'client', 'ui/teams/sharedProperties', '{\"hp\":{\"path\":\"stats/hp\",\"pathMax\":\"statsBase/hp\",\"label\":\"HP\"},\"mp\":{\"path\":\"stats/mp\",\"pathMax\":\"statsBase/mp\",\"label\":\"MP\"}}', 4),\n\t(290, 'client', 'ui/teams/x', '430', 2),\n\t(291, 'client', 'ui/teams/y', '100', 2),\n\t(292, 'client', 'ui/trade/responsiveX', '5', 2),\n\t(293, 'client', 'ui/trade/responsiveY', '5', 2),\n\t(294, 'client', 'ui/trade/x', '5', 2),\n\t(295, 'client', 'ui/trade/y', '5', 2),\n\t(296, 'client', 'ui/uiTarget/enabled', '1', 3),\n\t(297, 'client', 'ui/uiTarget/hideOnDialog', '0', 3),\n\t(298, 'client', 'ui/uiTarget/responsiveX', '0', 2),\n\t(299, 'client', 'ui/uiTarget/responsiveY', '0', 2),\n\t(300, 'client', 'ui/uiTarget/x', '10', 2),\n\t(301, 'client', 'ui/uiTarget/y', '85', 2),\n\t(302, 'client', 'world/debug/enabled', '0', 3),\n\t(303, 'server', 'actions/pvp/battleTimeOff', '20000', 2),\n\t(304, 'server', 'actions/pvp/timerType', 'bt', 1),\n\t(305, 'server', 'admin/companyName', 'Reldens - Administration Panel', 1),\n\t(306, 'server', 'admin/faviconPath', '/assets/web/favicon.ico', 1),\n\t(307, 'server', 'admin/logoPath', '/assets/web/reldens-your-logo-mage.png', 1),\n\t(308, 'server', 'admin/roleId', '99', 2),\n\t(309, 'server', 'admin/stylesPath', '/css/reldens-admin-client.css', 1),\n\t(310, 'server', 'chat/messages/broadcast_join', '1', 3),\n\t(311, 'server', 'chat/messages/broadcast_leave', '1', 3),\n\t(312, 'server', 'chat/messages/global_allowed_roles', '1,9000', 1),\n\t(313, 'server', 'chat/messages/global_enabled', '1', 3),\n\t(314, 'server', 'enemies/default/affectedProperty', 'stats/hp', 1),\n\t(315, 'server', 'enemies/default/skillKey', 'attackShort', 1),\n\t(316, 'server', 'enemies/initialStats/aim', '50', 2),\n\t(317, 'server', 'enemies/initialStats/atk', '50', 2),\n\t(318, 'server', 'enemies/initialStats/def', '50', 2),\n\t(319, 'server', 'enemies/initialStats/dodge', '50', 2),\n\t(320, 'server', 'enemies/initialStats/hp', '50', 2),\n\t(321, 'server', 'enemies/initialStats/mp', '50', 2),\n\t(322, 'server', 'enemies/initialStats/speed', '50', 2),\n\t(323, 'server', 'enemies/initialStats/stamina', '50', 2),\n\t(324, 'server', 'objects/actions/closeInteractionOnOutOfReach', '1', 3),\n\t(325, 'server', 'objects/actions/interactionsDistance', '140', 2),\n\t(326, 'server', 'objects/drops/disappearTime', '1800000', 2),\n\t(327, 'server', 'players/actions/initialClassPathId', '1', 2),\n\t(328, 'server', 'players/actions/interactionDistance', '40', 2),\n\t(329, 'server', 'players/drop/percent', '20', 2),\n\t(330, 'server', 'players/drop/quantity', '2', 2),\n\t(331, 'server', 'players/gameOver/timeOut', '10000', 2),\n\t(332, 'server', 'players/guestUser/allowOnRooms', '1', 3),\n\t(333, 'server', 'players/guestUser/roleId', '2', 2),\n\t(334, 'server', 'players/initialState/dir', 'down', 1),\n\t(335, 'server', 'players/initialState/room_id', '4', 2),\n\t(336, 'server', 'players/initialState/x', '400', 2),\n\t(337, 'server', 'players/initialState/y', '345', 2),\n\t(338, 'server', 'players/initialUser/roleId', '1', 2),\n\t(339, 'server', 'players/initialUser/status', '1', 2),\n\t(340, 'server', 'players/physicsBody/speed', '180', 2),\n\t(341, 'server', 'players/physicsBody/usePlayerSpeedConfig', '0', 3),\n\t(342, 'server', 'players/physicsBody/usePlayerSpeedProperty', '0', 3),\n\t(343, 'server', 'rewards/actions/disappearTime', '1800000', 2),\n\t(344, 'server', 'rewards/actions/interactionsDistance', '40', 2),\n\t(345, 'server', 'rewards/loginReward/enabled', '1', 3),\n\t(346, 'server', 'rewards/playedTimeReward/enabled', '1', 3),\n\t(347, 'server', 'rewards/playedTimeReward/time', '30000', 3),\n\t(348, 'server', 'rooms/validation/enabled', '1', 3),\n\t(349, 'server', 'rooms/validation/valid', 'room_game,chat_global', 1),\n\t(350, 'server', 'rooms/world/bulletsStopOnPlayer', '1', 3),\n\t(351, 'server', 'rooms/world/disableObjectsCollisionsOnChase', '0', 3),\n\t(352, 'server', 'rooms/world/disableObjectsCollisionsOnReturn', '1', 3),\n\t(353, 'server', 'rooms/world/groupWallsHorizontally', '1', 3),\n\t(354, 'server', 'rooms/world/groupWallsVertically', '0', 3),\n\t(355, 'server', 'rooms/world/movementSpeed', '180', 2),\n\t(356, 'server', 'rooms/world/onlyWalkable', '1', 3),\n\t(357, 'server', 'rooms/world/timeStep', '0.04', 2),\n\t(358, 'server', 'rooms/world/tryClosestPath', '0', 3),\n\t(359, 'server', 'scores/fullTableView/enabled', '1', 3),\n\t(360, 'server', 'scores/obtainedScorePerNpc', '5', 2),\n\t(361, 'server', 'scores/obtainedScorePerPlayer', '10', 2),\n\t(362, 'server', 'scores/useNpcCustomScore', '1', 3);\n\nREPLACE INTO `features` (`id`, `code`, `title`, `is_enabled`) VALUES\n\t(1, 'chat', 'Chat', 1),\n\t(2, 'objects', 'Objects', 1),\n\t(3, 'respawn', 'Respawn', 1),\n\t(4, 'inventory', 'Inventory', 1),\n\t(5, 'firebase', 'Firebase', 1),\n\t(6, 'actions', 'Actions', 1),\n\t(7, 'users', 'Users', 1),\n\t(8, 'audio', 'Audio', 1),\n\t(9, 'rooms', 'Rooms', 1),\n\t(10, 'admin', 'Admin', 1),\n\t(11, 'prediction', 'Prediction', 0),\n\t(12, 'teams', 'Teams', 1),\n\t(13, 'rewards', 'Rewards', 1),\n\t(14, 'snippets', 'Snippets', 1),\n\t(16, 'ads', 'Ads', 1),\n\t(17, 'world', 'World', 0),\n\t(18, 'scores', 'Scores', 1);\n\nREPLACE INTO `items_types` (`id`, `key`) VALUES\n\t(10, 'base'),\n\t(1, 'equipment'),\n\t(3, 'single'),\n\t(4, 'single_equipment'),\n\t(5, 'single_usable'),\n\t(2, 'usable');\n\nREPLACE INTO `locale` (`id`, `locale`, `language_code`, `country_code`, `enabled`) VALUES\n\t(1, 'en_US', 'en', 'US', 1);\n\nREPLACE INTO `objects_types` (`id`, `key`) VALUES\n\t(2, 'animation'),\n\t(1, 'base'),\n\t(6, 'drop'),\n\t(4, 'enemy'),\n\t(7, 'multiple'),\n\t(3, 'npc'),\n\t(5, 'trader');\n\nREPLACE INTO `operation_types` (`id`, `label`, `key`) VALUES\n\t(1, 'Increment', 1),\n\t(2, 'Decrease', 2),\n\t(3, 'Divide', 3),\n\t(4, 'Multiply', 4),\n\t(5, 'Increment Percentage', 5),\n\t(6, 'Decrease Percentage', 6),\n\t(7, 'Set', 7),\n\t(8, 'Method', 8),\n\t(9, 'Set Number', 9);\n\nREPLACE INTO `skills_skill_type` (`id`, `key`) VALUES\n\t(2, 'attack'),\n\t(1, 'base'),\n\t(3, 'effect'),\n\t(4, 'physical_attack'),\n\t(5, 'physical_effect');\n\nREPLACE INTO `target_options` (`id`, `target_key`, `target_label`) VALUES\n\t(1, 'object', 'Object'),\n\t(2, 'player', 'Player');\n\n-- default user/password: root/root\nREPLACE INTO `users` (`id`, `email`, `username`, `password`, `role_id`, `status`) VALUES\n\t(1, 'root@yourgame.com', 'root', '879abc0494b36a09f184fd8308ea18f2643d71263f145b1e40e2ec3546d42202:6a186aff4d69daadcd7940a839856b394b12f0aec64a5df745c83cf9d881dc9dcb121b03d946872571f214228684216df097305b68417a56403299b8b2388db3', 99, '1');\n\nREPLACE INTO `users_locale` (`id`, `locale_id`, `user_id`) VALUES\n\t(1, 1, 1);\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "migrations/production/reldens-install-v4.0.0.sql",
    "content": "--\n-- Reldens - Installation\n--\n\n--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\nCREATE TABLE IF NOT EXISTS `features` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `code` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `title` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `is_enabled` TINYINT UNSIGNED DEFAULT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `code` (`code`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `config_types` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `label` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `operation_types` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `label` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,\n    `key` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `key` (`key`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `target_options` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `target_key` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `target_label` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `target_key` (`target_key`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `locale` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `locale` VARCHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `language_code` VARCHAR(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `country_code` VARCHAR(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `enabled` TINYINT UNSIGNED DEFAULT NULL,\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `users` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `email` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `username` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `password` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `role_id` INT UNSIGNED NOT NULL,\n    `status` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT (NOW()),\n    `updated_at` TIMESTAMP NOT NULL DEFAULT (NOW()) ON UPDATE CURRENT_TIMESTAMP,\n    `played_time` INT NOT NULL DEFAULT '0',\n    `login_count` INT NOT NULL DEFAULT '0',\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `email` (`email`) USING BTREE,\n    UNIQUE KEY `username` (`username`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `stats` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `description` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `base_value` INT UNSIGNED NOT NULL,\n    `customData` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `key` (`key`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `players` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `user_id` INT UNSIGNED NOT NULL,\n    `name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `user_id_name` (`user_id`,`name`),\n    KEY `FK_players_users` (`user_id`),\n    CONSTRAINT `FK_players_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `rooms` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `title` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `map_filename` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `scene_images` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `room_class_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `server_url` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `customData` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `key` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `rooms_change_points` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `room_id` INT UNSIGNED NOT NULL,\n    `tile_index` INT UNSIGNED NOT NULL,\n    `next_room_id` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `id` (`id`),\n    KEY `scene_id` (`room_id`),\n    KEY `FK_rooms_change_points_rooms_2` (`next_room_id`),\n    CONSTRAINT `FK_rooms_change_points_rooms` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,\n    CONSTRAINT `FK_rooms_change_points_rooms_2` FOREIGN KEY (`next_room_id`) REFERENCES `rooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `rooms_return_points` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `room_id` INT UNSIGNED NOT NULL,\n    `direction` VARCHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `x` INT UNSIGNED NOT NULL,\n    `y` INT UNSIGNED NOT NULL,\n    `is_default` TINYINT UNSIGNED DEFAULT NULL,\n    `from_room_id` INT UNSIGNED DEFAULT NULL,\n    PRIMARY KEY (`id`),\n    KEY `FK_scenes_return_points_rooms` (`room_id`),\n    KEY `FK_scenes_return_points_rooms_2` (`from_room_id`) USING BTREE,\n    CONSTRAINT `FK_rooms_return_points_rooms_from_room_id` FOREIGN KEY (`from_room_id`) REFERENCES `rooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,\n    CONSTRAINT `FK_rooms_return_points_rooms_room_id` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `players_state` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `player_id` INT UNSIGNED NOT NULL,\n    `room_id` INT UNSIGNED NOT NULL,\n    `x` INT UNSIGNED NOT NULL,\n    `y` INT UNSIGNED NOT NULL,\n    `dir` VARCHAR(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE INDEX `player_id` (`player_id`) USING BTREE,\n    INDEX `FK_player_state_rooms` (`room_id`) USING BTREE,\n    INDEX `FK_player_state_player_stats` (`player_id`) USING BTREE,\n    CONSTRAINT `FK_player_state_player_stats` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION,\n    CONSTRAINT `FK_player_state_rooms` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `players_stats` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `player_id` INT UNSIGNED NOT NULL,\n    `stat_id` INT UNSIGNED NOT NULL,\n    `base_value` INT UNSIGNED NOT NULL,\n    `value` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `player_id_stat_id` (`player_id`,`stat_id`) USING BTREE,\n    KEY `stat_id` (`stat_id`) USING BTREE,\n    KEY `user_id` (`player_id`) USING BTREE,\n    CONSTRAINT `FK_player_current_stats_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,\n    CONSTRAINT `FK_players_current_stats_players_stats` FOREIGN KEY (`stat_id`) REFERENCES `stats` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `ads_providers` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `enabled` TINYINT UNSIGNED NOT NULL DEFAULT (1),\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `key` (`key`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `ads_types` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `key` (`key`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `ads` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `provider_id` INT UNSIGNED NOT NULL,\n    `type_id` INT UNSIGNED NOT NULL,\n    `width` INT UNSIGNED DEFAULT NULL,\n    `height` INT UNSIGNED DEFAULT NULL,\n    `position` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `top` INT UNSIGNED DEFAULT NULL,\n    `bottom` INT UNSIGNED DEFAULT NULL,\n    `left` INT UNSIGNED DEFAULT NULL,\n    `right` INT UNSIGNED DEFAULT NULL,\n    `replay` INT UNSIGNED DEFAULT NULL,\n    `enabled` TINYINT UNSIGNED NOT NULL DEFAULT '0',\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `key` (`key`),\n    KEY `provider_id` (`provider_id`),\n    KEY `type_id` (`type_id`) USING BTREE,\n    CONSTRAINT `FK_ads_ads_providers` FOREIGN KEY (`provider_id`) REFERENCES `ads_providers` (`id`),\n    CONSTRAINT `FK_ads_ads_types` FOREIGN KEY (`type_id`) REFERENCES `ads_types` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `ads_banner` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `ads_id` INT UNSIGNED NOT NULL,\n    `banner_data` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `ads_id` (`ads_id`),\n    CONSTRAINT `FK_ads_banner_ads` FOREIGN KEY (`ads_id`) REFERENCES `ads` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `ads_event_video` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `ads_id` INT UNSIGNED NOT NULL,\n    `event_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `event_data` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `ads_id` (`ads_id`),\n    KEY `ad_id` (`ads_id`) USING BTREE,\n    KEY `room_id` (`event_key`) USING BTREE,\n    CONSTRAINT `FK_ads_scene_change_video_ads` FOREIGN KEY (`ads_id`) REFERENCES `ads` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `ads_played` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `ads_id` INT UNSIGNED NOT NULL,\n    `player_id` INT UNSIGNED NOT NULL,\n    `started_at` DATETIME NOT NULL DEFAULT (now()),\n    `ended_at` DATETIME DEFAULT NULL,\n    PRIMARY KEY (`id`),\n    KEY `ads_id` (`ads_id`),\n    KEY `player_id` (`player_id`),\n    CONSTRAINT `FK_ads_played_ads` FOREIGN KEY (`ads_id`) REFERENCES `ads` (`id`),\n    CONSTRAINT `FK_ads_played_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `audio_categories` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `category_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `category_label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `enabled` TINYINT DEFAULT NULL,\n    `single_audio` TINYINT DEFAULT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `category_key` (`category_key`),\n    UNIQUE KEY `category_label` (`category_label`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `audio` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `audio_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `files_name` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `config` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `room_id` INT UNSIGNED DEFAULT NULL,\n    `category_id` INT UNSIGNED DEFAULT NULL,\n    `enabled` TINYINT UNSIGNED DEFAULT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `audio_key` (`audio_key`),\n    KEY `FK_audio_rooms` (`room_id`),\n    KEY `FK_audio_audio_categories` (`category_id`),\n    CONSTRAINT `FK_audio_audio_categories` FOREIGN KEY (`category_id`) REFERENCES `audio_categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,\n    CONSTRAINT `FK_audio_rooms` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON DELETE SET NULL ON UPDATE SET NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `audio_markers` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `audio_id` INT UNSIGNED NOT NULL,\n    `marker_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `start` INT UNSIGNED NOT NULL,\n    `duration` INT UNSIGNED NOT NULL,\n    `config` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `audio_id_marker_key` (`audio_id`,`marker_key`),\n    KEY `audio_id` (`audio_id`),\n    CONSTRAINT `FK_audio_markers_audio` FOREIGN KEY (`audio_id`) REFERENCES `audio` (`id`) ON DELETE CASCADE ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `audio_player_config` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `player_id` INT UNSIGNED NOT NULL,\n    `category_id` INT UNSIGNED DEFAULT NULL,\n    `enabled` TINYINT UNSIGNED DEFAULT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `player_id_category_id` (`player_id`,`category_id`),\n    KEY `FK_audio_player_config_audio_categories` (`category_id`),\n    CONSTRAINT `FK_audio_player_config_audio_categories` FOREIGN KEY (`category_id`) REFERENCES `audio_categories` (`id`) ON UPDATE CASCADE,\n    CONSTRAINT `FK_audio_player_config_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `chat_message_types` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `show_tab` TINYINT UNSIGNED DEFAULT NULL,\n    `also_show_in_type` INT UNSIGNED DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `FK_chat_message_types_chat_message_types` (`also_show_in_type`),\n    CONSTRAINT `FK_chat_message_types_chat_message_types` FOREIGN KEY (`also_show_in_type`) REFERENCES `chat_message_types` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `chat` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `player_id` INT UNSIGNED NOT NULL,\n    `room_id` INT UNSIGNED DEFAULT NULL,\n    `message` VARCHAR(140) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `private_player_id` INT UNSIGNED DEFAULT NULL,\n    `message_type` INT UNSIGNED DEFAULT NULL,\n    `message_time` TIMESTAMP NOT NULL,\n    PRIMARY KEY (`id`),\n    KEY `user_id` (`player_id`),\n    KEY `scene_id` (`room_id`),\n    KEY `private_user_id` (`private_player_id`),\n    KEY `FK_chat_chat_message_types` (`message_type`),\n    CONSTRAINT `FK__players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`),\n    CONSTRAINT `FK__players_2` FOREIGN KEY (`private_player_id`) REFERENCES `players` (`id`),\n    CONSTRAINT `FK__scenes` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`),\n    CONSTRAINT `FK_chat_chat_message_types` FOREIGN KEY (`message_type`) REFERENCES `chat_message_types` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `clan_levels` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` INT UNSIGNED NOT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `required_experience` BIGINT UNSIGNED DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `key` (`key`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `clan` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `owner_id` INT UNSIGNED NOT NULL,\n    `name` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `points` INT UNSIGNED NOT NULL DEFAULT '0',\n    `level` INT UNSIGNED NOT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `owner_id` (`owner_id`),\n    UNIQUE KEY `name` (`name`),\n    KEY `FK_clan_clan_levels` (`level`),\n    CONSTRAINT `FK_clan_clan_levels` FOREIGN KEY (`level`) REFERENCES `clan_levels` (`key`),\n    CONSTRAINT `FK_clan_players` FOREIGN KEY (`owner_id`) REFERENCES `players` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `clan_levels_modifiers` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `level_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `operation` INT UNSIGNED NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `minValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `maxValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `minProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `maxProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `modifier_id` (`key`) USING BTREE,\n    KEY `level_key` (`level_id`) USING BTREE,\n    KEY `FK_clan_levels_modifiers_operation_types` (`operation`) USING BTREE,\n    CONSTRAINT `FK_clan_levels_modifiers_clan_levels` FOREIGN KEY (`level_id`) REFERENCES `clan_levels` (`id`) ON UPDATE CASCADE,\n    CONSTRAINT `FK_clan_levels_modifiers_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `clan_members` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `clan_id` INT UNSIGNED NOT NULL,\n    `player_id` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `clan_id_player_id` (`clan_id`,`player_id`) USING BTREE,\n    UNIQUE KEY `player_id` (`player_id`) USING BTREE,\n    CONSTRAINT `FK_clan_members_clan` FOREIGN KEY (`clan_id`) REFERENCES `clan` (`id`),\n    CONSTRAINT `FK_clan_members_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `config` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `scope` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `path` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `value` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `type` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `scope_path` (`scope`,`path`) USING BTREE,\n    KEY `FK_config_config_types` (`type`) USING BTREE,\n    CONSTRAINT `FK_config_config_types` FOREIGN KEY (`type`) REFERENCES `config_types` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `items_types` (\n    `id` INT NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `key` (`key`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `items_group` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    `files_name` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    `sort` INT DEFAULT NULL,\n    `items_limit` INT NOT NULL DEFAULT '0',\n    `limit_per_item` INT NOT NULL DEFAULT '0',\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `items_item` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `type` INT NOT NULL DEFAULT '0',\n    `group_id` INT UNSIGNED DEFAULT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `description` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `qty_limit` INT NOT NULL DEFAULT '0',\n    `uses_limit` INT NOT NULL DEFAULT '1',\n    `useTimeOut` INT DEFAULT NULL,\n    `execTimeOut` INT DEFAULT NULL,\n  `customData` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `id` (`id`),\n    UNIQUE KEY `key` (`key`),\n    KEY `group_id` (`group_id`),\n    KEY `type` (`type`),\n    CONSTRAINT `FK_items_item_items_group` FOREIGN KEY (`group_id`) REFERENCES `items_group` (`id`) ON UPDATE CASCADE,\n    CONSTRAINT `FK_items_item_items_types` FOREIGN KEY (`type`) REFERENCES `items_types` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `items_inventory` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `owner_id` INT UNSIGNED NOT NULL,\n    `item_id` INT UNSIGNED NOT NULL,\n    `qty` INT NOT NULL DEFAULT '0',\n    `remaining_uses` INT NULL DEFAULT NULL,\n    `is_active` TINYINT NULL DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    INDEX `FK_items_inventory_items_item` (`item_id`) USING BTREE,\n    INDEX `FK_items_inventory_players` (`owner_id`) USING BTREE,\n    CONSTRAINT `FK_items_inventory_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION,\n    CONSTRAINT `FK_items_inventory_players` FOREIGN KEY (`owner_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `items_item_modifiers` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `item_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `operation` INT UNSIGNED NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `maxProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `item_id` (`item_id`) USING BTREE,\n    KEY `operation` (`operation`) USING BTREE,\n    CONSTRAINT `FK_items_item_modifiers_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE CASCADE,\n    CONSTRAINT `FK_items_item_modifiers_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `objects_types` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `key` (`key`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `objects` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `room_id` INT UNSIGNED NOT NULL,\n    `layer_name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `tile_index` INT UNSIGNED DEFAULT NULL,\n    `class_type` INT UNSIGNED DEFAULT NULL,\n    `object_class_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `client_key` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `title` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `private_params` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    `client_params` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    `enabled` TINYINT DEFAULT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `object_class_key` (`object_class_key`) USING BTREE,\n    UNIQUE KEY `room_id_layer_name_tile_index` (`room_id`,`layer_name`,`tile_index`) USING BTREE,\n    KEY `room_id` (`room_id`) USING BTREE,\n    KEY `class_type` (`class_type`) USING BTREE,\n    CONSTRAINT `FK_objects_objects_types` FOREIGN KEY (`class_type`) REFERENCES `objects_types` (`id`) ON UPDATE CASCADE,\n    CONSTRAINT `FK_objects_rooms` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `objects_animations` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `object_id` INT UNSIGNED NOT NULL,\n    `animationKey` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `animationData` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `object_id_animationKey` (`object_id`,`animationKey`),\n    KEY `id` (`id`) USING BTREE,\n    KEY `object_id` (`object_id`) USING BTREE,\n    CONSTRAINT `FK_objects_animations_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `objects_assets` (\n    `object_asset_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `object_id` INT UNSIGNED NOT NULL,\n    `asset_type` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `asset_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `asset_file` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `extra_params` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    PRIMARY KEY (`object_asset_id`) USING BTREE,\n    KEY `object_id` (`object_id`) USING BTREE,\n    CONSTRAINT `FK_objects_assets_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `objects_items_inventory` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `owner_id` INT UNSIGNED NOT NULL,\n    `item_id` INT UNSIGNED NOT NULL,\n    `qty` INT NOT NULL DEFAULT '0',\n    `remaining_uses` INT DEFAULT NULL,\n    `is_active` TINYINT DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `FK_items_inventory_items_item` (`item_id`) USING BTREE,\n    KEY `FK_objects_items_inventory_objects` (`owner_id`),\n    CONSTRAINT `FK_objects_items_inventory_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE CASCADE,\n    CONSTRAINT `FK_objects_items_inventory_objects` FOREIGN KEY (`owner_id`) REFERENCES `objects` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `objects_items_requirements` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `object_id` INT UNSIGNED NOT NULL,\n    `item_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n    `required_item_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n    `required_quantity` INT UNSIGNED NOT NULL DEFAULT '0',\n    `auto_remove_requirement` TINYINT UNSIGNED DEFAULT NULL,\n    PRIMARY KEY (`id`),\n    KEY `FK_objects_items_requirements_objects` (`object_id`),\n    KEY `FK_objects_items_requirements_items_item` (`item_key`),\n    KEY `FK_objects_items_requirements_items_item_2` (`required_item_key`),\n    CONSTRAINT `FK_objects_items_requirements_items_item` FOREIGN KEY (`item_key`) REFERENCES `items_item` (`key`),\n    CONSTRAINT `FK_objects_items_requirements_items_item_2` FOREIGN KEY (`required_item_key`) REFERENCES `items_item` (`key`),\n    CONSTRAINT `FK_objects_items_requirements_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `objects_items_rewards` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `object_id` INT UNSIGNED NOT NULL,\n    `item_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n    `reward_item_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\n    `reward_quantity` INT UNSIGNED NOT NULL DEFAULT '0',\n    `reward_item_is_required` TINYINT UNSIGNED DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `FK_objects_items_requirements_objects` (`object_id`) USING BTREE,\n    KEY `FK_objects_items_rewards_items_item` (`item_key`),\n    KEY `FK_objects_items_rewards_items_item_2` (`reward_item_key`),\n    CONSTRAINT `FK_objects_items_rewards_items_item` FOREIGN KEY (`item_key`) REFERENCES `items_item` (`key`),\n    CONSTRAINT `FK_objects_items_rewards_items_item_2` FOREIGN KEY (`reward_item_key`) REFERENCES `items_item` (`key`),\n    CONSTRAINT `FK_objects_items_rewards_object` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `rewards_modifiers` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `operation` INT UNSIGNED NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `minValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `maxValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `minProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `maxProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `modifier_id` (`key`) USING BTREE,\n    KEY `operation` (`operation`) USING BTREE,\n    CONSTRAINT `FK_rewards_modifiers_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `rewards` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `object_id` INT UNSIGNED NOT NULL,\n    `item_id` INT UNSIGNED DEFAULT NULL,\n    `modifier_id` INT UNSIGNED DEFAULT NULL,\n    `experience` INT UNSIGNED NOT NULL DEFAULT '0',\n    `drop_rate` INT UNSIGNED NOT NULL,\n    `drop_quantity` INT UNSIGNED NOT NULL,\n    `is_unique` TINYINT UNSIGNED DEFAULT NULL,\n    `was_given` TINYINT UNSIGNED DEFAULT NULL,\n    `has_drop_body` TINYINT UNSIGNED DEFAULT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `FK_rewards_items_item` (`item_id`) USING BTREE,\n    KEY `FK_rewards_objects` (`object_id`) USING BTREE,\n    KEY `FK_rewards_rewards_modifiers` (`modifier_id`) USING BTREE,\n    CONSTRAINT `FK_rewards_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`),\n    CONSTRAINT `FK_rewards_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`),\n    CONSTRAINT `FK_rewards_rewards_modifiers` FOREIGN KEY (`modifier_id`) REFERENCES `rewards_modifiers` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `drops_animations` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `item_id` INT UNSIGNED NOT NULL,\n    `asset_type` VARCHAR(255) NULL DEFAULT NULL COLLATE utf8mb4_unicode_ci,\n    `asset_key` VARCHAR(255) NOT NULL COLLATE utf8mb4_unicode_ci,\n    `file` VARCHAR(255) NOT NULL COLLATE utf8mb4_unicode_ci,\n    `extra_params` TEXT NULL DEFAULT NULL COLLATE utf8mb4_unicode_ci,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE INDEX `item_id_unique` (`item_id`) USING BTREE,\n    INDEX `item_id` (`item_id`) USING BTREE,\n    CONSTRAINT `FK_drops_animations_items_item` FOREIGN KEY (`item_id`) REFERENCES `items_item` (`id`) ON UPDATE CASCADE ON DELETE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_type` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `key` (`key`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_levels_set` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `autoFillRanges` TINYINT UNSIGNED DEFAULT NULL,\n    `autoFillExperienceMultiplier` INT UNSIGNED DEFAULT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `key` (`key`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_groups` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `description` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `sort` INT UNSIGNED NOT NULL DEFAULT '0',\n    PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `type` INT UNSIGNED NOT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `autoValidation` TINYINT DEFAULT NULL,\n    `skillDelay` INT NOT NULL,\n    `castTime` INT NOT NULL,\n    `usesLimit` INT NOT NULL DEFAULT '0',\n    `range` INT NOT NULL,\n    `rangeAutomaticValidation` TINYINT DEFAULT NULL,\n    `rangePropertyX` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `rangePropertyY` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `rangeTargetPropertyX` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `rangeTargetPropertyY` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `allowSelfTarget` TINYINT DEFAULT NULL,\n    `criticalChance` INT DEFAULT NULL,\n    `criticalMultiplier` INT DEFAULT NULL,\n    `criticalFixedValue` INT DEFAULT NULL,\n    `customData` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `key` (`key`) USING BTREE,\n    KEY `FK_skills_skill_skills_skill_type` (`type`) USING BTREE,\n    CONSTRAINT `FK_skills_skill_skills_skill_type` FOREIGN KEY (`type`) REFERENCES `skills_skill_type` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `objects_skills` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `object_id` INT UNSIGNED NOT NULL,\n    `skill_id` INT UNSIGNED NOT NULL,\n    `target_id` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `FK_objects_skills_objects` (`object_id`) USING BTREE,\n    KEY `FK_objects_skills_skills_skill` (`skill_id`) USING BTREE,\n    KEY `FK_objects_skills_target_options` (`target_id`) USING BTREE,\n    CONSTRAINT `FK_objects_skills_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`),\n    CONSTRAINT `FK_objects_skills_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`),\n    CONSTRAINT `FK_objects_skills_target_options` FOREIGN KEY (`target_id`) REFERENCES `target_options` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `objects_stats` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `object_id` INT UNSIGNED NOT NULL,\n    `stat_id` INT UNSIGNED NOT NULL,\n    `base_value` INT UNSIGNED NOT NULL,\n    `value` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `object_id_stat_id` (`object_id`,`stat_id`) USING BTREE,\n    KEY `stat_id` (`stat_id`) USING BTREE,\n    KEY `object_id` (`object_id`) USING BTREE,\n    CONSTRAINT `FK_object_current_stats_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,\n    CONSTRAINT `FK_objects_current_stats_objects_stats` FOREIGN KEY (`stat_id`) REFERENCES `stats` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `respawn` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `object_id` INT UNSIGNED NOT NULL,\n    `respawn_time` INT UNSIGNED NOT NULL DEFAULT '0',\n    `instances_limit` INT UNSIGNED NOT NULL DEFAULT '0',\n    `layer` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    KEY `respawn_object_id` (`object_id`),\n    CONSTRAINT `FK_respawn_objects` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_class_path` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `levels_set_id` INT UNSIGNED NOT NULL,\n    `enabled` TINYINT UNSIGNED DEFAULT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `key` (`key`),\n    KEY `levels_set_id` (`levels_set_id`),\n    CONSTRAINT `FK_skills_class_path_skills_levels_set` FOREIGN KEY (`levels_set_id`) REFERENCES `skills_levels_set` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_levels` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `key` INT UNSIGNED NOT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `required_experience` BIGINT UNSIGNED DEFAULT NULL,\n    `level_set_id` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `key_level_set_id` (`key`,`level_set_id`),\n    KEY `level_set_id` (`level_set_id`),\n    CONSTRAINT `FK_skills_levels_skills_levels_set` FOREIGN KEY (`level_set_id`) REFERENCES `skills_levels_set` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_class_level_up_animations` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `class_path_id` INT UNSIGNED DEFAULT NULL,\n    `level_id` INT UNSIGNED DEFAULT NULL,\n    `animationData` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `class_path_id_level_id` (`class_path_id`,`level_id`) USING BTREE,\n    KEY `FK_skills_class_level_up_skills_levels` (`level_id`) USING BTREE,\n    CONSTRAINT `FK_skills_class_level_up_skills_class_path` FOREIGN KEY (`class_path_id`) REFERENCES `skills_class_path` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,\n    CONSTRAINT `FK_skills_class_level_up_skills_levels` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_class_path_level_labels` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `class_path_id` INT UNSIGNED NOT NULL,\n    `level_id` INT UNSIGNED NOT NULL,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`),\n    UNIQUE KEY `class_path_id_level_key` (`class_path_id`,`level_id`) USING BTREE,\n    KEY `class_path_id` (`class_path_id`),\n    KEY `level_key` (`level_id`) USING BTREE,\n    CONSTRAINT `FK__skills_class_path` FOREIGN KEY (`class_path_id`) REFERENCES `skills_class_path` (`id`) ON UPDATE CASCADE,\n    CONSTRAINT `FK_skills_class_path_level_labels_skills_levels` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_class_path_level_skills` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `class_path_id` INT UNSIGNED NOT NULL,\n    `level_id` INT UNSIGNED NOT NULL,\n    `skill_id` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `class_path_id_level_id_skill_id` (`class_path_id`,`level_id`,`skill_id`) USING BTREE,\n    KEY `class_path_id` (`class_path_id`) USING BTREE,\n    KEY `skill_id` (`skill_id`) USING BTREE,\n    KEY `level_key` (`level_id`) USING BTREE,\n    CONSTRAINT `FK_skills_class_path_level_skills_skills_class_path` FOREIGN KEY (`class_path_id`) REFERENCES `skills_class_path` (`id`),\n    CONSTRAINT `FK_skills_class_path_level_skills_skills_levels_id` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`id`),\n    CONSTRAINT `FK_skills_class_path_level_skills_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_levels_modifiers` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `level_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `operation` INT UNSIGNED NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `minValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `maxValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `minProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `maxProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    PRIMARY KEY (`id`),\n    KEY `modifier_id` (`key`) USING BTREE,\n    KEY `level_key` (`level_id`) USING BTREE,\n    KEY `FK_skills_levels_modifiers_operation_types` (`operation`) USING BTREE,\n    CONSTRAINT `FK_skills_levels_modifiers_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE CASCADE ON DELETE NO ACTION,\n    CONSTRAINT `FK_skills_levels_modifiers_skills_levels` FOREIGN KEY (`level_id`) REFERENCES `skills_levels` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_levels_modifiers_conditions` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `levels_modifier_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `conditional` enum('eq','ne','lt','gt','le','ge') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `levels_modifier_id` (`levels_modifier_id`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_owners_class_path` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `class_path_id` INT UNSIGNED NOT NULL,\n    `owner_id` INT UNSIGNED NOT NULL,\n    `currentLevel` BIGINT UNSIGNED NOT NULL DEFAULT '0',\n    `currentExp` BIGINT UNSIGNED NOT NULL DEFAULT '0',\n    PRIMARY KEY (`id`) USING BTREE,\n    INDEX `level_set_id` (`class_path_id`) USING BTREE,\n    INDEX `FK_skills_owners_class_path_players` (`owner_id`) USING BTREE,\n    CONSTRAINT `FK_skills_owners_class_path_players` FOREIGN KEY (`owner_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,\n    CONSTRAINT `FK_skills_owners_class_path_skills_class_path` FOREIGN KEY (`class_path_id`) REFERENCES `skills_class_path` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_animations` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `skill_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `classKey` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `animationData` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `skill_id_key` (`skill_id`,`key`) USING BTREE,\n    KEY `id` (`id`) USING BTREE,\n    KEY `key` (`key`) USING BTREE,\n    KEY `skill_id` (`skill_id`) USING BTREE,\n    CONSTRAINT `FK_skills_skill_animations_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_attack` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `skill_id` INT UNSIGNED NOT NULL,\n    `affectedProperty` VARCHAR(255) NOT NULL COLLATE utf8mb4_unicode_ci,\n    `allowEffectBelowZero` TINYINT UNSIGNED NULL DEFAULT NULL,\n    `hitDamage` INT UNSIGNED NOT NULL,\n    `applyDirectDamage` TINYINT UNSIGNED NULL DEFAULT NULL,\n    `attackProperties` TEXT NULL DEFAULT NULL COLLATE utf8mb4_unicode_ci,\n    `defenseProperties` TEXT NULL DEFAULT NULL COLLATE utf8mb4_unicode_ci,\n    `aimProperties` TEXT NULL DEFAULT NULL COLLATE utf8mb4_unicode_ci,\n    `dodgeProperties` TEXT NULL DEFAULT NULL COLLATE utf8mb4_unicode_ci,\n    `dodgeFullEnabled` TINYINT NULL DEFAULT '1',\n    `dodgeOverAimSuccess` TINYINT NULL DEFAULT '1',\n    `damageAffected` TINYINT NULL DEFAULT NULL,\n    `criticalAffected` TINYINT NULL DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE INDEX `skill_id_unique` (`skill_id`) USING BTREE,\n    INDEX `skill_id` (`skill_id`) USING BTREE,\n    CONSTRAINT `FK__skills_skill_attack` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_group_relation` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `skill_id` INT UNSIGNED NOT NULL,\n    `group_id` INT UNSIGNED NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE INDEX `skill_id_unique` (`skill_id`) USING BTREE,\n    INDEX `group_id` (`group_id`) USING BTREE,\n    INDEX `skill_id` (`skill_id`) USING BTREE,\n    CONSTRAINT `FK__skills_groups` FOREIGN KEY (`group_id`) REFERENCES `skills_groups` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION,\n    CONSTRAINT `FK__skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_owner_conditions` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `skill_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `conditional` enum('eq','ne','lt','gt','le','ge') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `skill_id_property_key` (`skill_id`,`property_key`) USING BTREE,\n    KEY `skill_id` (`skill_id`) USING BTREE,\n    CONSTRAINT `FK_skills_skill_owner_conditions_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_owner_effects` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `skill_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `operation` INT UNSIGNED NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `minValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `maxValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `minProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `maxProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `skill_id` (`skill_id`) USING BTREE,\n    KEY `FK_skills_skill_owner_effects_operation_types` (`operation`),\n    CONSTRAINT `FK_skills_skill_owner_effects_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE CASCADE,\n    CONSTRAINT `FK_skills_skill_owner_effects_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_owner_effects_conditions` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `skill_owner_effect_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `conditional` enum('eq','ne','lt','gt','le','ge') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `skill_owner_effect_id` (`skill_owner_effect_id`) USING BTREE,\n    CONSTRAINT `FK_skills_skill_owner_effects_conditions_skill_owner_effects` FOREIGN KEY (`skill_owner_effect_id`) REFERENCES `skills_skill_owner_effects` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_physical_data` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `skill_id` INT UNSIGNED NOT NULL,\n    `magnitude` INT UNSIGNED NOT NULL,\n    `objectWidth` INT UNSIGNED NOT NULL,\n    `objectHeight` INT UNSIGNED NOT NULL,\n    `validateTargetOnHit` TINYINT UNSIGNED NULL DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE INDEX `skill_id` (`skill_id`) USING BTREE,\n    INDEX `attack_skill_id` (`skill_id`) USING BTREE,\n    CONSTRAINT `FK_skills_skill_physical_data_skills_skill` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE ON DELETE NO ACTION\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_target_effects` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `skill_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `operation` INT UNSIGNED NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `minValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `maxValue` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `minProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `maxProperty` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `skill_id` (`skill_id`) USING BTREE,\n    KEY `FK_skills_skill_target_effects_operation_types` (`operation`),\n    CONSTRAINT `FK_skills_skill_effect_modifiers` FOREIGN KEY (`skill_id`) REFERENCES `skills_skill` (`id`) ON UPDATE CASCADE,\n    CONSTRAINT `FK_skills_skill_target_effects_operation_types` FOREIGN KEY (`operation`) REFERENCES `operation_types` (`key`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `skills_skill_target_effects_conditions` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `skill_target_effect_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `property_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `conditional` enum('eq','ne','lt','gt','le','ge') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `value` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `skill_target_effect_id` (`skill_target_effect_id`) USING BTREE,\n    CONSTRAINT `FK_skills_skill_target_effects_conditions_skill_target_effects` FOREIGN KEY (`skill_target_effect_id`) REFERENCES `skills_skill_target_effects` (`id`) ON UPDATE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `snippets` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `locale_id` INT UNSIGNED NOT NULL,\n    `key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `value` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`),\n    KEY `locale_id` (`locale_id`),\n    CONSTRAINT `FK_snippets_locale` FOREIGN KEY (`locale_id`) REFERENCES `locale` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `users_locale` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `locale_id` INT UNSIGNED DEFAULT NULL,\n    `user_id` INT UNSIGNED DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    UNIQUE KEY `locale_id_player_id` (`locale_id`,`user_id`) USING BTREE,\n    KEY `locale_id` (`locale_id`) USING BTREE,\n    KEY `player_id` (`user_id`) USING BTREE,\n    CONSTRAINT `FK_players_locale_locale` FOREIGN KEY (`locale_id`) REFERENCES `locale` (`id`),\n    CONSTRAINT `FK_users_locale_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `users_login` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `user_id` INT UNSIGNED NOT NULL,\n    `login_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `logout_date` TIMESTAMP NULL DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `user_id` (`user_id`) USING BTREE,\n    CONSTRAINT `FK_users_login_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `scores` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `player_id` INT UNSIGNED NOT NULL,\n    `total_score` INT UNSIGNED NOT NULL,\n    `players_kills_count` INT UNSIGNED NOT NULL,\n    `npcs_kills_count` INT UNSIGNED NOT NULL,\n    `last_player_kill_time` DATETIME DEFAULT NULL,\n    `last_npc_kill_time` DATETIME DEFAULT NULL,\n    `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n    PRIMARY KEY (`id`) USING BTREE,\n    INDEX `player_id` (`player_id`) USING BTREE,\n    CONSTRAINT `FK_scores_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE CASCADE ON DELETE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `scores_detail` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `player_id` INT UNSIGNED NOT NULL,\n    `obtained_score` INT UNSIGNED NOT NULL,\n    `kill_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    `kill_player_id` INT UNSIGNED NULL DEFAULT NULL,\n    `kill_npc_id` INT UNSIGNED NULL DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    INDEX `player_id` (`player_id`) USING BTREE,\n    CONSTRAINT `FK_scores_detail_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE CASCADE ON DELETE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `rewards_events` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `label` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `description` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n    `handler_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `event_key` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `event_data` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,\n    `position` INT UNSIGNED NOT NULL DEFAULT '0',\n    `enabled` TINYINT DEFAULT NULL,\n    `active_from` DATETIME DEFAULT NULL,\n    `active_to` DATETIME DEFAULT NULL,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `event_key` (`event_key`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\nCREATE TABLE IF NOT EXISTS `rewards_events_state` (\n    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n    `rewards_events_id` INT UNSIGNED NOT NULL,\n    `player_id` INT UNSIGNED NOT NULL,\n    `state` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,\n    PRIMARY KEY (`id`) USING BTREE,\n    KEY `rewards_events_id` (`rewards_events_id`) USING BTREE,\n    KEY `user_id` (`player_id`) USING BTREE,\n    CONSTRAINT `FK__rewards_events` FOREIGN KEY (`rewards_events_id`) REFERENCES `rewards_events` (`id`),\n    CONSTRAINT `FK_rewards_events_state_players` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "migrations/production/reldens-sample-data-v4.0.0.sql",
    "content": "--\n\nSET FOREIGN_KEY_CHECKS = 0;\n\n--\n\nTRUNCATE `ads`;\nTRUNCATE `ads_banner`;\nTRUNCATE `ads_event_video`;\nTRUNCATE `ads_played`;\nTRUNCATE `ads_providers`;\nTRUNCATE `audio`;\nTRUNCATE `audio_categories`;\nTRUNCATE `audio_markers`;\nTRUNCATE `audio_player_config`;\nTRUNCATE `chat`;\nTRUNCATE `clan`;\nTRUNCATE `clan_levels_modifiers`;\nTRUNCATE `clan_members`;\nTRUNCATE `drops_animations`;\nTRUNCATE `items_group`;\nTRUNCATE `items_inventory`;\nTRUNCATE `items_item`;\nTRUNCATE `items_item_modifiers`;\nTRUNCATE `objects`;\nTRUNCATE `objects_animations`;\nTRUNCATE `objects_assets`;\nTRUNCATE `objects_items_inventory`;\nTRUNCATE `objects_items_requirements`;\nTRUNCATE `objects_items_rewards`;\nTRUNCATE `objects_skills`;\nTRUNCATE `objects_stats`;\nTRUNCATE `players`;\nTRUNCATE `players_state`;\nTRUNCATE `players_stats`;\nTRUNCATE `respawn`;\nTRUNCATE `rewards`;\nTRUNCATE `rewards_modifiers`;\nTRUNCATE `rewards_events`;\nTRUNCATE `rewards_events_state`;\nTRUNCATE `rooms`;\nTRUNCATE `rooms_change_points`;\nTRUNCATE `rooms_return_points`;\nTRUNCATE `scores`;\nTRUNCATE `scores_detail`;\nTRUNCATE `skills_class_level_up_animations`;\nTRUNCATE `skills_class_path`;\nTRUNCATE `skills_class_path_level_labels`;\nTRUNCATE `skills_class_path_level_skills`;\nTRUNCATE `skills_groups`;\nTRUNCATE `skills_levels`;\nTRUNCATE `skills_levels_modifiers`;\nTRUNCATE `skills_levels_modifiers_conditions`;\nTRUNCATE `skills_levels_set`;\nTRUNCATE `skills_owners_class_path`;\nTRUNCATE `skills_skill`;\nTRUNCATE `skills_skill_animations`;\nTRUNCATE `skills_skill_attack`;\nTRUNCATE `skills_skill_group_relation`;\nTRUNCATE `skills_skill_owner_conditions`;\nTRUNCATE `skills_skill_owner_effects`;\nTRUNCATE `skills_skill_owner_effects_conditions`;\nTRUNCATE `skills_skill_physical_data`;\nTRUNCATE `skills_skill_target_effects`;\nTRUNCATE `skills_skill_target_effects_conditions`;\nTRUNCATE `snippets`;\nTRUNCATE `stats`;\nTRUNCATE `users`;\nTRUNCATE `users_locale`;\n\nREPLACE INTO `ads` (`id`, `key`, `provider_id`, `type_id`, `width`, `height`, `position`, `top`, `bottom`, `left`, `right`, `replay`, `enabled`) VALUES\n\t(3, 'fullTimeBanner', 1, 1, 320, 50, NULL, NULL, 0, NULL, 80, NULL, 0),\n\t(4, 'ui-banner', 1, 1, 320, 50, NULL, NULL, 80, NULL, 80, NULL, 0),\n\t(5, 'crazy-games-sample-video', 1, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0),\n\t(6, 'game-monetize-sample-video', 2, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0);\n\nREPLACE INTO `ads_banner` (`id`, `ads_id`, `banner_data`) VALUES\n\t(1, 3, '{\"fullTime\": true}'),\n\t(2, 4, '{\"uiReferenceIds\":[\"box-open-clan\",\"equipment-open\",\"inventory-open\",\"player-stats-open\"]}');\n\nREPLACE INTO `ads_event_video` (`id`, `ads_id`, `event_key`, `event_data`) VALUES\n\t(1, 5, 'activatedRoom_ReldensTown', '{\"rewardItemKey\":\"coins\",\"rewardItemQty\":1}'),\n\t(2, 6, 'activatedRoom_ReldensForest', '{\"rewardItemKey\":\"coins\",\"rewardItemQty\":1}');\n\nREPLACE INTO `ads_providers` (`id`, `key`, `enabled`) VALUES\n\t(1, 'crazyGames', 0),\n\t(2, 'gameMonetize', 0);\n\nREPLACE INTO `audio` (`id`, `audio_key`, `files_name`, `config`, `room_id`, `category_id`, `enabled`) VALUES\n\t(3, 'footstep', 'footstep.mp3', '{\"onlyCurrentPlayer\":true}', NULL, 3, 1),\n\t(4, 'reldens-town', 'reldens-town.mp3', '', 4, 1, 1);\n\nREPLACE INTO `audio_categories` (`id`, `category_key`, `category_label`, `enabled`, `single_audio`) VALUES\n\t(1, 'music', 'Music', 1, 1),\n\t(3, 'sound', 'Sound', 1, 0);\n\nREPLACE INTO `audio_markers` (`id`, `audio_id`, `marker_key`, `start`, `duration`, `config`) VALUES\n\t(1, 4, 'ReldensTown', 0, 41, NULL),\n\t(2, 3, 'journeyman_right', 0, 1, NULL),\n\t(3, 3, 'journeyman_left', 0, 1, NULL),\n\t(4, 3, 'journeyman_up', 0, 1, NULL),\n\t(5, 3, 'journeyman_down', 0, 1, NULL),\n\t(6, 3, 'r_journeyman_right', 0, 1, NULL),\n\t(7, 3, 'r_journeyman_left', 0, 1, NULL),\n\t(8, 3, 'r_journeyman_up', 0, 1, NULL),\n\t(9, 3, 'r_journeyman_down', 0, 1, NULL),\n\t(10, 3, 'sorcerer_right', 0, 1, NULL),\n\t(11, 3, 'sorcerer_left', 0, 1, NULL),\n\t(12, 3, 'sorcerer_up', 0, 1, NULL),\n\t(13, 3, 'sorcerer_down', 0, 1, NULL),\n\t(14, 3, 'r_sorcerer_right', 0, 1, NULL),\n\t(15, 3, 'r_sorcerer_left', 0, 1, NULL),\n\t(16, 3, 'r_sorcerer_up', 0, 1, NULL),\n\t(17, 3, 'r_sorcerer_down', 0, 1, NULL),\n\t(18, 3, 'warlock_right', 0, 1, NULL),\n\t(19, 3, 'warlock_left', 0, 1, NULL),\n\t(20, 3, 'warlock_up', 0, 1, NULL),\n\t(21, 3, 'warlock_down', 0, 1, NULL),\n\t(22, 3, 'r_warlock_right', 0, 1, NULL),\n\t(23, 3, 'r_warlock_left', 0, 1, NULL),\n\t(24, 3, 'r_warlock_up', 0, 1, NULL),\n\t(25, 3, 'r_warlock_down', 0, 1, NULL),\n\t(26, 3, 'swordsman_right', 0, 1, NULL),\n\t(27, 3, 'swordsman_left', 0, 1, NULL),\n\t(28, 3, 'swordsman_up', 0, 1, NULL),\n\t(29, 3, 'swordsman_down', 0, 1, NULL),\n\t(30, 3, 'r_swordsman_right', 0, 1, NULL),\n\t(31, 3, 'r_swordsman_left', 0, 1, NULL),\n\t(32, 3, 'r_swordsman_up', 0, 1, NULL),\n\t(33, 3, 'r_swordsman_down', 0, 1, NULL),\n\t(34, 3, 'warrior_right', 0, 1, NULL),\n\t(35, 3, 'warrior_left', 0, 1, NULL),\n\t(36, 3, 'warrior_up', 0, 1, NULL),\n\t(37, 3, 'warrior_down', 0, 1, NULL),\n\t(38, 3, 'r_warrior_right', 0, 1, NULL),\n\t(39, 3, 'r_warrior_left', 0, 1, NULL),\n\t(40, 3, 'r_warrior_up', 0, 1, NULL),\n\t(41, 3, 'r_warrior_down', 0, 1, NULL);\n\nREPLACE INTO `items_group` (`id`, `key`, `label`, `description`, `files_name`, `sort`, `items_limit`, `limit_per_item`) VALUES\n\t(1, 'weapon', 'Weapon', 'All kinds of weapons.', 'weapon.png', 2, 1, 0),\n\t(2, 'shield', 'Shield', 'Protect with these items.', 'shield.png', 3, 1, 0),\n\t(3, 'armor', 'Armor', '', 'armor.png', 4, 1, 0),\n\t(4, 'boots', 'Boots', '', 'boots.png', 6, 1, 0),\n\t(5, 'gauntlets', 'Gauntlets', '', 'gauntlets.png', 5, 1, 0),\n\t(6, 'helmet', 'Helmet', '', 'helmet.png', 1, 1, 0);\n\nREPLACE INTO `items_item` (`id`, `key`, `type`, `group_id`, `label`, `description`, `qty_limit`, `uses_limit`, `useTimeOut`, `execTimeOut`, `customData`) VALUES\n\t(1, 'coins', 3, NULL, 'Coins', NULL, 0, 1, NULL, NULL, '{\"canBeDropped\": true}'),\n\t(2, 'branch', 10, NULL, 'Tree branch', 'An useless tree branch (for now)', 0, 1, NULL, NULL, '{\"canBeDropped\": true}'),\n\t(3, 'heal_potion_20', 5, NULL, 'Heal Potion', 'A heal potion that will restore 20 HP.', 0, 1, NULL, NULL, '{\"canBeDropped\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"usePlayerPosition\":true,\"followPlayer\":true,\"startsOnTarget\":true},\"removeAfterUse\":true}'),\n\t(4, 'axe', 1, 1, 'Axe', 'A short distance but powerful weapon.', 0, 0, NULL, NULL, '{\"canBeDropped\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"destroyOnComplete\":true,\"usePlayerPosition\":true,\"followPlayer\":true,\"startsOnTarget\":true}}'),\n\t(5, 'spear', 1, 1, 'Spear', 'A short distance but powerful weapon.', 0, 0, NULL, NULL, '{\"canBeDropped\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"destroyOnComplete\":true,\"usePlayerPosition\":true,\"followPlayer\":true,\"startsOnTarget\":true}}'),\n\t(6, 'magic_potion_20', 5, NULL, 'Magic Potion', 'A magic potion that will restore 20 MP.', 0, 1, NULL, NULL, '{\"canBeDropped\":true,\"animationData\":{\"frameWidth\":64,\"frameHeight\":64,\"start\":6,\"end\":11,\"repeat\":0,\"usePlayerPosition\":true,\"followPlayer\":true,\"startsOnTarget\":true},\"removeAfterUse\":true}');\n\nREPLACE INTO `items_item_modifiers` (`id`, `item_id`, `key`, `property_key`, `operation`, `value`, `maxProperty`) VALUES\n\t(1, 4, 'atk', 'stats/atk', 5, '5', NULL),\n\t(2, 3, 'heal_potion_20', 'stats/hp', 1, '20', 'statsBase/hp'),\n\t(3, 5, 'atk', 'stats/atk', 5, '3', NULL),\n\t(4, 6, 'magic_potion_20', 'stats/mp', 1, '20', 'statsBase/mp');\n\nREPLACE INTO `objects` (`id`, `room_id`, `layer_name`, `tile_index`, `class_type`, `object_class_key`, `client_key`, `title`, `private_params`, `client_params`, `enabled`) VALUES\n\t(1, 4, 'ground-collisions', 444, 2, 'door_1', 'door_house_1', '', '{\"runOnHit\":true,\"roomVisible\":true,\"yFix\":6}', '{\"positionFix\":{\"y\":-18},\"frameStart\":0,\"frameEnd\":3,\"repeat\":0,\"hideOnComplete\":false,\"autoStart\":false,\"restartTime\":2000}', 1),\n\t(2, 8, 'respawn-area-monsters-lvl-1-2', NULL, 7, 'enemy_bot_1', 'enemy_forest_1', 'Tree', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true}', '{\"autoStart\":true}', 0),\n\t(3, 8, 'respawn-area-monsters-lvl-1-2', NULL, 7, 'enemy_bot_2', 'enemy_forest_2', 'Tree Punch', '{\"shouldRespawn\":true,\"childObjectType\":4}', '{\"autoStart\":true}', 0),\n\t(4, 4, 'ground-collisions', 951, 2, 'door_2', 'door_house_2', '', '{\"runOnHit\":true,\"roomVisible\":true,\"yFix\":6}', '{\"positionFix\":{\"y\":-18},\"frameStart\":0,\"frameEnd\":3,\"repeat\":0,\"hideOnComplete\":false,\"autoStart\":false,\"restartTime\":2000}', 1),\n\t(5, 4, 'house-collisions-over-player', 535, 3, 'npc_1', 'people_town_1', 'Alfred', '{\"runOnAction\":true,\"playerVisible\":true}', '{\"content\":\"Hello! My name is Alfred. Go to the forest and kill some monsters! Now... leave me alone!\"}', 1),\n\t(6, 5, 'respawn-area-monsters-lvl-1-2', NULL, 7, 'enemy_1', 'enemy_forest_1', 'Tree', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true}', '{\"autoStart\":true}', 1),\n\t(7, 5, 'respawn-area-monsters-lvl-1-2', NULL, 7, 'enemy_2', 'enemy_forest_2', 'Tree Punch', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true,\"interactionRadio\":70}', '{\"autoStart\":true}', 1),\n\t(8, 4, 'house-collisions-over-player', 538, 3, 'npc_2', 'healer_1', 'Mamon', '{\"runOnAction\":true,\"playerVisible\":true,\"sendInvalidOptionMessage\":true}', '{\"content\":\"Hello traveler! I can restore your health, would you like me to do it?\",\"options\":{\"1\":{\"label\":\"Heal HP\",\"value\":1},\"2\":{\"label\":\"Nothing...\",\"value\":2},\"3\":{\"label\":\"Need some MP\",\"value\":3}},\"ui\":true}', 1),\n\t(10, 4, 'house-collisions-over-player', 560, 5, 'npc_3', 'merchant_1', 'Gimly', '{\"runOnAction\":true,\"playerVisible\":true,\"sendInvalidOptionMessage\":true}', '{\"content\":\"Hi there! What would you like to do?\",\"options\":{\"buy\":{\"label\":\"Buy\",\"value\":\"buy\"},\"sell\":{\"label\":\"Sell\",\"value\":\"sell\"}}}', 1),\n\t(12, 4, 'house-collisions-over-player', 562, 3, 'npc_4', 'weapons_master_1', 'Barrik', '{\"runOnAction\":true,\"playerVisible\":true,\"sendInvalidOptionMessage\":true}', '{\"content\":\"Hi, I am the weapons master, choose your weapon and go kill some monsters!\",\"options\":{\"1\":{\"key\":\"axe\",\"label\":\"Axe\",\"value\":1,\"icon\":\"axe\"},\"2\":{\"key\":\"spear\",\"label\":\"Spear\",\"value\":2,\"icon\":\"spear\"}},\"ui\":true}', 1),\n\t(13, 5, 'forest-collisions', 258, 3, 'npc_5', 'quest_npc_1', 'Miles', '{\"runOnAction\":true,\"playerVisible\":true,\"sendInvalidOptionMessage\":true}', '{\"content\":\"Hi there! Do you want a coin? I can give you one if you give me a tree branch.\",\"options\":{\"1\":{\"label\":\"Sure!\",\"value\":1},\"2\":{\"label\":\"No, thank you.\",\"value\":2}},\"ui\":true}', 1),\n\t(14, 9, 'ground-respawn-area', NULL, 7, 'enemy_bot_b1', 'enemy_forest_1', 'Tree', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true,\"interactionRadio\":120}', '{\"autoStart\":true}', 1),\n\t(15, 9, 'ground-respawn-area', NULL, 7, 'enemy_bot_b2', 'enemy_forest_2', 'Tree Punch', '{\"shouldRespawn\":true,\"childObjectType\":4,\"isAggressive\":true,\"interactionRadio\":70}', '{\"autoStart\":true}', 1);\n\nREPLACE INTO `objects_animations` (`id`, `object_id`, `animationKey`, `animationData`) VALUES\n\t(5, 6, 'respawn-area-monsters-lvl-1-2_6_right', '{\"start\":6,\"end\":8}'),\n\t(6, 6, 'respawn-area-monsters-lvl-1-2_6_down', '{\"start\":0,\"end\":2}'),\n\t(7, 6, 'respawn-area-monsters-lvl-1-2_6_left', '{\"start\":3,\"end\":5}'),\n\t(8, 6, 'respawn-area-monsters-lvl-1-2_6_up', '{\"start\":9,\"end\":11}');\n\nREPLACE INTO `objects_assets` (`object_asset_id`, `object_id`, `asset_type`, `asset_key`, `asset_file`, `extra_params`) VALUES\n\t(1, 1, 'spritesheet', 'door_house_1', 'door-a-x2.png', '{\"frameWidth\":32,\"frameHeight\":58}'),\n\t(2, 4, 'spritesheet', 'door_house_2', 'door-a-x2.png', '{\"frameWidth\":32,\"frameHeight\":58}'),\n\t(3, 5, 'spritesheet', 'people_town_1', 'people-b-x2.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n\t(4, 2, 'spritesheet', 'enemy_forest_1', 'monster-treant.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n\t(5, 6, 'spritesheet', 'enemy_forest_1', 'monster-treant.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n\t(6, 7, 'spritesheet', 'enemy_forest_2', 'monster-golem2.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n\t(7, 5, 'spritesheet', 'healer_1', 'healer-1.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n\t(8, 3, 'spritesheet', 'enemy_forest_2', 'monster-golem2.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n\t(9, 10, 'spritesheet', 'merchant_1', 'people-d-x2.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n\t(10, 12, 'spritesheet', 'weapons_master_1', 'people-c-x2.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n\t(11, 13, 'spritesheet', 'quest_npc_1', 'people-quest-npc.png', '{\"frameWidth\":52,\"frameHeight\":71}'),\n    (12, 14, 'spritesheet', 'enemy_forest_1', 'monster-treant.png', '{\"frameWidth\":47,\"frameHeight\":50}'),\n    (13, 15, 'spritesheet', 'enemy_forest_2', 'monster-golem2.png', '{\"frameWidth\":47,\"frameHeight\":50}');\n\nREPLACE INTO `objects_items_inventory` (`id`, `owner_id`, `item_id`, `qty`, `remaining_uses`, `is_active`) VALUES\n\t(2, 10, 4, -1, -1, 0),\n\t(3, 10, 5, -1, -1, 0),\n\t(5, 10, 3, -1, 1, 0),\n\t(6, 10, 6, -1, 1, 0);\n\nREPLACE INTO `objects_items_requirements` (`id`, `object_id`, `item_key`, `required_item_key`, `required_quantity`, `auto_remove_requirement`) VALUES\n\t(1, 10, 'axe', 'coins', 5, 1),\n\t(2, 10, 'spear', 'coins', 2, 1),\n\t(3, 10, 'heal_potion_20', 'coins', 2, 1),\n\t(5, 10, 'magic_potion_20', 'coins', 2, 1);\n\nREPLACE INTO `objects_items_rewards` (`id`, `object_id`, `item_key`, `reward_item_key`, `reward_quantity`, `reward_item_is_required`) VALUES\n\t(1, 10, 'axe', 'coins', 2, 0),\n\t(2, 10, 'spear', 'coins', 1, 0),\n\t(3, 10, 'heal_potion_20', 'coins', 1, 0),\n\t(5, 10, 'magic_potion_20', 'coins', 1, 0);\n\nREPLACE INTO `drops_animations` (`id`, `item_id`, `asset_type`, `asset_key`, `file`, `extra_params`) VALUES\n    (1, 1, NULL, 'coins', 'coins.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n\t(2, 2, NULL, 'branch', 'branch.png', '{\"start\":0,\"end\":2,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n    (3, 3, NULL, 'heal-potion-20', 'heal-potion-20.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n\t(4, 4, NULL, 'axe', 'axe.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n    (5, 5, NULL, 'spear', 'spear.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}'),\n    (6, 6, NULL, 'magic-potion-20', 'magic-potion-20.png', '{\"start\":0,\"end\":0,\"repeat\":-1,\"frameWidth\":32, \"frameHeight\":32,\"depthByPlayer\":\"above\"}');\n\nREPLACE INTO `objects_skills` (`id`, `object_id`, `skill_id`, `target_id`) VALUES\n\t(1, 6, 1, 2);\n\nREPLACE INTO `objects_stats` (`id`, `object_id`, `stat_id`, `base_value`, `value`) VALUES\n\t(1, 2, 1, 50, 50),\n    (2, 2, 2, 50, 50),\n    (3, 2, 3, 50, 50),\n    (4, 2, 4, 50, 50),\n    (5, 2, 5, 50, 50),\n    (6, 2, 6, 50, 50),\n    (7, 2, 7, 50, 50),\n    (8, 2, 8, 50, 50),\n    (9, 2, 9, 50, 50),\n    (10, 2, 10, 50, 50),\n    (11, 3, 1, 50, 50),\n    (12, 3, 2, 50, 50),\n    (13, 3, 3, 50, 50),\n    (14, 3, 4, 50, 50),\n    (15, 3, 5, 50, 50),\n    (16, 3, 6, 50, 50),\n    (17, 3, 7, 50, 50),\n    (18, 3, 8, 50, 50),\n    (19, 3, 9, 50, 50),\n    (20, 3, 10, 50, 50),\n    (21, 6, 1, 50, 50),\n    (22, 6, 2, 50, 50),\n    (23, 6, 3, 50, 50),\n    (24, 6, 4, 50, 50),\n    (25, 6, 5, 50, 50),\n    (26, 6, 6, 50, 50),\n    (27, 6, 7, 50, 50),\n    (28, 6, 8, 50, 50),\n    (29, 6, 9, 50, 50),\n    (30, 6, 10, 50, 50),\n    (31, 7, 1, 50, 50),\n    (32, 7, 2, 50, 50),\n    (33, 7, 3, 50, 50),\n    (34, 7, 4, 50, 50),\n    (35, 7, 5, 50, 50),\n    (36, 7, 6, 50, 50),\n    (37, 7, 7, 50, 50),\n    (38, 7, 8, 50, 50),\n    (39, 7, 9, 50, 50),\n    (40, 7, 10, 50, 50),\n    (41, 14, 1, 50, 50),\n    (42, 14, 2, 50, 50),\n    (43, 14, 3, 50, 50),\n    (44, 14, 4, 50, 50),\n    (45, 14, 5, 50, 50),\n    (46, 14, 6, 50, 50),\n    (47, 14, 7, 50, 50),\n    (48, 14, 8, 50, 50),\n    (49, 14, 9, 50, 50),\n    (50, 14, 10, 50, 50),\n    (51, 15, 1, 50, 50),\n    (52, 15, 2, 50, 50),\n    (53, 15, 3, 50, 50),\n    (54, 15, 4, 50, 50),\n    (55, 15, 5, 50, 50),\n    (56, 15, 6, 50, 50),\n    (57, 15, 7, 50, 50),\n    (58, 15, 8, 50, 50),\n    (59, 15, 9, 50, 50),\n    (60, 15, 10, 50, 50);\n\nREPLACE INTO `players` (`id`, `user_id`, `name`, `created_at`) VALUES\n\t(1, 1, 'ImRoot', '2022-03-17 19:57:50');\n\nREPLACE INTO `players_state` (`id`, `player_id`, `room_id`, `x`, `y`, `dir`) VALUES\n\t(1, 1, 5, 332, 288, 'down');\n\nREPLACE INTO `players_stats` (`id`, `player_id`, `stat_id`, `base_value`, `value`) VALUES\n\t(1, 1, 1, 280, 81),\n\t(2, 1, 2, 280, 85),\n\t(3, 1, 3, 280, 400),\n\t(4, 1, 4, 280, 280),\n\t(5, 1, 5, 100, 100),\n\t(6, 1, 6, 100, 100),\n\t(7, 1, 7, 100, 100),\n\t(8, 1, 8, 100, 100),\n\t(9, 1, 9, 100, 100),\n\t(10, 1, 10, 100, 100);\n\nREPLACE INTO `respawn` (`id`, `object_id`, `respawn_time`, `instances_limit`, `layer`) VALUES\n    (1, 2, 20000, 10, 'respawn-area-monsters-lvl-1-2'),\n    (2, 3, 10000, 20, 'respawn-area-monsters-lvl-1-2'),\n\t(3, 6, 20000, 2, 'respawn-area-monsters-lvl-1-2'),\n\t(4, 7, 10000, 3, 'respawn-area-monsters-lvl-1-2'),\n    (5, 14, 20000, 100, 'ground-respawn-area'),\n    (6, 15, 10000, 200, 'ground-respawn-area');\n\nREPLACE INTO `rewards` (`id`, `object_id`, `item_id`, `modifier_id`, `experience`, `drop_rate`, `drop_quantity`, `is_unique`, `was_given`, `has_drop_body`) VALUES\n\t(1, 2, 2, NULL, 10, 100, 3, 0, 0, 1),\n\t(2, 3, 2, NULL, 10, 100, 1, 0, 0, 1),\n\t(3, 6, 2, NULL, 10, 100, 3, 0, 0, 1),\n\t(4, 7, 2, NULL, 10, 100, 1, 0, 0, 1),\n\t(5, 14, 2, NULL, 10, 100, 3, 0, 0, 1),\n\t(6, 15, 2, NULL, 10, 100, 1, 0, 0, 1);\n\nREPLACE INTO `rewards_events` (`id`, `label`, `description`, `handler_key`, `event_key`, `event_data`, `position`, `enabled`, `active_from`, `active_to`) VALUES\n    (1, 'rewards.dailyLogin', 'rewards.dailyDescription', 'login', 'reldens.joinRoomEnd', '{\"action\":\"dailyLogin\",\"items\":{\"coins\":1}}', 0, 1, NULL, NULL),\n    (2, 'rewards.straightDaysLogin', 'rewards.straightDaysDescription', 'login', 'reldens.joinRoomEnd', '{\"action\":\"straightDaysLogin\",\"days\":2,\"items\":{\"coins\":10}}', 0, 1, NULL, NULL);\n\nREPLACE INTO `rooms` (`id`, `name`, `title`, `map_filename`, `scene_images`, `room_class_key`, `customData`) VALUES\n\t(2, 'reldens-house-1', 'House - 1', 'reldens-house-1.json', 'reldens-house-1.png', NULL, '{\"allowGuest\":true}'),\n\t(3, 'reldens-house-2', 'House - 2', 'reldens-house-2.json', 'reldens-house-2.png', NULL, '{\"allowGuest\":true}'),\n\t(4, 'reldens-town', 'Town', 'reldens-town.json', 'reldens-town.png', NULL, '{\"allowGuest\":true}'),\n\t(5, 'reldens-forest', 'Forest', 'reldens-forest.json', 'reldens-forest.png', NULL, '{\"allowGuest\":true}'),\n\t(6, 'reldens-house-1-2d-floor', 'House - 1 - Floor 2', 'reldens-house-1-2d-floor.json', 'reldens-house-1-2d-floor.png', NULL, NULL),\n\t(7, 'reldens-gravity', 'Gravity World!', 'reldens-gravity.json', 'reldens-gravity.png', NULL, '{\"allowGuest\":true,\"gravity\":[0,625],\"applyGravity\":true,\"allowPassWallsFromBelow\":true,\"timeStep\":0.012,\"type\":\"TOP_DOWN_WITH_GRAVITY\",\"useFixedWorldStep\":false,\"maxSubSteps\":2,\"movementSpeed\":160,\"usePathFinder\":false}'),\n    (8, 'reldens-bots', 'Bots Test', 'reldens-bots.json', 'reldens-forest.png', NULL, '{\"allowGuest\":true}'),\n    (9, 'reldens-bots-forest', 'Bots Forest', 'reldens-bots-forest.json', 'reldens-bots-forest.png', NULL, '{\"allowGuest\":true,\"joinInRandomPlace\":true,\"joinInRandomPlaceGuestAlways\":true}'),\n    (10, 'reldens-bots-forest-house-01-n0', 'Bots Forest - House 1-0', 'reldens-bots-forest-house-01-n0.json', 'reldens-bots-forest-house-01-n0.png', NULL, '{\"allowGuest\":true}');\n\nREPLACE INTO `rooms_change_points` (`id`, `room_id`, `tile_index`, `next_room_id`) VALUES\n\t(1, 2, 816, 4),\n\t(2, 2, 817, 4),\n\t(3, 3, 778, 4),\n\t(4, 3, 779, 4),\n\t(5, 4, 444, 2),\n\t(6, 4, 951, 3),\n\t(7, 4, 18, 5),\n\t(8, 4, 19, 5),\n\t(9, 5, 1315, 4),\n\t(10, 5, 1316, 4),\n\t(11, 2, 623, 6),\n\t(12, 2, 663, 6),\n\t(13, 6, 624, 2),\n\t(14, 6, 664, 2),\n\t(15, 7, 540, 3),\n\t(16, 3, 500, 7),\n\t(17, 3, 780, 4),\n    (18, 9, 20349, 10),\n    (19, 10, 381, 9),\n    (20, 10, 382, 9);\n\nREPLACE INTO `rooms_return_points` (`id`, `room_id`, `direction`, `x`, `y`, `is_default`, `from_room_id`) VALUES\n\t(1, 2, 'up', 548, 615, 1, 4),\n\t(2, 3, 'up', 640, 600, 1, 4),\n\t(3, 4, 'down', 400, 345, 1, 2),\n\t(4, 4, 'down', 1266, 670, 0, 3),\n\t(5, 5, 'up', 640, 768, 0, 4),\n\t(6, 8, 'up', 640, 768, 0, 4),\n\t(7, 4, 'down', 615, 64, 0, 5),\n\t(9, 6, 'right', 820, 500, 0, 2),\n\t(11, 2, 'left', 720, 540, 0, 6),\n\t(12, 7, 'left', 340, 600, 0, NULL),\n\t(13, 3, 'down', 660, 520, 0, 7),\n\t(14, 9, 'down', 4500, 985, 1, NULL),\n    (15, 9, 'down', 1600, 4544, 0, 10),\n    (16, 10, 'up', 64, 544, 1, 9);\n\nREPLACE INTO `skills_class_level_up_animations` (`id`, `class_path_id`, `level_id`, `animationData`) VALUES\n\t(1, NULL, NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"heal_cast\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":3,\"repeat\":-1,\"destroyTime\":2000,\"depthByPlayer\":\"above\"}');\n\nREPLACE INTO `skills_class_path` (`id`, `key`, `label`, `levels_set_id`, `enabled`) VALUES\n\t(1, 'journeyman', 'Journeyman', 1, 1),\n\t(2, 'sorcerer', 'Sorcerer', 2, 1),\n\t(3, 'warlock', 'Warlock', 3, 1),\n\t(4, 'swordsman', 'Swordsman', 4, 1),\n\t(5, 'warrior', 'Warrior', 5, 1);\n\nREPLACE INTO `skills_class_path_level_labels` (`id`, `class_path_id`, `level_id`, `label`) VALUES\n\t(1, 1, 3, 'Old Traveler'),\n\t(2, 2, 7, 'Fire Master'),\n\t(3, 3, 11, 'Magus'),\n\t(4, 4, 15, 'Blade Master'),\n\t(5, 5, 19, 'Palading');\n\nREPLACE INTO `skills_class_path_level_skills` (`id`, `class_path_id`, `level_id`, `skill_id`) VALUES\n\t(1, 1, 1, 2),\n\t(2, 1, 3, 1),\n\t(3, 1, 4, 3),\n\t(4, 1, 4, 4),\n\t(5, 2, 5, 1),\n\t(6, 2, 7, 3),\n\t(7, 2, 8, 4),\n\t(8, 3, 9, 1),\n\t(9, 3, 11, 3),\n\t(10, 3, 12, 2),\n\t(11, 4, 13, 2),\n\t(12, 4, 15, 4),\n\t(13, 5, 17, 2),\n\t(14, 5, 19, 1),\n\t(15, 5, 20, 4);\n\nREPLACE INTO `skills_levels` (`id`, `key`, `label`, `required_experience`, `level_set_id`) VALUES\n\t(1, 1, '1', 0, 1),\n\t(2, 2, '2', 100, 1),\n\t(3, 5, '5', 338, 1),\n\t(4, 10, '10', 2570, 1),\n\t(5, 1, '1', 0, 2),\n\t(6, 2, '2', 100, 2),\n\t(7, 5, '5', 338, 2),\n\t(8, 10, '10', 2570, 2),\n\t(9, 1, '1', 0, 3),\n\t(10, 2, '2', 100, 3),\n\t(11, 5, '5', 338, 3),\n\t(12, 10, '10', 2570, 3),\n\t(13, 1, '1', 0, 4),\n\t(14, 2, '2', 100, 4),\n\t(15, 5, '5', 338, 4),\n\t(16, 10, '10', 2570, 4),\n\t(17, 1, '1', 0, 5),\n\t(18, 2, '2', 100, 5),\n\t(19, 5, '5', 338, 5),\n\t(20, 10, '10', 2570, 5);\n\nREPLACE INTO `skills_levels_modifiers` (`id`, `level_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES\n\t(1, 2, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(2, 2, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(3, 2, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(4, 2, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(5, 2, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(6, 2, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(7, 2, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(8, 2, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(9, 3, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(10, 3, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(11, 3, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(12, 3, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(13, 3, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(14, 3, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(15, 3, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(16, 3, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(17, 4, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(18, 4, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(19, 4, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(20, 4, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(21, 4, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(22, 4, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(23, 4, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(24, 4, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(25, 6, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(26, 6, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(27, 6, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(28, 6, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(29, 6, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(30, 6, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(31, 6, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(32, 6, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(33, 7, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(34, 7, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(35, 7, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(36, 7, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(37, 7, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(38, 7, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(39, 7, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(40, 7, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(41, 8, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(42, 8, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(43, 8, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(44, 8, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(45, 8, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(46, 8, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(47, 8, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(48, 8, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(49, 10, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(50, 10, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(51, 10, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(52, 10, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(53, 10, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(54, 10, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(55, 10, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(56, 10, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(57, 11, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(58, 11, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(59, 11, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(60, 11, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(61, 11, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(62, 11, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(63, 11, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(64, 11, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(65, 12, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(66, 12, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(67, 12, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(68, 12, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(69, 12, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(70, 12, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(71, 12, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(72, 12, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(73, 14, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(74, 14, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(75, 14, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(76, 14, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(77, 14, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(78, 14, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(79, 14, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(80, 14, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(81, 15, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(82, 15, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(83, 15, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(84, 15, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(85, 15, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(86, 15, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(87, 15, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(88, 15, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(89, 16, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(90, 16, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(91, 16, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(92, 16, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(93, 16, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(94, 16, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(95, 16, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(96, 16, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(97, 18, 'inc_atk', 'stats/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(98, 18, 'inc_def', 'stats/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(99, 18, 'inc_hp', 'stats/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(100, 18, 'inc_mp', 'stats/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(101, 18, 'inc_atk', 'statsBase/atk', 1, '10', NULL, NULL, NULL, NULL),\n\t(102, 18, 'inc_def', 'statsBase/def', 1, '10', NULL, NULL, NULL, NULL),\n\t(103, 18, 'inc_hp', 'statsBase/hp', 1, '10', NULL, NULL, NULL, NULL),\n\t(104, 18, 'inc_mp', 'statsBase/mp', 1, '10', NULL, NULL, NULL, NULL),\n\t(105, 19, 'inc_atk', 'stats/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(106, 19, 'inc_def', 'stats/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(107, 19, 'inc_hp', 'stats/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(108, 19, 'inc_mp', 'stats/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(109, 19, 'inc_atk', 'statsBase/atk', 1, '20', NULL, NULL, NULL, NULL),\n\t(110, 19, 'inc_def', 'statsBase/def', 1, '20', NULL, NULL, NULL, NULL),\n\t(111, 19, 'inc_hp', 'statsBase/hp', 1, '20', NULL, NULL, NULL, NULL),\n\t(112, 19, 'inc_mp', 'statsBase/mp', 1, '20', NULL, NULL, NULL, NULL),\n\t(113, 20, 'inc_atk', 'stats/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(114, 20, 'inc_def', 'stats/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(115, 20, 'inc_hp', 'stats/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(116, 20, 'inc_mp', 'stats/mp', 1, '50', NULL, NULL, NULL, NULL),\n\t(117, 20, 'inc_atk', 'statsBase/atk', 1, '50', NULL, NULL, NULL, NULL),\n\t(118, 20, 'inc_def', 'statsBase/def', 1, '50', NULL, NULL, NULL, NULL),\n\t(119, 20, 'inc_hp', 'statsBase/hp', 1, '50', NULL, NULL, NULL, NULL),\n\t(120, 20, 'inc_mp', 'statsBase/mp', 1, '50', NULL, NULL, NULL, NULL);\n\nREPLACE INTO `skills_levels_set` (`id`, `autoFillRanges`, `autoFillExperienceMultiplier`) VALUES\n\t(1, 1, NULL),\n\t(2, 1, NULL),\n\t(3, 1, NULL),\n\t(4, 1, NULL),\n\t(5, 1, NULL);\n\nREPLACE INTO `skills_owners_class_path` (`id`, `class_path_id`, `owner_id`, `currentLevel`, `currentExp`) VALUES\n\t(1, 1, 1, 10, 9080);\n\nREPLACE INTO `skills_skill` (`id`, `key`, `type`, `autoValidation`, `skillDelay`, `castTime`, `usesLimit`, `range`, `rangeAutomaticValidation`, `rangePropertyX`, `rangePropertyY`, `rangeTargetPropertyX`, `rangeTargetPropertyY`, `allowSelfTarget`, `criticalChance`, `criticalMultiplier`, `criticalFixedValue`, `customData`) VALUES\n\t(1, 'attackBullet', '4', 0, 1000, 0, 0, 250, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0, NULL),\n\t(2, 'attackShort', '2', 0, 600, 0, 0, 50, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0, NULL),\n\t(3, 'fireball', '4', 0, 5000, 2000, 0, 280, 1, 'state/x', 'state/y', NULL, NULL, 0, 10, 2, 0, NULL),\n\t(4, 'heal', '3', 0, 5000, 2000, 0, 100, 1, 'state/x', 'state/y', NULL, NULL, 1, 0, 1, 0, NULL);\n\nREPLACE INTO `skills_skill_animations` (`id`, `skill_id`, `key`, `classKey`, `animationData`) VALUES\n\t(1, 3, 'bullet', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"fireball_bullet\",\"frameWidth\":64,\"frameHeight\":64,\"start\":0,\"end\":3,\"repeat\":-1,\"frameRate\":1,\"dir\":3}'),\n\t(2, 3, 'cast', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"fireball_cast\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":3,\"repeat\":-1,\"destroyTime\":2000,\"depthByPlayer\":\"above\"}'),\n\t(3, 4, 'cast', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"heal_cast\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":3,\"repeat\":-1,\"destroyTime\":2000}'),\n\t(4, 4, 'hit', NULL, '{\"enabled\":true,\"type\":\"spritesheet\",\"img\":\"heal_hit\",\"frameWidth\":64,\"frameHeight\":70,\"start\":0,\"end\":4,\"repeat\":0,\"depthByPlayer\":\"above\"}');\n\nREPLACE INTO `skills_skill_attack` (`id`, `skill_id`, `affectedProperty`, `allowEffectBelowZero`, `hitDamage`, `applyDirectDamage`, `attackProperties`, `defenseProperties`, `aimProperties`, `dodgeProperties`, `dodgeFullEnabled`, `dodgeOverAimSuccess`, `damageAffected`, `criticalAffected`) VALUES\n\t(1, 1, 'stats/hp', 0, 3, 0, 'stats/atk,stats/speed', 'stats/def,stats/speed', 'stats/aim', 'stats/dodge', 0, 1, 0, 0),\n\t(2, 2, 'stats/hp', 0, 5, 0, 'stats/atk,stats/speed', 'stats/def,stats/speed', 'stats/aim', 'stats/dodge', 0, 1, 0, 0),\n\t(3, 3, 'stats/hp', 0, 7, 0, 'stats/mgk-atk,stats/speed', 'stats/mgk-def,stats/speed', 'stats/aim', 'stats/dodge', 0, 1, 0, 0);\n\nREPLACE INTO `skills_skill_owner_conditions` (`id`, `skill_id`, `key`, `property_key`, `conditional`, `value`) VALUES\n\t(1, 3, 'available_mp', 'stats/mp', 'ge', '5');\n\nREPLACE INTO `skills_skill_owner_effects` (`id`, `skill_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES\n\t(2, 3, 'dec_mp', 'stats/mp', 2, '5', '0', ' ', NULL, NULL),\n\t(3, 4, 'dec_mp', 'stats/mp', 2, '2', '0', '', NULL, NULL);\n\nREPLACE INTO `skills_skill_physical_data` (`id`, `skill_id`, `magnitude`, `objectWidth`, `objectHeight`, `validateTargetOnHit`) VALUES\n\t(1, 1, 350, 5, 5, 0),\n\t(2, 3, 550, 5, 5, 0);\n\nREPLACE INTO `skills_skill_target_effects` (`id`, `skill_id`, `key`, `property_key`, `operation`, `value`, `minValue`, `maxValue`, `minProperty`, `maxProperty`) VALUES\n\t(1, 4, 'heal', 'stats/hp', 1, '10', '0', '0', NULL, 'statsBase/hp');\n\nREPLACE INTO `stats` (`id`, `key`, `label`, `description`, `base_value`, `customData`) VALUES\n\t(1, 'hp', 'HP', 'Player life points', 100, '{\"showBase\":true}'),\n\t(2, 'mp', 'MP', 'Player magic points', 100, '{\"showBase\":true}'),\n\t(3, 'atk', 'Atk', 'Player attack points', 100, NULL),\n\t(4, 'def', 'Def', 'Player defense points', 100, NULL),\n\t(5, 'dodge', 'Dodge', 'Player dodge points', 100, NULL),\n\t(6, 'speed', 'Speed', 'Player speed point', 100, NULL),\n\t(7, 'aim', 'Aim', 'Player aim points', 100, NULL),\n\t(8, 'stamina', 'Stamina', 'Player stamina points', 100, '{\"showBase\":true}'),\n\t(9, 'mAtk', 'Magic Atk', 'Player magic attack', 100, NULL),\n\t(10, 'mDef', 'Magic Def', 'Player magic defense', 100, NULL);\n\n-- default user/password: root/root\nREPLACE INTO `users` (`id`, `email`, `username`, `password`, `role_id`, `status`, `created_at`, `updated_at`, `played_time`) VALUES\n\t(1, 'root@yourgame.com', 'root', '879abc0494b36a09f184fd8308ea18f2643d71263f145b1e40e2ec3546d42202:6a186aff4d69daadcd7940a839856b394b12f0aec64a5df745c83cf9d881dc9dcb121b03d946872571f214228684216df097305b68417a56403299b8b2388db3', 99, '1', '2022-03-17 18:57:44', '2023-10-21 16:51:55', 0);\n\nREPLACE INTO `users_locale` (`id`, `locale_id`, `user_id`) VALUES\n\t(1, 1, 1);\n\n--\n\nSET FOREIGN_KEY_CHECKS = 1;\n\n--\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"reldens\",\n    \"version\": \"4.0.0-beta.39.8\",\n    \"description\": \"Reldens - MMORPG Platform\",\n    \"author\": \"Damian A. Pastorini\",\n    \"license\": \"MIT\",\n    \"homepage\": \"https://www.reldens.com/\",\n    \"source\": false,\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git+https://github.com/damian-pastorini/reldens.git\"\n    },\n    \"keywords\": [\n        \"reldens\",\n        \"game\",\n        \"mmorpg\",\n        \"rpg\",\n        \"dwd\",\n        \"colyseus\",\n        \"phaser\",\n        \"parcel\",\n        \"nodejs\",\n        \"mmo\",\n        \"multiplayer\",\n        \"rol\",\n        \"platform\",\n        \"framework\",\n        \"javascript\",\n        \"js\",\n        \"script\"\n    ],\n    \"bugs\": {\n        \"url\": \"https://github.com/damian-pastorini/reldens/issues\"\n    },\n    \"engines\": {\n        \"node\": \">=20.0.0\"\n    },\n    \"bin\": {\n        \"reldens\": \"bin/reldens-commands.js\",\n        \"reldens-generate\": \"bin/generate.js\",\n        \"reldens-import\": \"bin/import.js\"\n    },\n    \"scripts\": {\n        \"test\": \"node tests/manager.js\"\n    },\n    \"dependencies\": {\n        \"@colyseus/core\": \"0.16.24\",\n        \"@colyseus/monitor\": \"0.16.7\",\n        \"@colyseus/schema\": \"3.0.76\",\n        \"@colyseus/ws-transport\": \"0.16.5\",\n        \"@parcel/bundler-default\": \"2.16.4\",\n        \"@parcel/compressor-raw\": \"2.16.4\",\n        \"@parcel/core\": \"2.16.4\",\n        \"@parcel/namer-default\": \"2.16.4\",\n        \"@parcel/optimizer-css\": \"2.16.4\",\n        \"@parcel/optimizer-data-url\": \"2.16.4\",\n        \"@parcel/optimizer-htmlnano\": \"2.16.4\",\n        \"@parcel/optimizer-image\": \"2.16.4\",\n        \"@parcel/optimizer-swc\": \"2.16.4\",\n        \"@parcel/packager-css\": \"2.16.4\",\n        \"@parcel/packager-html\": \"2.16.4\",\n        \"@parcel/packager-js\": \"2.16.4\",\n        \"@parcel/packager-raw\": \"2.16.4\",\n        \"@parcel/packager-raw-url\": \"2.16.4\",\n        \"@parcel/packager-svg\": \"2.16.4\",\n        \"@parcel/packager-ts\": \"2.16.4\",\n        \"@parcel/packager-wasm\": \"2.16.4\",\n        \"@parcel/packager-xml\": \"2.16.4\",\n        \"@parcel/resolver-default\": \"2.16.4\",\n        \"@parcel/runtime-browser-hmr\": \"2.16.4\",\n        \"@parcel/runtime-js\": \"2.16.4\",\n        \"@parcel/runtime-rsc\": \"2.16.4\",\n        \"@parcel/runtime-service-worker\": \"2.16.4\",\n        \"@parcel/transformer-babel\": \"2.16.4\",\n        \"@parcel/transformer-coffeescript\": \"2.16.4\",\n        \"@parcel/transformer-css\": \"2.16.4\",\n        \"@parcel/transformer-graphql\": \"2.16.4\",\n        \"@parcel/transformer-html\": \"2.16.4\",\n        \"@parcel/transformer-image\": \"2.16.4\",\n        \"@parcel/transformer-inline-string\": \"2.16.4\",\n        \"@parcel/transformer-js\": \"2.16.4\",\n        \"@parcel/transformer-json\": \"2.16.4\",\n        \"@parcel/transformer-jsonld\": \"2.16.4\",\n        \"@parcel/transformer-less\": \"2.16.4\",\n        \"@parcel/transformer-postcss\": \"2.16.4\",\n        \"@parcel/transformer-posthtml\": \"2.16.4\",\n        \"@parcel/transformer-pug\": \"2.16.4\",\n        \"@parcel/transformer-raw\": \"2.16.4\",\n        \"@parcel/transformer-react-refresh-wrap\": \"2.16.4\",\n        \"@parcel/transformer-sass\": \"2.16.4\",\n        \"@parcel/transformer-sugarss\": \"2.16.4\",\n        \"@parcel/transformer-svg\": \"2.16.4\",\n        \"@parcel/transformer-typescript-types\": \"2.16.4\",\n        \"@parcel/transformer-vue\": \"2.16.4\",\n        \"@parcel/transformer-webmanifest\": \"2.16.4\",\n        \"@parcel/transformer-worklet\": \"2.16.4\",\n        \"@parcel/transformer-xml\": \"2.16.4\",\n        \"@parcel/transformer-yaml\": \"2.16.4\",\n        \"@reldens/cms\": \"^0.59.0\",\n        \"@reldens/game-data-generator\": \"^0.25.0\",\n        \"@reldens/items-system\": \"^0.49.0\",\n        \"@reldens/modifiers\": \"^0.34.0\",\n        \"@reldens/server-utils\": \"^0.46.0\",\n        \"@reldens/skills\": \"^0.48.0\",\n        \"@reldens/storage\": \"^0.91.0\",\n        \"@reldens/tile-map-generator\": \"^0.31.0\",\n        \"@reldens/utils\": \"^0.54.0\",\n        \"@sendgrid/mail\": \"8.1.6\",\n        \"buffer\": \"6.0.3\",\n        \"colyseus.js\": \"0.16.22\",\n        \"core-js\": \"3.48.0\",\n        \"dotenv\": \"17.3.1\",\n        \"express-basic-auth\": \"1.2.1\",\n        \"firebase\": \"12.9.0\",\n        \"jimp\": \"1.6.0\",\n        \"mustache\": \"4.2.0\",\n        \"nodemailer\": \"8.0.1\",\n        \"p2\": \"0.7.1\",\n        \"pathfinding\": \"0.4.18\",\n        \"phaser\": \"3.90.0\",\n        \"regenerator-runtime\": \"0.14.1\",\n        \"tslib\": \"2.8.1\"\n    }\n}\n"
  },
  {
    "path": "server.js",
    "content": "/**\n *\n * Reldens - ServerManager\n *\n */\n\nconst { ServerManager } = require('./lib/game/server/manager');\n\nmodule.exports.ServerManager = ServerManager;\n"
  },
  {
    "path": "tests/base-test.js",
    "content": "/**\n *\n * Reldens - Base Test\n *\n */\n\nconst assert = require('assert');\nconst http = require('http');\nconst https = require('https');\nconst querystring = require('querystring');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger } = require('@reldens/utils');\n\nclass BaseTest\n{\n\n    constructor(config)\n    {\n        this.assert = assert;\n        this.testCount = 0;\n        this.passedCount = 0;\n        this.config = config;\n        this.breakOnError = config.breakOnError || false;\n        this.baseUrl = config.baseUrl;\n        this.adminPath = config.adminPath;\n        this.adminUser = config.adminUser;\n        this.adminPassword = config.adminPassword;\n        let parsedUrl = new URL(this.baseUrl);\n        this.hostname = parsedUrl.hostname;\n        this.port = parsedUrl.port || ('https:' === parsedUrl.protocol ? 443 : 80);\n        this.isHttps = 'https:' === parsedUrl.protocol;\n    }\n\n    async test(name, fn)\n    {\n        this.testCount++;\n        try {\n            await fn();\n            Logger.log(100, '', '✓ PASS: '+name);\n            this.passedCount++;\n        } catch(error){\n            Logger.log(100, '', '✗ FAIL: '+name);\n            Logger.log(100, '', 'Error: '+error.message);\n            if(this.breakOnError){\n                throw error;\n            }\n        }\n    }\n\n    async _makeHttpRequest(options, data)\n    {\n        return new Promise((resolve, reject) => {\n            let httpModule = this.isHttps ? https : http;\n            if(this.isHttps){\n                // required for local HTTPS testing with self-signed certificates:\n                // codeql[js/disabling-certificate-validation] - test code only\n                options.rejectUnauthorized = false;\n            }\n            let req = httpModule.request(options, (res) => {\n                let body = '';\n                res.on('data', (chunk) => body += chunk);\n                res.on('end', () => {\n                    resolve({\n                        statusCode: res.statusCode,\n                        headers: res.headers,\n                        body: body\n                    });\n                });\n            });\n            req.on('error', (error) => {\n                reject(error);\n            });\n            req.on('timeout', () => {\n                req.destroy();\n                reject(new Error('Request timeout'));\n            });\n            if(data){\n                req.write(data);\n            }\n            req.end();\n        });\n    }\n\n    async makeRequest(method, path, data)\n    {\n        let options = {\n            hostname: this.hostname,\n            port: this.port,\n            path: path,\n            method: method,\n            headers: {'Content-Type': 'application/json'},\n            timeout: 10000\n        };\n        let requestData = data ? JSON.stringify(data) : null;\n        return await this._makeHttpRequest(options, requestData);\n    }\n\n    async makeAuthenticatedRequest(method, path, data, session)\n    {\n        let cookieHeader = this.formatCookies(session);\n        let options = {\n            hostname: this.hostname,\n            port: this.port,\n            path: path,\n            method: method,\n            headers: {\n                'Content-Type': 'application/json',\n                'Cookie': cookieHeader\n            },\n            timeout: 10000\n        };\n        let requestData = data ? JSON.stringify(data) : null;\n        return await this._makeHttpRequest(options, requestData);\n    }\n\n    async makeFormRequest(method, path, data, session)\n    {\n        let postData = querystring.stringify(data);\n        let headers = {\n            'Content-Type': 'application/x-www-form-urlencoded',\n            'Content-Length': postData.length\n        };\n        if(session){\n            headers['Cookie'] = this.formatCookies(session);\n        }\n        let options = {\n            hostname: this.hostname,\n            port: this.port,\n            path: path,\n            method: method,\n            headers: headers,\n            timeout: 10000\n        };\n        return await this._makeHttpRequest(options, postData);\n    }\n\n    async makeMultipartRequest(method, path, data, session)\n    {\n        let boundary = 'WebKitFormBoundary' + Math.random().toString(36).substring(2, 18);\n        let postData = this.buildMultipartData(data, boundary);\n        let headers = {\n            'Content-Type': 'multipart/form-data; boundary=----' + boundary,\n            'Content-Length': postData.length\n        };\n        if(session){\n            headers['Cookie'] = this.formatCookies(session);\n        }\n        let options = {\n            hostname: this.hostname,\n            port: this.port,\n            path: path,\n            method: method,\n            headers: headers,\n            timeout: 10000\n        };\n        return await this._makeHttpRequest(options, postData);\n    }\n\n    async makeFormRequestWithTimeout(method, path, data, session, timeoutMs)\n    {\n        let cookieHeader = this.formatCookies(session);\n        let postData = this.formatFormData(data);\n        let options = {\n            hostname: this.hostname,\n            port: this.port,\n            path: path,\n            method: method,\n            headers: {\n                'Content-Type': 'application/x-www-form-urlencoded',\n                'Content-Length': postData.length,\n                'Cookie': cookieHeader\n            },\n            timeout: timeoutMs || 15000\n        };\n        return await this._makeHttpRequest(options, postData);\n    }\n\n    formatCookies(sessionCookies)\n    {\n        if(!sessionCookies){\n            return '';\n        }\n        if('string' === typeof sessionCookies){\n            return sessionCookies;\n        }\n        if(Array.isArray(sessionCookies)){\n            return sessionCookies.map(cookie => cookie.split(';')[0]).join('; ');\n        }\n        return '';\n    }\n\n    formatFormData(data)\n    {\n        let formData = '';\n        for(let key of Object.keys(data)){\n            formData += encodeURIComponent(key)+'='+encodeURIComponent(data[key])+'&';\n        }\n        return formData.slice(0, -1);\n    }\n\n    buildMultipartData(data, boundary)\n    {\n        let postData = Buffer.alloc(0);\n        for(let key of Object.keys(data)){\n            let value = data[key];\n            postData = Buffer.concat([postData, Buffer.from('------'+boundary+'\\r\\n')]);\n            if(value && 'object' === typeof value && value.filename && value.filePath){\n                if(!FileHandler.exists(value.filePath)){\n                    throw new Error('Test file not found: '+value.filePath);\n                }\n                let fileContent = FileHandler.readFile(value.filePath);\n                if('string' === typeof fileContent){\n                    fileContent = Buffer.from(fileContent, 'binary');\n                }\n                let headers = 'Content-Disposition: form-data; name=\"'+key+'\"; filename=\"'+value.filename\n                    +'\"\\r\\nContent-Type: '+value.contentType+'\\r\\n\\r\\n';\n                postData = Buffer.concat([\n                    postData,\n                    Buffer.from(headers),\n                    Buffer.from(fileContent),\n                    Buffer.from('\\r\\n')\n                ]);\n                continue;\n            }\n            let headers = 'Content-Disposition: form-data; name=\"'+key+'\"\\r\\n\\r\\n';\n            postData = Buffer.concat([postData, Buffer.from(headers), Buffer.from(String(value)), Buffer.from('\\r\\n')]);\n        }\n        return Buffer.concat([postData, Buffer.from('------'+boundary+'--\\r\\n')]);\n    }\n\n    entityHasUploadFields(entity, data)\n    {\n        return this.getUploadFields(data).length > 0;\n    }\n\n    getUploadFields(data)\n    {\n        if(!data){\n            return [];\n        }\n        let uploadFields = [];\n        for(let key of Object.keys(data)){\n            let value = data[key];\n            if(value && 'object' === typeof value && value.filename && value.content){\n                uploadFields.push(key);\n            }\n        }\n        return uploadFields;\n    }\n\n    async getAuthenticatedSession()\n    {\n        let session = null;\n        await this.test('Authentication', async () => {\n            let loginResponse = await this.makeRequest('GET', this.adminPath+'/login');\n            if(200 !== loginResponse.statusCode){\n                throw new Error('Login page not accessible');\n            }\n            let response = await this.makeFormRequest('POST', this.adminPath+'/login', {\n                email: this.adminUser,\n                password: this.adminPassword\n            });\n            if(302 !== response.statusCode){\n                throw new Error('Login failed with status: '+response.statusCode);\n            }\n            if(!response.headers.location){\n                throw new Error('Login response missing location header');\n            }\n            if(response.headers.location.includes('error')){\n                throw new Error('Login failed with error in redirect');\n            }\n            session = response.headers['set-cookie'];\n        });\n        return session;\n    }\n\n}\n\nmodule.exports.BaseTest = BaseTest;\n"
  },
  {
    "path": "tests/database-reset-utility.js",
    "content": "/**\n *\n * Reldens - DatabaseResetUtility\n *\n */\n\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger } = require('@reldens/utils');\nconst { ObjectionJsDataServer } = require('@reldens/storage');\n\nclass DatabaseResetUtility\n{\n\n    constructor(config)\n    {\n        this.config = config;\n    }\n\n    async resetDatabase()\n    {\n        let dbConfig = {\n            client: 'mysql2',\n            config: {\n                host: this.config.dbHost,\n                port: Number(this.config.dbPort),\n                database: this.config.dbName,\n                user: this.config.dbUser,\n                password: this.config.dbPassword,\n                multipleStatements: true\n            }\n        };\n        let dbDriver = new ObjectionJsDataServer(dbConfig);\n        if(!await dbDriver.connect()){\n            Logger.log(100, '', 'Database connection failed');\n            return false;\n        }\n        let migrationsPath = FileHandler.joinPaths(__dirname, '..', 'migrations', 'production');\n        let testDataPath = FileHandler.joinPaths(__dirname, '..', 'migrations', 'development');\n        try {\n            await this.executeQueryFile(migrationsPath, dbDriver, 'reldens-basic-config-v4.0.0.sql');\n            Logger.log(100, '', 'Basic config executed');\n            await this.executeQueryFile(testDataPath, dbDriver, 'reldens-test-sample-data-v4.0.0.sql');\n            Logger.log(100, '', 'Test sample data executed');\n            Logger.log(100, '', 'Database reset completed successfully');\n            return true;\n        } catch(error){\n            Logger.log(100, '', 'Database reset failed: '+error.message);\n            return false;\n        }\n    }\n\n    async executeQueryFile(migrationsPath, dbDriver, fileName)\n    {\n        await dbDriver.rawQuery(\n            FileHandler.readFile(\n                FileHandler.joinPaths(migrationsPath, fileName),\n                {encoding: 'utf8'}\n            ).toString()\n        );\n    }\n\n}\n\nmodule.exports.DatabaseResetUtility = DatabaseResetUtility;\n"
  },
  {
    "path": "tests/fixtures/crud-test-data.js",
    "content": "/**\n *\n * Reldens - CrudTestData\n *\n */\n\nclass CrudTestData\n{\n\n    static getBaseTestIds()\n    {\n        return {\n            users: 1001,\n            rooms: 1001,\n            objects: 1001,\n            audio: 1001,\n            config: 1003,\n            features: 1003,\n            respawn: 1001,\n            rewards: 1001,\n            snippets: 1001,\n            chat: 1001,\n            players: 1001,\n            ads: 100,\n            locale: 1,\n            'items-item': 1001,\n            'skills-skill': 1,\n            stats: 1,\n            'skills-levels': 1,\n            'items-group': 1,\n            'audio-categories': 1,\n            'skills-class-path': 1,\n            'skills-levels-set': 1,\n            'skills-groups': 1,\n            'objects-types': 1,\n            'ads-providers': 1,\n            'ads-types': 1,\n            'config-types': 1,\n            'skills-skill-type': 1,\n            'items-types': 1,\n            'operation-types': 1,\n            'target-options': 1,\n            'clan-levels': 1,\n            scores: 1,\n            'skills-skill-animations': 1,\n            clan: 1,\n            'users-locale-main': 1004,\n            'users-locale-delete': 1005,\n            'players-state-main': 1004,\n            'players-state-delete': 1005,\n            'players-state-editfail': 1006,\n            'skills-attack-main': 1001,\n            'skills-attack-delete': 1002,\n            'skills-attack-editfail': 1003,\n            'drops-animations-main': 1004,\n            'drops-animations-delete': 1005,\n            'drops-animations-editfail': 1006\n        };\n    }\n\n    static getValidTestData(entity, testPrefix, uniqueSuffix = '')\n    {\n        let baseIds = this.getBaseTestIds();\n        let timestamp = Date.now();\n        let uniqueKey = uniqueSuffix ? testPrefix+'-'+uniqueSuffix+'-'+timestamp : testPrefix+'-'+timestamp;\n        let testData = {\n            rooms: {\n                name: uniqueKey+'-room-test',\n                title: 'Test Room '+uniqueSuffix+' '+timestamp,\n                map_filename: 'test-room-'+uniqueSuffix+'.json',\n                scene_images: 'test-scene-'+uniqueSuffix+'.png',\n                room_class_key: null,\n                server_url: null,\n                customData: '{\"allowGuest\":true}'\n            },\n            objects: {\n                room_id: baseIds.rooms,\n                layer_name: 'test-objects-layer',\n                tile_index: 1000+timestamp%1000,\n                class_type: 1,\n                object_class_key: uniqueKey+'-object-test',\n                client_key: 'test-object-'+uniqueSuffix+'-'+timestamp,\n                title: 'Test Object '+uniqueSuffix+' '+timestamp,\n                private_params: '{\"testParam\":true}',\n                client_params: '{\"testClientParam\":true}',\n                enabled: 1\n            },\n            'objects-assets': {\n                object_id: baseIds.objects,\n                asset_type: 'spritesheet',\n                asset_key: uniqueKey+'-asset',\n                asset_file: 'test-asset-'+uniqueSuffix+'.png',\n                extra_params: '{\"frameWidth\":32,\"frameHeight\":32}'\n            },\n            'skills-skill': {\n                key: uniqueKey+'-skill-test',\n                type: 1,\n                label: 'Test Skill '+uniqueSuffix+' '+timestamp,\n                autoValidation: 1,\n                skillDelay: 1000,\n                castTime: 0,\n                usesLimit: 0,\n                range: 100,\n                rangeAutomaticValidation: 1,\n                rangePropertyX: 'state/x',\n                rangePropertyY: 'state/y',\n                allowSelfTarget: 0,\n                criticalChance: 10,\n                criticalMultiplier: 2,\n                criticalFixedValue: 0\n            },\n            'items-item': {\n                key: uniqueKey+'-item-test',\n                type: 1,\n                group_id: 1,\n                label: 'Test Item '+uniqueSuffix+' '+timestamp,\n                description: 'Test item description '+uniqueSuffix,\n                qty_limit: 0,\n                uses_limit: 1,\n                useTimeOut: null,\n                execTimeOut: null,\n                customData: '{\"canBeDropped\":true}'\n            },\n            ads: {\n                key: uniqueKey+'-ad-test',\n                provider_id: 1,\n                type_id: 1,\n                width: 320,\n                height: 50,\n                position: '',\n                top: 0,\n                bottom: 0,\n                left: 0,\n                right: 80,\n                replay: 0,\n                enabled: 1\n            },\n            'ads-banner': {\n                ads_id: uniqueSuffix === 'delete' ? 101 : (uniqueSuffix === 'edit' ? 102 : baseIds.ads),\n                banner_data: '{\"testBanner\":true}'\n            },\n            'ads-event-video': {\n                ads_id: uniqueSuffix === 'delete' ? 101 : (uniqueSuffix === 'edit' ? 102 : baseIds.ads),\n                event_key: 'test_event_'+uniqueSuffix,\n                event_data: '{\"testEvent\":true}'\n            },\n            'ads-providers': {\n                key: uniqueKey+'-provider',\n                enabled: 1\n            },\n            'ads-types': {\n                key: uniqueKey+'-type',\n                label: 'Test Ad Type '+uniqueSuffix\n            },\n            'ads-played': {\n                ads_id: baseIds.ads,\n                player_id: baseIds.players,\n                started_at: '2025-01-01 12:00:00'\n            },\n            audio: {\n                audio_key: uniqueKey+'-audio-test',\n                files_name: 'test-audio-'+uniqueSuffix+'-'+timestamp+'.mp3',\n                config: '{\"testConfig\":true}',\n                room_id: baseIds.rooms,\n                category_id: baseIds['audio-categories'],\n                enabled: 1\n            },\n            'audio-categories': {\n                category_key: uniqueKey+'-category',\n                category_label: 'Test Audio Category '+uniqueSuffix,\n                enabled: 1,\n                single_audio: 0\n            },\n            'audio-markers': {\n                audio_id: baseIds.audio,\n                marker_key: uniqueKey+'-marker'+(uniqueSuffix === 'delete' ? '-del' : ''),\n                start: 0,\n                duration: 10,\n                config: null\n            },\n            'audio-player-config': {\n                player_id: baseIds.players,\n                category_id: uniqueSuffix === 'delete' ? 3 : baseIds['audio-categories'],\n                enabled: 1,\n                volume: 50\n            },\n            chat: {\n                player_id: baseIds.players,\n                room_id: baseIds.rooms,\n                message: 'Test message '+uniqueSuffix+' '+timestamp,\n                message_type: 1,\n                message_time: '2025-01-01 12:00:00'\n            },\n            'chat-message-types': {\n                key: uniqueKey+'-message-type'\n            },\n            config: {\n                scope: 'test',\n                path: uniqueKey+'.path.test',\n                value: 'test value '+uniqueSuffix+' '+timestamp,\n                type: 1\n            },\n            'config-types': {\n                label: 'Test Config Type '+uniqueSuffix,\n                node_type: 'string'\n            },\n            features: {\n                code: uniqueKey+'-feature-test',\n                title: 'Test Feature '+uniqueSuffix+' '+timestamp,\n                is_enabled: 1\n            },\n            respawn: {\n                object_id: baseIds.objects,\n                respawn_time: 10000,\n                instances_limit: 5,\n                layer: 'test-respawn-layer'\n            },\n            rewards: {\n                object_id: baseIds.objects,\n                item_id: baseIds['items-item'],\n                modifier_id: null,\n                experience: 100,\n                drop_rate: 100,\n                drop_quantity: 1,\n                is_unique: 0,\n                was_given: 0,\n                has_drop_body: 1\n            },\n            'rewards-modifiers': {\n                reward_id: baseIds.rewards,\n                key: uniqueKey+'-modifier'+(uniqueSuffix === 'delete' ? '-del' : ''),\n                property_key: 'stats/atk',\n                operation: 1,\n                value: 10,\n                minValue: null,\n                maxValue: null\n            },\n            'rewards-events': {\n                label: 'Test Reward Event '+uniqueSuffix,\n                description: 'Test reward event description',\n                handler_key: 'login',\n                event_key: 'test.event',\n                event_data: '{\"test\":true}',\n                position: 0,\n                enabled: 1,\n                active_from: null,\n                active_to: null\n            },\n            'rewards-events-state': {\n                player_id: baseIds.players,\n                rewards_events_id: uniqueSuffix === 'delete' ? 2 : 1,\n                state: '{\"current_count\":1,\"last_execution\":\"2025-01-01 12:00:00\"}'\n            },\n            snippets: {\n                locale_id: baseIds.locale,\n                key: uniqueKey+'-snippet-test',\n                value: 'Test snippet content '+uniqueSuffix+' '+timestamp\n            },\n            locale: {\n                locale: uniqueKey+'-locale-test',\n                language_code: 'te',\n                country_code: 'TS'\n            },\n            users: {\n                email: uniqueKey+'-test@deterministic.com',\n                username: uniqueKey+'-user-test',\n                password: 'test123password',\n                role_id: 1,\n                status: '1',\n                played_time: 0,\n                login_count: 0\n            },\n            'users-locale': {\n                locale_id: baseIds.locale,\n                user_id: uniqueSuffix === 'delete' ? baseIds['users-locale-delete'] : (uniqueSuffix === 'main' ? baseIds['users-locale-main'] : baseIds.users)\n            },\n            'users-login': {\n                user_id: baseIds.users,\n                login_date: '2025-01-01 12:00:00'\n            },\n            players: {\n                user_id: baseIds.users,\n                name: uniqueKey+'-player',\n                created_at: '2025-01-01 12:00:00'\n            },\n            'players-state': {\n                player_id: this.getIdForSuffix('players-state', uniqueSuffix, baseIds),\n                room_id: baseIds.rooms,\n                x: 100,\n                y: 100,\n                dir: 'down'\n            },\n            'players-stats': {\n                player_id: baseIds.players,\n                stat_id: uniqueSuffix === 'delete' ? 2 : baseIds.stats,\n                base_value: 100,\n                value: 100\n            },\n            stats: {\n                key: uniqueKey+'-stat',\n                label: 'Test Stat '+uniqueSuffix,\n                description: 'Test stat description',\n                base_value: 100,\n                customData: null\n            },\n            'items-group': {\n                key: uniqueKey+'-group',\n                label: 'Test Item Group '+uniqueSuffix,\n                description: 'Test group description',\n                files_name: null,\n                sort: 1,\n                items_limit: 0,\n                limit_per_item: 0\n            },\n            'items-types': {\n                label: 'Test Item Type '+uniqueSuffix,\n                key: uniqueKey+'-item-type'\n            },\n            'items-item-modifiers': {\n                item_id: baseIds['items-item'],\n                key: uniqueKey+'-modifier'+(uniqueSuffix === 'delete' ? '-del' : ''),\n                property_key: 'stats/atk',\n                operation: 1,\n                value: 10,\n                maxProperty: null\n            },\n            'objects-animations': {\n                object_id: baseIds.objects,\n                animationKey: uniqueKey+'-animation'+(uniqueSuffix === 'delete' ? '-del' : ''),\n                animationData: '{\"start\":0,\"end\":5}'\n            },\n            'objects-items-inventory': {\n                owner_id: baseIds.objects,\n                item_id: baseIds['items-item'],\n                qty: 1,\n                remaining_uses: -1,\n                is_active: 0\n            },\n            'objects-items-requirements': {\n                object_id: baseIds.objects,\n                item_key: 'test-item-list',\n                required_item_key: 'coins',\n                required_quantity: 1,\n                auto_remove_requirement: 1\n            },\n            'objects-items-rewards': {\n                object_id: baseIds.objects,\n                item_key: 'test-item-edit',\n                reward_item_key: 'coins',\n                reward_quantity: 1,\n                reward_item_is_required: 0\n            },\n            'objects-skills': {\n                object_id: baseIds.objects,\n                skill_id: baseIds['skills-skill'],\n                target_id: 1\n            },\n            'objects-stats': {\n                object_id: baseIds.objects,\n                stat_id: uniqueSuffix === 'delete' ? 2 : baseIds.stats,\n                base_value: 100,\n                value: 100\n            },\n            'objects-types': {\n                key: uniqueKey+'-object-type',\n                label: 'Test Object Type '+uniqueSuffix\n            },\n            'rooms-change-points': {\n                room_id: baseIds.rooms,\n                tile_index: 100,\n                next_room_id: baseIds.rooms\n            },\n            'rooms-return-points': {\n                room_id: baseIds.rooms,\n                direction: 'down',\n                x: 100,\n                y: 100,\n                is_default: 1,\n                from_room_id: null\n            },\n            'skills-class-path': {\n                key: uniqueKey+'-class-path',\n                label: 'Test Class Path '+uniqueSuffix,\n                levels_set_id: baseIds['skills-levels-set'],\n                enabled: 1\n            },\n            'skills-class-path-level-labels': {\n                class_path_id: baseIds['skills-class-path'],\n                level_id: uniqueSuffix === 'delete' ? 2 : baseIds['skills-levels'],\n                label: 'Test Level Label '+uniqueSuffix\n            },\n            'skills-class-path-level-skills': {\n                class_path_id: baseIds['skills-class-path'],\n                level_id: baseIds['skills-levels'],\n                skill_id: uniqueSuffix === 'delete' ? 3 : baseIds['skills-skill']\n            },\n            'skills-levels': {\n                key: uniqueSuffix === 'delete' ? 99 : 98,\n                label: 'Level '+uniqueSuffix,\n                required_experience: 100,\n                level_set_id: uniqueSuffix === 'delete' ? 2 : baseIds['skills-levels-set']\n            },\n            'skills-levels-modifiers': {\n                level_id: baseIds['skills-levels'],\n                key: uniqueKey+'-modifier',\n                property_key: 'stats/atk',\n                operation: 1,\n                value: 10,\n                minValue: null,\n                maxValue: null,\n                minProperty: null,\n                maxProperty: null\n            },\n            'skills-class-level-up-animations': {\n                class_path_id: baseIds['skills-class-path'],\n                level_id: uniqueSuffix === 'delete' ? 2 : baseIds['skills-levels'],\n                animationData: '{\"test\":\"animation\"}'\n            },\n            'skills-levels-set': {\n                autoFillRanges: 1,\n                autoFillExperienceMultiplier: uniqueSuffix === 'delete' ? 1.5 : null\n            },\n            'skills-owners-class-path': {\n                class_path_id: baseIds['skills-class-path'],\n                owner_id: baseIds.players,\n                currentLevel: uniqueSuffix === 'delete' ? 2 : 1,\n                currentExp: 0\n            },\n            'skills-skill-attack': {\n                skill_id: this.getIdForSuffix('skills-attack', uniqueSuffix, baseIds),\n                affectedProperty: 'stats/hp',\n                allowEffectBelowZero: 0,\n                hitDamage: 10,\n                applyDirectDamage: 0,\n                attackProperties: 'stats/atk',\n                defenseProperties: 'stats/def',\n                aimProperties: 'stats/aim',\n                dodgeProperties: 'stats/dodge',\n                dodgeFullEnabled: 0,\n                dodgeOverAimSuccess: 1,\n                damageAffected: 0,\n                criticalAffected: 0\n            },\n            'skills-skill-group-relation': {\n                skill_id: this.getIdForSuffix('skills-attack', uniqueSuffix, baseIds),\n                skill_group_id: baseIds['skills-groups'],\n                group_id: baseIds['skills-groups']\n            },\n            'skills-groups': {\n                key: uniqueKey+'-skill-group',\n                label: 'Test Skill Group '+uniqueSuffix,\n                description: 'Test skill group description',\n                sort: 1\n            },\n            'skills-skill-owner-conditions': {\n                skill_id: baseIds['skills-skill'],\n                key: uniqueKey+'-condition',\n                property_key: uniqueSuffix === 'delete' ? 'stats/hp' : 'stats/mp',\n                conditional: 'ge',\n                value: '5'\n            },\n            'skills-skill-owner-effects': {\n                skill_id: baseIds['skills-skill'],\n                key: uniqueKey+'-effect'+(uniqueSuffix === 'delete' ? '-del' : ''),\n                property_key: 'stats/mp',\n                operation: 2,\n                value: '5',\n                minValue: '0',\n                maxValue: '100',\n                minProperty: null,\n                maxProperty: null\n            },\n            'skills-skill-physical-data': {\n                skill_id: this.getIdForSuffix('skills-attack', uniqueSuffix, baseIds),\n                magnitude: 100,\n                objectWidth: 5,\n                objectHeight: 5,\n                validateTargetOnHit: 0\n            },\n            'skills-skill-target-effects': {\n                skill_id: baseIds['skills-skill'],\n                key: uniqueKey+'-target-effect'+(uniqueSuffix === 'delete' ? '-del' : ''),\n                property_key: 'stats/hp',\n                operation: 1,\n                value: '10',\n                minValue: '0',\n                maxValue: '0',\n                minProperty: null,\n                maxProperty: 'statsBase/hp'\n            },\n            'skills-skill-type': {\n                label: 'Test Skill Type '+uniqueSuffix,\n                key: uniqueKey+'-skill-type'\n            },\n            'operation-types': {\n                label: 'Test Operation Type '+uniqueSuffix,\n                key: uniqueSuffix === 'delete' ? 99 : (uniqueSuffix === 'edit' ? 98 : 97)\n            },\n            'target-options': {\n                target_key: uniqueKey+'-target-option',\n                target_label: 'Test Target Option '+uniqueSuffix\n            },\n            'drops-animations': {\n                item_id: this.getIdForSuffix('drops-animations', uniqueSuffix, baseIds),\n                asset_type: 'spritesheet',\n                asset_key: uniqueKey+'-drop-animation',\n                file: 'test-file.png',\n                extra_params: '{\"frameWidth\":32,\"frameHeight\":32}'\n            },\n            scores: {\n                player_id: baseIds.players,\n                total_score: 100,\n                players_kills_count: 0,\n                npcs_kills_count: 0,\n                last_player_kill_time: '2025-01-01 12:00:00',\n                last_npc_kill_time: '2025-01-01 12:00:00',\n                created_at: '2025-01-01 12:00:00'\n            },\n            'scores-detail': {\n                player_id: baseIds.players,\n                obtained_score: 150,\n                kill_player_id: baseIds.players,\n                kill_npc_id: baseIds.objects\n            },\n            clan: {\n                name: 'Test Clan '+uniqueSuffix,\n                owner_id: uniqueSuffix === 'delete' ? 1002 : baseIds.players,\n                level: baseIds['clan-levels'],\n                points: 0,\n                created_at: '2025-01-01 12:00:00'\n            },\n            'clan-levels': {\n                key: uniqueSuffix === 'delete' ? 99 : (uniqueSuffix === 'edit' ? 98 : 97),\n                label: 'Test Clan Level '+uniqueSuffix,\n                required_experience: 100\n            },\n            'clan-levels-modifiers': {\n                level_id: uniqueSuffix === 'delete' ? 2 : baseIds['clan-levels'],\n                clan_level_id: uniqueSuffix === 'delete' ? 2 : baseIds['clan-levels'],\n                key: uniqueKey+'-clan-modifier',\n                property_key: 'stats/atk',\n                operation: 1,\n                value: 10,\n                minValue: null,\n                maxValue: null\n            },\n            'clan-members': {\n                clan_id: baseIds.clan,\n                player_id: uniqueSuffix === 'delete' ? 1002 : baseIds.players,\n                role_id: 1,\n                joined_at: '2025-01-01 12:00:00'\n            },\n            'skills-skill-animations': {\n                key: uniqueKey+'-animation',\n                skill_id: baseIds['skills-skill'],\n                classKey: 'test-class',\n                animationData: '{\"test\":\"animation\"}',\n                files_name: 'test-animation-'+uniqueSuffix+'.json'\n            }\n        };\n        return testData[entity] || {\n            name: uniqueKey+'-'+entity+'-test'\n        };\n    }\n\n    static getIdForSuffix(entityKey, suffix, baseIds)\n    {\n        let suffixKey = 'edit-fail' === suffix ? 'editfail' : suffix;\n        let key = entityKey+'-'+(suffixKey || 'main');\n        return baseIds[key] || baseIds[entityKey+'-main'];\n    }\n\n    static getUploadFieldsForEntity(entity)\n    {\n        let uploadFields = {\n            rooms: ['map_filename', 'scene_images'],\n            audio: ['files_name'],\n            'drops-animations': ['file']\n        };\n        return uploadFields[entity] || [];\n    }\n\n    static getFileExtension(entity, field)\n    {\n        let extensions = {\n            rooms: {map_filename: 'json', scene_images: 'png'},\n            audio: {files_name: 'mp3'},\n            'skills-skill-animations': {files_name: 'json'}\n        };\n        return extensions[entity] && extensions[entity][field] || 'txt';\n    }\n\n    static getMockFileContent(entity, field)\n    {\n        let mockContent = {\n            rooms: {\n                map_filename: '{\"width\":20,\"height\":20,\"tilewidth\":32,\"tileheight\":32,\"type\":\"map\",\"version\":\"1.0\"}',\n                scene_images: 'PNG_MOCK_DATA_DETERMINISTIC'\n            },\n            audio: {files_name: 'MOCK_AUDIO_DATA_DETERMINISTIC'},\n            'skills-skill-animations': {files_name: 'JSON_MOCK_ANIMATION_DETERMINISTIC'}\n        };\n        return mockContent[entity] && mockContent[entity][field] || 'MOCK_FILE_CONTENT_DETERMINISTIC';\n    }\n\n    static getContentType(entity, field)\n    {\n        let contentTypes = {\n            rooms: {map_filename: 'application/json', scene_images: 'image/png'},\n            audio: {files_name: 'audio/mpeg'},\n            'skills-skill-animations': {files_name: 'application/json'}\n        };\n        return contentTypes[entity] && contentTypes[entity][field] || 'text/plain';\n    }\n\n    static getInvalidTestData(entity)\n    {\n        let invalidData = {\n            rooms: {name: '', title: ''},\n            objects: {room_id: 1001, object_class_key: '', client_key: ''},\n            'skills-skill': {key: '', type: 1},\n            'items-item': {key: '', type: 1, group_id: 1},\n            item: {key: '', type: 1, group_id: 1},\n            ads: {key: '', provider_id: 1, type_id: 1},\n            audio: {audio_key: '', room_id: 1001, category_id: 1},\n            chat: {player_id: 1001, room_id: 1001},\n            config: {scope: '', path: '', type: 1},\n            features: {code: '', title: ''},\n            respawn: {object_id: 1001, respawn_time: ''},\n            rewards: {object_id: 1001, item_id: 1001, drop_rate: ''},\n            snippets: {locale_id: 1, key: '', value: ''},\n            locale: {locale: '', language_code: ''},\n            users: {email: '', username: '', role_id: 1},\n            'ads-banner': {ads_id: '', banner_data: ''},\n            'ads-event-video': {ads_id: '', event_key: ''},\n            'ads-providers': {key: ''},\n            'ads-types': {key: ''},\n            'config-types': {label: ''},\n            'audio-categories': {category_key: '', category_label: ''},\n            'chat-message-types': {key: ''},\n            'items-group': {key: '', label: ''},\n            'items-types': {label: ''},\n            'skills-groups': {key: ''},\n            'operation-types': {key: 'invalid-string', label: 'Test Label'},\n            'target-options': {target_label: 'Test Label'},\n            'clan-levels': {key: '', label: ''},\n            scores: {player_id: '', total_score: ''},\n            stats: {key: '', label: ''},\n            players: {user_id: '', name: ''},\n            'skills-class-path': {key: '', levels_set_id: ''},\n            'skills-levels': {key: '', level_set_id: ''},\n            clan: {name: '', owner_id: ''},\n            'skills-skill-animations': {key: ''}\n        };\n        return invalidData[entity] || null;\n    }\n\n    static getExpectedValidationErrors(entity)\n    {\n        let errors = {\n            rooms: 'error',\n            objects: 'error',\n            'skills-skill': 'error',\n            'items-item': 'error',\n            ads: 'error',\n            audio: 'error',\n            chat: 'error',\n            config: 'error',\n            features: 'error',\n            respawn: 'error',\n            rewards: 'error',\n            snippets: 'error',\n            locale: 'error',\n            users: 'error'\n        };\n        return errors[entity] || 'error';\n    }\n\n    static getTestPrefix()\n    {\n        return 'test-crud-deterministic';\n    }\n\n}\n\nmodule.exports.CrudTestData = CrudTestData;\n"
  },
  {
    "path": "tests/fixtures/entities-list.js",
    "content": "/**\n *\n * Reldens - EntitiesList\n *\n */\n\nclass EntitiesList\n{\n\n    static getAll()\n    {\n        return [\n            ...this.getEntitiesWithoutRequiredFK(),\n            ...this.getEntitiesWithRequiredFK(),\n            ...this.getEntitiesWithUploadsButNoRequiredFK(),\n            ...this.getEntitiesWithUploadsAndRequiredFK()\n        ];\n    }\n\n    static getEntitiesWithoutRequiredFK()\n    {\n        return [\n            'ads', 'ads-banner', 'ads-event-video', 'ads-providers', 'ads-types',\n            'config', 'config-types', 'features', 'locale', 'snippets',\n            'users', 'stats', 'items-group', 'items-types', 'audio-categories',\n            'operation-types', 'target-options', 'skills-levels-set', 'skills-groups',\n            'skills-skill-type', 'objects-types', 'scores', 'clan-levels'\n        ];\n    }\n\n    static getEntitiesWithRequiredFK()\n    {\n        return [\n            'chat', 'chat-message-types', 'respawn', 'rewards', 'rewards-modifiers',\n            'rewards-events', 'rewards-events-state', 'players', 'players-state',\n            'players-stats', 'users-locale', 'objects-animations', 'objects-items-inventory',\n            'objects-items-requirements', 'objects-items-rewards', 'objects-skills',\n            'objects-stats', 'rooms-change-points', 'rooms-return-points',\n            'skills-class-path', 'skills-class-path-level-labels', 'skills-class-path-level-skills',\n            'skills-levels', 'skills-levels-modifiers', 'skills-class-level-up-animations', 'skills-owners-class-path',\n            'skills-skill-attack', 'skills-skill-group-relation', 'skills-skill-owner-conditions',\n            'skills-skill-owner-effects', 'skills-skill-physical-data', 'skills-skill-target-effects',\n            'items-item', 'items-item-modifiers', 'audio-markers', 'audio-player-config', 'ads-played', 'objects',\n            'objects-assets', 'skills-skill', 'skills-skill-animations',\n            'scores-detail', 'clan', 'clan-levels-modifiers', 'clan-members', 'users-login'\n        ];\n    }\n\n    static getEntitiesWithUploadsButNoRequiredFK()\n    {\n        return ['rooms', 'audio'];\n    }\n\n    static getEntitiesWithUploadsAndRequiredFK()\n    {\n        return ['drops-animations'];\n    }\n\n    static getEntityIdField(entity)\n    {\n        let customIdFields = {\n            'objects-assets': 'object_asset_id'\n        };\n        return customIdFields[entity] || 'id';\n    }\n\n}\n\nmodule.exports.EntitiesList = EntitiesList;\n"
  },
  {
    "path": "tests/fixtures/features-test-data.js",
    "content": "/**\n *\n * Reldens - FeaturesTestData\n *\n */\n\nclass FeaturesTestData\n{\n\n    static getMapsWizardValidData()\n    {\n        return {\n            mainAction: 'generate',\n            mapsWizardAction: 'elements-composite-loader',\n            generatorData: JSON.stringify({\n                factor: 2,\n                mainPathSize: 3,\n                blockMapBorder: true,\n                freeSpaceTilesQuantity: 2,\n                variableTilesPercentage: 15,\n                collisionLayersForPaths: ['change-points', 'collisions'],\n                compositeElementsFile: 'sample-map.json',\n                automaticallyExtrudeMaps: '1'\n            })\n        };\n    }\n\n    static getMapsWizardInvalidData()\n    {\n        return {\n            mainAction: 'generate',\n            mapsWizardAction: 'elements-composite-loader',\n            generatorData: 'invalid-json'\n        };\n    }\n\n    static getMapsWizardExpectedError()\n    {\n        return 'mapsWizardWrongJsonDataError';\n    }\n\n    static getObjectsImportValidData()\n    {\n        let timestamp = Date.now();\n        return {\n            json: JSON.stringify([\n                {\n                    room_id: 4,\n                    object_class_key: 'imported-object-1-'+timestamp,\n                    client_key: 'obj1',\n                    title: 'Test Object 1'\n                },\n                {\n                    room_id: 4,\n                    object_class_key: 'imported-object-2-'+timestamp,\n                    client_key: 'obj2',\n                    title: 'Test Object 2'\n                }\n            ])\n        };\n    }\n\n    static getObjectsImportInvalidData()\n    {\n        return {json: 'invalid-json'};\n    }\n\n    static getObjectsImportMissingFieldsData()\n    {\n        return {json: JSON.stringify([{room_id: 4}])};\n    }\n\n    static getSkillsImportValidData()\n    {\n        let timestamp = Date.now();\n        return {\n            json: JSON.stringify([\n                {\n                    key: 'imported-skill-1-'+timestamp,\n                    name: 'Imported Skill 1',\n                    type: 1,\n                    autoValidation: 1,\n                    skillDelay: 1000\n                },\n                {\n                    key: 'imported-skill-2-'+timestamp,\n                    name: 'Imported Skill 2',\n                    type: 1,\n                    autoValidation: 1,\n                    skillDelay: 1000\n                }\n            ])\n        };\n    }\n\n    static getServerManagementValidData()\n    {\n        return {'shutdown-time': 300};\n    }\n\n    static getServerManagementInvalidData()\n    {\n        return {};\n    }\n\n    static getServerManagementExpectedError()\n    {\n        return 'shutdownError';\n    }\n\n    static getAudioUploadValidData()\n    {\n        let timestamp = Date.now();\n        let audioKey = 'test-audio-'+timestamp;\n        return {\n            audio_key: audioKey,\n            room_id: 4,\n            files_name: audioKey+'.mp3',\n            category_id: 1,\n            enabled: 1\n        };\n    }\n\n    static getItemsUploadValidData()\n    {\n        let timestamp = Date.now();\n        return {\n            key: 'test-item-'+timestamp,\n            label: 'Test Item',\n            type: 1,\n            group_id: 1,\n            base_qty: 1\n        };\n    }\n\n    static getFileUploadInvalidData()\n    {\n        return {\n            audio_key: '',\n            room_id: '',\n            files_name: '',\n            category_id: '',\n            enabled: ''\n        };\n    }\n\n}\n\nmodule.exports.FeaturesTestData = FeaturesTestData;\n"
  },
  {
    "path": "tests/fixtures/generate-complete-comparison.js",
    "content": "/**\n *\n * Reldens - GenerateCompleteComparison\n *\n */\n\nconst { GenerateEntitiesFixtures } = require('./generate-entities-fixtures');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\n\nclass GenerateCompleteComparison\n{\n    async generate()\n    {\n        Logger.info('Starting complete comparison analysis...');\n        let projectRoot = FileHandler.joinPaths(__dirname, '..', '..', '..');\n        let reldensModuleLibPath = FileHandler.joinPaths(__dirname, '..', '..', 'lib');\n        let generatedEntitiesPath = FileHandler.joinPaths(projectRoot, 'src', 'generated-entities');\n        let report = {\n            timestamp: new Date().toISOString(),\n            pluginAnalysis: {},\n            dependencyAnalysis: {},\n            fixtureComparison: {},\n            relationMappingsComparison: {},\n            errors: {},\n            summary: {}\n        };\n        report.pluginAnalysis = await this.analyzeAllPlugins(reldensModuleLibPath, generatedEntitiesPath);\n        report.dependencyAnalysis = await this.analyzeDependencies(projectRoot);\n        report.fixtureComparison = await this.compareFixtures(projectRoot);\n        report.relationMappingsComparison = await this.compareRelationMappings(reldensModuleLibPath, generatedEntitiesPath);\n        report.errors = this.generateMissingCustomizations(report);\n        report.summary = this.generateSummary(report);\n        let outputPath = FileHandler.joinPaths(__dirname, 'complete-comparison-report.json');\n        FileHandler.writeFile(outputPath, JSON.stringify(report, null, 2));\n        Logger.info('Complete comparison report generated: '+outputPath);\n        return report;\n    }\n\n    async analyzeAllPlugins(reldensModuleLibPath, generatedEntitiesPath)\n    {\n        let pluginPaths = [\n            'actions', 'admin', 'ads', 'audio', 'chat', 'config', 'features', 'inventory',\n            'objects', 'respawn', 'rewards', 'rooms', 'scores', 'snippets', 'teams', 'users'\n        ];\n        let pluginAnalysis = {};\n        for(let pluginName of pluginPaths){\n            pluginAnalysis[pluginName] = await this.analyzePlugin(pluginName, reldensModuleLibPath, generatedEntitiesPath);\n        }\n        return pluginAnalysis;\n    }\n\n    async analyzePlugin(pluginName, reldensModuleLibPath, generatedEntitiesPath)\n    {\n        let pluginPath = FileHandler.joinPaths(reldensModuleLibPath, pluginName, 'server');\n        let entitiesPath = FileHandler.joinPaths(pluginPath, 'entities');\n        let modelsPath = FileHandler.joinPaths(pluginPath, 'models', 'objection-js');\n        let analysis = {\n            pluginName: pluginName,\n            hasEntities: FileHandler.exists(entitiesPath),\n            hasModels: FileHandler.exists(modelsPath),\n            entities: [],\n            models: [],\n            entitiesAnalysis: [],\n            modelsAnalysis: []\n        };\n        if(analysis.hasEntities){\n            analysis.entities = this.getFilesInFolder(entitiesPath, '.js');\n            for(let entityFile of analysis.entities){\n                if('entities-config.js' === entityFile || 'entities-translations.js' === entityFile){\n                    continue;\n                }\n                let entityAnalysis = await this.analyzeEntityFile(\n                    FileHandler.joinPaths(entitiesPath, entityFile),\n                    generatedEntitiesPath\n                );\n                analysis.entitiesAnalysis.push(entityAnalysis);\n            }\n        }\n        if(analysis.hasModels){\n            analysis.models = this.getFilesInFolder(modelsPath, '.js');\n            for(let modelFile of analysis.models){\n                if('registered-models-objection-js.js' === modelFile || 'overridden-models-objection-js.js' === modelFile){\n                    continue;\n                }\n                let modelAnalysis = await this.analyzeModelFile(\n                    FileHandler.joinPaths(modelsPath, modelFile),\n                    generatedEntitiesPath\n                );\n                analysis.modelsAnalysis.push(modelAnalysis);\n            }\n        }\n        return analysis;\n    }\n\n    findMatchingFile(files, targetFileName)\n    {\n        let exactMatch = files.find(f => f.endsWith(targetFileName));\n        if(exactMatch){\n            return exactMatch;\n        }\n        let baseName = targetFileName.replace(/-entity\\.js$/, '').replace(/-model\\.js$/, '');\n        let baseNameParts = baseName.split('-');\n        for(let file of files){\n            let fileBase = file.replace(/-entity\\.js$/, '').replace(/-model\\.js$/, '');\n            let fileBaseParts = fileBase.split('-');\n            let matchCount = 0;\n            for(let part of baseNameParts){\n                if(fileBaseParts.includes(part) || fileBaseParts.includes(part+'s') || fileBaseParts.includes(part.replace(/s$/, ''))){\n                    matchCount++;\n                }\n            }\n            if(matchCount >= baseNameParts.length - 1 && matchCount >= baseNameParts.length * 0.8){\n                return file;\n            }\n        }\n        return null;\n    }\n\n    async analyzeEntityFile(pluginEntityPath, generatedEntitiesPath)\n    {\n        let entityFileName = FileHandler.getFileName(pluginEntityPath);\n        let generatedEntitiesFolder = FileHandler.joinPaths(generatedEntitiesPath, 'entities');\n        let generatedFiles = this.getFilesInFolder(generatedEntitiesFolder, '.js');\n        let matchedFile = this.findMatchingFile(generatedFiles, entityFileName);\n        let generatedEntityPath = matchedFile ? FileHandler.joinPaths(generatedEntitiesFolder, matchedFile) : FileHandler.joinPaths(generatedEntitiesFolder, entityFileName);\n        let analysis = {\n            fileName: entityFileName,\n            pluginEntityPath: pluginEntityPath,\n            generatedEntityPath: generatedEntityPath,\n            generatedExists: matchedFile ? true : false,\n            pluginMethods: [],\n            generatedMethods: [],\n            missingInGenerated: [],\n            error: null\n        };\n        try{\n            let pluginEntity = require(pluginEntityPath);\n            if(!pluginEntity){\n                analysis.error = 'Module export is null or undefined';\n                Logger.error('Entity file '+entityFileName+' returned null/undefined export');\n                return analysis;\n            }\n            if('object' !== typeof pluginEntity){\n                analysis.error = 'Invalid module export type: '+typeof pluginEntity;\n                Logger.error('Entity file '+entityFileName+' export is not an object');\n                return analysis;\n            }\n            let keys = Object.keys(pluginEntity);\n            if(!keys){\n                analysis.error = 'Object.keys returned null/undefined';\n                Logger.error('Entity file '+entityFileName+' Object.keys failed');\n                return analysis;\n            }\n            if(0 === keys.length){\n                analysis.error = 'No exports found';\n                Logger.error('Entity file '+entityFileName+' has no exported keys');\n                return analysis;\n            }\n            let pluginClassName = keys[0];\n            let pluginClass = pluginEntity[pluginClassName];\n            if(!pluginClass){\n                analysis.error = 'Class not found in export at key: '+pluginClassName;\n                Logger.error('Entity file '+entityFileName+' class at key '+pluginClassName+' is undefined');\n                return analysis;\n            }\n            analysis.pluginMethods = this.extractMethods(pluginClass);\n            if(analysis.generatedExists){\n                let generatedEntity = require(generatedEntityPath);\n                if(!generatedEntity){\n                    Logger.warning('Generated entity '+entityFileName+' returned null/undefined export');\n                    return analysis;\n                }\n                if('object' !== typeof generatedEntity){\n                    Logger.warning('Generated entity '+entityFileName+' export is not an object');\n                    return analysis;\n                }\n                let genKeys = Object.keys(generatedEntity);\n                if(!genKeys){\n                    Logger.warning('Generated entity '+entityFileName+' Object.keys returned null/undefined');\n                    return analysis;\n                }\n                if(0 === genKeys.length){\n                    Logger.warning('Generated entity '+entityFileName+' has no exported keys');\n                    return analysis;\n                }\n                let generatedClassName = genKeys[0];\n                let generatedClass = generatedEntity[generatedClassName];\n                if(!generatedClass){\n                    Logger.warning('Generated entity '+entityFileName+' class at key '+generatedClassName+' is undefined');\n                    return analysis;\n                }\n                analysis.generatedMethods = this.extractMethods(generatedClass);\n                analysis.missingInGenerated = analysis.pluginMethods.filter(\n                    method => !analysis.generatedMethods.includes(method)\n                );\n            }\n        }\n        catch(error){\n            analysis.error = error.message;\n            Logger.error('Failed to analyze entity '+entityFileName+': '+error.message);\n        }\n        return analysis;\n    }\n\n    async analyzeModelFile(pluginModelPath, generatedEntitiesPath)\n    {\n        let modelFileName = FileHandler.getFileName(pluginModelPath);\n        let generatedModelsFolder = FileHandler.joinPaths(generatedEntitiesPath, 'models', 'objection-js');\n        let generatedFiles = this.getFilesInFolder(generatedModelsFolder, '.js');\n        let matchedFile = this.findMatchingFile(generatedFiles, modelFileName);\n        let generatedModelPath = matchedFile ? FileHandler.joinPaths(generatedModelsFolder, matchedFile) : FileHandler.joinPaths(generatedModelsFolder, modelFileName);\n        let analysis = {\n            fileName: modelFileName,\n            pluginModelPath: pluginModelPath,\n            generatedModelPath: generatedModelPath,\n            generatedExists: matchedFile ? true : false,\n            pluginMethods: [],\n            generatedMethods: [],\n            pluginRelations: [],\n            generatedRelations: [],\n            missingMethods: [],\n            relationsDiff: [],\n            error: null\n        };\n        try{\n            let pluginModel = require(pluginModelPath);\n            if(!pluginModel){\n                analysis.error = 'Module export is null or undefined';\n                Logger.error('Model file '+modelFileName+' returned null/undefined export');\n                return analysis;\n            }\n            if('object' !== typeof pluginModel){\n                analysis.error = 'Invalid module export type: '+typeof pluginModel;\n                Logger.error('Model file '+modelFileName+' export is not an object');\n                return analysis;\n            }\n            let keys = Object.keys(pluginModel);\n            if(!keys){\n                analysis.error = 'Object.keys returned null/undefined';\n                Logger.error('Model file '+modelFileName+' Object.keys failed');\n                return analysis;\n            }\n            if(0 === keys.length){\n                analysis.error = 'No exports found';\n                Logger.error('Model file '+modelFileName+' has no exported keys');\n                return analysis;\n            }\n            let pluginClassName = keys[0];\n            let pluginClass = pluginModel[pluginClassName];\n            if(!pluginClass){\n                analysis.error = 'Class not found in export at key: '+pluginClassName;\n                Logger.error('Model file '+modelFileName+' class at key '+pluginClassName+' is undefined');\n                return analysis;\n            }\n            analysis.pluginMethods = this.extractMethods(pluginClass);\n            analysis.pluginRelations = this.extractRelationMappings(pluginClass);\n            if(analysis.generatedExists){\n                let generatedModel = require(generatedModelPath);\n                if(!generatedModel){\n                    Logger.warning('Generated model '+modelFileName+' returned null/undefined export');\n                    return analysis;\n                }\n                if('object' !== typeof generatedModel){\n                    Logger.warning('Generated model '+modelFileName+' export is not an object');\n                    return analysis;\n                }\n                let genKeys = Object.keys(generatedModel);\n                if(!genKeys){\n                    Logger.warning('Generated model '+modelFileName+' Object.keys returned null/undefined');\n                    return analysis;\n                }\n                if(0 === genKeys.length){\n                    Logger.warning('Generated model '+modelFileName+' has no exported keys');\n                    return analysis;\n                }\n                let generatedClassName = genKeys[0];\n                let generatedClass = generatedModel[generatedClassName];\n                if(!generatedClass){\n                    Logger.warning('Generated model '+modelFileName+' class at key '+generatedClassName+' is undefined');\n                    return analysis;\n                }\n                analysis.generatedMethods = this.extractMethods(generatedClass);\n                analysis.generatedRelations = this.extractRelationMappings(generatedClass);\n                analysis.missingMethods = analysis.pluginMethods.filter(\n                    method => !analysis.generatedMethods.includes(method)\n                );\n                analysis.relationsDiff = this.compareRelations(analysis.pluginRelations, analysis.generatedRelations);\n            }\n        }\n        catch(error){\n            analysis.error = error.message;\n            Logger.error('Failed to analyze model '+modelFileName+': '+error.message);\n        }\n        return analysis;\n    }\n\n    extractMethods(classConstructor)\n    {\n        if(!classConstructor){\n            return [];\n        }\n        let methods = [];\n        let prototype = classConstructor.prototype;\n        if(prototype){\n            let protoProps = Object.getOwnPropertyNames(prototype);\n            for(let prop of protoProps){\n                if('constructor' === prop){\n                    continue;\n                }\n                if('function' === typeof prototype[prop]){\n                    methods.push(prop);\n                }\n            }\n        }\n        let staticProps = Object.getOwnPropertyNames(classConstructor);\n        for(let prop of staticProps){\n            if('length' === prop || 'name' === prop || 'prototype' === prop){\n                continue;\n            }\n            if('function' === typeof classConstructor[prop]){\n                methods.push('static:'+prop);\n                continue;\n            }\n        }\n        return methods;\n    }\n\n    extractRelationMappings(classConstructor)\n    {\n        if(!classConstructor || !classConstructor.relationMappings){\n            return [];\n        }\n        let relations = [];\n        let mappings = classConstructor.relationMappings;\n        for(let key of Object.keys(mappings)){\n            relations.push({\n                key: key,\n                relation: mappings[key].relation ? mappings[key].relation.name : 'unknown',\n                join: mappings[key].join || {}\n            });\n        }\n        return relations;\n    }\n\n    compareRelations(pluginRelations, generatedRelations)\n    {\n        let diff = {\n            onlyInPlugin: [],\n            onlyInGenerated: [],\n            differentJoins: []\n        };\n        if(!pluginRelations){\n            Logger.error('Plugin relations is undefined in compareRelations');\n            return diff;\n        }\n        if(!generatedRelations){\n            Logger.error('Generated relations is undefined in compareRelations');\n            return diff;\n        }\n        for(let pluginRel of pluginRelations){\n            if(!pluginRel){\n                Logger.error('Plugin relation item is undefined');\n                continue;\n            }\n            let found = generatedRelations.find(gr => gr && gr.key === pluginRel.key);\n            if(!found){\n                diff.onlyInPlugin.push(pluginRel);\n                continue;\n            }\n            if(JSON.stringify(pluginRel.join) !== JSON.stringify(found.join)){\n                diff.differentJoins.push({\n                    key: pluginRel.key,\n                    pluginJoin: pluginRel.join,\n                    generatedJoin: found.join\n                });\n            }\n        }\n        for(let generatedRel of generatedRelations){\n            if(!generatedRel){\n                Logger.error('Generated relation item is undefined');\n                continue;\n            }\n            let found = pluginRelations.find(pr => pr && pr.key === generatedRel.key);\n            if(!found){\n                diff.onlyInGenerated.push(generatedRel);\n            }\n        }\n        return diff;\n    }\n\n    async analyzeDependencies(projectRoot)\n    {\n        let dependencies = {\n            skills: null,\n            items: null\n        };\n        let skillsPath = FileHandler.joinPaths(projectRoot, 'npm-packages', 'reldens-skills', 'lib', 'server', 'storage', 'models', 'objection-js');\n        if(FileHandler.exists(skillsPath)){\n            dependencies.skills = {\n                path: skillsPath,\n                models: this.getFilesInFolder(skillsPath, '.js'),\n                modelsAnalysis: []\n            };\n            if(!dependencies.skills.models){\n                Logger.error('Failed to read models from skills path: '+skillsPath);\n                dependencies.skills.models = [];\n            }\n            for(let modelFile of dependencies.skills.models){\n                if('registered-models-objection-js.js' === modelFile){\n                    continue;\n                }\n                let modelAnalysis = await this.analyzeDependencyModel(\n                    FileHandler.joinPaths(skillsPath, modelFile),\n                    projectRoot\n                );\n                dependencies.skills.modelsAnalysis.push(modelAnalysis);\n            }\n        }\n        let itemsPath = FileHandler.joinPaths(projectRoot, 'npm-packages', 'reldens-items', 'lib', 'server', 'storage', 'models', 'objection-js');\n        if(FileHandler.exists(itemsPath)){\n            dependencies.items = {\n                path: itemsPath,\n                models: this.getFilesInFolder(itemsPath, '.js'),\n                modelsAnalysis: []\n            };\n            if(!dependencies.items.models){\n                Logger.error('Failed to read models from items path: '+itemsPath);\n                dependencies.items.models = [];\n            }\n            for(let modelFile of dependencies.items.models){\n                if('registered-models-objection-js.js' === modelFile){\n                    continue;\n                }\n                let modelAnalysis = await this.analyzeDependencyModel(\n                    FileHandler.joinPaths(itemsPath, modelFile),\n                    projectRoot\n                );\n                dependencies.items.modelsAnalysis.push(modelAnalysis);\n            }\n        }\n        return dependencies;\n    }\n\n    async analyzeDependencyModel(modelPath, projectRoot)\n    {\n        let modelFileName = FileHandler.getFileName(modelPath);\n        let generatedEntitiesPath = FileHandler.joinPaths(projectRoot, 'src', 'generated-entities');\n        let generatedModelsFolder = FileHandler.joinPaths(generatedEntitiesPath, 'models', 'objection-js');\n        let generatedFiles = this.getFilesInFolder(generatedModelsFolder, '.js');\n        let matchedFile = this.findMatchingFile(generatedFiles, modelFileName);\n        let generatedModelPath = matchedFile ? FileHandler.joinPaths(generatedModelsFolder, matchedFile) : FileHandler.joinPaths(generatedModelsFolder, modelFileName);\n        let analysis = {\n            fileName: modelFileName,\n            dependencyModelPath: modelPath,\n            generatedModelPath: generatedModelPath,\n            generatedExists: matchedFile ? true : false,\n            dependencyMethods: [],\n            generatedMethods: [],\n            missingMethods: [],\n            dependencyRelations: [],\n            generatedRelations: [],\n            relationsDiff: [],\n            error: null\n        };\n        try{\n            let dependencyModel = require(modelPath);\n            if(!dependencyModel){\n                analysis.error = 'Module export is null or undefined';\n                Logger.error('Dependency model '+modelFileName+' returned null/undefined export');\n                return analysis;\n            }\n            if('object' !== typeof dependencyModel){\n                analysis.error = 'Invalid module export type: '+typeof dependencyModel;\n                Logger.error('Dependency model '+modelFileName+' export is not an object');\n                return analysis;\n            }\n            let depKeys = Object.keys(dependencyModel);\n            if(!depKeys){\n                analysis.error = 'Object.keys returned null/undefined';\n                Logger.error('Dependency model '+modelFileName+' Object.keys failed');\n                return analysis;\n            }\n            if(0 === depKeys.length){\n                analysis.error = 'No exports found';\n                Logger.error('Dependency model '+modelFileName+' has no exported keys');\n                return analysis;\n            }\n            let dependencyClassName = depKeys[0];\n            let dependencyClass = dependencyModel[dependencyClassName];\n            if(!dependencyClass){\n                analysis.error = 'Class not found in export at key: '+dependencyClassName;\n                Logger.error('Dependency model '+modelFileName+' class at key '+dependencyClassName+' is undefined');\n                return analysis;\n            }\n            analysis.dependencyMethods = this.extractMethods(dependencyClass);\n            analysis.dependencyRelations = this.extractRelationMappings(dependencyClass);\n            if(analysis.generatedExists){\n                let generatedModel = require(generatedModelPath);\n                if(!generatedModel){\n                    Logger.warning('Generated model '+modelFileName+' returned null/undefined export');\n                    return analysis;\n                }\n                if('object' !== typeof generatedModel){\n                    Logger.warning('Generated model '+modelFileName+' export is not an object');\n                    return analysis;\n                }\n                let genKeys = Object.keys(generatedModel);\n                if(!genKeys){\n                    Logger.warning('Generated model '+modelFileName+' Object.keys returned null/undefined');\n                    return analysis;\n                }\n                if(0 === genKeys.length){\n                    Logger.warning('Generated model '+modelFileName+' has no exported keys');\n                    return analysis;\n                }\n                let generatedClassName = genKeys[0];\n                let generatedClass = generatedModel[generatedClassName];\n                if(!generatedClass){\n                    Logger.warning('Generated model '+modelFileName+' class at key '+generatedClassName+' is undefined');\n                    return analysis;\n                }\n                analysis.generatedMethods = this.extractMethods(generatedClass);\n                analysis.generatedRelations = this.extractRelationMappings(generatedClass);\n                analysis.missingMethods = analysis.dependencyMethods.filter(\n                    method => !analysis.generatedMethods.includes(method)\n                );\n                analysis.relationsDiff = this.compareRelations(analysis.dependencyRelations, analysis.generatedRelations);\n            }\n        }\n        catch(error){\n            analysis.error = error.message;\n            Logger.error('Failed to analyze dependency model '+modelFileName+': '+error.message);\n        }\n        return analysis;\n    }\n\n    async compareFixtures(projectRoot)\n    {\n        let oldFixturePath = FileHandler.joinPaths(projectRoot, 'src', 'tests', 'fixtures', 'generated-entities-old.json');\n        let newFixturePath = FileHandler.joinPaths(projectRoot, 'src', 'tests', 'fixtures', 'generated-entities-new.json');\n        let comparison = {\n            oldExists: FileHandler.exists(oldFixturePath),\n            newExists: FileHandler.exists(newFixturePath),\n            differences: null\n        };\n        if(!comparison.newExists){\n            Logger.warning('New fixture not found. Generating now...');\n            let generator = new GenerateEntitiesFixtures();\n            await generator.generate('generated-entities-new.json');\n            comparison.newExists = true;\n        }\n        if(comparison.oldExists && comparison.newExists){\n            let oldData = JSON.parse(FileHandler.readFile(oldFixturePath));\n            let newData = JSON.parse(FileHandler.readFile(newFixturePath));\n            let oldEntityKeys = sc.get(oldData, 'entityKeys', []);\n            let newEntityKeys = sc.get(newData, 'entityKeys', []);\n            let oldStats = sc.get(oldData, 'stats', {});\n            let newStats = sc.get(newData, 'stats', {});\n            comparison.differences = {\n                entitiesCountMatch: sc.get(oldStats, 'entitiesCount', 0) === sc.get(newStats, 'entitiesCount', 0),\n                entitiesRawCountMatch: sc.get(oldStats, 'entitiesRawCount', 0) === sc.get(newStats, 'entitiesRawCount', 0),\n                translationsCountMatch: sc.get(oldStats, 'translationsCount', 0) === sc.get(newStats, 'translationsCount', 0),\n                oldEntityKeys: oldEntityKeys,\n                newEntityKeys: newEntityKeys,\n                missingInNew: oldEntityKeys.filter(key => !newEntityKeys.includes(key)),\n                addedInNew: newEntityKeys.filter(key => !oldEntityKeys.includes(key)),\n                configDifferences: this.compareConfigs(\n                    sc.get(oldData, 'entities', {}),\n                    sc.get(newData, 'entities', {})\n                )\n            };\n        }\n        return comparison;\n    }\n\n    compareConfigs(oldEntities, newEntities)\n    {\n        let differences = [];\n        if(!oldEntities){\n            Logger.error('Old entities is undefined in compareConfigs');\n            return differences;\n        }\n        if(!newEntities){\n            Logger.error('New entities is undefined in compareConfigs');\n            return differences;\n        }\n        for(let key of Object.keys(oldEntities)){\n            if(!sc.hasOwn(newEntities, key)){\n                continue;\n            }\n            let oldConfig = oldEntities[key].config || {};\n            let newConfig = newEntities[key].config || {};\n            let diff = this.findConfigDifferences(key, oldConfig, newConfig);\n            if(!diff.missingKeys){\n                Logger.error('Missing keys array is undefined for entity: '+key);\n                continue;\n            }\n            if(!diff.addedKeys){\n                Logger.error('Added keys array is undefined for entity: '+key);\n                continue;\n            }\n            if(diff.missingKeys.length > 0 || diff.addedKeys.length > 0){\n                differences.push(diff);\n            }\n        }\n        return differences;\n    }\n\n    findConfigDifferences(entityKey, oldConfig, newConfig)\n    {\n        let diff = {\n            entityKey: entityKey,\n            missingKeys: [],\n            addedKeys: []\n        };\n        for(let key of Object.keys(oldConfig)){\n            if(!sc.hasOwn(newConfig, key)){\n                diff.missingKeys.push(key);\n            }\n        }\n        for(let key of Object.keys(newConfig)){\n            if(!sc.hasOwn(oldConfig, key)){\n                diff.addedKeys.push(key);\n            }\n        }\n        return diff;\n    }\n\n    async compareRelationMappings(reldensModuleLibPath, generatedEntitiesPath)\n    {\n        let comparison = {\n            modelsWithRelations: []\n        };\n        let pluginPaths = [\n            'actions', 'admin', 'ads', 'audio', 'chat', 'config', 'features', 'inventory',\n            'objects', 'respawn', 'rewards', 'rooms', 'scores', 'snippets', 'teams', 'users'\n        ];\n        for(let pluginName of pluginPaths){\n            let modelsPath = FileHandler.joinPaths(reldensModuleLibPath, pluginName, 'server', 'models', 'objection-js');\n            if(!FileHandler.exists(modelsPath)){\n                continue;\n            }\n            let models = this.getFilesInFolder(modelsPath, '.js');\n            for(let modelFile of models){\n                if('registered-models-objection-js.js' === modelFile || 'overridden-models-objection-js.js' === modelFile){\n                    continue;\n                }\n                let modelPath = FileHandler.joinPaths(modelsPath, modelFile);\n                try{\n                    let pluginModel = require(modelPath);\n                    if(!pluginModel){\n                        Logger.warning('Plugin model '+modelFile+' returned null/undefined export, skipping relation comparison');\n                        continue;\n                    }\n                    if('object' !== typeof pluginModel){\n                        Logger.warning('Plugin model '+modelFile+' export is not an object, skipping relation comparison');\n                        continue;\n                    }\n                    let keys = Object.keys(pluginModel);\n                    if(!keys || 0 === keys.length){\n                        Logger.warning('Plugin model '+modelFile+' has no exported keys, skipping relation comparison');\n                        continue;\n                    }\n                    let pluginClassName = keys[0];\n                    let pluginClass = pluginModel[pluginClassName];\n                    if(!pluginClass){\n                        Logger.warning('Plugin model '+modelFile+' class is undefined, skipping relation comparison');\n                        continue;\n                    }\n                    let pluginRelations = this.extractRelationMappings(pluginClass);\n                    if(!pluginRelations){\n                        Logger.error('extractRelationMappings returned undefined for '+modelFile);\n                        continue;\n                    }\n                    if(pluginRelations.length > 0){\n                        let generatedModelPath = FileHandler.joinPaths(generatedEntitiesPath, 'models', 'objection-js', modelFile);\n                        let generatedRelations = [];\n                        if(FileHandler.exists(generatedModelPath)){\n                            try{\n                                let generatedModel = require(generatedModelPath);\n                                if(!generatedModel){\n                                    Logger.warning('Generated model '+modelFile+' returned null/undefined export');\n                                }\n                                if(generatedModel && 'object' === typeof generatedModel){\n                                    let genKeys = Object.keys(generatedModel);\n                                    if(genKeys && genKeys.length > 0){\n                                        let generatedClassName = genKeys[0];\n                                        let generatedClass = generatedModel[generatedClassName];\n                                        if(generatedClass){\n                                            generatedRelations = this.extractRelationMappings(generatedClass);\n                                        }\n                                    }\n                                }\n                            }\n                            catch(error){\n                                Logger.error('Failed to load generated model '+modelFile+' for relation comparison: '+error.message);\n                            }\n                        }\n                        comparison.modelsWithRelations.push({\n                            plugin: pluginName,\n                            modelFile: modelFile,\n                            pluginRelations: pluginRelations,\n                            generatedRelations: generatedRelations,\n                            relationsDiff: this.compareRelations(pluginRelations, generatedRelations)\n                        });\n                    }\n                }\n                catch(error){\n                    Logger.error('Failed to analyze plugin model '+modelFile+' for relations: '+error.message);\n                }\n            }\n        }\n        return comparison;\n    }\n\n    getFilesInFolder(folderPath, extension)\n    {\n        if(!FileHandler.exists(folderPath)){\n            Logger.warning('Folder does not exist: '+folderPath);\n            return [];\n        }\n        let files = [];\n        let contents = FileHandler.readFolder(folderPath);\n        if(!contents){\n            Logger.error('Failed to read folder: '+folderPath);\n            return [];\n        }\n        for(let item of contents){\n            if(item.endsWith(extension)){\n                files.push(item);\n            }\n        }\n        return files;\n    }\n\n    generateMissingCustomizations(report)\n    {\n        let errors = {};\n        if(!report.pluginAnalysis){\n            return errors;\n        }\n        for(let pluginName of Object.keys(report.pluginAnalysis)){\n            let plugin = report.pluginAnalysis[pluginName];\n            if(!plugin){\n                continue;\n            }\n            let pluginErrors = {\n                entities: {},\n                models: {}\n            };\n            let hasAnyError = false;\n            if(plugin.entitiesAnalysis){\n                for(let entityAnalysis of plugin.entitiesAnalysis){\n                    if(!entityAnalysis){\n                        continue;\n                    }\n                    let entityErrors = {};\n                    if(!entityAnalysis.generatedExists){\n                        entityErrors.missing = true;\n                        hasAnyError = true;\n                    }\n                    if(entityAnalysis.missingInGenerated && entityAnalysis.missingInGenerated.length > 0){\n                        entityErrors.missingMethods = entityAnalysis.missingInGenerated;\n                        hasAnyError = true;\n                    }\n                    if(entityAnalysis.error){\n                        entityErrors.error = entityAnalysis.error;\n                        hasAnyError = true;\n                    }\n                    if(Object.keys(entityErrors).length > 0){\n                        pluginErrors.entities[entityAnalysis.fileName] = entityErrors;\n                    }\n                }\n            }\n            if(plugin.modelsAnalysis){\n                for(let modelAnalysis of plugin.modelsAnalysis){\n                    if(!modelAnalysis){\n                        continue;\n                    }\n                    let modelErrors = {};\n                    if(!modelAnalysis.generatedExists){\n                        modelErrors.missing = true;\n                        hasAnyError = true;\n                    }\n                    if(modelAnalysis.missingMethods && modelAnalysis.missingMethods.length > 0){\n                        modelErrors.missingMethods = modelAnalysis.missingMethods;\n                        hasAnyError = true;\n                    }\n                    if(modelAnalysis.relationsDiff){\n                        if('object' === typeof modelAnalysis.relationsDiff && !Array.isArray(modelAnalysis.relationsDiff)){\n                            if(sc.hasOwn(modelAnalysis.relationsDiff, 'onlyInPlugin') && modelAnalysis.relationsDiff.onlyInPlugin && modelAnalysis.relationsDiff.onlyInPlugin.length > 0){\n                                modelErrors.relationsOnlyInPlugin = modelAnalysis.relationsDiff.onlyInPlugin;\n                                hasAnyError = true;\n                            }\n                            if(sc.hasOwn(modelAnalysis.relationsDiff, 'onlyInGenerated') && modelAnalysis.relationsDiff.onlyInGenerated && modelAnalysis.relationsDiff.onlyInGenerated.length > 0){\n                                modelErrors.relationsOnlyInGenerated = modelAnalysis.relationsDiff.onlyInGenerated;\n                                hasAnyError = true;\n                            }\n                            if(sc.hasOwn(modelAnalysis.relationsDiff, 'differentJoins') && modelAnalysis.relationsDiff.differentJoins && modelAnalysis.relationsDiff.differentJoins.length > 0){\n                                modelErrors.relationsDifferentJoins = modelAnalysis.relationsDiff.differentJoins;\n                                hasAnyError = true;\n                            }\n                        }\n                    }\n                    if(modelAnalysis.error){\n                        modelErrors.error = modelAnalysis.error;\n                        hasAnyError = true;\n                    }\n                    if(Object.keys(modelErrors).length > 0){\n                        pluginErrors.models[modelAnalysis.fileName] = modelErrors;\n                    }\n                }\n            }\n            if(hasAnyError){\n                errors[pluginName] = pluginErrors;\n            }\n        }\n        if(report.dependencyAnalysis){\n            if(report.dependencyAnalysis.skills && report.dependencyAnalysis.skills.modelsAnalysis){\n                let depErrors = {\n                    entities: {},\n                    models: {}\n                };\n                let hasAnyError = false;\n                for(let modelAnalysis of report.dependencyAnalysis.skills.modelsAnalysis){\n                    if(!modelAnalysis){\n                        continue;\n                    }\n                    let modelErrors = {};\n                    if(!modelAnalysis.generatedExists){\n                        modelErrors.missing = true;\n                        hasAnyError = true;\n                    }\n                    if(modelAnalysis.missingMethods && modelAnalysis.missingMethods.length > 0){\n                        modelErrors.missingMethods = modelAnalysis.missingMethods;\n                        hasAnyError = true;\n                    }\n                    if(modelAnalysis.relationsDiff){\n                        if('object' === typeof modelAnalysis.relationsDiff && !Array.isArray(modelAnalysis.relationsDiff)){\n                            if(sc.hasOwn(modelAnalysis.relationsDiff, 'onlyInPlugin') && modelAnalysis.relationsDiff.onlyInPlugin && modelAnalysis.relationsDiff.onlyInPlugin.length > 0){\n                                modelErrors.relationsOnlyInPlugin = modelAnalysis.relationsDiff.onlyInPlugin;\n                                hasAnyError = true;\n                            }\n                            if(sc.hasOwn(modelAnalysis.relationsDiff, 'onlyInGenerated') && modelAnalysis.relationsDiff.onlyInGenerated && modelAnalysis.relationsDiff.onlyInGenerated.length > 0){\n                                modelErrors.relationsOnlyInGenerated = modelAnalysis.relationsDiff.onlyInGenerated;\n                                hasAnyError = true;\n                            }\n                            if(sc.hasOwn(modelAnalysis.relationsDiff, 'differentJoins') && modelAnalysis.relationsDiff.differentJoins && modelAnalysis.relationsDiff.differentJoins.length > 0){\n                                modelErrors.relationsDifferentJoins = modelAnalysis.relationsDiff.differentJoins;\n                                hasAnyError = true;\n                            }\n                        }\n                    }\n                    if(modelAnalysis.error){\n                        modelErrors.error = modelAnalysis.error;\n                        hasAnyError = true;\n                    }\n                    if(Object.keys(modelErrors).length > 0){\n                        depErrors.models[modelAnalysis.fileName] = modelErrors;\n                    }\n                }\n                if(hasAnyError){\n                    errors['@reldens/skills'] = depErrors;\n                }\n            }\n            if(report.dependencyAnalysis.items && report.dependencyAnalysis.items.modelsAnalysis){\n                let depErrors = {\n                    entities: {},\n                    models: {}\n                };\n                let hasAnyError = false;\n                for(let modelAnalysis of report.dependencyAnalysis.items.modelsAnalysis){\n                    if(!modelAnalysis){\n                        continue;\n                    }\n                    let modelErrors = {};\n                    if(!modelAnalysis.generatedExists){\n                        modelErrors.missing = true;\n                        hasAnyError = true;\n                    }\n                    if(modelAnalysis.missingMethods && modelAnalysis.missingMethods.length > 0){\n                        modelErrors.missingMethods = modelAnalysis.missingMethods;\n                        hasAnyError = true;\n                    }\n                    if(modelAnalysis.relationsDiff){\n                        if('object' === typeof modelAnalysis.relationsDiff && !Array.isArray(modelAnalysis.relationsDiff)){\n                            if(sc.hasOwn(modelAnalysis.relationsDiff, 'onlyInPlugin') && modelAnalysis.relationsDiff.onlyInPlugin && modelAnalysis.relationsDiff.onlyInPlugin.length > 0){\n                                modelErrors.relationsOnlyInPlugin = modelAnalysis.relationsDiff.onlyInPlugin;\n                                hasAnyError = true;\n                            }\n                            if(sc.hasOwn(modelAnalysis.relationsDiff, 'onlyInGenerated') && modelAnalysis.relationsDiff.onlyInGenerated && modelAnalysis.relationsDiff.onlyInGenerated.length > 0){\n                                modelErrors.relationsOnlyInGenerated = modelAnalysis.relationsDiff.onlyInGenerated;\n                                hasAnyError = true;\n                            }\n                            if(sc.hasOwn(modelAnalysis.relationsDiff, 'differentJoins') && modelAnalysis.relationsDiff.differentJoins && modelAnalysis.relationsDiff.differentJoins.length > 0){\n                                modelErrors.relationsDifferentJoins = modelAnalysis.relationsDiff.differentJoins;\n                                hasAnyError = true;\n                            }\n                        }\n                    }\n                    if(modelAnalysis.error){\n                        modelErrors.error = modelAnalysis.error;\n                        hasAnyError = true;\n                    }\n                    if(Object.keys(modelErrors).length > 0){\n                        depErrors.models[modelAnalysis.fileName] = modelErrors;\n                    }\n                }\n                if(hasAnyError){\n                    errors['@reldens/items-system'] = depErrors;\n                }\n            }\n        }\n        if(report.fixtureComparison && report.fixtureComparison.differences){\n            let diff = report.fixtureComparison.differences;\n            if(diff.configDifferences && diff.configDifferences.length > 0){\n                if(!errors._configDifferences){\n                    errors._configDifferences = {};\n                }\n                for(let configDiff of diff.configDifferences){\n                    errors._configDifferences[configDiff.entityKey] = {\n                        missingKeys: configDiff.missingKeys || [],\n                        addedKeys: configDiff.addedKeys || []\n                    };\n                }\n            }\n        }\n        return errors;\n    }\n\n    generateSummary(report)\n    {\n        let summary = {\n            totalPlugins: 0,\n            pluginsWithEntities: 0,\n            pluginsWithModels: 0,\n            totalEntityFiles: 0,\n            totalModelFiles: 0,\n            entitiesMissingInGenerated: 0,\n            modelsMissingInGenerated: 0,\n            modelsWithMissingMethods: 0,\n            modelsWithRelationDifferences: 0,\n            dependenciesFound: {\n                skills: report.dependencyAnalysis.skills !== null,\n                items: report.dependencyAnalysis.items !== null\n            },\n            fixtureComparison: null\n        };\n        if(sc.hasOwn(report.fixtureComparison, 'differences') && report.fixtureComparison.differences){\n            let differences = report.fixtureComparison.differences;\n            summary.fixtureComparison = {\n                entitiesCountMatch: sc.get(differences, 'entitiesCountMatch', false),\n                missingInNew: sc.get(differences, 'missingInNew', []).length,\n                addedInNew: sc.get(differences, 'addedInNew', []).length,\n                configDifferencesCount: sc.get(differences, 'configDifferences', []).length\n            };\n        }\n        if(!report.pluginAnalysis){\n            Logger.error('Plugin analysis is undefined in report');\n            return summary;\n        }\n        for(let pluginName of Object.keys(report.pluginAnalysis)){\n            let plugin = report.pluginAnalysis[pluginName];\n            if(!plugin){\n                Logger.error('Plugin '+pluginName+' is undefined in analysis');\n                continue;\n            }\n            summary.totalPlugins++;\n            if(plugin.hasEntities){\n                summary.pluginsWithEntities++;\n                if(!plugin.entities){\n                    Logger.error('Plugin '+pluginName+' entities array is undefined');\n                    continue;\n                }\n                summary.totalEntityFiles+= plugin.entities.length;\n                if(!plugin.entitiesAnalysis){\n                    Logger.error('Plugin '+pluginName+' entitiesAnalysis array is undefined');\n                    continue;\n                }\n                for(let entityAnalysis of plugin.entitiesAnalysis){\n                    if(!entityAnalysis){\n                        Logger.error('Entity analysis is undefined in '+pluginName);\n                        continue;\n                    }\n                    if(!entityAnalysis.generatedExists){\n                        summary.entitiesMissingInGenerated++;\n                    }\n                }\n            }\n            if(plugin.hasModels){\n                summary.pluginsWithModels++;\n                if(!plugin.models){\n                    Logger.error('Plugin '+pluginName+' models array is undefined');\n                    continue;\n                }\n                summary.totalModelFiles+= plugin.models.length;\n                if(!plugin.modelsAnalysis){\n                    Logger.error('Plugin '+pluginName+' modelsAnalysis array is undefined');\n                    continue;\n                }\n                for(let modelAnalysis of plugin.modelsAnalysis){\n                    if(!modelAnalysis){\n                        Logger.error('Model analysis is undefined in '+pluginName);\n                        continue;\n                    }\n                    if(!modelAnalysis.generatedExists){\n                        summary.modelsMissingInGenerated++;\n                    }\n                    if(!modelAnalysis.missingMethods){\n                        Logger.error('Missing methods array is undefined for model in '+pluginName);\n                        continue;\n                    }\n                    if(modelAnalysis.missingMethods.length > 0){\n                        summary.modelsWithMissingMethods++;\n                    }\n                    if(!modelAnalysis.relationsDiff){\n                        continue;\n                    }\n                    if(Array.isArray(modelAnalysis.relationsDiff)){\n                        continue;\n                    }\n                    if('object' !== typeof modelAnalysis.relationsDiff){\n                        continue;\n                    }\n                    if(!sc.hasOwn(modelAnalysis.relationsDiff, 'onlyInPlugin')){\n                        continue;\n                    }\n                    if(!sc.hasOwn(modelAnalysis.relationsDiff, 'differentJoins')){\n                        continue;\n                    }\n                    if(!modelAnalysis.relationsDiff.onlyInPlugin){\n                        continue;\n                    }\n                    if(!modelAnalysis.relationsDiff.differentJoins){\n                        continue;\n                    }\n                    if(modelAnalysis.relationsDiff.onlyInPlugin.length > 0 || modelAnalysis.relationsDiff.differentJoins.length > 0){\n                        summary.modelsWithRelationDifferences++;\n                    }\n                }\n            }\n        }\n        return summary;\n    }\n}\n\nmodule.exports.GenerateCompleteComparison = GenerateCompleteComparison;\n\nif(require.main === module){\n    let generator = new GenerateCompleteComparison();\n    generator.generate().then(() => {\n        Logger.info('Analysis complete');\n    }).catch((error) => {\n        Logger.critical('Analysis failed: '+error.message);\n        Logger.critical('Stack trace: '+error.stack);\n        process.exit(1);\n    });\n}\n"
  },
  {
    "path": "tests/fixtures/generate-entities-fixtures.js",
    "content": "/**\n *\n * Reldens - GenerateEntitiesFixtures\n *\n */\n\nconst { EntitiesLoader } = require('../../lib/game/server/entities-loader');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger } = require('@reldens/utils');\n\nclass GenerateEntitiesFixtures\n{\n    async generate(outputFileName)\n    {\n        let reldensModuleLibPath = FileHandler.joinPaths(__dirname, '..', '..', 'lib');\n        let projectRoot = FileHandler.joinPaths(__dirname, '..', '..', '..');\n        let bucketFullPath = FileHandler.joinPaths(projectRoot, 'theme', 'default');\n        let distPath = FileHandler.joinPaths(projectRoot, 'dist');\n        let storageDriver = process.env.RELDENS_STORAGE_DRIVER || 'objection-js';\n        let result = EntitiesLoader.loadEntities({\n            reldensModuleLibPath: reldensModuleLibPath,\n            bucketFullPath: bucketFullPath,\n            distPath: distPath,\n            storageDriver: storageDriver,\n            withConfig: true,\n            withTranslations: true\n        });\n        if(!result){\n            Logger.critical('Failed to load entities.');\n            process.exit(1);\n        }\n        let entityStructures = {};\n        for(let key of Object.keys(result.entitiesRaw)){\n            entityStructures[key] = this.introspectClass(result.entitiesRaw[key]);\n        }\n        let snapshot = {\n            timestamp: new Date().toISOString(),\n            storageDriver: storageDriver,\n            stats: {\n                entitiesCount: Object.keys(result.entities).length,\n                entitiesRawCount: Object.keys(result.entitiesRaw).length,\n                translationsCount: Object.keys(result.translations).length\n            },\n            entityKeys: Object.keys(result.entities).sort(),\n            entities: result.entities,\n            entitiesRaw: result.entitiesRaw,\n            translations: result.translations,\n            classStructures: entityStructures\n        };\n        let outputPath = FileHandler.joinPaths(__dirname, outputFileName);\n        FileHandler.writeFile(outputPath, JSON.stringify(snapshot, null, 2));\n        Logger.info('Fixture generated: '+outputPath);\n        Logger.info('Entities: '+snapshot.stats.entitiesCount);\n        Logger.info('Raw: '+snapshot.stats.entitiesRawCount);\n        Logger.info('Translations: '+snapshot.stats.translationsCount);\n        return snapshot;\n    }\n\n    introspectClass(classConstructor)\n    {\n        if(!classConstructor){\n            return null;\n        }\n        let structure = {\n            className: classConstructor.name,\n            instanceMethods: [],\n            staticMethods: [],\n            properties: []\n        };\n        let prototype = classConstructor.prototype;\n        if(prototype){\n            let protoProps = Object.getOwnPropertyNames(prototype);\n            for(let prop of protoProps){\n                if('constructor' === prop){\n                    continue;\n                }\n                if('function' === typeof prototype[prop]){\n                    structure.instanceMethods.push(prop);\n                }\n            }\n        }\n        let staticProps = Object.getOwnPropertyNames(classConstructor);\n        for(let prop of staticProps){\n            if('length' === prop || 'name' === prop || 'prototype' === prop){\n                continue;\n            }\n            if('function' === typeof classConstructor[prop]){\n                structure.staticMethods.push(prop);\n                continue;\n            }\n            structure.properties.push(prop);\n        }\n        structure.instanceMethods.sort();\n        structure.staticMethods.sort();\n        structure.properties.sort();\n        return structure;\n    }\n}\n\nmodule.exports.GenerateEntitiesFixtures = GenerateEntitiesFixtures;\n\nif(require.main === module){\n    let generator = new GenerateEntitiesFixtures();\n    let fileName = process.argv[2] || 'generated-entities-old.json';\n    generator.generate(fileName);\n}\n"
  },
  {
    "path": "tests/fixtures/test-file.json",
    "content": "{ \"backgroundcolor\":\"#000000\",\n \"compressionlevel\":0,\n \"editorsettings\":\n    {\n     \"export\":\n        {\n         \"format\":\"json\",\n         \"target\":\"reldens-forest.json\"\n        }\n    },\n \"height\":28,\n \"infinite\":false,\n \"layers\":[\n        {\n         \"data\":[111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, 0, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 0, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 114, 111, 111, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 115, 111, 113, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 113, 113, 113, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 113, 113, 111, 111, 111, 112, 0, 0, 112, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 111, 111, 111, 111, 112, 0, 0, 112, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 0, 111, 111, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":70,\n         \"name\":\"pathfinder\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":72,\n         \"name\":\"respawn-area-monsters-lvl-1-2\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 114, 111, 111, 111, 111, 111, 111, 111, 111, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 115, 111, 113, 111, 111, 111, 111, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 113, 113, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 113, 111, 111, 111, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 111, 111, 111, 111, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111],\n         \"height\":28,\n         \"id\":50,\n         \"name\":\"ground\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 14, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 0, 14, 0, 0, 0, 0, 14, 15, 15, 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, 15, 0, 0, 0, 0, 0, 15, 16, 15, 17, 17, 17, 16, 15, 14, 15, 0, 15, 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, 16, 13, 0, 16, 14, 0, 0, 17, 16, 17, 14, 14, 17, 16, 16, 16, 17, 17, 16, 17, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 14, 14, 16, 14, 15, 16, 15, 14, 16, 16, 14, 16, 16, 16, 15, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 15, 16, 16, 14, 16, 17, 15, 16, 17, 15, 14, 16, 14, 15, 16, 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, 16, 17, 15, 16, 17, 16, 14, 17, 17, 16, 14, 15, 14, 17, 15, 0, 14, 16, 0, 0, 0, 0, 108, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 17, 0, 0, 0, 15, 15, 17, 14, 15, 14, 15, 17, 0, 15, 16, 17, 14, 14, 16, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 16, 0, 0, 0, 10, 17, 14, 17, 17, 15, 14, 15, 16, 0, 15, 14, 16, 0, 15, 16, 16, 0, 0, 0, 14, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 15, 17, 17, 15, 17, 0, 0, 0, 0, 16, 17, 16, 17, 15, 14, 0, 0, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 15, 16, 14, 15, 15, 14, 0, 0, 0, 15, 17, 15, 15, 16, 14, 0, 0, 0, 15, 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, 16, 0, 0, 0, 0, 15, 14, 14, 15, 0, 16, 17, 0, 15, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 17, 14, 0, 16, 0, 14, 17, 15, 14, 0, 16, 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, 30, 29, 0, 16, 17, 0, 15, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 21, 18, 19, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 20, 20, 19, 21, 18, 21, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 18, 20, 19, 18, 19, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 20, 20, 19, 21, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 17, 0, 0, 0, 0, 14, 14, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 0, 14, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 17, 16, 0, 0, 16, 16, 15, 14, 17, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 10, 15, 0, 11, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 16, 17, 16, 16, 0, 17, 17, 17, 17, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 15, 14, 16, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":51,\n         \"name\":\"ground-variations\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 3, 4, 5, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, 93, 0, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 102, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":52,\n         \"name\":\"ground-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 128, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 116, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 116, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 116, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 116, 138, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 117, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 0, 0, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129],\n         \"height\":28,\n         \"id\":68,\n         \"name\":\"river-animations-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 72, 73, 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":53,\n         \"name\":\"bridge\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 94, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":66,\n         \"name\":\"change-points\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":56,\n         \"name\":\"forest-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 86, 86, 86, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 97, 75, 76, 76, 76, 77, 98, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 88, 89, 89, 89, 90, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 88, 89, 89, 89, 90, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 88, 89, 89, 89, 90, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":57,\n         \"name\":\"trees-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 69, 70, 71, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":73,\n         \"name\":\"objects-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 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, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 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, 42, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 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, 42, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":58,\n         \"name\":\"over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }],\n \"nextlayerid\":74,\n \"nextobjectid\":1,\n \"orientation\":\"orthogonal\",\n \"renderorder\":\"right-down\",\n \"tiledversion\":\"1.4.3\",\n \"tileheight\":32,\n \"tilesets\":[\n        {\n         \"columns\":14,\n         \"firstgid\":1,\n         \"image\":\"reldens-forest.png\",\n         \"imageheight\":408,\n         \"imagewidth\":476,\n         \"margin\":1,\n         \"name\":\"reldens-forest\",\n         \"spacing\":2,\n         \"tilecount\":168,\n         \"tileheight\":32,\n         \"tiles\":[\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":115\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":117\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":119\n                        }],\n                 \"id\":115\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":116\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":118\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":120\n                        }],\n                 \"id\":116\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":121\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":123\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":125\n                        }],\n                 \"id\":121\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":122\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":124\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":126\n                        }],\n                 \"id\":122\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":127\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":130\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":133\n                        }],\n                 \"id\":127\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":128\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":131\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":134\n                        }],\n                 \"id\":128\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":129\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":132\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":135\n                        }],\n                 \"id\":129\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":136\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":139\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":142\n                        }],\n                 \"id\":136\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":137\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":140\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":143\n                        }],\n                 \"id\":137\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":138\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":141\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":144\n                        }],\n                 \"id\":138\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":145\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":148\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":151\n                        }],\n                 \"id\":145\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":146\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":149\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":152\n                        }],\n                 \"id\":146\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":147\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":150\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":153\n                        }],\n                 \"id\":147\n                }],\n         \"tilewidth\":32\n        }],\n \"tilewidth\":32,\n \"type\":\"map\",\n \"version\":1.4,\n \"width\":48\n}"
  },
  {
    "path": "tests/manager.js",
    "content": "/**\n *\n * Reldens - Manager\n *\n */\n\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger } = require('@reldens/utils');\nconst { spawn } = require('child_process');\nconst readline = require('readline');\n\nclass Manager\n{\n\n    constructor()\n    {\n        this.projectRoot = process.cwd();\n        this.testsDir = FileHandler.joinPaths(this.projectRoot, 'tests');\n        this.configFile = FileHandler.joinPaths(this.testsDir, 'config.json');\n        this.config = {};\n        this.parseArguments();\n    }\n\n    parseArguments()\n    {\n        for(let arg of process.argv){\n            if(arg.startsWith('--filter=')){\n                this.filter = arg.split('=')[1];\n                Logger.log(100, '', 'Filter applied: '+this.filter);\n            }\n            if(arg === '--break-on-error'){\n                this.breakOnError = true;\n                Logger.log(100, '', 'Break on error enabled');\n            }\n        }\n    }\n\n    async run()\n    {\n        Logger.log(100, '', '='.repeat(60));\n        Logger.log(100, '', 'RELDENS TEST MANAGER');\n        Logger.log(100, '', '='.repeat(60));\n        let config = await this.loadOrCreateConfig();\n        await this.executeTests(config);\n    }\n\n    async loadOrCreateConfig()\n    {\n        if(FileHandler.exists(this.configFile)){\n            Logger.log(100, '', 'Loading existing test configuration...');\n            let configContent = FileHandler.readFile(this.configFile);\n            this.config = JSON.parse(configContent);\n            return this.config;\n        }\n        Logger.log(100, '', 'Test configuration not found, creating new...');\n        await this.promptConfig();\n        this.saveConfig();\n        return this.config;\n    }\n\n    async promptConfig()\n    {\n        let rl = readline.createInterface({\n            input: process.stdin,\n            output: process.stdout\n        });\n        let question = (prompt) => new Promise(resolve => rl.question(prompt, resolve));\n        Logger.log(100, '', 'Test configuration setup:');\n        this.config.baseUrl = await question('Server URL (http://localhost:8080): ') || 'http://localhost:8080';\n        this.config.adminPath = await question('Admin path (/reldens-admin): ') || '/reldens-admin';\n        this.config.adminUser = await question('Admin username (root@yourgame.com): ') || 'root@yourgame.com';\n        this.config.adminPassword = await question('Admin password (root): ') || 'root';\n        this.config.serverPath = await question('Server folder path (optional, for upload tests): ') || '';\n        this.config.themeName = await question('Theme name (default): ') || 'default';\n        this.config.dbHost = await question('Database host (localhost): ') || 'localhost';\n        this.config.dbPort = await question('Database port (3306): ') || '3306';\n        this.config.dbUser = await question('Database user (reldens): ') || 'reldens';\n        this.config.dbPassword = await question('Database password (reldens): ') || 'reldens';\n        this.config.dbName = await question('Database name (reldens_test): ') || 'reldens_test';\n        rl.close();\n    }\n\n    saveConfig()\n    {\n        let configContent = JSON.stringify(this.config, null, 2);\n        FileHandler.writeFile(this.configFile, configContent);\n        Logger.log(100, '', 'Test configuration saved to: '+this.configFile);\n    }\n\n    async executeTests(config)\n    {\n        Logger.log(100, '', 'Starting tests against: '+config.baseUrl+config.adminPath);\n        if(config.serverPath){\n            Logger.log(100, '', 'Upload tests enabled with server path: '+config.serverPath);\n        }\n        let configArg = JSON.stringify(config);\n        let args = [FileHandler.joinPaths(this.testsDir, 'run.js'), configArg];\n        if(this.filter){\n            args.push('--filter='+this.filter);\n        }\n        if(this.breakOnError){\n            args.push('--break-on-error');\n        }\n        let testRunner = spawn('node', args, {\n            stdio: 'inherit'\n        });\n        return new Promise((resolve) => {\n            testRunner.on('close', (code) => {\n                Logger.log(100, '', 'Test execution completed with exit code: '+code);\n                process.exit(code);\n            });\n        });\n    }\n\n}\n\nlet manager = new Manager();\nmanager.run().catch((error) => {\n    Logger.critical('Manager error: '+error.message);\n    process.exit(1);\n});\n"
  },
  {
    "path": "tests/run.js",
    "content": "/**\n *\n * Reldens - Admin Integration Test Runner\n *\n */\n\nconst { FileHandler } = require('@reldens/server-utils');\nconst { Logger, sc } = require('@reldens/utils');\nconst { DatabaseResetUtility } = require('./database-reset-utility');\nconst readline = require('readline');\n\nLogger.activeLogLevels = [100];\nLogger.setLogLevel(100);\nLogger.addTimeStamp = false;\nLogger.context().RELDENS_ENABLE_TRACE_FOR = 'none';\n\nasync function runTests()\n{\n    try {\n        await confirmTestExecution();\n        Logger.log(100, '', '='.repeat(60));\n        Logger.log(100, '', 'TESTING RELDENS ADMIN INTEGRATION');\n        Logger.log(100, '', '='.repeat(60)+'\\n');\n        Logger.log(100, '', 'Test execution started: '+sc.formatDate(new Date()));\n        let config = JSON.parse(process.argv[2] || '{}');\n        Logger.log(100, '', 'Resetting database before tests...');\n        let databaseResetUtility = new DatabaseResetUtility(config);\n        let resetResult = await databaseResetUtility.resetDatabase();\n        if(!resetResult){\n            Logger.log(100, '', 'Database reset failed - aborting test execution');\n            process.exit(1);\n        }\n        Logger.log(100, '', 'Database reset completed successfully\\n');\n        let testFiles = await getTestFilesFromDirectory(__dirname);\n        let filter = null;\n        let methodFilter = null;\n        let breakOnError = false;\n        for(let arg of process.argv){\n            if(arg.startsWith('--filter=')){\n                let filterValue = arg.split('=')[1];\n                if(filterValue.includes('::')){\n                    let filterParts = filterValue.split('::');\n                    filter = filterParts[0];\n                    methodFilter = filterParts[1];\n                }\n                if(!filterValue.includes('::')){\n                    filter = filterValue;\n                }\n            }\n            if(arg === '--break-on-error'){\n                breakOnError = true;\n            }\n        }\n        testFiles = applyFilter(testFiles, filter);\n        if(0 === testFiles.length){\n            let filterMsg = filter ? ' matching filter: '+filter : '';\n            Logger.log(100, '', 'No test files found in directory: '+__dirname+filterMsg);\n            process.exit(1);\n        }\n        let totalTests = 0;\n        let totalPassed = 0;\n        for(let testFile of testFiles){\n            let testDisplayName = getTestDisplayName(testFile);\n            Logger.log(100, '', 'Running '+testDisplayName+' ('+testFile+')');\n            let testModule = require(FileHandler.joinPaths(__dirname, testFile));\n            let TestClassName = Object.keys(testModule)[0];\n            if(!TestClassName){\n                Logger.log(100, '', 'No test class found in: '+testFile);\n                continue;\n            }\n            let TestClass = testModule[TestClassName];\n            let testInstance = new TestClass(config);\n            testInstance.breakOnError = breakOnError;\n            let testMethods = getTestMethods(testInstance);\n            if(methodFilter){\n                testMethods = testMethods.filter(methodName => methodName.includes(methodFilter));\n            }\n            if(0 === testMethods.length){\n                let methodFilterMsg = methodFilter ? ' matching method filter: '+methodFilter : '';\n                Logger.log(100, '', 'No test methods found in: '+testFile+methodFilterMsg);\n                continue;\n            }\n            for(let methodName of testMethods){\n                if('function' === typeof testInstance[methodName]){\n                    let testFailed = false;\n                    try {\n                        await testInstance[methodName]();\n                    } catch(error){\n                        testFailed = true;\n                        Logger.log(100, '', 'Test method failed: '+methodName+' - '+error.message);\n                        if(breakOnError){\n                            Logger.log(100, '', 'Breaking on error as requested');\n                            process.exit(1);\n                        }\n                    }\n                    if(breakOnError && testFailed){\n                        break;\n                    }\n                }\n            }\n            totalTests += testInstance.testCount;\n            totalPassed += testInstance.passedCount;\n            if(breakOnError && testInstance.testCount !== testInstance.passedCount){\n                Logger.log(100, '', 'Breaking execution due to test failure');\n                break;\n            }\n        }\n        Logger.log(100, '', '='.repeat(60));\n        if(totalTests === totalPassed){\n            Logger.log(100, '', 'ALL TESTS PASSED: '+totalPassed+'/'+totalTests+' succeed.');\n            Logger.log(100, '', '='.repeat(60));\n            process.exit(0);\n        }\n        Logger.log(100, '', 'TESTS FAILED: '+totalPassed+'/'+totalTests+' succeed.');\n        Logger.log(100, '', '='.repeat(60));\n        process.exit(1);\n    } catch(error){\n        Logger.log(100, '', 'Test execution failed: '+error.message);\n        Logger.log(100, '', error.stack);\n        process.exit(1);\n    }\n}\n\nasync function confirmTestExecution()\n{\n    let rl = readline.createInterface({\n        input: process.stdin,\n        output: process.stdout\n    });\n    console.log('\\n⚠️  WARNING: Integration Tests');\n    console.log('══════════════════════════════');\n    console.log('Running integration tests may modify or corrupt your test database.');\n    console.log('Make sure you are using a dedicated test environment.');\n    console.log('══════════════════════════════\\n');\n    return new Promise((resolve) => {\n        rl.question('Do you want to continue? (y/N): ', (answer) => {\n            rl.close();\n            let shouldContinue = answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n            if(!shouldContinue){\n                console.log('Tests cancelled by user.');\n                process.exit(0);\n            }\n            resolve();\n        });\n    });\n}\n\nfunction getTestMethods(testInstance)\n{\n    let methods = [];\n    for(let prototype = Object.getPrototypeOf(testInstance);\n        prototype !== null && prototype.constructor.name !== 'BaseTest';\n        prototype = Object.getPrototypeOf(prototype)){\n        let propertyNames = Object.getOwnPropertyNames(prototype);\n        for(let propertyName of propertyNames){\n            if(\n                propertyName.startsWith('test')\n                && sc.isFunction(testInstance[propertyName])\n                && 'constructor' !== propertyName\n            ){\n                if(!methods.includes(propertyName)){\n                    methods.push(propertyName);\n                }\n            }\n        }\n    }\n    return methods.sort();\n}\n\nfunction getTestDisplayName(fileName)\n{\n    return fileName\n            .replace(/^test-/, '')\n            .replace(/\\.js$/, '')\n            .split('-')\n            .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n            .join(' ')\n        + ' Tests';\n}\n\nfunction applyFilter(testFiles, filter)\n{\n    if(!filter){\n        return testFiles;\n    }\n    return testFiles.filter(file => file.includes(filter));\n}\n\nasync function getTestFilesFromDirectory(directoryPath)\n{\n    if(!FileHandler.exists(directoryPath)){\n        return [];\n    }\n    let files = FileHandler.readFolder(directoryPath);\n    let excludeFiles = ['manager.js', 'utils.js', 'run.js', 'base-test.js'];\n    return files.filter(file => file.startsWith('test-') && file.endsWith('.js') && !excludeFiles.includes(file));\n}\n\nprocess.on('unhandledRejection', (reason, promise) => {\n    Logger.log(100, '', 'Unhandled Rejection at:', promise, 'reason:', reason);\n    process.exit(1);\n});\n\nprocess.on('uncaughtException', (error) => {\n    Logger.log(100, '', 'Uncaught Exception:', error);\n    process.exit(1);\n});\n\nrunTests();\n"
  },
  {
    "path": "tests/test-admin-auth.js",
    "content": "/**\n *\n * Reldens - TestAdminAuth\n *\n */\n\nconst { BaseTest } = require('./base-test');\n\nclass TestAdminAuth extends BaseTest\n{\n\n    async testLoginPageLoads()\n    {\n        await this.test('Login page loads', async () => {\n            let response = await this.makeRequest('GET', this.adminPath+'/login');\n            this.assert.strictEqual(200, response.statusCode);\n            this.assert(response.body.includes('login') || \n                response.body.includes('email') || \n                response.body.includes('password'));\n        });\n    }\n\n    async testValidLoginRedirectsToAdmin()\n    {\n        await this.test('Valid login redirects to admin', async () => {\n            let response = await this.makeFormRequest('POST', \n                this.adminPath+'/login', {\n                email: this.adminUser,\n                password: this.adminPassword\n            });\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(response.headers.location.includes(this.adminPath));\n        });\n    }\n\n    async testInvalidLoginShowsError()\n    {\n        await this.test('Invalid login shows error', async () => {\n            let response = await this.makeFormRequest('POST', \n                this.adminPath+'/login', {\n                email: 'invalid@test.com',\n                password: 'wrongpassword'\n            });\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(response.headers.location.includes('login'));\n        });\n    }\n\n    async testLogoutDestroysSession()\n    {\n        await this.test('Logout destroys session', async () => {\n            let response = await this.makeRequest('GET', this.adminPath+'/logout');\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(response.headers.location.includes('/login'));\n        });\n    }\n\n    async testAdminRootRedirectsWhenNotAuthenticated()\n    {\n        await this.test('Admin root redirects when not authenticated', async () => {\n            let response = await this.makeRequest('GET', this.adminPath);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(response.headers.location.includes('/login'));\n        });\n    }\n\n    async testEntityRoutesRequireAuthentication()\n    {\n        await this.test('Entity routes require authentication', async () => {\n            let response = await this.makeRequest('GET', this.adminPath+'/users');\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(response.headers.location.includes('/login'));\n        });\n    }\n\n}\n\nmodule.exports.TestAdminAuth = TestAdminAuth;\n"
  },
  {
    "path": "tests/test-admin-crud.js",
    "content": "/**\n *\n * Reldens - TestAdminCrud\n *\n */\n\nconst { BaseTest } = require('./base-test');\nconst { Logger } = require('@reldens/utils');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { CrudTestData } = require('./fixtures/crud-test-data');\nconst { EntitiesList } = require('./fixtures/entities-list');\n\nclass TestAdminCrud extends BaseTest\n{\n    constructor(config)\n    {\n        super(config);\n        this.entitiesWithoutRequiredFK = EntitiesList.getEntitiesWithoutRequiredFK();\n        this.entitiesWithRequiredFK = EntitiesList.getEntitiesWithRequiredFK();\n        this.entitiesWithUploadsButNoRequiredFK = EntitiesList.getEntitiesWithUploadsButNoRequiredFK();\n        this.entitiesWithUploadsAndRequiredFK = EntitiesList.getEntitiesWithUploadsAndRequiredFK();\n        this.testPrefix = CrudTestData.getTestPrefix();\n        this.createdIds = {};\n        this.testRecordsForCleanup = [];\n        this.baseTestIds = CrudTestData.getBaseTestIds();\n        this.serverPath = config.serverPath || null;\n        this.themeName = config.themeName || 'default';\n        this.testFiles = [];\n    }\n\n    async testEntityCrudWithoutFK()\n    {\n        Logger.log(100, '', 'Running CRUD tests for entities without required FK');\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.preCleanup(session);\n        for(let entity of this.entitiesWithoutRequiredFK){\n            await this.runEntityCrudFlow(entity, session, 'withoutFK');\n        }\n        await this.cleanup();\n    }\n\n    async testEntityCrudWithRequiredFK()\n    {\n        Logger.log(100, '', 'Running CRUD tests for entities with required FK');\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.preCleanup(session);\n        for(let entity of this.entitiesWithRequiredFK){\n            await this.runEntityCrudFlow(entity, session, 'withRequiredFK');\n        }\n        await this.cleanup();\n    }\n\n    async testEntityCrudWithUploadsNoFK()\n    {\n        if(!this.serverPath){\n            return;\n        }\n        Logger.log(100, '', 'Running CRUD tests for entities with uploads but no required FK');\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.preCleanup(session);\n        for(let entity of this.entitiesWithUploadsButNoRequiredFK){\n            await this.runEntityCrudFlowWithUploads(entity, session, 'withUploadsNoFK');\n        }\n        await this.cleanup();\n    }\n\n    async testEntityCrudWithUploadsAndFK()\n    {\n        if(!this.serverPath){\n            return;\n        }\n        Logger.log(100, '', 'Running CRUD tests for entities with uploads and required FK');\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.preCleanup(session);\n        for(let entity of this.entitiesWithUploadsAndRequiredFK){\n            await this.runEntityCrudFlowWithUploads(entity, session, 'withUploadsAndFK');\n        }\n        await this.cleanup();\n    }\n\n    async runEntityCrudFlow(entity, session, type)\n    {\n        Logger.log(100, '', 'Testing entity '+type+': '+entity);\n        await this.runEntityList(entity, session, 'initially');\n        let createdRecordId = await this.runEntityCreate(entity, session, 'main');\n        await this.runEntityList(entity, session, 'after creation');\n        await this.runEntityListWithFilters(entity, session);\n        await this.runEntityEdit(entity, session, createdRecordId, 'edit');\n        await this.runEntityDeleteAndEditFlows(entity, session, createdRecordId);\n    }\n\n    async runEntityCrudFlowWithUploads(entity, session, type)\n    {\n        Logger.log(100, '', 'Testing entity '+type+': '+entity);\n        await this.runEntityList(entity, session, 'initially');\n        let createdRecordId = await this.runEntityCreate(entity, session, 'main');\n        await this.runEntityCreateWithUpload(entity, session, 'upload');\n        await this.runEntityList(entity, session, 'after creation');\n        await this.runEntityListWithFilters(entity, session);\n        await this.runEntityEdit(entity, session, createdRecordId, 'edit');\n        await this.runEntityEditWithUpload(entity, session, createdRecordId, 'edit-upload');\n        await this.runEntityDeleteAndEditFlows(entity, session, createdRecordId);\n    }\n\n    async runEntityDeleteAndEditFlows(entity, session, createdRecordId)\n    {\n        let deleteTestRecordId = await this.runEntityCreateForDelete(entity, session);\n        await this.runEntityDelete(entity, session, deleteTestRecordId);\n        await this.runEntityCreateWithInvalidData(entity, session);\n        let editFailTestRecordId = await this.runEntityCreateForEditFail(entity, session);\n        await this.runEntityEditWithInvalidData(entity, session, editFailTestRecordId);\n        await this.runEntityView(entity, session, createdRecordId);\n        await this.runEntityEditForm(entity, session, createdRecordId);\n    }\n\n    async preCleanup(session)\n    {\n        try {\n            await this.makeFormRequest(\n                'POST',\n                this.adminPath+'/config/bulk-delete',\n                {scope: 'test', pathPattern: this.testPrefix+'%', confirm: 1, action: 'bulk_delete'},\n                session\n            );\n        } catch(error){\n            Logger.log(100, '', 'Pre-cleanup failed: '+error.message);\n        }\n    }\n\n    async runEntityList(entity, session, context)\n    {\n        await this.test(entity+' - List records '+context, async () => {\n            let response = await this.makeAuthenticatedRequest('GET', this.adminPath+'/'+entity, null, session);\n            this.assert.strictEqual(200, response.statusCode);\n            this.assert(response.body.includes('<table class=\"list\">'));\n            this.assert(response.body.includes('<div class=\"entity-list '+entity+'-list\">'));\n        });\n    }\n\n    async runEntityCreate(entity, session, suffix)\n    {\n        let createTestData = this.getTestDataForEntity(entity, suffix);\n        let createdRecordId = null;\n        await this.test(entity+' - Create record with valid data ('+suffix+')', async () => {\n            let response = await this.makeEntityRequest('POST', entity, '/save', createTestData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(response.headers.location);\n            this.assert(!response.headers.location.includes('error'));\n            createdRecordId = this.extractIdFromLocation(response.headers.location, entity);\n            this.assert(createdRecordId);\n            this.createdIds[entity+'_'+suffix] = createdRecordId;\n            this.trackRecordForCleanup(entity, createdRecordId);\n        });\n        return createdRecordId;\n    }\n\n    async runEntityCreateWithUpload(entity, session, suffix)\n    {\n        let hasUploadFields = CrudTestData.getUploadFieldsForEntity(entity).length > 0;\n        if(!hasUploadFields){\n            return;\n        }\n        await this.test(entity+' - Create record with file upload ('+suffix+')', async () => {\n            let uploadTestData = this.getTestDataForEntity(entity, suffix);\n            let response = await this.makeEntityRequest('POST', entity, '/save', uploadTestData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(!response.headers.location.includes('error'));\n            let uploadRecordId = this.extractIdFromLocation(response.headers.location, entity);\n            this.trackRecordForCleanup(entity, uploadRecordId);\n        });\n    }\n\n    async runEntityListWithFilters(entity, session)\n    {\n        await this.test(entity+' - List records with filters', async () => {\n            let createTestData = this.getTestDataForEntity(entity, 'filter');\n            let filterParams = this.getFilterParams(entity, createTestData);\n            let response = await this.makeAuthenticatedRequest(\n                'GET',\n                this.adminPath+'/'+entity+'?'+filterParams,\n                null,\n                session\n            );\n            this.assert.strictEqual(200, response.statusCode);\n        });\n    }\n\n    async runEntityEdit(entity, session, recordId, suffix)\n    {\n        await this.test(entity+' - Edit existing record ('+suffix+')', async () => {\n            let editData = this.getTestDataForEntity(entity, suffix);\n            let idField = EntitiesList.getEntityIdField(entity);\n            editData[idField] = recordId;\n            let response = await this.makeEntityRequest('POST', entity, '/save', editData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(!response.headers.location.includes('error'));\n        });\n    }\n\n    async runEntityEditWithUpload(entity, session, recordId, suffix)\n    {\n        let hasUploadFields = CrudTestData.getUploadFieldsForEntity(entity).length > 0;\n        if(!hasUploadFields){\n            return;\n        }\n        await this.test(entity+' - Edit record with file upload ('+suffix+')', async () => {\n            let uploadEditData = this.getTestDataForEntity(entity, suffix);\n            let idField = EntitiesList.getEntityIdField(entity);\n            uploadEditData[idField] = recordId;\n            let response = await this.makeEntityRequest('POST', entity, '/save', uploadEditData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(!response.headers.location.includes('error'));\n        });\n    }\n\n    async runEntityCreateForDelete(entity, session)\n    {\n        let deleteTestRecordId = null;\n        await this.test(entity+' - Create record for delete test', async () => {\n            let deleteTestData = this.getTestDataForEntity(entity, 'delete');\n            let response = await this.makeEntityRequest('POST', entity, '/save', deleteTestData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(!response.headers.location.includes('error'));\n            deleteTestRecordId = this.extractIdFromLocation(response.headers.location, entity);\n            this.assert(deleteTestRecordId);\n        });\n        return deleteTestRecordId;\n    }\n\n    async runEntityDelete(entity, session, recordId)\n    {\n        await this.test(entity+' - Delete the test record', async () => {\n            let idField = EntitiesList.getEntityIdField(entity);\n            let response = await this.makeEntityRequest('POST', entity, '/delete', {\n                [idField]: recordId,\n                confirm: 1,\n                action: 'delete'\n            }, session);\n            this.assert.strictEqual(302, response.statusCode);\n            await this.validateRecordDeleted(entity, recordId, session);\n        });\n    }\n\n    async runEntityCreateWithInvalidData(entity, session)\n    {\n        let invalidData = CrudTestData.getInvalidTestData(entity);\n        if(!invalidData){\n            Logger.log(100, '', 'Skipping invalid data test for '+entity+' - no invalid case exists');\n            return;\n        }\n        await this.test(entity+' - Create with missing data (should fail)', async () => {\n            let response = await this.makeEntityRequest('POST', entity, '/save', invalidData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(!response.headers.location.includes('success'));\n        });\n    }\n\n    async runEntityCreateForEditFail(entity, session)\n    {\n        let editFailTestRecordId = null;\n        await this.test(entity+' - Create record for edit fail test', async () => {\n            let editFailTestData = this.getTestDataForEntity(entity, 'edit-fail');\n            let response = await this.makeEntityRequest('POST', entity, '/save', editFailTestData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            editFailTestRecordId = this.extractIdFromLocation(response.headers.location, entity);\n            this.trackRecordForCleanup(entity, editFailTestRecordId);\n        });\n        return editFailTestRecordId;\n    }\n\n    async runEntityEditWithInvalidData(entity, session, recordId)\n    {\n        let invalidEditData = CrudTestData.getInvalidTestData(entity);\n        if(!invalidEditData){\n            Logger.log(100, '', 'Skipping invalid edit test for '+entity+' - no invalid case exists');\n            return;\n        }\n        await this.test(entity+' - Edit with missing data (should fail)', async () => {\n            let idField = EntitiesList.getEntityIdField(entity);\n            invalidEditData[idField] = recordId;\n            let response = await this.makeEntityRequest('POST', entity, '/save', invalidEditData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(!response.headers.location.includes('success'));\n        });\n    }\n\n    async runEntityView(entity, session, recordId)\n    {\n        await this.test(entity+' - View record validation', async () => {\n            let idField = EntitiesList.getEntityIdField(entity);\n            let response = await this.makeAuthenticatedRequest(\n                'GET',\n                this.adminPath+'/'+entity+'/view?'+idField+'='+recordId,\n                null,\n                session\n            );\n            this.assert.strictEqual(200, response.statusCode);\n        });\n    }\n\n    async runEntityEditForm(entity, session, recordId)\n    {\n        await this.test(entity+' - Edit form validation', async () => {\n            let idField = EntitiesList.getEntityIdField(entity);\n            let response = await this.makeAuthenticatedRequest(\n                'GET',\n                this.adminPath+'/'+entity+'/edit?'+idField+'='+recordId,\n                null,\n                session\n            );\n            this.assert.strictEqual(200, response.statusCode);\n            this.assert(response.body.includes('<form'));\n        });\n    }\n\n    getTestDataForEntity(entity, suffix)\n    {\n        let baseData = CrudTestData.getValidTestData(entity, this.testPrefix, suffix);\n        let uploadFields = CrudTestData.getUploadFieldsForEntity(entity);\n        for(let field of uploadFields){\n            let testFile = this.getTestFileForField(entity, field);\n            baseData[field] = {\n                filename: testFile.filename,\n                filePath: testFile.filePath,\n                contentType: testFile.contentType\n            };\n        }\n        return baseData;\n    }\n\n    getTestFileForField(entity, field)\n    {\n        let testFiles = {\n            rooms: {\n                map_filename: {\n                    filename: 'test-file.json',\n                    filePath: FileHandler.joinPaths(process.cwd(), 'tests', 'fixtures', 'test-file.json'),\n                    contentType: 'application/json'\n                },\n                scene_images: {\n                    filename: 'test-file.png',\n                    filePath: FileHandler.joinPaths(process.cwd(), 'tests', 'fixtures', 'test-file.png'),\n                    contentType: 'image/png'\n                }\n            },\n            audio: {\n                files_name: {\n                    filename: 'test-audio.mp3',\n                    filePath: FileHandler.joinPaths(process.cwd(), 'tests', 'fixtures', 'test-audio.mp3'),\n                    contentType: 'audio/mpeg'\n                }\n            },\n            'items-item': {\n                files_name: {\n                    filename: 'test-file.png',\n                    filePath: FileHandler.joinPaths(process.cwd(), 'tests', 'fixtures', 'test-file.png'),\n                    contentType: 'image/png'\n                }\n            },\n            objects: {\n                asset_file: {\n                    filename: 'test-file.png',\n                    filePath: FileHandler.joinPaths(process.cwd(), 'tests', 'fixtures', 'test-file.png'),\n                    contentType: 'image/png'\n                }\n            }\n        };\n        let entityFiles = testFiles[entity];\n        if(!entityFiles || !entityFiles[field]){\n            return {\n                filename: 'test-file.png',\n                filePath: FileHandler.joinPaths(process.cwd(), 'tests', 'fixtures', 'test-file.png'),\n                contentType: 'image/png'\n            };\n        }\n        return entityFiles[field];\n    }\n\n    async makeEntityRequest(method, entity, endpoint, data, session)\n    {\n        if('GET' === method){\n            return await this.makeAuthenticatedRequest(method, this.adminPath+'/'+entity+endpoint, data, session);\n        }\n        if(this.entityHasUploadFields(entity, data)){\n            return await this.makeMultipartRequest(method, this.adminPath+'/'+entity+endpoint, data, session);\n        }\n        return await this.makeFormRequest(method, this.adminPath+'/'+entity+endpoint, data, session);\n    }\n\n    entityHasUploadFields(entity, data)\n    {\n        let uploadFields = CrudTestData.getUploadFieldsForEntity(entity);\n        if(!uploadFields.length){\n            return false;\n        }\n        for(let field of uploadFields){\n            if(data && data[field]){\n                return true;\n            }\n        }\n        return false;\n    }\n\n    getFilterParams(entity, testData)\n    {\n        let filterMappings = {\n            rooms: 'name='+encodeURIComponent(testData.name || ''),\n            objects: 'object_class_key='+encodeURIComponent(testData.object_class_key || ''),\n            'skills-skill': 'key='+encodeURIComponent(testData.key || ''),\n            'items-item': 'key='+encodeURIComponent(testData.key || ''),\n            ads: 'key='+encodeURIComponent(testData.key || ''),\n            audio: 'audio_key='+encodeURIComponent(testData.audio_key || ''),\n            config: 'scope='+encodeURIComponent(testData.scope || ''),\n            features: 'code='+encodeURIComponent(testData.code || ''),\n            users: 'username='+encodeURIComponent(testData.username || '')\n        };\n        return filterMappings[entity] || 'id='+encodeURIComponent(testData.id || '');\n    }\n\n    trackRecordForCleanup(entity, recordId)\n    {\n        if(!recordId){\n            return;\n        }\n        this.testRecordsForCleanup.push({entity: entity, id: recordId});\n    }\n\n    async cleanup()\n    {\n        try {\n            let session = await this.getAuthenticatedSession();\n            if(!session){\n                Logger.log(100, '', 'Cannot cleanup - authentication failed');\n                return;\n            }\n            for(let record of this.testRecordsForCleanup){\n                try {\n                    let idField = EntitiesList.getEntityIdField(record.entity);\n                    await this.makeEntityRequest(\n                        'POST',\n                        record.entity,\n                        '/delete',\n                        {[idField]: record.id, confirm: 1, action: 'delete'},\n                        session\n                    );\n                } catch(error){\n                    Logger.log(100, '', 'Cleanup failed for '+record.entity+' ID '+record.id+': '+error.message);\n                }\n            }\n            await this.cleanupConfigTestData(session);\n            Logger.log(100, '', 'Database cleanup completed');\n        } catch(error){\n            Logger.log(100, '', 'Database cleanup failed: '+error.message);\n        }\n    }\n\n    async cleanupConfigTestData(session)\n    {\n        try {\n            await this.makeFormRequest(\n                'POST',\n                this.adminPath+'/config/bulk-delete',\n                {scope: 'test', pathPattern: this.testPrefix+'%', confirm: 1, action: 'bulk_delete'},\n                session\n            );\n        } catch(error){\n            Logger.log(100, '', 'Config cleanup failed: '+error.message);\n        }\n    }\n\n    async validateRecordDeleted(entity, recordId, session)\n    {\n        let idField = EntitiesList.getEntityIdField(entity);\n        let response = await this.makeAuthenticatedRequest(\n            'GET',\n            this.adminPath+'/'+entity+'/view?'+idField+'='+recordId,\n            null,\n            session\n        );\n        this.assert.strictEqual(200, response.statusCode);\n        this.assert(response.body.includes('<!DOCTYPE html>'));\n    }\n\n    extractIdFromLocation(location, entity)\n    {\n        if(!location){\n            return null;\n        }\n        let idField = EntitiesList.getEntityIdField(entity);\n        let customIdMatch = location.match(new RegExp('[?&]'+idField+'=(\\\\d+)'));\n        if(customIdMatch){\n            return customIdMatch[1];\n        }\n        let match = location.match(/[?&]id=(\\d+)/);\n        if(!match){\n            match = location.match(/\\/(\\d+)(?:[?&]|$)/);\n        }\n        if(!match){\n            match = location.match(/success.*?(\\d+)/);\n        }\n        return match ? match[1] : null;\n    }\n\n}\n\nmodule.exports.TestAdminCrud = TestAdminCrud;\n"
  },
  {
    "path": "tests/test-admin-features.js",
    "content": "/**\n *\n * Reldens - TestAdminFeatures\n *\n */\n\nconst { BaseTest } = require('./base-test');\nconst { Logger } = require('@reldens/utils');\nconst { FileHandler } = require('@reldens/server-utils');\nconst { FeaturesTestData } = require('./fixtures/features-test-data');\nconst { CrudTestData } = require('./fixtures/crud-test-data');\n\nclass TestAdminFeatures extends BaseTest\n{\n\n    constructor(config)\n    {\n        super(config);\n        this.projectRoot = process.cwd();\n        this.testFiles = [];\n        this.testPrefix = 'test-features-deterministic';\n        this.baseTestIds = CrudTestData.getBaseTestIds();\n        this.serverPath = config.serverPath || null;\n        this.themeName = config.themeName || 'default';\n    }\n\n    async testMapsWizardPageLoads()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Maps wizard page loads', async () => {\n            let response = await this.makeAuthenticatedRequest('GET', this.adminPath+'/maps-wizard', null, session);\n            this.assert.strictEqual(200, response.statusCode);\n            this.assert(response.body.includes('wizard'));\n        });\n    }\n\n    async testMapsWizardGeneratesWithValidData()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Maps wizard generates with valid data and validates file creation', async () => {\n            let wizardData = FeaturesTestData.getMapsWizardValidData();\n            let response = await this.makeFormRequestWithTimeout(\n                'POST',\n                this.adminPath+'/maps-wizard',\n                wizardData,\n                session,\n                30000\n            );\n            this.assert.strictEqual(302, response.statusCode);\n        });\n    }\n\n    async testMapsWizardFailsWithInvalidData()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Maps wizard fails with invalid data', async () => {\n            let wizardData = FeaturesTestData.getMapsWizardInvalidData();\n            let response = await this.makeFormRequestWithTimeout(\n                'POST',\n                this.adminPath+'/maps-wizard',\n                wizardData,\n                session,\n                15000\n            );\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(response.headers.location);\n            this.assert(response.headers.location.includes('mapsWizardWrongJsonDataError'));\n        });\n    }\n\n    async testObjectsImportPageLoads()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Objects import page loads', async () => {\n            let response = await this.makeAuthenticatedRequest(\n                'GET',\n                this.adminPath+'/objects-import',\n                null,\n                session\n            );\n            this.assert.strictEqual(200, response.statusCode);\n            this.assert(response.body.includes('import'));\n        });\n    }\n\n    async testObjectsImportWithValidJson()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Objects import with valid JSON validates import count', async () => {\n            let importData = this.getObjectsImportDeterministicData();\n            let response = await this.makeFormRequest(\n                'POST',\n                this.adminPath+'/objects-import',\n                importData,\n                session\n            );\n            this.validateSuccessfulResponse(response);\n            await this.validateImportResult(response.headers.location, 2);\n        });\n    }\n\n    async testObjectsImportFailsWithInvalidJson()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Objects import fails with invalid JSON', async () => {\n            let importData = FeaturesTestData.getObjectsImportInvalidData();\n            let response = await this.makeFormRequest('POST', this.adminPath+'/objects-import', importData, session);\n            this.assert.strictEqual(302, response.statusCode);\n        });\n    }\n\n    async testObjectsImportHandlesMissingFields()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Objects import handles missing fields', async () => {\n            let importData = FeaturesTestData.getObjectsImportMissingFieldsData();\n            let response = await this.makeFormRequest('POST', this.adminPath+'/objects-import', importData, session);\n            this.assert.strictEqual(302, response.statusCode);\n        });\n    }\n\n    async testSkillsImportPageLoads()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Skills import page loads', async () => {\n            let response = await this.makeAuthenticatedRequest('GET', this.adminPath+'/skills-import', null, session);\n            this.assert.strictEqual(200, response.statusCode);\n            this.assert(response.body.includes('import'));\n        });\n    }\n\n    async testSkillsImportWithValidJson()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Skills import with valid JSON validates import count', async () => {\n            let importData = this.getSkillsImportDeterministicData();\n            let response = await this.makeFormRequest('POST', this.adminPath+'/skills-import', importData, session);\n            this.validateSuccessfulResponse(response);\n            await this.validateImportResult(response.headers.location, 2);\n        });\n    }\n\n    async testServerManagementPageLoads()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Server management page loads', async () => {\n            let response = await this.makeAuthenticatedRequest('GET', this.adminPath+'/management', null, session);\n            this.assert.strictEqual(200, response.statusCode);\n            this.assert(response.body.includes('shutdown'));\n        });\n    }\n\n    async testServerShutdownValidation()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Server shutdown validation works', async () => {\n            let invalidData = FeaturesTestData.getServerManagementInvalidData();\n            let response = await this.makeFormRequest('POST', this.adminPath+'/management', invalidData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(response.headers.location.includes('shutdownError'));\n        });\n    }\n\n    async testServerShutdownWithValidTime()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Server shutdown with valid time succeeds', async () => {\n            let validData = FeaturesTestData.getServerManagementValidData();\n            let response = await this.makeFormRequest('POST', this.adminPath+'/management', validData, session);\n            this.assert.strictEqual(302, response.statusCode);\n            this.assert(response.headers.location.includes('success'));\n            await this.makeFormRequest('POST', this.adminPath+'/management', {'shutdown-time': 1}, session);\n        });\n    }\n\n    async testAudioFileUpload()\n    {\n        if(!this.serverPath){\n            return;\n        }\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Audio file upload validates file creation', async () => {\n            let testAudioFile = await this.createTestAudioFile();\n            let audioData = this.getAudioUploadWithRealFileDeterministicData(testAudioFile);\n            let uploadedFilePath = FileHandler.joinPaths(\n                this.serverPath,\n                'theme',\n                this.themeName,\n                'assets',\n                'audio',\n                testAudioFile.filename\n            );\n            try {\n                let response = await this.makeMultipartRequest('POST', this.adminPath+'/audio/save', audioData, session);\n                this.validateSuccessfulResponse(response);\n                await this.validateEntityExists('audio', audioData.audio_key, session);\n                await this.validateFileExists(uploadedFilePath);\n            } catch(error){\n                Logger.error('Audio upload test failed', {error: error.message, audioData});\n                throw error;\n            } finally {\n                FileHandler.remove(uploadedFilePath);\n            }\n        });\n    }\n\n    async testInvalidFileDataRejection()\n    {\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Invalid file data is rejected properly', async () => {\n            let formData = FeaturesTestData.getFileUploadInvalidData();\n            let response = await this.makeFormRequest('POST', this.adminPath+'/audio/save', formData, session);\n            this.assert.strictEqual(302, response.statusCode);\n        });\n    }\n\n    async testGenerateDataStaticRoute()\n    {\n        if(!this.serverPath){\n            return;\n        }\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Generate data static route accessible', async () => {\n            let testFileName = 'test-generate-'+Date.now()+'.txt';\n            let testFilePath = FileHandler.joinPaths(this.serverPath, 'generate-data', testFileName);\n            await this.createTestFile(testFilePath, 'test generate data content');\n            let response = await this.makeAuthenticatedRequest(\n                'GET',\n                this.adminPath+'/generate-data/'+testFileName,\n                null,\n                session\n            );\n            this.assert.strictEqual(200, response.statusCode);\n            this.assert(response.body.includes('test generate data content'));\n            FileHandler.remove(testFilePath);\n        });\n    }\n\n    async testGeneratedStaticRoute()\n    {\n        if(!this.serverPath){\n            return;\n        }\n        let session = await this.getAuthenticatedSession();\n        if(!session){\n            return;\n        }\n        await this.test('Generated static route accessible', async () => {\n            let testFileName = 'test-generated-'+Date.now()+'.txt';\n            let testFilePath = FileHandler.joinPaths(this.serverPath, 'generate-data', 'generated', testFileName);\n            await this.createTestFile(testFilePath, 'test generated content');\n            let response = await this.makeAuthenticatedRequest(\n                'GET',\n                this.adminPath+'/generated/'+testFileName,\n                null,\n                session\n            );\n            this.assert.strictEqual(200, response.statusCode);\n            this.assert(response.body.includes('test generated content'));\n            FileHandler.remove(testFilePath);\n        });\n    }\n\n    async createTestFile(filePath, content)\n    {\n        FileHandler.createFolder(FileHandler.getFolderName(filePath));\n        FileHandler.writeFile(filePath, content);\n        this.testFiles.push(filePath);\n    }\n\n    getObjectsImportDeterministicData()\n    {\n        return {\n            json: JSON.stringify([\n                {\n                    id: this.baseTestIds.objects + 50,\n                    room_id: this.baseTestIds.rooms,\n                    object_class_key: this.testPrefix+'-imported-object-1',\n                    client_key: 'obj1-deterministic',\n                    title: 'Test Object 1 Deterministic'\n                },\n                {\n                    id: this.baseTestIds.objects + 51,\n                    room_id: this.baseTestIds.rooms,\n                    object_class_key: this.testPrefix+'-imported-object-2',\n                    client_key: 'obj2-deterministic',\n                    title: 'Test Object 2 Deterministic'\n                }\n            ])\n        };\n    }\n\n    getSkillsImportDeterministicData()\n    {\n        return {\n            json: JSON.stringify([\n                {\n                    id: this.baseTestIds.skills + 50,\n                    key: this.testPrefix+'-imported-skill-1',\n                    name: 'Imported Skill 1 Deterministic',\n                    type: 1,\n                    autoValidation: 1,\n                    skillDelay: 1000\n                },\n                {\n                    id: this.baseTestIds.skills + 51,\n                    key: this.testPrefix+'-imported-skill-2',\n                    name: 'Imported Skill 2 Deterministic',\n                    type: 1,\n                    autoValidation: 1,\n                    skillDelay: 1000\n                }\n            ])\n        };\n    }\n\n    async createTestAudioFile()\n    {\n        let filename = this.testPrefix+'-audio.mp3';\n        let fixtureFilePath = FileHandler.joinPaths(process.cwd(), 'tests', 'fixtures', 'test-audio.mp3');\n        if(!FileHandler.exists(fixtureFilePath)){\n            throw new Error('Test fixture file not found: '+fixtureFilePath);\n        }\n        return {filename, filePath: fixtureFilePath};\n    }\n\n    getAudioUploadWithRealFileDeterministicData(testFile)\n    {\n        return {\n            audio_key: this.testPrefix+'-audio-'+Date.now(),\n            files_name: {\n                filename: testFile.filename,\n                filePath: testFile.filePath,\n                contentType: 'audio/mpeg'\n            },\n            category_id: 1,\n            enabled: 1\n        };\n    }\n\n    async validateFileExists(filePath)\n    {\n        this.assert(FileHandler.exists(filePath), 'Uploaded file should exist at: '+filePath);\n    }\n\n    getItemsUploadDeterministicData()\n    {\n        return {\n            id: this.baseTestIds.items + 40,\n            key: this.testPrefix+'-item',\n            label: 'Test Item Deterministic',\n            type: 1,\n            group_id: 1,\n            qty_limit: 10,\n            uses_limit: 1\n        };\n    }\n\n    validateSuccessfulResponse(response)\n    {\n        this.assert.strictEqual(302, response.statusCode);\n        this.assert(response.headers.location);\n        this.assert(!response.headers.location.includes('error'));\n    }\n\n    async validateEntityExists(entity, key, session)\n    {\n        let response = await this.makeAuthenticatedRequest(\n            'GET',\n            this.adminPath+'/'+entity,\n            null,\n            session\n        );\n        this.assert.strictEqual(200, response.statusCode);\n        this.assert(response.body.includes(key));\n    }\n\n    async validateImportResult(location, expectedCount)\n    {\n        if(location.includes('imported=')){\n            let match = location.match(/imported=(\\d+)/);\n            if(match && parseInt(match[1]) >= expectedCount){\n                return true;\n            }\n        }\n        return location.includes('success');\n    }\n\n}\n\nmodule.exports.TestAdminFeatures = TestAdminFeatures;\n"
  },
  {
    "path": "tests/utils.js",
    "content": "/**\n *\n * Reldens - Utils\n *\n */\n\nconst { FileHandler } = require('@reldens/server-utils');\nconst { EntitiesList } = require('./fixtures/entities-list');\n\nclass Utils\n{\n\n    static async cleanupTestFiles(paths)\n    {\n        for(let path of paths){\n            FileHandler.remove(path);\n        }\n    }\n\n    static async verifyDatabaseRecord(dataServer, entityName, filters)\n    {\n        let entity = dataServer.getEntity(entityName);\n        if(!entity){\n            return false;\n        }\n        let result = await entity.loadOne(filters);\n        return null !== result;\n    }\n\n    static async beginTransaction(dataServer)\n    {\n        if(!dataServer){\n            return false;\n        }\n        await dataServer.rawQuery('START TRANSACTION');\n        return true;\n    }\n\n    static async rollbackTransaction(dataServer)\n    {\n        if(!dataServer){\n            return false;\n        }\n        await dataServer.rawQuery('ROLLBACK');\n        return true;\n    }\n\n    static async cleanupTestData(dataServer, testPrefix)\n    {\n        if(!dataServer || !testPrefix){\n            return 0;\n        }\n        let cleanedRecords = 0;\n        try {\n            let cleanupQueries = [\n                'DELETE FROM config WHERE scope = \"test\" AND path LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM rooms WHERE name LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM objects WHERE object_class_key LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM skills WHERE key LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM items WHERE key LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM ads WHERE ads_key LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM audio WHERE audio_key LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM features WHERE code LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM rewards WHERE key LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM snippets WHERE key LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM teams WHERE key LIKE \"'+testPrefix+'%\"',\n                'DELETE FROM users WHERE username LIKE \"'+testPrefix+'%\" OR email LIKE \"'+testPrefix+'%\"'\n            ];\n            for(let query of cleanupQueries){\n                let result = await dataServer.rawQuery(query);\n                if(result && result.affectedRows){\n                    cleanedRecords += result.affectedRows;\n                }\n            }\n            return cleanedRecords;\n        } catch(error){\n            return 0;\n        }\n    }\n\n    static async cleanupTestDataByTimestamp(dataServer, testTimestamp)\n    {\n        if(!dataServer || !testTimestamp){\n            return 0;\n        }\n        try {\n            let query = 'DELETE FROM config WHERE scope = \"test\" AND path LIKE \"%'+testTimestamp+'%\"';\n            let result = await dataServer.rawQuery(query);\n            return result && result.affectedRows ? result.affectedRows : 0;\n        } catch(error){\n            return 0;\n        }\n    }\n\n    static async createTestSnapshot(dataServer)\n    {\n        if(!dataServer){\n            return {};\n        }\n        let snapshot = {};\n        let entities = EntitiesList.getAll();\n        for(let entityName of entities){\n            let results = await dataServer.rawQuery('SELECT COUNT(*) as count FROM '+entityName);\n            snapshot[entityName] = results[0].count;\n        }\n        return snapshot;\n    }\n\n    static async restoreTestSnapshot(dataServer, snapshot, currentSnapshot)\n    {\n        if(!dataServer || !snapshot || !currentSnapshot){\n            return false;\n        }\n        for(let entityName of Object.keys(snapshot)){\n            let originalCount = snapshot[entityName];\n            let currentCount = currentSnapshot[entityName];\n            if(currentCount > originalCount){\n                let deleteCount = currentCount - originalCount;\n                await dataServer.rawQuery('DELETE FROM '+entityName+' ORDER BY id DESC LIMIT '+deleteCount);\n            }\n        }\n        return true;\n    }\n\n}\n\nmodule.exports.Utils = Utils;\n"
  },
  {
    "path": "theme/admin/functions.js",
    "content": "/**\n *\n * Reldens - Admin Functions\n *\n */\n\nfunction getCookie(name)\n{\n    let value = '; '+document.cookie;\n    let parts = value.split('; '+name+'=');\n    if(2 === parts.length){\n        return parts.pop().split(';').shift();\n    }\n}\n\nfunction deleteCookie(name)\n{\n    document.cookie = name+'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';\n}\n\nfunction escapeHTML(str)\n{\n    return str.replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;')\n        .replace(/'/g, '&#039;');\n}\n\nfunction sanitizeImageUrl(url)\n{\n    if(!url || 'string' !== typeof url){\n        return null;\n    }\n    let trimmedUrl = url.trim();\n    trimmedUrl = trimmedUrl.replace(/[<>\"']/g, '');\n    if(0 === trimmedUrl.indexOf('/')){\n        return trimmedUrl;\n    }\n    if(0 === trimmedUrl.indexOf('./')){\n        return trimmedUrl;\n    }\n    if(0 === trimmedUrl.indexOf('../')){\n        return trimmedUrl;\n    }\n    try{\n        let urlObject = new URL(trimmedUrl);\n        if('http:' === urlObject.protocol || 'https:' === urlObject.protocol){\n            return urlObject.href;\n        }\n        return null;\n    } catch(error){\n        return null;\n    }\n}\n\nfunction cloneElement(element)\n{\n    if(element instanceof HTMLCanvasElement){\n        let clonedCanvas = document.createElement('canvas');\n        clonedCanvas.width = element.width;\n        clonedCanvas.height = element.height;\n        let ctx = clonedCanvas.getContext('2d');\n        ctx.drawImage(element, 0, 0);\n        return clonedCanvas;\n    }\n    return element.cloneNode(true);\n}\n\nfunction showConfirmDialog(callback)\n{\n    let dialog = document.querySelector('.confirm-dialog');\n    if(!dialog){\n        return callback(false);\n    }\n    dialog.showModal();\n    let confirmButton = dialog.querySelector('.dialog-confirm');\n    let cancelButton = dialog.querySelector('.dialog-cancel');\n    let onConfirm = () => {\n        dialog.close();\n        callback(true);\n        confirmButton.removeEventListener('click', onConfirm);\n        cancelButton.removeEventListener('click', onCancel);\n    };\n    let onCancel = () => {\n        dialog.close();\n        callback(false);\n        confirmButton.removeEventListener('click', onConfirm);\n        cancelButton.removeEventListener('click', onCancel);\n    };\n    confirmButton.addEventListener('click', onConfirm);\n    cancelButton.addEventListener('click', onCancel);\n}\n\nfunction activateExpandCollapse()\n{\n    let expandCollapseButtons = document.querySelectorAll('[data-expand-collapse]');\n    if(!expandCollapseButtons){\n        return;\n    }\n    for(let expandCollapseButton of expandCollapseButtons){\n        expandCollapseButton.addEventListener('click', (event) => {\n            let expandCollapseElement = document.querySelector(event.currentTarget.dataset.expandCollapse);\n            if(expandCollapseElement){\n                expandCollapseElement.classList.toggle('hidden');\n            }\n        });\n    }\n}\n\nfunction createModalContent(modalElement)\n{\n    if(modalElement.hasAttribute('data-modal-zoom-image')){\n        let modalContent = document.createElement('img');\n        let imageUrl = modalElement.getAttribute('data-modal-zoom-image');\n        let sanitizedUrl = sanitizeImageUrl(imageUrl);\n        if(!sanitizedUrl){\n            console.error('Invalid image URL:', imageUrl);\n            return cloneElement(modalElement);\n        }\n        modalContent.setAttribute('src', sanitizedUrl);\n        modalContent.setAttribute('alt', modalElement.alt || 'Modal Image');\n        modalContent.classList.add('modal-zoom-image');\n        return modalContent;\n    }\n    return cloneElement(modalElement);\n}\n\nfunction activateModalElements()\n{\n    let modalElements = document.querySelectorAll('[data-toggle=\"modal\"]');\n    if(!modalElements){\n        return;\n    }\n    for(let modalElement of modalElements){\n        if(!modalElement.id){\n            modalElement.id = 'modal-'+Math.random().toString(36).substr(2, 9);\n        }\n        modalElement.addEventListener('click', () => {\n            let overlayId = 'overlay-'+modalElement.id;\n            let existingOverlay = document.querySelector('#'+overlayId);\n            if(existingOverlay){\n                existingOverlay.style.display = 'block';\n                document.body.style.overflow = 'hidden';\n                return;\n            }\n            let overlay = document.createElement('div');\n            overlay.id = overlayId;\n            overlay.classList.add('modal-overlay');\n            let modal = document.createElement('div');\n            modal.classList.add('modal');\n            modal.classList.add('clickable');\n            let modalContent = createModalContent(modalElement);\n            modalContent.classList.add('clickable');\n            modal.appendChild(modalContent);\n            overlay.appendChild(modal);\n            document.body.appendChild(overlay);\n            document.body.style.overflow = 'hidden';\n            modalContent.addEventListener('click', () => {\n                document.body.style.overflow = '';\n                document.body.removeChild(overlay);\n            });\n            modal.addEventListener('click', (e) => {\n                if(modal === e.target){\n                    document.body.style.overflow = '';\n                    document.body.removeChild(overlay);\n                }\n            });\n            overlay.addEventListener('click', (e) => {\n                if(overlay === e.target){\n                    document.body.style.overflow = '';\n                    document.body.removeChild(overlay);\n                }\n            });\n        });\n    }\n}\n"
  },
  {
    "path": "theme/admin/reldens-admin-client.css",
    "content": "/*\n * Reldens - CMS - Administration Panel\n */\n\n:root {\n    --normalFont: Verdana, Geneva, sans-serif;\n    --reldensFont: \"Play\", sans-serif;\n    --bold: 600;\n    --black: #000000;\n    --white: #ffffff;\n    --red: #ff0000;\n    --orange: #d38200;\n    --darkGrey: #333333;\n    --grey: #7f8c8d;\n    --lightGrey: #ecf0f1;\n    --lightGrey2: #f9f9f9;\n    --lightBlue: #3498db;\n    --darkBlue: #34495e;\n    --green: #05c459;\n    --darkGreen: #27ae60;\n}\n\n.reldens-admin-panel {\n    font-family: var(--normalFont);\n    background-color: var(--lightGrey);\n    margin: 0;\n    padding: 0;\n    font-size: 0.75rem;\n\n    .wrapper {\n        display: flex;\n        flex-direction: column;\n        min-height: 100vh;\n    }\n\n    .notification {\n        display: none;\n        position: absolute;\n        top: 1.5rem;\n        right: 0;\n        padding: 1rem 5rem 1rem 2rem;\n        border-radius: 8px 0 0 8px;\n        font-size: 0.875rem;\n\n        &.success, &.error {\n            display: block;\n        }\n\n        &.error {\n            background-color: var(--red);\n            color: var(--white);\n        }\n\n        &.success {\n            background-color: var(--darkGreen);\n            color: var(--white);\n        }\n\n        .close {\n            position: absolute;\n            top: 1rem;\n            right: 1rem;\n            cursor: pointer;\n            font-weight: var(--bold);\n        }\n    }\n\n    .header {\n        /* height: 3.85rem; */\n        padding: 1.5rem;\n        background-color: var(--darkGrey);\n        text-align: center;\n\n        .title a {\n            color: var(--white);\n            text-decoration: none;\n            font-size: 1.5rem;\n            font-weight: var(--bold);\n            font-family: var(--reldensFont);\n        }\n    }\n\n    .content {\n        display: flex;\n        flex-grow: 1;\n        position: relative;\n        /* min-height: calc(100vh - 11.80rem); */\n    }\n\n    .button {\n        padding: 0.5rem 1rem;\n        border: none;\n        border-radius: 4px;\n        font-size: 0.875rem;\n        cursor: pointer;\n        text-decoration: none;\n\n        &:disabled {\n            background-color: var(--grey) !important;\n        }\n    }\n\n    .button-primary {\n        color: var(--white);\n        background-color: var(--lightBlue);\n\n        &:hover {\n            background-color: var(--lightBlue);\n        }\n    }\n\n    .button-secondary {\n        color: var(--white);\n        background-color: var(--grey);\n\n        &:hover {\n            background-color: var(--grey);\n        }\n    }\n\n    .button-warning {\n        color: var(--white);\n        background-color: var(--orange);\n\n        &:hover {\n            background-color: var(--orange);\n        }\n    }\n\n    .button-danger {\n        color: var(--white);\n        background-color: var(--red);\n\n        &:hover {\n            background-color: var(--red);\n        }\n\n        svg, path {\n            width: 22px;\n            fill: var(--white);\n        }\n    }\n\n    .icon {\n        &-sm {\n            width: 32px;\n        }\n    }\n\n    .clickable {\n        cursor: pointer;\n    }\n\n    .modal-overlay {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        position: fixed;\n        top: 0;\n        left: 0;\n        z-index: 9999;\n        width: 100vw;\n        height: 100vh;\n        background-color: rgba(0, 0, 0, 0.5);\n    }\n\n    .modal {\n        max-width: 92vw;\n        max-height: 92vh;\n        padding: 1rem;\n        overflow: auto;\n        cursor: pointer;\n        background-color: var(--white);\n        border-radius: 8px;\n\n        & canvas {\n            max-width: 100%;\n        }\n    }\n\n    .response-error {\n        color: var(--red);\n        font-weight: var(--bold);\n    }\n\n    .side-bar {\n        min-width: 230px;\n        padding: 1.4rem;\n        background-color: var(--darkBlue);\n        color: var(--lightGrey);\n        box-shadow: 2px 0 5px rgba(0, 0, 0, 0.1);\n    }\n\n    .with-sub-items {\n        &.active {\n            .side-bar-item {\n                display: block;\n\n                &:first-of-type {\n                    margin-top: 1rem;\n                }\n\n                &.active {\n                    & a {\n                        border-left: 3px solid var(--white);\n                    }\n                }\n            }\n        }\n\n        .side-bar-item {\n            display: none;\n\n            & a {\n                display: block;\n                color: var(--lightGrey);\n                text-decoration: none;\n                border-left: 3px solid transparent;\n                font-size: 0.75rem;\n                border-left: 3px solid #0000;\n                padding: 0.1rem 0.1rem 0.1rem 1rem;\n                margin-top: 0.3rem;\n                margin-bottom: 0.5rem;\n\n                &:hover, &:focus, &:active {\n                    background-color: var(--darkBlue);\n                    border-left: 3px solid var(--lightBlue);\n                }\n            }\n        }\n    }\n\n    .side-bar-item {\n        margin-bottom: 0.2rem;\n\n        &:first-child {\n            & h3 {\n                margin-top: 0;\n            }\n        }\n\n        & h3, a {\n            display: block;\n            margin: 1rem 0 0;\n            border: none;\n            padding: 0;\n            color: var(--lightGrey);\n            text-decoration: none;\n            cursor: pointer;\n            font-size: 0.875rem;\n            font-weight: var(--font-semi-bold);\n            border-bottom: 1px solid var(--darkBlue);\n\n            &:hover {\n                font-weight: var(--bold);\n            }\n        }\n    }\n\n    .user-area {\n        margin-top: 1.5rem;\n    }\n\n    .main-content {\n        padding: 2rem;\n        background-color: var(--white);\n        box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n        border-radius: 8px;\n        margin: 1.4rem;\n        overflow: auto;\n        width: 100%;\n    }\n\n    .entity-list {\n        .actions {\n            display: flex;\n            justify-content: end;\n            margin-bottom: 1rem;\n        }\n\n        .extra-actions {\n            justify-content: end;\n        }\n    }\n\n    .table-wrapper {\n        overflow-x: auto;\n    }\n\n    .forms-container {\n        width: 96%;\n        max-width: 400px;\n        margin: auto;\n    }\n\n    .form-title {\n        font-size: 1.375rem;\n        margin-bottom: 2%;\n        color: var(--darkGrey);\n        text-align: center;\n    }\n\n    .input-box {\n        margin: 0 auto 4%;\n\n        & label {\n            display: block;\n            font-weight: 600;\n            margin-bottom: 1%;\n        }\n\n        & input[type='text'], input[type='password'] {\n            width: 96%;\n            padding: 2%;\n            border: 1px solid #ccc;\n            border-radius: 4px;\n        }\n\n        & input[type='submit'] {\n            margin: 0 auto;\n            display: flex;\n\n            &:hover {\n                background-color: var(--lightBlue);\n            }\n        }\n    }\n\n    & textarea {\n        width: 98%;\n        margin: 0;\n        padding: 1%;\n        resize: vertical;\n        min-height: 300px;\n    }\n\n    .table-container {\n        width: 96%;\n        margin: auto;\n    }\n\n    & h2 {\n        font-size: 1.375rem;\n        margin: 0 0 2rem;\n        color: var(--darkGrey);\n        text-align: center;\n    }\n\n    .list {\n        width: 100%;\n        border-collapse: collapse;\n        margin-bottom: 2%;\n        color: var(--darkGrey);\n        table-layout: auto;\n\n        .row {\n            background-color: var(--white);\n\n            &.row-header {\n                background-color: var(--darkBlue);\n                color: var(--white);\n            }\n\n            &:nth-child(even) {\n                background-color: var(--lightGrey);\n            }\n        }\n\n        & th.field {\n            padding: 1rem 0;\n\n            & span {\n                color: var(--white);\n            }\n        }\n\n        .field {\n            padding: 0.5rem 0;\n            min-width: min-content;\n            white-space: nowrap;\n            height: auto;\n            border: 1px solid #ccc;\n            text-align: left;\n\n            .button-list-delete {\n                border: none;\n                background-color: transparent;\n                cursor: pointer;\n            }\n\n            .field-actions-container {\n                display: flex;\n                flex-direction: row;\n                justify-content: space-around;\n                align-items: center;\n                margin: 0 1rem;\n\n                .button {\n                    border: 1px solid var(--white);\n                }\n\n                .list-select {\n                    margin-bottom: 0;\n                }\n\n                .list-delete-selection {\n                    padding: 0.34rem 1rem;\n                    margin: 0 0.2rem;\n                }\n            }\n\n            & a, a:visited {\n                color: var(--black);\n                text-decoration: none;\n            }\n\n            & a:active, a:hover {\n                color: var(--lightBlue);\n            }\n\n            & span {\n                padding: 0 1rem;\n                color: var(--black);\n            }\n        }\n\n        .field-edit, .field-delete {\n            & span {\n                display: block;\n                text-align: center;\n                cursor: pointer;\n            }\n        }\n\n        .field-edit {\n            & span {\n                & svg, & path {\n                    width: 24px;\n                    color: var(--lightBlue);\n                }\n            }\n        }\n\n        .field-delete {\n            & span {\n                & svg, & path {\n                    width: 24px;\n                    fill: var(--red);\n                }\n            }\n        }\n    }\n\n    .sortable {\n        cursor: pointer;\n        user-select: none;\n        transition: background-color 0.2s;\n\n        &:hover {\n            background-color: var(--lightBlue);\n\n            .sort-icon {\n                opacity: 0.7;\n            }\n        }\n\n        .header-content {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n        }\n    }\n\n    .sort-indicators {\n        display: flex;\n        flex-direction: column;\n        margin-left: 0.5rem;\n        gap: 2px;\n    }\n\n    .sort-icon {\n        width: 12px;\n        height: 12px;\n        fill: var(--grey);\n        opacity: 0.4;\n        transition: opacity 0.2s;\n\n        &.active {\n            fill: var(--white);\n            opacity: 1;\n        }\n    }\n\n    .sorted {\n        background-color: var(--darkBlue);\n    }\n\n    .filters-toggle {\n        cursor: pointer;\n    }\n\n    .filters-toggle-content {\n        display: flex;\n        flex-wrap: wrap;\n        justify-content: flex-start;\n        margin-top: 1rem;\n\n        &.hidden {\n            display: none;\n        }\n    }\n\n    .pagination {\n        width: 100%;\n        display: flex;\n        flex-flow: wrap;\n        justify-content: center;\n        padding: 1rem 0;\n        text-align: center;\n\n        & a {\n            margin: 0.2rem;\n            padding: 1rem 1.4rem;\n            border: 1px solid #ccc;\n            color: var(--lightBlue);\n            text-decoration: none;\n\n            &:hover, &:focus, &:active {\n                background-color: var(--lightBlue);\n                color: var(--white);\n            }\n        }\n    }\n\n    .footer {\n        padding: 2rem;\n        text-align: center;\n        background-color: var(--darkGrey);\n        color: var(--white);\n\n        & a {\n            color: var(--white);\n            text-decoration: none;\n\n            &:hover {\n                text-decoration: underline;\n            }\n        }\n    }\n\n    .copyright {\n        position: relative;\n        display: block;\n        width: 100%;\n        margin: 0;\n        padding: 0;\n        text-align: center;\n\n        & a, a:hover, a:visited {\n            display: block;\n            color: var(--white);\n            text-decoration: none;\n            padding: 0;\n        }\n\n    }\n\n    .alert {\n        font-weight: var(--bold);\n        color: var(--red);\n    }\n\n    .shutting-down {\n        margin-bottom: 1rem;\n    }\n\n    .sub-content {\n        background-color: var(--lightGrey2);\n        padding: 1rem;\n        margin-bottom: 1rem;\n        border: 1px solid #ccc;\n        border-radius: 4px;\n\n        .sub-content-form {\n            display: flex;\n            flex-wrap: wrap;\n            align-items: flex-end;\n            justify-content: space-between;\n\n            & h4 {\n                display: flex;\n                flex-direction: row;\n                vertical-align: middle;\n                align-items: center;\n                margin: 0 1rem 1rem 0;\n                font-size: 0.875rem;\n                color: var(--darkGrey);\n\n                &.filters-toggle {\n                    margin-bottom: 0;\n\n                    & img {\n                        max-width: 30px;\n                        margin-right: 1rem;\n                    }\n                }\n            }\n\n            .actions {\n                display: flex;\n                width: 100%;\n                margin: 1rem 0 0 0;\n            }\n\n            .sub-content-box {\n                display: flex;\n                flex-direction: column;\n                margin-bottom: 1rem;\n                margin-right: 1rem;\n\n                & label {\n                    font-weight: 600;\n                    margin-bottom: 0.5rem;\n                }\n\n                & input[type=\"text\"] {\n                    padding: 0.5rem;\n                    border: 1px solid #ccc;\n                    border-radius: 4px;\n                    min-width: 150px;\n                }\n            }\n\n            & input[type=\"submit\"] {\n                margin-right: 1.4rem;\n\n            }\n        }\n\n        & textarea {\n            position: relative;\n            display: block;\n            width: 98%;\n            padding: 1%;\n            margin: 1rem 0;\n        }\n    }\n\n    .filters-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        width: 100%;\n        flex-wrap: wrap;\n        gap: 1rem;\n    }\n\n    .filters-toggle {\n        cursor: pointer;\n        margin: 0;\n        padding: 0.5rem 0;\n        flex-shrink: 0;\n    }\n\n    .filters-toggle img {\n        width: 34px;\n        height: auto;\n        margin-right: 0.5rem;\n        opacity: 0.7;\n    }\n\n    .search-controls {\n        display: flex;\n        align-items: center;\n        gap: 0.5rem;\n        flex-wrap: wrap;\n        flex: 1;\n        justify-content: flex-end;\n    }\n\n    .search-input-group input[type=\"text\"] {\n        width: calc(100% - 1rem);\n        padding: 0.5rem;\n        border: 1px solid #ccc;\n        border-radius: 4px;\n        font-size: 1rem;\n    }\n\n    .search-input-group input[type=\"text\"]:focus {\n        outline: none;\n        border-color: var(--lightBlue);\n        box-shadow: 0 0 0 0.2rem rgba(52, 152, 219, 0.25);\n    }\n\n    .filter-actions {\n        display: flex;\n        gap: 0.5rem;\n        flex-wrap: wrap;\n        flex-shrink: 0;\n    }\n\n    .loading {\n        max-width: 50px;\n\n        &.hidden {\n            display: none;\n        }\n    }\n\n    .entity-view, .entity-edit {\n        & h2 {\n            font-size: 1.375rem;\n            margin-bottom: 2rem;\n            color: var(--darkGrey);\n            text-align: center;\n        }\n\n        .view-field, .edit-field {\n            display: flex;\n            justify-content: space-between;\n            padding: 0;\n            margin-bottom: 1rem;\n\n            & span, label, input {\n                padding: 0.5rem;\n\n                &.field-name {\n                    font-weight: var(--bold);\n                    color: var(--darkGrey);\n                    flex: 1;\n                }\n\n                &.field-value {\n                    flex: 2;\n                    color: var(--darkBlue);\n                    background-color: var(--lightGrey);\n\n                    &.with-button {\n                        margin: auto;\n                        vertical-align: middle;\n\n                        & button {\n                            width: max-content;\n                            margin: 0 0.5rem;\n                        }\n                    }\n\n                    & input[type=\"checkbox\"] {\n                        max-width: max-content;\n                        margin-left: 0.5rem;\n                        margin-top: 0.5rem;\n                    }\n\n                    .remove-upload-btn {\n                        cursor: pointer;\n                    }\n                }\n            }\n        }\n\n        .view-field {\n            .field-value img {\n                max-width: 200px;\n            }\n\n            .admin-audio-player {\n                width: 100%;\n                max-width: 400px;\n            }\n        }\n\n        .edit-field {\n            & span, input {\n                &.field-value {\n                    display: flex;\n                    flex-direction: column;\n                    padding: 0;\n\n                    & p {\n                        margin-left: 0.5rem;\n                    }\n\n                    & input, select {\n                        margin: 0;\n                        padding: 0.5rem;\n                        border: none;\n                        background-color: transparent;\n\n                        &:not([disabled]) {\n                            margin: 0;\n                            border: 1px solid #7f8c8d;\n                            background-color: var(--white);\n\n                            &[type=\"checkbox\"] {\n                                max-width: max-content;\n                                margin-left: 0.5rem;\n                                margin-top: 0.5rem;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        .actions {\n            margin: 2rem 0;\n            text-align: center;\n\n            & form {\n                display: inline;\n            }\n\n            .button {\n                display: inline-block;\n                margin: 0 0.5rem;\n            }\n        }\n    }\n\n    .extra-actions {\n        display: flex;\n        width: 100%;\n        justify-content: center;\n        margin: 1rem 0;\n    }\n\n    .cache-clean-form {\n        display: block;\n        text-align: center;\n    }\n\n    .extra-content-container, .default-room-container {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        box-sizing: border-box;\n        padding: 1rem 0;\n        margin-top: 1rem;\n        text-align: left;\n\n        & h3 {\n            text-align: center;\n        }\n    }\n\n    .association-maps-container {\n        display: block;\n        width: 100%;\n        max-height: 500px;\n        overflow: auto;\n    }\n\n    .confirm-dialog {\n        border: none;\n        border-radius: 8px;\n        padding: 0;\n        max-width: 500px;\n        width: 90%;\n        box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n    }\n\n    .confirm-dialog::backdrop {\n        background-color: rgba(0, 0, 0, 0.5);\n    }\n\n    .dialog-content {\n        padding: 1rem;\n    }\n\n    .dialog-content h5 {\n        margin: 0 0 1rem 0;\n        font-size: 1.125rem;\n        color: var(--darkGrey);\n    }\n\n    .dialog-content p {\n        margin: 0 0 1rem 0;\n        color: var(--darkGrey);\n    }\n\n    .dialog-actions {\n        display: flex;\n        justify-content: flex-end;\n        gap: 1rem;\n    }\n\n    /* === RELDENS-SPECIFIC: TILESET ALERT STYLES === */\n\n    .tileset-alert-wrapper {\n        position: relative;\n        display: flex;\n        flex-direction: row-reverse;\n        align-items: center;\n        gap: 0;\n\n    }\n\n    .upload-files-with-alert {\n        flex: 1;\n    }\n\n    .tileset-alert-icon-container {\n        position: relative;\n        display: flex;\n        align-items: center;\n        margin-left: 0.5rem;\n    }\n\n    .tileset-alert-icon {\n        max-width: 24px;\n        cursor: pointer;\n        vertical-align: middle;\n    }\n\n    .tileset-alert-icon-container .tileset-info-message {\n        position: absolute;\n        left: 30px;\n        top: 0;\n        min-width: 250px;\n        max-width: 350px;\n        padding: 0.5rem;\n        background-color: var(--white);\n        border: 1px solid #ccc;\n        border-radius: 4px;\n        font-size: 0.75rem;\n        color: var(--darkGrey);\n        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n        z-index: 1000;\n\n        &.hidden {\n            display: none;\n        }\n    }\n\n    /* === RELDENS-SPECIFIC: MAPS WIZARD STYLES === */\n\n    .maps-wizard {\n\n        .main-action-container.maps-selection {\n            width: 100%;\n\n            .wizard-options-container {\n                display: flex;\n                justify-content: space-between;\n                flex-wrap: wrap;\n                width: 100%;\n\n                .wizard-map-option-container {\n                    flex: 0 0 22%;\n                    padding: 1rem 1% 0;\n                    margin: 1.5rem 0 0;\n                    border: 1px solid #ccc;\n\n                    &:only-child {\n                        flex: 0 0 100%;\n                        padding: 1rem 0 0;\n                        border: none;\n                    }\n\n                    &:first-child:nth-last-child(2),\n                    &:last-child:nth-child(2) {\n                        flex: 0 0 47%;\n                    }\n                }\n\n                input.map-wizard-option {\n                    top: 2px;\n                    margin-right: 0;\n                }\n            }\n        }\n\n        .checkbox-container {\n            display: flex;\n            flex-direction: row;\n            font-weight: var(--bold);\n        }\n\n        .wizard-options-container {\n            padding: 0;\n            margin-bottom: 1rem;\n\n            input.map-wizard-option {\n                position: relative;\n                top: -2px;\n                margin-right: 6px;\n            }\n\n            .wizard-map-option-container {\n                display: flex;\n                flex-direction: column;\n                list-style: none;\n                padding-top: 1rem;\n                margin-top: 1.5rem;\n                border-top: 1px solid #ccc;\n\n                label {\n                    cursor: pointer;\n                }\n\n                canvas {\n                    width: 100%;\n                    margin-top: 1rem;\n                }\n            }\n\n            .wizard-option-container {\n                list-style: none;\n                margin-bottom: 1rem;\n\n                .main-option {\n                    display: inline-block;\n                    cursor: pointer;\n                }\n\n                .maps-wizard-option-content {\n                    display: none;\n                    padding-left: 1.6rem;\n                }\n\n                &.active {\n                    .maps-wizard-option-content {\n                        display: block;\n                    }\n                }\n            }\n        }\n\n        .maps-wizard-form {\n            align-items: flex-start;\n            flex-direction: column;\n            justify-content: flex-start;\n\n            .submit-container {\n                display: flex;\n            }\n        }\n\n        .sub-map-option-description {\n            display: flex;\n            align-items: center;\n\n            img.icon-sm {\n                margin-right: 1rem;\n            }\n        }\n\n        .sub-maps-container {\n            display: block;\n\n            &.hidden {\n                display: none;\n            }\n\n            p {\n                margin: 1.5rem 0 0;\n            }\n        }\n    }\n\n    /* === RELDENS-SPECIFIC: THEME MANAGER STYLES === */\n\n    #selected-theme {\n        width: max-content;\n        padding: 0.5rem;\n        border: 1px solid #ccc;\n        border-radius: 4px;\n        font-size: 0.875rem;\n        background-color: var(--white);\n        cursor: pointer;\n    }\n\n    .sub-content-box {\n        margin-bottom: 2rem;\n\n        & h3 {\n            margin-bottom: 1rem;\n        }\n    }\n\n    .theme-manager-form {\n        display: flex;\n        flex-direction: column;\n        align-items: flex-start;\n    }\n\n    .command-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\n        gap: 1rem;\n        margin-top: 1rem;\n        width: 100%;\n    }\n\n    .command-item {\n        display: flex;\n        gap: 0.5rem;\n        align-items: center;\n        position: relative;\n    }\n\n    .button-info {\n        padding: 0;\n        min-width: 20px;\n        width: 20px;\n        height: 20px;\n        font-size: 0;\n        position: relative;\n        background-color: var(--grey);\n        border-radius: 50%;\n        flex-shrink: 0;\n\n        &::before {\n            content: \"?\";\n            font-size: 0.75rem;\n            font-weight: var(--bold);\n            color: var(--white);\n            font-style: normal;\n            display: block;\n            text-align: center;\n            line-height: 20px;\n        }\n\n        &:hover {\n            background-color: var(--darkGrey);\n        }\n    }\n\n    .command-info-tooltip {\n        display: none;\n        position: absolute;\n        bottom: 100%;\n        left: 50%;\n        transform: translateX(-50%);\n        margin-bottom: 0.5rem;\n        min-width: 250px;\n        max-width: 350px;\n        padding: 0.75rem;\n        background-color: var(--darkGrey);\n        color: var(--white);\n        border-radius: 4px;\n        font-size: 0.75rem;\n        font-weight: normal;\n        line-height: 1.4;\n        z-index: 1000;\n        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n\n        &.visible {\n            display: block;\n        }\n\n        .tooltip-title {\n            font-weight: var(--bold);\n            margin-bottom: 0.5rem;\n            border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n            padding-bottom: 0.25rem;\n        }\n\n        .tooltip-description {\n            margin-bottom: 0.5rem;\n        }\n\n        .tooltip-details {\n            font-size: 0.7rem;\n            color: var(--lightGrey);\n        }\n    }\n\n    .section-description {\n        margin: 0.5rem 0 1rem;\n        color: var(--darkGrey);\n        font-size: 0.875rem;\n\n        &.warning {\n            color: var(--orange);\n            font-weight: var(--bold);\n            text-align: center;\n            border-top: 1px solid var(--orange);\n            padding-top: 1rem;\n            margin-top: 1rem;\n        }\n    }\n\n    .info-text {\n        margin: 0.5rem 0;\n        color: var(--grey);\n        font-size: 0.75rem;\n        font-style: italic;\n    }\n\n    .theme-manager-heading {\n        margin-top: 2rem;\n    }\n\n    .reboot-notice {\n        display: table;\n        margin: 0 auto 1rem;\n        padding: 0.4rem 1.5rem;\n        background-color: var(--lightGrey);\n        border: 1px solid var(--grey);\n        border-radius: 4px;\n        text-align: center;\n        color: var(--grey);\n        font-size: 0.75rem;\n        font-style: italic;\n    }\n\n}\n\n@media (max-width: 768px) {\n    .reldens-admin-panel .filter-actions {\n        flex-direction: column;\n    }\n\n    .reldens-admin-panel .filter-actions .button {\n        width: 100%;\n        text-align: center;\n    }\n}\n"
  },
  {
    "path": "theme/admin/reldens-admin-client.js",
    "content": "/**\n *\n * Reldens - Admin Client JS\n *\n */\n\nlet trustedTypesPolicy = null;\nif(window.trustedTypes && window.trustedTypes.createPolicy){\n    trustedTypesPolicy = window.trustedTypes.createPolicy('default', {\n        createHTML: (s) => s,\n        createScriptURL: (s) => s\n    });\n}\nwindow.trustedTypesPolicy = trustedTypesPolicy;\n\nwindow.addEventListener('DOMContentLoaded', () => {\n\n    // helpers:\n    let location = window.location;\n    let currentPath = location.pathname;\n    let queryString = location.search;\n    let urlParams = new URLSearchParams(queryString);\n\n    // error codes messages map:\n    let errorMessages = {\n        saveBadPatchData: 'Bad patch data on update.',\n        saveEntityStorageError: 'Entity storage error.',\n        saveEntityError: 'Entity could not be saved.',\n        shutdownError: 'Server could not be shutdown, missing \"shutdownTime\".',\n        errorView: 'Could not render view page.',\n        errorEdit: 'Could not render edit page.',\n        errorId: 'Missing entity ID on POST.',\n        // Reldens custom messages:\n        mapsWizardImportDataError: 'Map could not be imported, missing generated map data.',\n        mapsWizardImportError: 'Map could not be imported.',\n        objectsImportMissingDataError: 'Object could not be imported, missing JSON files.',\n        objectsImportDataError: 'Object could not be imported, missing data in JSON files.',\n        objectsImportError: 'Object could not be imported.',\n        skillsImportMissingDataError: 'Skills could not be imported, missing JSON files.',\n        skillsImportDataError: 'Skills could not be imported, missing data in JSON files.',\n        skillsImportError: 'Skills could not be imported.',\n        errorMissingTileIndex: 'Missing tile index to create change point.',\n        errorMissingNextRoom: 'Missing next room selection.',\n        errorMissingRoomX: 'Missing return point X.',\n        errorMissingRoomY: 'Missing return point Y.',\n        errorSaveChangePoint: 'Error saving change point.',\n        errorSaveReturnPoint: 'Error saving return point.',\n        themeManagerMissingTheme: 'Please select a theme.',\n        themeManagerMissingCommand: 'Please select a command.',\n        themeManagerExecutionError: 'Theme command execution failed.',\n    };\n\n    activateExpandCollapse();\n\n    activateModalElements();\n\n    // login errors:\n    if('true' === urlParams.get('login-error')){\n        let loginErrorBox = document.querySelector('form.login-form .response-error');\n        if(loginErrorBox){\n            loginErrorBox.innerHTML = 'Login error, please try again.';\n        }\n    }\n\n    // entity search functionality:\n    let entityFilterTerm = document.querySelector('#entityFilterTerm');\n    let filterForm = document.querySelector('#filter-form');\n    let allFilters = document.querySelectorAll('.filters-toggle-content .filter input');\n    if(entityFilterTerm && filterForm){\n        entityFilterTerm.addEventListener('input', () => {\n            if(entityFilterTerm.value){\n                for(let filterInput of allFilters){\n                    filterInput.value = '';\n                }\n            }\n        });\n        entityFilterTerm.addEventListener('keypress', (event) => {\n            if(13 === event.keyCode){\n                event.preventDefault();\n                filterForm.submit();\n            }\n        });\n        for(let filterInput of allFilters){\n            filterInput.addEventListener('input', () => {\n                if(filterInput.value){\n                    entityFilterTerm.value = '';\n                }\n            });\n        }\n        filterForm.addEventListener('submit', () => {\n            if(entityFilterTerm.value && allFilters.some(input => input.value)){\n                for(let filterInput of allFilters){\n                    filterInput.value = '';\n                }\n            }\n        });\n    }\n\n    // forms behavior:\n    let forms = document.querySelectorAll('form');\n    if(forms){\n        for(let form of forms){\n            form.addEventListener('submit', (event) => {\n                let submitButton = form.querySelector('input[type=\"submit\"], button[type=\"submit\"]');\n                submitButton.disabled = true;\n                let loadingImage = form.querySelector('.loading');\n                if(form.classList.contains('form-delete') || form.classList.contains('confirmation-required')){\n                    event.preventDefault();\n                    showConfirmDialog((confirmed) => {\n                        if(confirmed){\n                            if(loadingImage){\n                                loadingImage.classList.remove('hidden');\n                            }\n                            form.submit();\n                        }\n                        if(!confirmed){\n                            submitButton.disabled = false;\n                        }\n                    });\n                    return;\n                }\n                if(loadingImage){\n                    loadingImage.classList.remove('hidden');\n                }\n            });\n        }\n    }\n\n    // sidebar headers click behavior:\n    let sideBarHeaders = document.querySelectorAll('.with-sub-items h3');\n    if(sideBarHeaders){\n        for(let header of sideBarHeaders){\n            header.addEventListener('click', (event) => {\n                event.currentTarget.parentNode.classList.toggle('active');\n            });\n        }\n    }\n\n    // expand menu on load:\n    let subItemContainers = document.querySelectorAll('.with-sub-items');\n    if(subItemContainers){\n        let done = false;\n        for(let container of subItemContainers){\n            let links = container.querySelectorAll('.side-bar-item a');\n            for(let link of links){\n                let linkWithoutHost = link.href.replace(location.host, '').replace(location.protocol+'//', '');\n                if(currentPath === linkWithoutHost || 0 === currentPath.indexOf(linkWithoutHost+'/')){\n                    link.parentNode.classList.add('active');\n                    container.classList.add('active');\n                    done = true;\n                    break;\n                }\n            }\n            if(done){\n                break;\n            }\n        }\n    }\n\n    // filters toggle visibility:\n    let filtersToggle = document.querySelector('.filters-toggle');\n    let filtersToggleContent = document.querySelector('.filters-toggle-content');\n    if(filtersToggle && filtersToggleContent){\n        filtersToggle.addEventListener('click', () => {\n            filtersToggle.classList.toggle('active');\n            filtersToggleContent.classList.toggle('hidden');\n        });\n        let allFilters = document.querySelectorAll('.filters-toggle-content .filter input');\n        let entitySearchInput = document.querySelector('#entityFilterTerm');\n        let hasEntitySearch = entitySearchInput && '' !== entitySearchInput.value;\n        let activeFilters = Array.from(allFilters).filter(input => '' !== input.value);\n        if(0 < activeFilters.length || hasEntitySearch){\n            filtersToggleContent.classList.remove('hidden');\n        }\n        let paginationLinks = document.querySelectorAll('.pagination a');\n        if(paginationLinks && filterForm){\n            for(let link of paginationLinks){\n                link.addEventListener('click', (event) => {\n                    event.stopPropagation();\n                    event.preventDefault();\n                    let url = new URL(link.href);\n                    let params = new URLSearchParams(url.search);\n                    if(entitySearchInput && entitySearchInput.value){\n                        params.set('entityFilterTerm', entitySearchInput.value);\n                    }\n                    for(let filterInput of allFilters){\n                        if(filterInput.value){\n                            let filterName = filterInput.name;\n                            params.set(filterName, filterInput.value);\n                        }\n                    }\n                    let sortedHeader = document.querySelector('th.sorted');\n                    if(sortedHeader){\n                        let columnName = sortedHeader.getAttribute('data-column');\n                        let sortDirection = sortedHeader.classList.contains('sorted-asc') ? 'asc' : 'desc';\n                        params.set('sortBy', columnName);\n                        params.set('sortDirection', sortDirection);\n                    }\n                    window.location.href = url.pathname+'?'+params;\n                    return false;\n                });\n            }\n        }\n    }\n\n    // column sorting functionality:\n    let sortableHeaders = document.querySelectorAll('th.sortable');\n    if(sortableHeaders){\n        for(let header of sortableHeaders){\n            header.addEventListener('click', () => {\n                let sortForm = header.querySelector('.sort-form');\n                if(!sortForm){\n                    return;\n                }\n                let columnName = header.getAttribute('data-column');\n                let currentSortDirection = header.classList.contains('sorted-asc')\n                    ? 'asc'\n                    : header.classList.contains('sorted-desc') ? 'desc' : '';\n                let newSortDirection = 'asc';\n                if('asc' === currentSortDirection){\n                    newSortDirection = 'desc';\n                }\n                let sortByInput = sortForm.querySelector('input[name=\"sortBy\"]');\n                let sortDirectionInput = sortForm.querySelector('input[name=\"sortDirection\"]');\n                sortByInput.value = columnName;\n                sortDirectionInput.value = newSortDirection;\n                let entitySearchInput = document.querySelector('#entityFilterTerm');\n                let entityFilterTermInput = sortForm.querySelector('input[name=\"entityFilterTerm\"]');\n                if(entityFilterTermInput){\n                    entityFilterTermInput.value = entitySearchInput?.value || '';\n                }\n                let allFilters = document.querySelectorAll('.filters-toggle-content .filter input');\n                for(let filterInput of allFilters){\n                    let filterName = filterInput.name.replace(/^filters\\[/, '').replace(/\\]$/, '');\n                    let sortFormFilterInput = sortForm.querySelector('input[data-filter-key=\"'+filterName+'\"]');\n                    if(sortFormFilterInput){\n                        sortFormFilterInput.value = filterInput.value;\n                    }\n                }\n                sortForm.submit();\n            });\n        }\n    }\n\n    // list \"select all\" option:\n    let listSelect = document.querySelector('.list-select');\n    if(listSelect){\n        listSelect.addEventListener('click', (event) => {\n            let checkboxes = document.querySelectorAll('.ids-checkbox');\n            for(let checkbox of checkboxes){\n                checkbox.checked = 1 === Number(event.currentTarget.dataset.checked);\n            }\n            event.currentTarget.dataset.checked = 1 === Number(event.currentTarget.dataset.checked) ? 0 : 1;\n        });\n    }\n\n    // list delete selection:\n    let listDeleteSelection = document.querySelector('.list-delete-selection');\n    let deleteSelectionForm = document.getElementById('delete-selection-form');\n    let hiddenInput = document.querySelector('.hidden-ids-input');\n    if(listDeleteSelection && deleteSelectionForm && hiddenInput){\n        listDeleteSelection.addEventListener('click', (event) => {\n            event.preventDefault();\n            showConfirmDialog((confirmed) => {\n                if(confirmed){\n                    let checkboxes = document.querySelectorAll('.ids-checkbox');\n                    let ids = [];\n                    for(let checkbox of checkboxes){\n                        if(checkbox.checked){\n                            ids.push(checkbox.value);\n                        }\n                    }\n                    if(0 === ids.length){\n                        return;\n                    }\n                    deleteSelectionForm.innerHTML = '';\n                    for(let id of ids){\n                        let input = document.createElement('input');\n                        input.type = 'hidden';\n                        input.name = 'ids[]';\n                        input.value = id;\n                        deleteSelectionForm.appendChild(input);\n                    }\n                    deleteSelectionForm.submit();\n                }\n            });\n        });\n    }\n\n    // display notifications from query params:\n    let notificationElement = document.querySelector('.notification');\n    if(notificationElement){\n        let closeNotificationElement = document.querySelector('.notification .close');\n        closeNotificationElement?.addEventListener('click', () => {\n            notificationElement.classList.remove('success', 'error');\n        });\n        let queryParams = new URLSearchParams(location.search);\n        let result = queryParams.get('result');\n        if(!result){\n            result = getCookie('result');\n        }\n        let notificationMessageElement = document.querySelector('.notification .message');\n        if(result && notificationMessageElement){\n            let notificationClass = 'success' === result ? 'success' : 'error';\n            notificationMessageElement.innerHTML = '';\n            notificationElement.classList.add(notificationClass);\n            notificationMessageElement.innerHTML = 'success' === result\n                ? 'Success!'\n                : 'There was an error: '+escapeHTML(errorMessages[result] || result);\n            deleteCookie('result');\n            queryParams.delete('result');\n            let newUrl = location.pathname + (queryParams.toString() ? '?' + queryParams.toString() : '');\n            window.history.replaceState({}, '', newUrl);\n        }\n    }\n\n    // shutdown timer:\n    let shuttingDownTimeElement = document.querySelector('.shutting-down .shutting-down-time');\n    if(shuttingDownTimeElement){\n        let shuttingDownTime = shuttingDownTimeElement.getAttribute('data-shutting-down-time');\n        if(shuttingDownTime){\n            shuttingDownTimeElement.innerHTML = escapeHTML(String(shuttingDownTime))+'s';\n            shuttingDownTime = Number(shuttingDownTime);\n            let shuttingDownTimer = setInterval(\n                () => {\n                    shuttingDownTimeElement.innerHTML = escapeHTML(String(shuttingDownTime))+'s';\n                    shuttingDownTime--;\n                    if(0 === Number(shuttingDownTime)){\n                        clearInterval(shuttingDownTimer);\n                    }\n                },\n                1000\n            );\n        }\n    }\n\n    // cache clear all functionality:\n    let cacheClearAllButton = document.querySelector('.cache-clear-all-button');\n    let cacheClearForm = document.querySelector('.cache-clear-form');\n    if(cacheClearAllButton){\n        cacheClearAllButton.addEventListener('click', () => {\n            showConfirmDialog((confirmed) => {\n                if(confirmed && cacheClearForm){\n                    let submitButton = cacheClearForm.querySelector('button[type=\"submit\"]');\n                    if(submitButton){\n                        submitButton.disabled = true;\n                    }\n                    cacheClearForm.submit();\n                }\n            });\n        });\n    }\n\n    // remove upload button functionality:\n    let removeUploadButtons = document.querySelectorAll('.remove-upload-btn');\n    if(removeUploadButtons){\n        for(let button of removeUploadButtons){\n            button.addEventListener('click', (event) => {\n                event.preventDefault();\n                let fieldName = button.getAttribute('data-field');\n                let fileName = button.getAttribute('data-filename');\n                let fileInput = document.getElementById(fieldName);\n                let form = fileInput?.closest('form');\n                if(!fileInput){\n                    return;\n                }\n                if(!form){\n                    return;\n                }\n                let currentFileDisplay = button.closest('.upload-current-file');\n                let container = button.closest('.upload-files-container');\n                let isRequired = container && 'true' === container.dataset.required;\n                if(isRequired){\n                    let remainingFiles = container.querySelectorAll('.upload-current-file');\n                    if(2 === remainingFiles.length){\n                        let allRemoveButtons = container.querySelectorAll('.remove-upload-btn');\n                        for(let removeBtn of allRemoveButtons){\n                            removeBtn.remove();\n                        }\n                    }\n                }\n                if(currentFileDisplay){\n                    currentFileDisplay.remove();\n                }\n                if(fileName){\n                    let hiddenFieldName = 'removed_'+fieldName;\n                    let existingHiddenInput = form.querySelector('input[name=\"'+hiddenFieldName+'\"]');\n                    if(existingHiddenInput){\n                        let currentValue = existingHiddenInput.value;\n                        let filesArray = currentValue ? currentValue.split(',') : [];\n                        if(-1 === filesArray.indexOf(fileName)){\n                            filesArray.push(fileName);\n                        }\n                        existingHiddenInput.value = filesArray.join(',');\n                        return;\n                    }\n                    let hiddenInput = document.createElement('input');\n                    hiddenInput.type = 'hidden';\n                    hiddenInput.name = hiddenFieldName;\n                    hiddenInput.value = fileName;\n                    form.appendChild(hiddenInput);\n                    return;\n                }\n                fileInput.value = '';\n                let clearFieldName = 'clear_'+fieldName;\n                let existingClearInput = form.querySelector('input[name=\"'+clearFieldName+'\"]');\n                if(existingClearInput){\n                    return;\n                }\n                let clearInput = document.createElement('input');\n                clearInput.type = 'hidden';\n                clearInput.name = clearFieldName;\n                clearInput.value = '1';\n                form.appendChild(clearInput);\n            });\n        }\n    }\n\n    // tileset alert icon toggle:\n    let tilesetAlertIcons = document.querySelectorAll('.tileset-alert-icon');\n    if(tilesetAlertIcons){\n        for(let icon of tilesetAlertIcons){\n            icon.addEventListener('click', () => {\n                let message = icon.nextElementSibling;\n                if(message && message.classList.contains('tileset-info-message')){\n                    message.classList.toggle('hidden');\n                }\n            });\n        }\n    }\n\n    // Reldens custom functions:\n\n    // create rooms link function:\n    let entityDataElement = document.querySelector('[data-entity-serialized-data]');\n    let mapLoadElement = document.querySelector('[data-map-loader]');\n    if(entityDataElement){\n        let entityData = entityDataElement?.dataset.entitySerializedData\n            ? JSON.parse(entityDataElement.dataset.entitySerializedData)\n            : false;\n        let elementCurrentRoomChangePointTileIndex = document.querySelector('#currentRoomChangePointTileIndex');\n        let roomsSelector = document.querySelector('.nextRoomSelector');\n        let elementNextRoomPositionX = document.querySelector('#nextRoomPositionX');\n        let elementNextRoomPositionY = document.querySelector('#nextRoomPositionY');\n        let nextRoomMapContainer = document.querySelector('.next-room-return-position-container');\n        let roomsList = entityData?.extraData?.roomsList;\n        if(roomsList && nextRoomMapContainer && roomsSelector instanceof HTMLSelectElement){\n            let roomListKey = Object.keys(roomsList);\n            for(let key of roomListKey){\n                let roomListData = roomsList[key];\n                let option = document.createElement('option');\n                option.text = roomListData.name;\n                option.value = roomListData.id;\n                option.dataset.mapFile = roomListData.mapFile;\n                option.dataset.mapImages = roomListData.mapImages;\n                roomsSelector.add(option);\n            }\n            roomsSelector.addEventListener('change', (event) => {\n                let selectedOption = event.target.options[event.target.selectedIndex];\n                nextRoomMapContainer.innerHTML = '';\n                elementNextRoomPositionX.value = '';\n                elementNextRoomPositionY.value = '';\n                loadAndCreateMap(\n                    selectedOption.dataset.mapFile,\n                    selectedOption.dataset.mapImages,\n                    nextRoomMapContainer,\n                    (event, data) => {\n                        let tileData = calculateTileData(event, data);\n                        elementNextRoomPositionX.value = tileData.positionTileX;\n                        elementNextRoomPositionY.value = tileData.positionTileY;\n                    }\n                );\n            });\n        }\n        if(mapLoadElement){\n            loadAndCreateMap(\n                entityData.map_filename,\n                entityData.scene_images,\n                mapLoadElement,\n                (event, data) => {\n                    let tileData = calculateTileData(event, data);\n                    if(elementCurrentRoomChangePointTileIndex){\n                        elementCurrentRoomChangePointTileIndex.value = tileData.tileIndex;\n                    }\n                }\n            );\n        }\n    }\n\n    // maps wizard functions:\n    let mapsWizardsOptions = document.querySelectorAll('.maps-wizard-form .map-wizard-option.with-state');\n    for(let option of mapsWizardsOptions){\n        option.addEventListener('click', (event) => {\n            let wizardOptionsContainer = document.querySelectorAll('.wizard-option-container');\n            for(let container of wizardOptionsContainer){\n                container.classList.remove('active');\n            }\n            event.currentTarget.parentNode.parentNode.classList.add('active');\n        });\n    }\n\n    let mapCanvasElements = document.querySelectorAll('.mapCanvas');\n    for(let mapCanvas of mapCanvasElements){\n        if(!mapCanvas.dataset?.mapJson){\n            continue;\n        }\n        let tileset = new Image();\n        // for now, we will only handle 1 image cases:\n        tileset.src = mapCanvas.dataset.imageKey;\n        tileset.onload = () => {\n            fetchMapFileAndDraw(mapCanvas.dataset.mapJson, tileset, mapCanvas);\n        };\n        tileset.onerror = () => {\n            console.error('Error loading tileset image');\n        };\n    }\n\n    // theme manager functionality:\n    let themeSelector = document.querySelector('#selected-theme');\n    let executeCommandButtons = document.querySelectorAll('.execute-command');\n    let showCommandInfoButtons = document.querySelectorAll('.show-command-info');\n    let commandDescriptionsData = document.querySelector('#command-descriptions-data');\n    let commandDescriptions = {};\n\n    if(commandDescriptionsData){\n        try {\n            commandDescriptions = JSON.parse(commandDescriptionsData.textContent);\n        } catch(error){\n            console.error('Failed to parse command descriptions', error);\n        }\n    }\n\n    if(executeCommandButtons){\n        for(let button of executeCommandButtons){\n            button.addEventListener('click', (event) => {\n                event.preventDefault();\n                if(!themeSelector || !themeSelector.value){\n                    return;\n                }\n                let commandName = button.dataset.command;\n                if(!commandName){\n                    return;\n                }\n                let form = button.closest('form');\n                if(!form){\n                    return;\n                }\n                let formThemeInput = form.querySelector('input[name=\"selected-theme\"]');\n                let formCommandInput = form.querySelector('input[name=\"command\"]');\n                if(!formThemeInput || !formCommandInput){\n                    return;\n                }\n                formThemeInput.value = themeSelector.value;\n                formCommandInput.value = commandName;\n                let commandItem = button.closest('.command-item');\n                let loadingImage = commandItem ? commandItem.querySelector('.command-loading') : null;\n                showConfirmDialog((confirmed) => {\n                    if(confirmed){\n                        if(loadingImage){\n                            loadingImage.classList.remove('hidden');\n                        }\n                        form.submit();\n                    }\n                });\n            });\n        }\n    }\n\n    if(showCommandInfoButtons){\n        let allTooltips = document.querySelectorAll('.command-info-tooltip');\n        for(let button of showCommandInfoButtons){\n            let commandName = button.dataset.command;\n            if(!commandName){\n                continue;\n            }\n            let commandItem = button.closest('.command-item');\n            if(!commandItem){\n                continue;\n            }\n            let tooltip = commandItem.querySelector('.command-info-tooltip[data-command=\"'+commandName+'\"]');\n            if(!tooltip){\n                continue;\n            }\n            let commandInfo = commandDescriptions[commandName];\n            if(commandInfo){\n                let descriptionElement = tooltip.querySelector('.tooltip-description');\n                let detailsElement = tooltip.querySelector('.tooltip-details');\n                if(descriptionElement){\n                    descriptionElement.textContent = commandInfo.description || '';\n                }\n                if(detailsElement){\n                    detailsElement.textContent = commandInfo.details || '';\n                }\n            }\n            button.addEventListener('click', (event) => {\n                event.preventDefault();\n                event.stopPropagation();\n                for(let otherTooltip of allTooltips){\n                    if(otherTooltip !== tooltip){\n                        otherTooltip.classList.remove('visible');\n                    }\n                }\n                tooltip.classList.toggle('visible');\n            });\n        }\n        document.addEventListener('click', () => {\n            for(let tooltip of allTooltips){\n                tooltip.classList.remove('visible');\n            }\n        });\n    }\n\n});\n"
  },
  {
    "path": "theme/admin/reldens-functions.js",
    "content": "/**\n *\n * Reldens - Admin Functions\n *\n * Map rendering and tile interaction functions specific to Reldens admin panel.\n *\n */\n\nfunction fetchMapFileAndDraw(mapJson, tileset, mapCanvas, withTileHighlight, tileClickCallback)\n{\n    if(!mapJson){\n        return false;\n    }\n    fetch(mapJson)\n        .then(response => response.json())\n        .then(data => {\n            mapCanvas.width = data.width * data.tilewidth;\n            mapCanvas.height = data.height * data.tileheight;\n            let mapCanvasContext = mapCanvas.getContext('2d');\n            drawMap(mapCanvasContext, tileset, data);\n            drawTiles(mapCanvasContext, mapCanvas.width, mapCanvas.height, data.tilewidth, data.tileheight);\n            if(withTileHighlight){\n                mapCanvas.addEventListener('mousemove', (event) => {\n                    let mouseX = event.offsetX;\n                    let mouseY = event.offsetY;\n                    // @TODO - BETA - Refactor to only re-draw the highlight area not the entire grid.\n                    // highlightTile(mouseX, mouseY, data.tilewidth, data.tileheight, mapCanvasContext);\n                    redrawWithHighlight(mapCanvasContext, mapCanvas.width, mapCanvas.height, data, mouseX, mouseY);\n                });\n            }\n            if(tileClickCallback){\n                mapCanvas.addEventListener('click', (event) => {\n                    tileClickCallback(event, data);\n                });\n            }\n        })\n        .catch(error => console.error('Error fetching JSON:', error));\n}\n\nfunction drawMap(mapCanvasContext, tileset, mapData)\n{\n    // we are assuming there is only one tileset in mapData.tilesets since the maps are coming from the optimizer:\n    let tilesetInfo = mapData.tilesets[0];\n    let tileWidth = tilesetInfo.tilewidth;\n    let tileHeight = tilesetInfo.tileheight;\n    let margin = tilesetInfo.margin;\n    let spacing = tilesetInfo.spacing;\n    let columns = tilesetInfo.imagewidth / (tilesetInfo.tilewidth + tilesetInfo.spacing);\n    for(let layer of mapData.layers){\n        if('tilelayer' !== layer.type){\n            continue;\n        }\n        let width = layer.width;\n        for(let index = 0; index < layer.data.length; index++){\n            let tileIndex = Number(layer.data[index]);\n            if(0 === tileIndex){\n                continue;\n            }\n            let colIndex = index % width;\n            let rowIndex = Math.floor(index / width);\n            // adjusting for 0-based index:\n            let tileId = tileIndex - 1;\n            let sx = margin + (tileId % columns) * (tileWidth + spacing);\n            let sy = margin + Math.floor(tileId / columns) * (tileHeight + spacing);\n            mapCanvasContext.drawImage(\n                tileset,\n                sx,\n                sy,\n                tileWidth,\n                tileHeight,\n                colIndex * tileWidth,\n                rowIndex * tileHeight,\n                tileWidth,\n                tileHeight\n            );\n        }\n    }\n}\n\nfunction drawTiles(canvasContext, canvasWidth, canvasHeight, tileWidth, tileHeight)\n{\n    canvasContext.save();\n    canvasContext.globalAlpha = 0.4;\n    canvasContext.strokeStyle = '#ccc';\n    canvasContext.lineWidth = 2;\n    for(let x = 0; x < canvasWidth; x += tileWidth){\n        for(let y = 0; y < canvasHeight; y += tileHeight){\n            canvasContext.strokeRect(x, y, tileWidth, tileHeight);\n        }\n    }\n    canvasContext.restore();\n}\n\nfunction highlightTile(mouseX, mouseY, tileWidth, tileHeight, canvasContext)\n{\n    let tileCol = Math.floor(mouseX / tileWidth);\n    let tileRow = Math.floor(mouseY / tileHeight);\n    let highlightX = tileCol * tileWidth;\n    let highlightY = tileRow * tileHeight;\n    canvasContext.save();\n    canvasContext.strokeStyle = 'red';\n    canvasContext.lineWidth = 2;\n    canvasContext.strokeRect(highlightX, highlightY, tileWidth, tileHeight);\n    canvasContext.restore();\n}\n\nfunction redrawWithHighlight(mapCanvasContext, mapCanvasWidth, mapCanvasHeight, mapData, mouseX, mouseY)\n{\n    drawTiles(mapCanvasContext, mapCanvasWidth, mapCanvasHeight, mapData.tilewidth, mapData.tileheight);\n    highlightTile(mouseX, mouseY, mapData.tilewidth, mapData.tileheight, mapCanvasContext);\n}\n\nfunction loadAndCreateMap(mapJsonFileName, mapSceneImages, appendOnElement, tileClickCallback) {\n    let mapCanvas = document.createElement('canvas');\n    mapCanvas.classList.add('mapCanvas');\n    appendOnElement.appendChild(mapCanvas);\n    let sceneImages = mapSceneImages.split(',');\n    if (1 === sceneImages.length) {\n        let tileset = new Image();\n        // for now, we will only handle 1 image cases:\n        tileset.src = '/assets/maps/' + sceneImages[0];\n        tileset.onload = () => {\n            fetchMapFileAndDraw(\n                '/assets/maps/' + mapJsonFileName,\n                tileset,\n                mapCanvas,\n                true,\n                tileClickCallback\n            );\n        };\n        tileset.onerror = () => {\n            console.error('Error loading tileset image');\n        };\n    }\n    if (1 < sceneImages.length) {\n        console.error('Maps link is not available for tilesets with multiple images for now.');\n    }\n}\n\nfunction calculateTileData(event, data)\n{\n    let positionX = event.offsetX;\n    let positionY = event.offsetY;\n    let tileCol = Math.floor(positionX / data.tilewidth);\n    let tileRow = Math.floor(positionY / data.tileheight);\n    let positionTileX = (tileCol * data.tilewidth) + (data.tilewidth / 2);\n    let positionTileY = (tileRow * data.tileheight) + (data.tileheight / 2);\n    let cols = data.width;\n    let rows = data.height;\n    let tileIndex = tileRow * cols + tileCol;\n    return {tileCol, tileRow, positionTileX, positionTileY, tileIndex, positionX, positionY, cols, rows};\n}\n"
  },
  {
    "path": "theme/admin/templates/cache-clean-button.html",
    "content": "<form class=\"cache-clean-form\" method=\"POST\" action=\"{{&cacheCleanRoute}}\">\n    <input type=\"hidden\" name=\"routeId\" value=\"{{routeId}}\"/>\n    <input type=\"hidden\" name=\"refererUrl\" value=\"{{&refererUrl}}\"/>\n    <button class=\"button button-warning cache-clean-btn\" type=\"submit\">{{&buttonText}}</button>\n</form>\n"
  },
  {
    "path": "theme/admin/templates/clear-all-cache-button.html",
    "content": "<button type=\"button\" class=\"button button-warning cache-clear-all-button\">\n    {{buttonText}}\n</button>\n<dialog class=\"confirm-dialog\">\n    <div class=\"dialog-content\">\n        <h5 class=\"dialog-title\">{{confirmTitle}}</h5>\n        <p class=\"dialog-message\">{{confirmMessage}}</p>\n        <div class=\"alert cache-warning\">\n            <strong>{{warningText}}</strong> {{warningMessage}}\n        </div>\n        <div class=\"dialog-actions\">\n            <button type=\"button\" class=\"button button-secondary dialog-cancel\">{{cancelText}}</button>\n            <form method=\"post\" action=\"{{clearAllCacheRoute}}\" class=\"cache-clear-form\">\n                <button type=\"submit\" class=\"button button-danger dialog-confirm\">{{confirmText}}</button>\n            </form>\n        </div>\n    </div>\n</dialog>\n"
  },
  {
    "path": "theme/admin/templates/dashboard.html",
    "content": "Welcome to the Reldens Administration Panel!"
  },
  {
    "path": "theme/admin/templates/default-copyright.html",
    "content": "<div class=\"copyright\">\n    <a href=\"https://www.dwdeveloper.com/\" target=\"_blank\">\n        by D<span class=\"text-black text-lowercase\">w</span><span class=\"text-capitalize\">Developer</span>\n    </a>\n</div>"
  },
  {
    "path": "theme/admin/templates/edit.html",
    "content": "<div class=\"entity-edit {{&entityName}}-edit\">\n    <h2>{{&templateTitle}}</h2>\n    <div class=\"actions\">\n        <button class=\"button button-primary button-submit\" type=\"submit\" form=\"edit-form\" name=\"saveAction\" value=\"save\">Save</button>\n        <button class=\"button button-primary button-submit\" type=\"submit\" form=\"edit-form\" name=\"saveAction\" value=\"saveAndContinue\">Save and continue...</button>\n        <button class=\"button button-primary button-submit\" type=\"submit\" form=\"edit-form\" name=\"saveAction\" value=\"saveAndGoBack\">Save and go back</button>\n        <a class=\"button button-secondary button-back\" href=\"{{&entityViewRoute}}\">Cancel</a>\n    </div>\n    <div class=\"extra-actions\">\n        {{&extraContent}}\n    </div>\n    <form name=\"edit-form\" id=\"edit-form\" action=\"{{&entitySaveRoute}}\" method=\"post\"{{&multipartFormData}}>\n        <input type=\"hidden\" name=\"{{&idProperty}}\" value=\"{{&idValue}}\"/>\n        <div class=\"edit-field\">\n            <span class=\"field-name\">{{&idPropertyLabel}}</span>\n            <span class=\"field-value\">\n                <input type=\"text\" name=\"disabled-{{&idProperty}}\" value=\"{{&idValue}}\" disabled=\"disabled\"/>\n            </span>\n        </div>\n        {{#editFields}}\n        <div class=\"edit-field\">\n            <span class=\"field-name\">{{&name}}</span>\n            <span class=\"field-value\">{{&value}}</span>\n        </div>\n        {{/editFields}}\n        {{&extraFormContent}}\n        <div class=\"actions\">\n            <button class=\"button button-primary button-submit\" type=\"submit\" name=\"saveAction\" value=\"save\">Save</button>\n            <button class=\"button button-primary button-submit\" type=\"submit\" name=\"saveAction\" value=\"saveAndContinue\">Save and continue...</button>\n            <button class=\"button button-primary button-submit\" type=\"submit\" name=\"saveAction\" value=\"saveAndGoBack\">Save and go back</button>\n            <a class=\"button button-secondary button-back\" href=\"{{&entityViewRoute}}\">Cancel</a>\n        </div>\n    </form>\n    <div class=\"extra-actions\">\n        {{&extraContent}}\n    </div>\n</div>\n"
  },
  {
    "path": "theme/admin/templates/fields/edit/button.html",
    "content": "<button name=\"{{&fieldName}}\" id=\"{{&fieldName}}\"{{&fieldDisabled}}>\n    {{&fieldValue}}\n</button>"
  },
  {
    "path": "theme/admin/templates/fields/edit/checkbox.html",
    "content": "<input type=\"checkbox\" name=\"{{&fieldName}}\" value=\"1\"{{&fieldValue}}{{&fieldDisabled}}/>"
  },
  {
    "path": "theme/admin/templates/fields/edit/file.html",
    "content": "{{{renderedAlert}}}\n{{{renderedFiles}}}\n{{#fieldValue}}\n    {{^renderedFiles}}\n        <div class=\"upload-files-container\" data-field=\"{{&fieldName}}\" data-required=\"{{isRequired}}\">\n            {{#filesArray}}\n                <p class=\"upload-current-file\" data-field=\"{{&fieldName}}\" data-filename=\"{{&filename}}\">\n                    {{#isRemovable}}\n                        <button type=\"button\" class=\"remove-upload-btn\" data-field=\"{{&fieldName}}\" data-filename=\"{{&filename}}\" title=\"REMOVE\">X</button> -\n                    {{/isRemovable}}\n                    {{&filename}}\n                </p>\n            {{/filesArray}}\n        </div>\n    {{/renderedFiles}}\n{{/fieldValue}}\n<input type=\"file\" name=\"{{&fieldName}}\" id=\"{{&fieldName}}\"{{&required}}{{&fieldDisabled}}{{&multiple}}/>\n"
  },
  {
    "path": "theme/admin/templates/fields/edit/radio.html",
    "content": "<input type=\"radio\" name=\"{{&fieldName}}\" value=\"{{&fieldValue}}\"{{checked}}{{&fieldDisabled}}/>"
  },
  {
    "path": "theme/admin/templates/fields/edit/select.html",
    "content": "<select name=\"{{&fieldName}}\" id=\"{{&fieldName}}\"{{&required}}{{&fieldDisabled}}>\n    {{#fieldValue}}\n    <option value=\"{{&value}}\"{{&selected}}>{{&label}}</option>\n    {{/fieldValue}}\n</select>"
  },
  {
    "path": "theme/admin/templates/fields/edit/text.html",
    "content": "<input type=\"{{&inputType}}\" name=\"{{&fieldName}}\" id=\"{{&fieldName}}\" value=\"{{fieldValue}}\"{{&required}}{{&fieldDisabled}}/>\n"
  },
  {
    "path": "theme/admin/templates/fields/edit/textarea.html",
    "content": "<textarea name=\"{{&fieldName}}\" id=\"{{&fieldName}}\"{{&required}}{{&fieldDisabled}}>{{&fieldValue}}</textarea>"
  },
  {
    "path": "theme/admin/templates/fields/edit/tileset-alert-wrapper.html",
    "content": "<div class=\"tileset-alert-wrapper\">\n    <div class=\"upload-files-with-alert\">\n        {{{renderedFileItems}}}\n    </div>\n    <div class=\"tileset-alert-icon-container\">\n        <img src=\"/assets/admin/alert.png\" class=\"tileset-alert-icon\" alt=\"Info\" title=\"Images specified in the tileset can't be removed since the option overrideSceneImagesWithMapFile is active.\">\n        <span class=\"tileset-info-message hidden\">Images specified in the tileset can't be removed since the option overrideSceneImagesWithMapFile is active.</span>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/admin/templates/fields/edit/tileset-file-item.html",
    "content": "<p class=\"upload-current-file\" data-field=\"{{&fieldName}}\" data-filename=\"{{&filename}}\">\n    {{^isProtected}}\n        <button type=\"button\" class=\"remove-upload-btn\" data-field=\"{{&fieldName}}\" data-filename=\"{{&filename}}\" title=\"REMOVE\">X</button> -\n    {{/isProtected}}\n    {{&filename}}\n</p>\n"
  },
  {
    "path": "theme/admin/templates/fields/view/audio.html",
    "content": "{{#fieldValue}}\n<audio controls class=\"admin-audio-player\">\n    <source src=\"{{&fieldValue}}\">\n    Your browser does not support the audio element.\n</audio>\n<p><a href=\"{{&fieldValue}}\"{{&target}}>{{&fieldValue}}</a></p>\n{{/fieldValue}}\n"
  },
  {
    "path": "theme/admin/templates/fields/view/audios.html",
    "content": "{{#fieldValue}}\n<audio controls class=\"admin-audio-player multiple-files\">\n    <source src=\"{{&fieldValuePart}}\">\n    Your browser does not support the audio element.\n</audio>\n<p><a href=\"{{&fieldValuePart}}\"{{&target}}>{{&fieldOriginalValuePart}}</a></p>\n<br/>\n{{/fieldValue}}\n"
  },
  {
    "path": "theme/admin/templates/fields/view/boolean.html",
    "content": "{{&fieldValue}}"
  },
  {
    "path": "theme/admin/templates/fields/view/image.html",
    "content": "<a href=\"{{&fieldValue}}\"{{&target}}>\n    <p>{{&fieldValue}}</p>\n    <img src=\"{{&fieldValue}}\" alt=\"{{&fieldValue}}\"/>\n</a>\n"
  },
  {
    "path": "theme/admin/templates/fields/view/images.html",
    "content": "{{#fieldValue}}\n<a href=\"{{&fieldValuePart}}\"{{&target}}>\n    <p>{{&fieldOriginalValuePart}}</p>\n    <img src=\"{{&fieldValuePart}}\" alt=\"{{&fieldValuePart}}\"/>\n</a>\n<br/>\n{{/fieldValue}}\n"
  },
  {
    "path": "theme/admin/templates/fields/view/link.html",
    "content": "<a href=\"{{&fieldValue}}\"{{&target}}>{{&fieldOriginalValue}}</a>"
  },
  {
    "path": "theme/admin/templates/fields/view/links.html",
    "content": "{{#fieldValue}}\n<a href=\"{{&fieldValuePart}}\"{{&target}}>\n    {{&fieldOriginalValuePart}}\n</a>\n<br/>\n{{/fieldValue}}"
  },
  {
    "path": "theme/admin/templates/fields/view/text.html",
    "content": "{{&fieldValue}}"
  },
  {
    "path": "theme/admin/templates/fields/view/textarea.html",
    "content": "<textarea name=\"{{&fieldName}}\" id=\"{{&fieldName}}\" disabled=\"disabled\">{{fieldValue}}</textarea>\n"
  },
  {
    "path": "theme/admin/templates/layout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <title>{{&brandingCompanyName}}</title>\n    <meta name=\"language\" content=\"en\"/>\n    <meta charset=\"utf-8\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes, viewport-fit=cover\"/>\n    <!-- favicons -->\n    <meta name=\"msapplication-config\" content=\"/browserconfig.xml\"/>\n    <link rel=\"shortcut icon\" href=\"/favicon.ico\" type=\"image/x-icon\"/>\n    <link rel=\"manifest\" href=\"/site.webmanifest\"/>\n    <!-- CSS and JS -->\n    <link crossorigin rel=\"preconnect\" href=\"https://fonts.googleapis.com\"/>\n    <link crossorigin rel=\"preconnect\" href=\"https://fonts.gstatic.com\"/>\n    <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Play:300,300i,400,400i,500,500i,600,600i,700,700i\"/>\n    <link rel=\"stylesheet\" href=\"{{stylesFilePath}}\"/>\n    <script type=\"text/javascript\" src=\"/js/functions.js\"></script>\n    <script type=\"text/javascript\" src=\"/reldens-functions.js\"></script>\n    <script type=\"module\" src=\"{{scriptsFilePath}}\"></script>\n</head>\n<body class=\"reldens-admin-panel\">\n<div class=\"wrapper\">\n    <div class=\"header\">\n        <h1 class=\"title\">\n            <a href=\"{{rootPath}}\">{{&brandingCompanyName}}</a>\n        </h1>\n    </div>\n    <div class=\"content\">\n        <div class=\"notification\">\n            <span class=\"close\">&times;</span>\n            <span class=\"message\"></span>\n        </div>\n        {{&sideBar}}\n        <div class=\"main-content\">\n            {{&pageContent}}\n        </div>\n    </div>\n    <div class=\"footer\">\n        {{&copyRight}}\n    </div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "theme/admin/templates/list-content.html",
    "content": "<tr class=\"row row-header\">\n    <th class=\"field field-actions\">\n        <div class=\"field-actions-container\">\n            <form name=\"delete-selection-form\" id=\"delete-selection-form\" action=\"{{&deletePath}}\" method=\"post\">\n                <input type=\"hidden\" name=\"ids\" class=\"hidden-ids-input\"/>\n                <button class=\"button button-danger list-delete-selection\">\n                    <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M10,18a1,1,0,0,0,1-1V11a1,1,0,0,0-2,0v6A1,1,0,0,0,10,18ZM20,6H16V5a3,3,0,0,0-3-3H11A3,3,0,0,0,8,5V6H4A1,1,0,0,0,4,8H5V19a3,3,0,0,0,3,3h8a3,3,0,0,0,3-3V8h1a1,1,0,0,0,0-2ZM10,5a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1V6H10Zm7,14a1,1,0,0,1-1,1H8a1,1,0,0,1-1-1V8H17Zm-3-1a1,1,0,0,0,1-1V11a1,1,0,0,0-2,0v6A1,1,0,0,0,14,18Z\" fill=\"#6563ff\"/>\n                    </svg>\n                </button>\n            </form>\n            <button class=\"button button-primary list-select\" data-checked=\"1\">\n                <input type=\"checkbox\" id=\"input-check-select-all\"/>\n            </button>\n        </div>\n    </th>\n    {{#fieldsHeaders}}\n    <th class=\"field field-{{&name}} sortable{{#isSorted}} sorted sorted-{{&sortDirection}}{{/isSorted}}\" data-column=\"{{&name}}\">\n        <div class=\"header-content\">\n            <span class=\"header-label\">{{&value}}</span>\n            <span class=\"sort-indicators\">\n                <svg class=\"sort-icon sort-asc{{#isSortedAsc}} active{{/isSortedAsc}}\" viewBox=\"0 0 10 6\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M0 6L5 0L10 6Z\"/>\n                </svg>\n                <svg class=\"sort-icon sort-desc{{#isSortedDesc}} active{{/isSortedDesc}}\" viewBox=\"0 0 10 6\" xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M0 0L5 6L10 0Z\"/>\n                </svg>\n            </span>\n        </div>\n        <form class=\"sort-form hidden\" method=\"POST\" action=\"{{&listRoute}}\">\n            <input type=\"hidden\" name=\"sortBy\" value=\"\"/>\n            <input type=\"hidden\" name=\"sortDirection\" value=\"\"/>\n            <input type=\"hidden\" name=\"entityFilterTerm\" value=\"\"/>\n            {{#filters}}\n            <input type=\"hidden\" name=\"filters[{{&propertyKey}}]\" value=\"\" data-filter-key=\"{{&propertyKey}}\"/>\n            {{/filters}}\n        </form>\n    </th>\n    {{/fieldsHeaders}}\n    <th class=\"field field-edit\"></th>\n    <th class=\"field field-delete\"></th>\n</tr>\n{{#rows}}\n<tr class=\"row\">\n    <td class=\"field field-actions\">\n        <div class=\"field-actions-container\">\n            <input class=\"ids-checkbox\" type=\"checkbox\" name=\"idsSelection[]\" value=\"{{&id}}\"/>\n        </div>\n    </td>\n    {{#fields}}\n    <td class=\"field field-{{&name}}\">\n        <a href=\"{{&viewLink}}\">\n            <span>{{&value}}</span>\n        </a>\n    </td>\n    {{/fields}}\n    <td class=\"field field-edit\">\n        <a href=\"{{&editLink}}\">\n            <span>\n                <svg\n                    class=\"feather feather-edit\"\n                    fill=\"none\"\n                    height=\"24\"\n                    stroke=\"currentColor\"\n                    stroke-linecap=\"round\"\n                    stroke-linejoin=\"round\"\n                    stroke-width=\"2\"\n                    viewBox=\"0 0 24 24\"\n                    width=\"24\"\n                    xmlns=\"http://www.w3.org/2000/svg\">\n                    <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/>\n                    <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/>\n                </svg>\n            </span>\n        </a>\n    </td>\n    <td class=\"field field-delete\">\n        <form class=\"form-delete\" name=\"delete-form-{{&id}}\" id=\"delete-form-{{&id}}\" action=\"{{&deleteLink}}\" method=\"post\">\n            <span>\n                <input type=\"hidden\" name=\"ids[]\" value=\"{{&id}}\"/>\n                <button class=\"button-list-delete\" type=\"submit\">\n                    <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"M10,18a1,1,0,0,0,1-1V11a1,1,0,0,0-2,0v6A1,1,0,0,0,10,18ZM20,6H16V5a3,3,0,0,0-3-3H11A3,3,0,0,0,8,5V6H4A1,1,0,0,0,4,8H5V19a3,3,0,0,0,3,3h8a3,3,0,0,0,3-3V8h1a1,1,0,0,0,0-2ZM10,5a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1V6H10Zm7,14a1,1,0,0,1-1,1H8a1,1,0,0,1-1-1V8H17Zm-3-1a1,1,0,0,0,1-1V11a1,1,0,0,0-2,0v6A1,1,0,0,0,14,18Z\" fill=\"#6563ff\"/>\n                    </svg>\n                </button>\n            </span>\n        </form>\n    </td>\n</tr>\n{{/rows}}\n"
  },
  {
    "path": "theme/admin/templates/list.html",
    "content": "<div class=\"entity-list {{&entityName}}-list\">\n    <h2 class=\"list-title\">{{&templateTitle}}</h2>\n    <div class=\"actions\">\n        <a class=\"button button-primary\" href=\"{{&entityEditRoute}}\">Create New</a>\n    </div>\n    <div class=\"extra-actions\">\n        {{&extraContent}}\n    </div>\n    <div class=\"sub-content filters\">\n        <form class=\"sub-content-form filter-form\" name=\"filter-form\" id=\"filter-form\" action=\"{{&entityListRoute}}\" method=\"post\">\n            <div class=\"filters-header\">\n                <div class=\"search-controls\">\n                    <div class=\"filters-toggle\">\n                        <img src=\"/assets/admin/filters.png\" alt=\"Filters\"/>\n                    </div>\n                    <div class=\"search-input-group\">\n                        <input type=\"text\" id=\"entityFilterTerm\" name=\"entityFilterTerm\" placeholder=\"Search...\" value=\"{{&entityFilterTermValue}}\"/>\n                    </div>\n                    <div class=\"filter-actions\">\n                        <input class=\"button button-primary button-filter\" type=\"submit\" value=\"Filter\"/>\n                        <a class=\"button button-secondary button-clear-filter\" href=\"{{&entityListRoute}}?clearFilters=true\">Clear Filters</a>\n                    </div>\n                </div>\n            </div>\n            <div class=\"filters-toggle-content hidden\">\n                {{#filters}}\n                <div class=\"sub-content-box filter\">\n                    <label for=\"filter-{{&propertyKey}}\">{{&name}}</label>\n                    <input type=\"text\" id=\"filter-{{&propertyKey}}\" name=\"filters[{{&propertyKey}}]\"{{&value}}/>\n                </div>\n                {{/filters}}\n            </div>\n        </form>\n    </div>\n    <div class=\"table-wrapper\">\n        <table class=\"list\">\n            {{&list}}\n        </table>\n    </div>\n    <div class=\"pagination\">\n        {{&pagination}}\n    </div>\n</div>\n<dialog class=\"confirm-dialog\">\n    <div class=\"dialog-content\">\n        <h5 class=\"dialog-title\">Confirm Delete</h5>\n        <p class=\"dialog-message\">Are you sure you want to delete the selected items? This action cannot be undone.</p>\n        <div class=\"dialog-actions\">\n            <button type=\"button\" class=\"button button-secondary dialog-cancel\">Cancel</button>\n            <button type=\"button\" class=\"button button-danger dialog-confirm\">Delete</button>\n        </div>\n    </div>\n</dialog>\n"
  },
  {
    "path": "theme/admin/templates/login.html",
    "content": "<div class=\"forms-container\">\n    <div class=\"row\">\n        <form name=\"login-form\" id=\"login-form\" class=\"login-form\" action=\"#\" method=\"post\">\n            <h3 class=\"form-title\">Login</h3>\n            <div class=\"input-box login-email\">\n                <label for=\"email\">E-mail</label>\n                <input type=\"text\" name=\"email\" id=\"email\" class=\"required\" required autocomplete=\"on\"/>\n            </div>\n            <div class=\"input-box login-password\">\n                <label for=\"password\">Password</label>\n                <input type=\"password\" name=\"password\" id=\"password\" class=\"required\" required autocomplete=\"off\"/>\n            </div>\n            <div class=\"input-box submit-container login-submit\">\n                <input class=\"button button-primary button-login\" type=\"submit\" value=\"Submit\"/>\n            </div>\n            <div class=\"input-box response-error\"></div>\n        </form>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/admin/templates/management.html",
    "content": "<h2>Server Management</h2>\n<div class=\"sub-content\">\n    <div class=\"sub-content-box\">\n        <h3>Server Maintenance</h3>\n        <form class=\"sub-content-form management-form confirmation-required\" name=\"management-form\" id=\"management-form\" action=\"{{&actionPath}}\" method=\"post\">\n            <div>\n                <label for=\"shutdown-time\">\n                    <span>Shutdown server with user notifications in seconds:</span>\n                    <input type=\"number\" name=\"shutdown-time\" id=\"shutdown-time\" value=\"{{&shutdownTime}}\"/>\n                </label>\n                <p class=\"alert\">IMPORTANT: this will take down the administration panel as well, and you will be logged out.</p>\n                <div class=\"shutting-down\">\n                    <span class=\"shutting-down-label\">{{&shuttingDownLabel}}</span>\n                    <span class=\"shutting-down-time\" data-shutting-down-time=\"{{&shuttingDownTime}}\">\n                        {{&shuttingDownTime}}\n                    </span>\n                </div>\n            </div>\n            <input type=\"submit\" class=\"button button-{{&submitType}} button-management\" value=\"{{&submitLabel}}\"/>\n        </form>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/admin/templates/maps-wizard-maps-selection.html",
    "content": "<h2>Maps Wizard</h2>\n<div class=\"sub-content maps-wizard\">\n    <div class=\"sub-content-box\">\n        <form class=\"sub-content-form maps-wizard-form confirmation-required\"\n            name=\"maps-wizard-form\"\n            id=\"maps-wizard-form\"\n            action=\"{{&actionPath}}\"\n            method=\"post\"\n            enctype=\"multipart/form-data\">\n            <input type=\"hidden\" name=\"mainAction\" id=\"mainAction\" value=\"import\"/>\n            <input type=\"hidden\" name=\"generatedMapsHandler\" id=\"generatedMapsHandler\" value=\"{{&generatedMapsHandler}}\"/>\n            <input type=\"hidden\" name=\"importAssociationsForChangePoints\" id=\"importAssociationsForChangePoints\" value=\"{{&importAssociationsForChangePoints}}\"/>\n            <input type=\"hidden\" name=\"importAssociationsRecursively\" id=\"importAssociationsRecursively\" value=\"{{&importAssociationsRecursively}}\"/>\n            <input type=\"hidden\" name=\"automaticallyExtrudeMaps\" id=\"automaticallyExtrudeMaps\" value=\"{{&automaticallyExtrudeMaps}}\"/>\n            <input type=\"hidden\" name=\"verifyTilesetImage\" id=\"verifyTilesetImage\" value=\"{{&verifyTilesetImage}}\"/>\n            <input type=\"hidden\" name=\"handlerParams\" id=\"handlerParams\" value=\"{{handlerParams}}\"/>\n            <div class=\"main-action-container maps-selection\">\n                <h3>Select the maps to be imported</h3>\n                <p>Notes:<p>\n                <p>\n                    - The Game Server requires a reboot in order to make the maps available on the game.<br/>\n                    - If you refresh the page you will get a new set of random maps generated.<br/>\n                    - Generated sub-maps will be automatically imported, if you don't want to import those you can download all the related maps (the main map and the sub-map) and edit change them to your needs.<br/>\n                </p>\n                <ul class=\"wizard-options-container\">\n                {{#maps}}\n                    <li class=\"wizard-map-option-container\">\n                        <div class=\"selector-box\">\n                            <input class=\"map-wizard-option\" type=\"checkbox\" name=\"selectedMaps[]\" id=\"maps-wizard-map-option-{{&key}}\" value=\"{{&key}}\"/>\n                            <input type=\"hidden\" name=\"map-title-{{&key}}\" id=\"map-title-{{&key}}\" value=\"{{&key}}\"/>\n                            <label class=\"main-option\" for=\"maps-wizard-map-option-{{&key}}\">\n                                {{&key}}\n                            </label>\n                            <p>Downloads:</p>\n                            <p>\n                                - <a href=\"{{&mapJson}}\" target=\"_blank\">{{&mapJson}}</a><br/>\n                                - <a href=\"{{&mapImage}}\" target=\"_blank\">{{&mapImage}}</a>\n                            </p>\n                        </div>\n                        <canvas\n                            class=\"mapCanvas\"\n                            data-toggle=\"modal\"\n                            width=\"{{&mapWidth}}\"\n                            height=\"{{&mapHeight}}\"\n                            data-tile-width=\"{{&tileWidth}}\"\n                            data-tile-height=\"{{&tileHeight}}\"\n                            data-image-key=\"{{&mapImage}}\"\n                            data-map-json=\"{{&mapJson}}\">\n                        </canvas>\n                        {{#hasSubMaps}}\n                            <div class=\"sub-maps\">\n                                <p class=\"sub-map-option-description clickable\" data-expand-collapse=\".sub-maps-container-{{&key}}\">\n                                    <img class=\"icon-sm\" src=\"/assets/admin/filters.png\" alt=\"Associated maps\"/>\n                                    <span>Associated maps generated</span>\n                                </p>\n                                <div class=\"sub-maps-container sub-maps-container-{{&key}} hidden\">\n                                    {{#subMaps}}\n                                        <p>{{&key}}</p>\n                                        <p>Downloads:</p>\n                                        <p>\n                                            - <a href=\"{{&mapJson}}\" target=\"_blank\">{{&mapJson}}</a><br/>\n                                            - <a href=\"{{&mapImage}}\" target=\"_blank\">{{&mapImage}}</a>\n                                        </p>\n                                        <canvas\n                                            class=\"mapCanvas\"\n                                            data-toggle=\"modal\"\n                                            width=\"{{&mapWidth}}\"\n                                            height=\"{{&mapHeight}}\"\n                                            data-tile-width=\"{{&tileWidth}}\"\n                                            data-tile-height=\"{{&tileHeight}}\"\n                                            data-image-key=\"{{&mapImage}}\"\n                                            data-map-json=\"{{&mapJson}}\">\n                                        </canvas>\n                                    {{/subMaps}}\n                                </div>\n                            </div>\n                        {{/hasSubMaps}}\n                    </li>\n                {{/maps}}\n                </ul>\n            </div>\n            <input type=\"submit\" class=\"button button-primary button-maps-wizard\" value=\"Import Selected Maps\"/>\n        </form>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/admin/templates/maps-wizard.html",
    "content": "<h2>Maps Wizard</h2>\n<div class=\"sub-content maps-wizard\">\n    <div class=\"sub-content-box\">\n        <form class=\"sub-content-form maps-wizard-form confirmation-required\"\n            name=\"maps-wizard-form\"\n            id=\"maps-wizard-form\"\n            action=\"{{&actionPath}}\"\n            method=\"post\"\n            enctype=\"multipart/form-data\">\n            <input type=\"hidden\" name=\"mainAction\" id=\"mainAction\" value=\"generate\"/>\n            <div class=\"main-action-container\">\n                <p>What would you like to do?</p>\n                <ul class=\"wizard-options-container\">\n                    <li class=\"wizard-option-container active\">\n                        <div class=\"checkbox-container\">\n                            <input class=\"map-wizard-option with-state\" type=\"radio\" name=\"mapsWizardAction\" id=\"mapsWizardAction-1\" value=\"elements-object-loader\" checked=\"checked\"/>\n                            <label class=\"main-option\" for=\"mapsWizardAction-1\">\n                                Generate a SINGLE random map with Layer Elements Object Loader (LayerElementsObjectLoader)\n                            </label>\n                        </div>\n                        <div class=\"maps-wizard-option-content mapsWizardAction-1-data\">\n                            <p>\n                                Generator Data example:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/map-data.json\" target=\"_blank\">\n                                https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/map-data.json\n                                </a>\n                            </p>\n                            <button type=\"button\" class=\"button button-primary set-sample-data\" data-option-value=\"elements-object-loader\">\n                                Set Sample Data in \"Generator Data\"\n                            </button>\n                            <p>\n                                Expected JSON files examples:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/house-001.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/house-001.json\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/house-002.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/house-002.json\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/tree.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/tree.json\n                                </a>\n                            </p>\n                            <p>\n                                Expected Images files examples:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/tilesheet.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-object/tilesheet.png\n                                </a>\n                            </p>\n                            <p>\n                                Note:<br/>\n                                In the examples above, all the tileset JSON files use the same tileset image (this is because we used the already optimized version of the tileset).<br/>\n                                Case disclaimer:\n                                In theory, it should also work if each element has its own image, but this still needs to be tested.<br/>\n                                For now, you can use the composite option to use multiple tileset images and those will be merged by the generator which use the Tile Map Optimizer.\n                            </p>\n                        </div>\n                    </li>\n                    <li class=\"wizard-option-container\">\n                        <div class=\"checkbox-container\">\n                            <input class=\"map-wizard-option with-state\" type=\"radio\" name=\"mapsWizardAction\" id=\"mapsWizardAction-2\" value=\"elements-composite-loader\"/>\n                            <label class=\"main-option\" for=\"mapsWizardAction-2\">\n                                Generate a SINGLE random map with Layer Elements Composite Loader (LayerElementsCompositeLoader)\n                            </label>\n                        </div>\n                        <div class=\"maps-wizard-option-content mapsWizardAction-2-data\">\n                            <p>\n                                Generator Data example:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/map-composite-data.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/map-composite-data.json\n                                </a>\n                            </p>\n                            <button type=\"button\" class=\"button button-primary set-sample-data\" data-option-value=\"elements-composite-loader\">\n                                Set Sample Data in \"Generator Data\"\n                            </button>\n                            <p>\n                                Expected JSON files examples:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/reldens-town-composite.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/reldens-town-composite.json\n                                </a>\n                            </p>\n                            <p>\n                                Expected Images files examples:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/outside.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/outside.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/terrain.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/terrain.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/house.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/house.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/doors.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/doors.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/water.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/water.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/inside.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/inside.png\n                                </a><br/>\n                            </p>\n                            <p>\n                                Note:<br/>\n                                In this case as you can see we have a single tile map JSON file which contains several tilesets with different images.<br/>\n                                All the original contents are 16x16 pixels, so you can see we set \"factor: 2\" in the sample params to run the optimizer and get 32x32 pixels tiles in the result.\n                            </p>\n                        </div>\n                    </li>\n                    <li class=\"wizard-option-container\">\n                        <div class=\"checkbox-container\">\n                            <input class=\"map-wizard-option with-state\" type=\"radio\" name=\"mapsWizardAction\" id=\"mapsWizardAction-3\" value=\"multiple-by-loader\"/>\n                            <label class=\"main-option\" for=\"mapsWizardAction-3\">\n                                Generate MULTIPLE random maps by Multiple Loader (MultipleByLoaderGenerator)\n                            </label>\n                        </div>\n                        <div class=\"maps-wizard-option-content mapsWizardAction-3-data\">\n                            <p>\n                                Generator Data example:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/map-composite-data.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/map-composite-data-with-names.json\n                                </a>\n                            </p>\n                            <button type=\"button\" class=\"button button-primary set-sample-data\" data-option-value=\"multiple-by-loader\">\n                                Set Sample Data in \"Generator Data\"\n                            </button>\n                            <p>\n                                Expected JSON files examples:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/reldens-town-composite.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/reldens-town-composite.json\n                                </a>\n                            </p>\n                            <p>\n                                Expected Images files examples:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/outside.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/outside.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/terrain.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/terrain.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/house.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/house.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/doors.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/doors.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/water.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/water.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/inside.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/inside.png\n                                </a><br/>\n                            </p>\n                            <p>\n                                Note:<br/>\n                                In this case we have the same structure as in the SINGLE import, but we include multiple map names in the provided data and use a different loader to create multiple maps at once.\n                            </p>\n                        </div>\n                    </li>\n                    <li class=\"wizard-option-container\">\n                        <div class=\"checkbox-container\">\n                            <input class=\"map-wizard-option with-state\" type=\"radio\" name=\"mapsWizardAction\" id=\"mapsWizardAction-4\" value=\"multiple-with-association-by-loader\"/>\n                            <label class=\"main-option\" for=\"mapsWizardAction-4\">\n                                Generate MULTIPLE random maps with Layer Elements Composite Loader (MultipleWithAssociationsByLoaderGenerator)\n                            </label>\n                        </div>\n                        <div class=\"maps-wizard-option-content mapsWizardAction-4-data\">\n                            <p>\n                                Generator Data example:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/map-composite-data.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/map-composite-data-with-associations.json\n                                </a>\n                            </p>\n                            <button type=\"button\" class=\"button button-primary set-sample-data\" data-option-value=\"multiple-with-association-by-loader\">\n                                Set Sample Data in \"Generator Data\"\n                            </button>\n                            <p>\n                                Expected JSON files examples:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/reldens-town-composite-with-associations.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/reldens-town-composite-with-associations.json\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/house-composite.json\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/house-composite.json\n                                </a>\n                            </p>\n                            <p>\n                                Expected Images files examples:<br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/outside.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/outside.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/terrain.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/terrain.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/house.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/house.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/doors.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/doors.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/water.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/water.png\n                                </a><br/>\n                                <a href=\"https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/inside.png\" target=\"_blank\">\n                                    https://github.com/damian-pastorini/tile-map-generator/blob/master/examples/layer-elements-composite/inside.png\n                                </a><br/>\n                            </p>\n                            <p>\n                                Note:<br/>\n                                In this case we have the same structure as in the SINGLE import, but we include multiple maps information and the association options in the provided data, but use a different loader to create multiple associated maps at once.\n                            </p>\n                        </div>\n                    </li>\n                </ul>\n                <hr/>\n                <p>NOTE: if you already uploaded all your files and never manually removed them from the \"generate-data\" folder, you don't need to upload the same files again.</p>\n                <div class=\"input-box\">\n                    <label for=\"generatorImages\">Images</label>\n                    <input type=\"file\" name=\"generatorImages\" id=\"generatorImages\" multiple=\"multiple\"/>\n                </div>\n                <div class=\"input-box\">\n                    <label for=\"generatorJsonFiles\">JSON Files</label>\n                    <input type=\"file\" name=\"generatorJsonFiles\" id=\"generatorJsonFiles\" multiple=\"multiple\"/>\n                </div>\n                <hr/>\n                <label for=\"generatorData\">Generator data:</label>\n                <textarea name=\"generatorData\" id=\"generatorData\" class=\"generatorData\" cols=\"30\" rows=\"10\" placeholder=\"JSON data for map generation process\" required=\"required\"></textarea>\n            </div>\n            <div class=\"submit-container\">\n                <input type=\"submit\" class=\"button button-primary button-maps-wizard\" value=\"Generate\"/>\n                <img class=\"hidden loading\" src=\"/assets/web/loading.gif\"/>\n            </div>\n        </form>\n    </div>\n</div>\n<script type=\"text/javascript\">\n    let data = {\n        'elements-object-loader': JSON.stringify({\n            tileSize: 32,\n            tileSheetPath: 'tilesheet.png',\n            tileSheetName: 'tilesheet.png',\n            imageHeight: 578,\n            imageWidth: 612,\n            tileCount: 306,\n            columns: 18,\n            margin: 1,\n            spacing: 2,\n            elementsQuantity: {\n                house1: 3,\n                house2: 2,\n                tree: 6\n            },\n            groundTile: 116,\n            mainPathSize: 3,\n            blockMapBorder: true,\n            freeSpaceTilesQuantity: 2,\n            variableTilesPercentage: 15.0,\n            pathTile: 121,\n            collisionLayersForPaths: ['change-points', 'collisions', 'tree-base'],\n            randomGroundTiles: [26, 27, 28, 29, 30, 36, 37, 38, 39, 50, 51, 52, 53],\n            surroundingTiles: {\n                '-1,-1': 127,\n                '-1,0': 124,\n                '-1,1': 130,\n                '0,-1': 126,\n                '0,1': 129,\n                '1,-1': 132,\n                '1,0': 131,\n                '1,1': 133\n            },\n            corners: {\n                '-1,-1': 285,\n                '-1,1': 284,\n                '1,-1': 283,\n                '1,1': 282\n            },\n            layerElementsFiles: {\n                house1: 'house-001.json',\n                house2: 'house-002.json',\n                tree: 'tree.json'\n            }\n        }),\n        'elements-composite-loader': JSON.stringify({\n            factor: 2,\n            mainPathSize: 3,\n            blockMapBorder: true,\n            freeSpaceTilesQuantity: 2,\n            variableTilesPercentage: 15,\n            collisionLayersForPaths: ['change-points', 'collisions', 'tree-base'],\n            compositeElementsFile: 'reldens-town-composite.json',\n            automaticallyExtrudeMaps: '1'\n        }),\n        'multiple-by-loader': JSON.stringify({\n            factor: 2,\n            mainPathSize: 3,\n            blockMapBorder: true,\n            freeSpaceTilesQuantity: 2,\n            variableTilesPercentage: 15,\n            collisionLayersForPaths: ['change-points', 'collisions', 'tree-base'],\n            mapNames: ['map-001', 'map-002', 'map-003'],\n            compositeElementsFile: 'reldens-town-composite.json',\n            automaticallyExtrudeMaps: '1'\n        }),\n        'multiple-with-association-by-loader': JSON.stringify({\n            factor: 2,\n            mainPathSize: 3,\n            blockMapBorder: true,\n            freeSpaceTilesQuantity: 2,\n            variableTilesPercentage: 15,\n            collisionLayersForPaths: ['change-points', 'collisions', 'tree-base'],\n            mapsInformation: [\n                {mapName: 'town-001', mapTitle: 'Town 1'},\n                {mapName: 'town-002', mapTitle: 'Town 2'},\n                {mapName: 'town-003', mapTitle: 'Town 3'},\n                {mapName: 'town-004', mapTitle: 'Town 4'}\n            ],\n            associationsProperties: {\n                generateElementsPath: false,\n                blockMapBorder: true,\n                freeSpaceTilesQuantity: 0,\n                variableTilesPercentage: 0,\n                placeElementsOrder: 'inOrder',\n                orderElementsBySize: false,\n                randomizeQuantities: true,\n                applySurroundingPathTiles: false,\n                automaticallyExtrudeMaps: true\n            },\n            compositeElementsFile: 'reldens-town-composite-with-associations.json',\n            automaticallyExtrudeMaps: '1'\n        })\n    };\n\n    let options = document.querySelectorAll('.set-sample-data');\n    let generatorDataElement = document.querySelector('.generatorData');\n    if(generatorDataElement){\n        for(let option of options){\n            option.addEventListener('click', () => {\n                generatorDataElement.value = data[option.dataset.optionValue] || '';\n            });\n        }\n    }\n\n</script>\n"
  },
  {
    "path": "theme/admin/templates/objects-import.html",
    "content": "<h2>Objects Import</h2>\n<div class=\"sub-content objects-import\">\n    <div class=\"sub-content-box\">\n        <form class=\"sub-content-form objects-import-form confirmation-required\"\n            name=\"objects-import-form\"\n            id=\"objects-import-form\"\n            action=\"{{&actionPath}}\"\n            method=\"post\"\n            enctype=\"multipart/form-data\">\n            <div class=\"main-action-container\">\n                <p>What would you like to do?</p>\n                <hr/>\n                <button type=\"button\" class=\"button button-primary set-sample-data\">\n                    Set Sample Data in \"Generator Data\"\n                </button>\n                <p>NOTE: if you already uploaded all your files and never manually removed them from the \"generate-data\" folder, you don't need to upload the same files again.</p>\n                <div class=\"input-box\">\n                    <label for=\"generatorJsonFiles\">JSON Files</label>\n                    <input type=\"file\" name=\"generatorJsonFiles\" id=\"generatorJsonFiles\" multiple=\"multiple\"/>\n                </div>\n                <hr/>\n                <label for=\"generatorData\">Generator data (if not empty this data field will be used instead of the files):</label>\n                <textarea name=\"generatorData\" id=\"generatorData\" class=\"generatorData\" cols=\"30\" rows=\"10\" placeholder=\"JSON data for objects import process\"></textarea>\n            </div>\n            <div class=\"submit-container\">\n                <input type=\"submit\" class=\"button button-primary button-objects-import\" value=\"Import\"/>\n                <img class=\"hidden loading\" src=\"/assets/web/loading.gif\"/>\n            </div>\n        </form>\n    </div>\n</div>\n<script type=\"text/javascript\">\n    let sampleDataElement = document.querySelector('.set-sample-data');\n    let generatorDataElement = document.querySelector('.generatorData');\n    if(sampleDataElement && generatorDataElement){\n        sampleDataElement.addEventListener('click', () => {\n            generatorDataElement.value = JSON.stringify({\n                \"objects\": [\n                    {\n                        \"clientKey\": \"enemy_forest_1\",\n                        \"title\": \"Tree\",\n                        \"privateParams\": \"{\\\"shouldRespawn\\\":true,\\\"childObjectType\\\":4,\\\"isAggressive\\\":true,\\\"interactionRadio\\\":120}\",\n                        \"assets\": [\n                            {\n                                \"assetType\": \"spritesheet\",\n                                \"assetKey\": \"enemy_forest_1\",\n                                \"assetFile\": \"monster-treant.png\",\n                                \"extraParams\": \"{\\\"frameWidth\\\":47,\\\"frameHeight\\\":50}\"\n                            }\n                        ]\n                    },\n                    {\n                        \"clientKey\": \"enemy_forest_2\",\n                        \"title\": \"Tree Punch\",\n                        \"privateParams\": \"{\\\"shouldRespawn\\\":true,\\\"childObjectType\\\":4,\\\"isAggressive\\\":true,\\\"interactionRadio\\\":70}\",\n                        \"assets\": [\n                            {\n                                \"assetType\": \"spritesheet\",\n                                \"assetKey\": \"enemy_forest_2\",\n                                \"assetFile\": \"monster-golem2.png\",\n                                \"extraParams\": \"{\\\"frameWidth\\\":47,\\\"frameHeight\\\":50}\"\n                            }\n                        ]\n                    }\n                ],\n                \"defaults\": {\n                    \"classType\": 7,\n                    \"layer\": \"ground-respawn-area\",\n                    \"clientParams\": \"{\\\"autoStart\\\":true}\",\n                    \"enabled\": 1,\n                    \"respawn\": {\n                        \"respawnTime\": 2000,\n                        \"instancesLimit\": 200\n                    },\n                    \"stats\": {\n                        \"hp\": 50,\n                        \"mp\": 50,\n                        \"atk\": 50,\n                        \"def\": 50,\n                        \"dodge\": 50,\n                        \"speed\": 50,\n                        \"aim\": 50,\n                        \"stamina\": 50,\n                        \"mgk-atk\": 50,\n                        \"mgk-def\": 50\n                    },\n                    \"roomsNames\": [\n                        \"bots-001\",\n                        \"bots-002\",\n                        \"bots-003\",\n                        \"bots-004\",\n                        \"bots-005\",\n                        \"bots-006\",\n                        \"bots-007\",\n                        \"bots-008\",\n                        \"bots-009\",\n                        \"bots-010\",\n                        \"bots-011\",\n                        \"bots-012\",\n                        \"bots-013\",\n                        \"bots-014\",\n                        \"bots-015\",\n                        \"bots-016\",\n                        \"bots-017\",\n                        \"bots-018\",\n                        \"bots-019\",\n                        \"bots-020\",\n                        \"bots-021\",\n                        \"bots-022\",\n                        \"bots-023\",\n                        \"bots-024\",\n                        \"bots-025\",\n                        \"bots-026\",\n                        \"bots-027\",\n                        \"bots-028\",\n                        \"bots-029\",\n                        \"bots-030\",\n                        \"bots-031\",\n                        \"bots-032\",\n                        \"bots-033\",\n                        \"bots-034\",\n                        \"bots-035\",\n                        \"bots-036\",\n                        \"bots-037\",\n                        \"bots-038\",\n                        \"bots-039\",\n                        \"bots-040\",\n                        \"bots-041\",\n                        \"bots-042\",\n                        \"bots-043\",\n                        \"bots-044\",\n                        \"bots-045\",\n                        \"bots-046\",\n                        \"bots-047\",\n                        \"bots-048\",\n                        \"bots-049\",\n                        \"bots-050\"\n                    ]\n                }\n            });\n        });\n    }\n</script>\n"
  },
  {
    "path": "theme/admin/templates/pagination-link.html",
    "content": "<a class=\"pagination-link {{&pageClass}}\" href=\"{{&pageLink}}\">{{&pageLabel}}</a>"
  },
  {
    "path": "theme/admin/templates/sections/editForm/cms-pages.html",
    "content": "<fieldset class=\"cms-page-route\">\n    <legend>Route data</legend>\n    {{#originalRouteId}}\n    <input type=\"hidden\" name=\"originalRouteId\" value=\"{{originalRouteId}}\"/>\n    {{/originalRouteId}}\n    <div class=\"edit-field\">\n        <span class=\"field-name\">Path</span>\n        <span class=\"field-value\">\n            <input type=\"text\" name=\"routePath\" value=\"{{routePath}}\"/>\n        </span>\n    </div>\n    <div class=\"edit-field\">\n        <span class=\"field-name\">Domain</span>\n        <span class=\"field-value\">\n            <input type=\"text\" name=\"routeDomain\" value=\"{{routeDomain}}\"/>\n        </span>\n    </div>\n</fieldset>\n"
  },
  {
    "path": "theme/admin/templates/sections/view/rooms.html",
    "content": "<div class=\"extra-content-container\" data-entity-serialized-data=\"{{&entitySerializedData}}\">\n    <h3>Extra options</h3>\n    <div class=\"default-room-container\">\n        <form name=\"defaultRoom\" action=\"#\" method=\"post\">\n            <input type=\"hidden\" name=\"setAsDefault\" value=\"1\">\n            <div class=\"edit-field\">\n            <label class=\"field-name\">\n                Set this room as default when the game starts<br/>\n                (new users registration or first login)\n            </label>\n            <span class=\"field-value with-button\">\n                <button class=\"button button-primary\" type=\"submit\">Save as default</button>\n            </span>\n            </div>\n        </form>\n    </div>\n    <div class=\"rooms-association-container\">\n        <h3>Link rooms</h3>\n        <p>Notes:</p>\n        <p>\n            - The room link does not exist as \"entity\" itself, this feature will create change points and return points in both directions (if specified).<br/>\n            - The \"bidirectional\" option will create a change point in the current room and another in the next, this will allow the player to go back and move between rooms.<br/>\n            - When selecting a return position, it can't be the same as the change point in that same room, otherwise the player will keep hitting the change points after each scene change entering an infinite loop.<br/>\n            - Once the association is created, it can only be removed by deleting the related records in the change-points and return points sections.<br/>\n        </p>\n        <form id=\"createRoomsLink\" name=\"createRoomsLink\" action=\"#\" method=\"post\">\n            <input type=\"hidden\" name=\"createRoomsLink\" value=\"1\"/>\n            <!-- current room map -->\n            <div class=\"edit-field\">\n                <label class=\"field-name\" for=\"currentRoomChangePointTileIndex\">\n                    Current room change point (tile index)\n                    <br/>When you hit this tile you will be moved to the next room.\n                </label>\n                <input class=\"field-value\" type=\"text\" id=\"currentRoomChangePointTileIndex\" name=\"currentRoomChangePointTileIndex\" required/>\n            </div>\n            <div class=\"association-maps-container current-room-change-point-container\" data-map-loader=\"{{&id}}\"></div>\n            <!-- next room selector -->\n            <div class=\"edit-field\">\n                <label class=\"field-name\" for=\"nextRoomSelector\">\n                    Select the destination room\n                </label>\n                <span  class=\"field-value\">\n                    <select id=\"nextRoomSelector\" class=\"nextRoomSelector\" name=\"nextRoomSelector\" required>\n                        <option value=\"\">Select a room</option>\n                    </select>\n                </span>\n            </div>\n            <!-- next room return point -->\n            <div class=\"edit-field\">\n                <label class=\"field-name\" for=\"nextRoomDirection\">The direction in which the player will be displayed</label>\n                <span  class=\"field-value\">\n                    <select id=\"nextRoomDirection\" class=\"nextRoomDirection\" name=\"nextRoomDirection\" required>\n                        <option value=\"down\">Down</option>\n                        <option value=\"up\">Up</option>\n                        <option value=\"left\">Left</option>\n                        <option value=\"right\">Right</option>\n                    </select>\n                </span>\n            </div>\n            <div class=\"edit-field\">\n                <label class=\"field-name\" for=\"nextRoomIsDefault\">Is the default position for when the player enters the room?</label>\n                <span  class=\"field-value\">\n                    <input id=\"nextRoomIsDefault\" class=\"nextRoomIsDefault\" type=\"checkbox\" name=\"nextRoomIsDefault\" value=\"1\"/>\n                </span>\n            </div>\n            <div class=\"edit-field\">\n                <label class=\"field-name\" for=\"nextRoomPositionX\">Next room position X</label>\n                <input class=\"field-value\" type=\"text\" id=\"nextRoomPositionX\" name=\"nextRoomPositionX\" required/>\n            </div>\n            <div class=\"edit-field\">\n                <label class=\"field-name\" for=\"nextRoomPositionY\">Next room position Y</label>\n                <input class=\"field-value\" type=\"text\" id=\"nextRoomPositionY\" name=\"nextRoomPositionY\" required/>\n            </div>\n            <div class=\"association-maps-container next-room-return-position-container\"></div>\n            <div class=\"actions-container\">\n                <span>\n                    <button class=\"button button-primary\" type=\"submit\">Create Link</button>\n                </span>\n            </div>\n        </form>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/admin/templates/sections/viewForm/cms-pages.html",
    "content": "<fieldset class=\"cms-page-route\">\n    <legend>Route data</legend>\n    <div class=\"edit-field\">\n        <span class=\"field-name\">Path</span>\n        <span class=\"field-value\">\n            <input type=\"text\" name=\"route-path\" value=\"{{routePath}}\" disabled=\"disabled\"/>\n        </span>\n    </div>\n    <div class=\"edit-field\">\n        <span class=\"field-name\">Domain</span>\n        <span class=\"field-value\">\n            <input type=\"text\" name=\"route-domain\" value=\"{{routeDomain}}\" disabled=\"disabled\"/>\n        </span>\n    </div>\n</fieldset>\n"
  },
  {
    "path": "theme/admin/templates/sidebar-header.html",
    "content": "<div class=\"side-bar-item with-sub-items\">\n    <h3>{{&name}}</h3>\n    {{&subItems}}\n</div>\n"
  },
  {
    "path": "theme/admin/templates/sidebar-item.html",
    "content": "<div class=\"side-bar-item\">\n    <a href=\"{{&path}}\">{{&name}}</a>\n</div>\n"
  },
  {
    "path": "theme/admin/templates/sidebar.html",
    "content": "<div class=\"side-bar\">\n    {{&navigationView}}\n    <div class=\"user-area\">\n        <div class=\"side-bar-item with-sub-items\">\n            <h3>My Account</h3>\n            <div class=\"side-bar-item\">\n                <a href=\"{{rootPath}}/logout\">Logout</a>\n            </div>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/admin/templates/skills-import.html",
    "content": "<h2>Skills Import</h2>\n<div class=\"sub-content objects-import\">\n    <div class=\"sub-content-box\">\n        <form class=\"sub-content-form objects-import-form confirmation-required\"\n            name=\"objects-import-form\"\n            id=\"objects-import-form\"\n            action=\"{{&actionPath}}\"\n            method=\"post\"\n            enctype=\"multipart/form-data\">\n            <div class=\"main-action-container\">\n                <p>What would you like to do?</p>\n                <hr/>\n                <button type=\"button\" class=\"button button-primary set-sample-data\">\n                    Set Sample Data in \"Generator Data\"\n                </button>\n                <p>NOTE: if you already uploaded all your files and never manually removed them from the \"generate-data\" folder, you don't need to upload the same files again.</p>\n                <div class=\"input-box\">\n                    <label for=\"generatorJsonFiles\">JSON Files</label>\n                    <input type=\"file\" name=\"generatorJsonFiles\" id=\"generatorJsonFiles\" multiple=\"multiple\"/>\n                </div>\n                <hr/>\n                <label for=\"generatorData\">Generator data (if not empty this data field will be used instead of the files):</label>\n                <textarea name=\"generatorData\" id=\"generatorData\" class=\"generatorData\" cols=\"30\" rows=\"10\" placeholder=\"JSON data for skills import process\"></textarea>\n            </div>\n            <div class=\"submit-container\">\n                <input type=\"submit\" class=\"button button-primary button-objects-import\" value=\"Import\"/>\n                <img class=\"hidden loading\" src=\"/assets/web/loading.gif\"/>\n            </div>\n        </form>\n    </div>\n</div>\n<script type=\"text/javascript\">\n    let sampleDataElement = document.querySelector('.set-sample-data');\n    let generatorDataElement = document.querySelector('.generatorData');\n    if(sampleDataElement && generatorDataElement){\n        sampleDataElement.addEventListener('click', () => {\n            generatorDataElement.value = JSON.stringify({\n                \"options\": {\n                    \"removeAll\": false,\n                    \"override\": false,\n                    \"update\": true\n                },\n                \"defaults\": {\n                    \"properties\": {\n                        \"autoValidation\": 0,\n                        \"skillDelay\": 1500,\n                        \"castTime\": 0,\n                        \"usesLimit\": 0,\n                        \"range\": 0,\n                        \"rangeAutomaticValidation\": 1,\n                        \"rangePropertyX\": \"state/x\",\n                        \"rangePropertyY\": \"state/y\",\n                        \"rangeTargetPropertyX\": null,\n                        \"rangeTargetPropertyY\": null,\n                        \"allowSelfTarget\": 0,\n                        \"criticalChance\": 0,\n                        \"criticalMultiplier\": 1,\n                        \"criticalFixedValue\": 0,\n                        \"customData\": null\n                    },\n                    \"animations\": {\n                        \"appendSkillKeyOnAnimationImage\": true,\n                        \"defaults\": {\n                            \"enabled\": true,\n                            \"type\": \"spritesheet\",\n                            \"frameWidth\": 64,\n                            \"frameHeight\": 70,\n                            \"start\": 0\n                        },\n                        \"bullet\": {\n                            \"img\": \"_bullet\",\n                            \"end\": 3,\n                            \"repeat\": -1,\n                            \"frameRate\": 1,\n                            \"dir\": 3\n                        },\n                        \"cast\": {\n                            \"img\": \"_cast\",\n                            \"end\": 3,\n                            \"repeat\": -1,\n                            \"destroyTime\": 2000,\n                            \"depthByPlayer\": \"above\"\n\n                        },\n                        \"hit\": {\n                            \"img\": \"_hit\",\n                            \"end\": 4,\n                            \"repeat\": 0,\n                            \"depthByPlayer\": \"above\"\n                        }\n                    },\n                    \"attack\": {\n                        \"affectedProperty\": \"stats/hp\",\n                        \"allowEffectBelowZero\": 0,\n                        \"applyDirectDamage\": 0,\n                        \"attackProperties\": \"stats/atk,stats/stamina,stats/speed\",\n                        \"defenseProperties\": \"stats/def,stats/stamina,stats/speed\",\n                        \"aimProperties\": \"stats/aim\",\n                        \"dodgeProperties\": \"stats/dodge\",\n                        \"dodgeFullEnabled\": 0,\n                        \"dodgeOverAimSuccess\": 1,\n                        \"damageAffected\": 0,\n                        \"criticalAffected\": 0\n                    },\n                    \"physicalData\": {\n                        \"magnitude\": 0,\n                        \"objectWidth\": 0,\n                        \"objectHeight\": 0,\n                        \"validateTargetOnHit\": 0\n                    },\n                    \"targetEffects\": {\n                        \"minValue\": 0,\n                        \"maxValue\": 0,\n                        \"minProperty\": null,\n                        \"maxProperty\": null\n                    },\n                    \"ownerEffects\": {\n                        \"minValue\": 0,\n                        \"maxValue\": 0,\n                        \"minProperty\": null,\n                        \"maxProperty\": null\n                    }\n                },\n                \"skills\": {\n                    \"punch\": {\n                        \"classPathLevelRelations\": {\"all\": \"1\"},\n                        \"objectsRelations\": {\"enemy_1\": \"player\", \"enemy_2\": \"player\"},\n                        \"properties\": {\n                            \"skillDelay\": 1000,\n                            \"range\": 50,\n                            \"criticalChance\": 10,\n                            \"criticalMultiplier\": 2\n                        },\n                        \"typeData\": {\n                            \"key\": \"attack\",\n                            \"properties\": {\n                                \"hitDamage\": 3\n                            }\n                        }\n                    },\n                    \"throwRock\": {\n                        \"classPathLevelRelations\": {\"all\": \"2\"},\n                        \"objectsRelations\": {\"enemy_1\": \"player\", \"enemy_2\": \"player\"},\n                        \"properties\": {\n                            \"skillDelay\": 2000,\n                            \"range\": 250,\n                            \"criticalChance\": 10,\n                            \"criticalMultiplier\": 2\n                        },\n                        \"typeData\": {\n                            \"key\": \"physical_attack\",\n                            \"properties\": {\n                                \"hitDamage\": 5\n                            }\n                        },\n                        \"physicalData\": {\n                            \"magnitude\": 350,\n                            \"objectWidth\": 5,\n                            \"objectHeight\": 5\n                        }\n                    },\n                    \"heal\": {\n                        \"classPathLevelRelations\": {\"sorcerer\": \"3\"},\n                        \"properties\": {\n                            \"skillDelay\": 1500,\n                            \"allowSelfTarget\": 1,\n                            \"castTime\": 2000\n                        },\n                        \"typeData\": {\n                            \"key\": \"effect\"\n                        },\n                        \"animations\": {\n                            \"cast\": {},\n                            \"hit\": {}\n                        },\n                        \"clearPrevious\": [\"targetEffects\", \"ownerEffects\", \"ownerConditions\"],\n                        \"ownerConditions\": [{\n                            \"key\": \"available_mp\",\n                            \"propertyKey\": \"stats/mp\",\n                            \"conditional\": \"ge\",\n                            \"value\": 2\n                        }],\n                        \"ownerEffects\": [{\n                            \"key\": \"dec_mp\",\n                            \"propertyKey\": \"stats/mp\",\n                            \"operationKey\": \"2\",\n                            \"value\": 2\n                        }],\n                        \"targetEffects\": [{\n                            \"key\": \"heal\",\n                            \"propertyKey\": \"stats/mp\",\n                            \"operationKey\": \"1\",\n                            \"value\": 5,\n                            \"maxProperty\": \"statsBase/hp\"\n                        }]\n                    }\n                }\n            });\n        });\n    }\n</script>\n"
  },
  {
    "path": "theme/admin/templates/theme-manager.html",
    "content": "<h2 class=\"theme-manager-heading\">Theme Management</h2>\n<script id=\"command-descriptions-data\" type=\"application/json\">{{&commandDescriptionsJson}}</script>\n<p class=\"reboot-notice\">All of these commands require a server reboot to take effect.</p>\n<div class=\"sub-content\">\n    <div class=\"sub-content-box\">\n        <h3>Theme Selector</h3>\n        <div class=\"input-box\">\n            <label for=\"selected-theme\">\n                <span>Select Theme:</span>\n                <select id=\"selected-theme\" name=\"selected-theme\">\n                    {{#themes}}\n                    <option value=\"{{&name}}\" {{#selected}}selected{{/selected}}>{{&name}}</option>\n                    {{/themes}}\n                </select>\n            </label>\n            <p class=\"info-text\">Commands will execute on the selected theme above.</p>\n        </div>\n    </div>\n\n    <div class=\"sub-content-box\">\n        <h3>Client Build Commands</h3>\n        <form class=\"sub-content-form theme-manager-form\" name=\"theme-manager-form\" id=\"theme-manager-form\" action=\"{{&actionPath}}\" method=\"post\">\n            <input type=\"hidden\" name=\"selected-theme\" id=\"form-selected-theme\" value=\"\"/>\n            <input type=\"hidden\" name=\"command\" id=\"form-command\" value=\"\"/>\n            <div class=\"command-grid\">\n                {{#buildCommands}}\n                <div class=\"command-item\">\n                    <button type=\"button\" class=\"button button-primary execute-command\" data-command=\"{{&name}}\" data-async=\"{{&async}}\">{{&label}}</button>\n                    <button type=\"button\" class=\"button button-info show-command-info\" data-command=\"{{&name}}\" title=\"Show command information\">ℹ</button>\n                    <img class=\"hidden loading command-loading\" src=\"/assets/web/loading.gif\"/>\n                    <div class=\"command-info-tooltip\" data-command=\"{{&name}}\">\n                        <div class=\"tooltip-title\">{{&label}}</div>\n                        <div class=\"tooltip-description\"></div>\n                        <div class=\"tooltip-details\"></div>\n                    </div>\n                </div>\n                {{/buildCommands}}\n            </div>\n        </form>\n    </div>\n\n    <div class=\"sub-content-box\">\n        <h3>Client Dist Commands</h3>\n        <form class=\"sub-content-form theme-manager-form\" name=\"theme-manager-dist-form\" id=\"theme-manager-dist-form\" action=\"{{&actionPath}}\" method=\"post\">\n            <input type=\"hidden\" name=\"selected-theme\" id=\"form-selected-theme-dist\" value=\"\"/>\n            <input type=\"hidden\" name=\"command\" id=\"form-command-dist\" value=\"\"/>\n            <div class=\"command-grid\">\n                {{#clientDistCommands}}\n                <div class=\"command-item\">\n                    <button type=\"button\" class=\"button button-primary execute-command\" data-command=\"{{&name}}\">{{&label}}</button>\n                    <button type=\"button\" class=\"button button-info show-command-info\" data-command=\"{{&name}}\" title=\"Show command information\">ℹ</button>\n                    <img class=\"hidden loading command-loading\" src=\"/assets/web/loading.gif\"/>\n                    <div class=\"command-info-tooltip\" data-command=\"{{&name}}\">\n                        <div class=\"tooltip-title\">{{&label}}</div>\n                        <div class=\"tooltip-description\"></div>\n                        <div class=\"tooltip-details\"></div>\n                    </div>\n                </div>\n                {{/clientDistCommands}}\n            </div>\n        </form>\n    </div>\n\n    <p class=\"section-description warning\">These commands perform complex operations (use with caution):</p>\n\n    <div class=\"sub-content-box\">\n        <h3>Copy Commands</h3>\n        <form class=\"sub-content-form theme-manager-form\" name=\"theme-manager-copy-form\" id=\"theme-manager-copy-form\" action=\"{{&actionPath}}\" method=\"post\">\n            <input type=\"hidden\" name=\"selected-theme\" id=\"form-selected-theme-copy\" value=\"\"/>\n            <input type=\"hidden\" name=\"command\" id=\"form-command-copy\" value=\"\"/>\n            <div class=\"command-grid\">\n                {{#copyCommands}}\n                <div class=\"command-item\">\n                    <button type=\"button\" class=\"button button-warning execute-command\" data-command=\"{{&name}}\">{{&label}}</button>\n                    <button type=\"button\" class=\"button button-info show-command-info\" data-command=\"{{&name}}\" title=\"Show command information\">ℹ</button>\n                    <img class=\"hidden loading command-loading\" src=\"/assets/web/loading.gif\"/>\n                    <div class=\"command-info-tooltip\" data-command=\"{{&name}}\">\n                        <div class=\"tooltip-title\">{{&label}}</div>\n                        <div class=\"tooltip-description\"></div>\n                        <div class=\"tooltip-details\"></div>\n                    </div>\n                </div>\n                {{/copyCommands}}\n            </div>\n        </form>\n    </div>\n\n    <div class=\"sub-content-box\">\n        <h3>Installation Commands</h3>\n        <form class=\"sub-content-form theme-manager-form\" name=\"theme-manager-install-form\" id=\"theme-manager-install-form\" action=\"{{&actionPath}}\" method=\"post\">\n            <input type=\"hidden\" name=\"selected-theme\" id=\"form-selected-theme-install\" value=\"\"/>\n            <input type=\"hidden\" name=\"command\" id=\"form-command-install\" value=\"\"/>\n            <div class=\"command-grid\">\n                {{#installCommands}}\n                <div class=\"command-item\">\n                    <button type=\"button\" class=\"button button-danger execute-command\" data-command=\"{{&name}}\" data-async=\"{{&async}}\">{{&label}}</button>\n                    <button type=\"button\" class=\"button button-info show-command-info\" data-command=\"{{&name}}\" title=\"Show command information\">ℹ</button>\n                    <img class=\"hidden loading command-loading\" src=\"/assets/web/loading.gif\"/>\n                    <div class=\"command-info-tooltip\" data-command=\"{{&name}}\">\n                        <div class=\"tooltip-title\">{{&label}}</div>\n                        <div class=\"tooltip-description\"></div>\n                        <div class=\"tooltip-details\"></div>\n                    </div>\n                </div>\n                {{/installCommands}}\n            </div>\n        </form>\n    </div>\n</div>\n\n<dialog class=\"confirm-dialog\">\n    <div class=\"dialog-content\">\n        <h5 class=\"dialog-title\">Execute Theme Command</h5>\n        <p class=\"dialog-message\">Are you sure you want to execute this command?</p>\n        <div class=\"dialog-actions\">\n            <button type=\"button\" class=\"button button-secondary dialog-cancel\">Cancel</button>\n            <button type=\"button\" class=\"button button-primary dialog-confirm\">Execute</button>\n        </div>\n    </div>\n</dialog>\n"
  },
  {
    "path": "theme/admin/templates/view.html",
    "content": "<div class=\"entity-view {{&entityName}}-view\">\n    <h2>{{&templateTitle}}</h2>\n    <div class=\"actions\">\n        <a class=\"button button-primary\" href=\"{{&entityNewRoute}}\">Create New</a>\n        <a class=\"button button-primary\" href=\"{{&entityEditRoute}}\">Edit</a>\n        <a class=\"button button-secondary\" href=\"{{&entityListRoute}}\">Back</a>\n        <form class=\"form-delete\" name=\"delete-form-top-{{&id}}\" action=\"{{&entityDeleteRoute}}\" method=\"post\">\n            <span>\n                <input type=\"hidden\" name=\"ids[]\" value=\"{{&id}}\"/>\n                <button class=\"button button-danger\" type=\"submit\">Delete</button>\n            </span>\n        </form>\n    </div>\n    <div class=\"extra-actions\">\n        {{&extraContentTop}}\n    </div>\n    {{#fields}}\n    <div class=\"view-field\">\n        <span class=\"field-name\">{{&name}}</span>\n        <span class=\"field-value\">{{&value}}</span>\n    </div>\n    {{/fields}}\n    {{&extraFormContent}}\n    <div class=\"actions\">\n        <a class=\"button button-primary\" href=\"{{&entityNewRoute}}\">Create New</a>\n        <a class=\"button button-primary\" href=\"{{&entityEditRoute}}\">Edit</a>\n        <a class=\"button button-secondary\" href=\"{{&entityListRoute}}\">Back</a>\n        <form class=\"form-delete\" name=\"delete-form-{{&id}}\" action=\"{{&entityDeleteRoute}}\" method=\"post\">\n            <span>\n                <input type=\"hidden\" name=\"ids[]\" value=\"{{&id}}\"/>\n                <button class=\"button button-danger\" type=\"submit\">Delete</button>\n            </span>\n        </form>\n        <div class=\"extra-actions\">\n            {{&extraContentBottom}}\n        </div>\n    </div>\n</div>\n<dialog class=\"confirm-dialog\">\n    <div class=\"dialog-content\">\n        <h5 class=\"dialog-title\">Confirm Delete</h5>\n        <p class=\"dialog-message\">Are you sure you want to delete this item? This action cannot be undone.</p>\n        <div class=\"dialog-actions\">\n            <button type=\"button\" class=\"button button-secondary dialog-cancel\">Cancel</button>\n            <button type=\"button\" class=\"button button-danger dialog-confirm\">Delete</button>\n        </div>\n    </div>\n</dialog>\n"
  },
  {
    "path": "theme/default/assets/email/forgot.html",
    "content": "<h3>Hello user!</h3>\n<p>Did you forget your password?</p>\n<p>\n    If so you can use this reset password link:<br/>\n    <a href=\"{{ resetLink }}\">{{ resetLink }}</a>\n</p>\n<p>\n    Regards,\n    <br/>Administration\n</p>\n"
  },
  {
    "path": "theme/default/assets/email/reset-error.html",
    "content": "<h3 class=\"form-title\">Reset password error!</h3>\n<div class=\"input-box\">Please contact the administrator.</div>\n"
  },
  {
    "path": "theme/default/assets/email/reset-success.html",
    "content": "<h3 class=\"form-title\">Your password has been reset!</h3>\n<div class=\"input-box\">\n    <p>Username: {{&userName}}</p>\n    <p>Your new password is: {{&newPass}}</p>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/chat/templates/message.html",
    "content": "{{from}}: <span style=\"color:{{color}};\">{{message}}</span><br/>"
  },
  {
    "path": "theme/default/assets/features/chat/templates/tab-content.html",
    "content": "<div class=\"tab-content tab-content-{{&tabId}}{{&className}}\"></div>\n"
  },
  {
    "path": "theme/default/assets/features/chat/templates/tab-label.html",
    "content": "<div class=\"tab-label tab-label-{{&tabId}}{{&className}}\" data-tab-id=\"{{&tabId}}\">\n    {{&tabLabel}}\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/chat/templates/tabs-container.html",
    "content": "<div class=\"tabs-container\">\n    <div class=\"tabs-headers\">\n        {{&tabsHeaders}}\n    </div>\n    <div class=\"tabs-contents\">\n        {{&tabsContents}}\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/chat/templates/ui-chat.html",
    "content": "<div class=\"chat-ui hidden\" id=\"chat-ui\">\n    <img id=\"chat-close\" class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div id=\"chat-contents\"></div>\n    <div id=\"chat-messages\"></div>\n    <input id=\"chat-input\" type=\"text\" placeholder=\"Enter message\"/>\n    <input id=\"chat-send\" type=\"button\" value=\"Send\"/>\n</div>\n<div class=\"open-ui-button\" id=\"chat-open\">\n    <div id=\"notification-balloon\" class=\"hidden notification-balloon\">!</div>\n    <img src=\"/assets/features/chat/assets/chat.png\" alt=\"open\"/>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/equip.html",
    "content": "<div class=\"item-action-block item-equip\"\n    id=\"item-equip-{{id}}\" data-item-id=\"{{id}}\" data-equip-status=\"{{equipStatus}}\">\n    <img src=\"/assets/features/inventory/assets/{{equipStatus}}.png\" alt=\"Equip/Unequip\"/>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/group.html",
    "content": "<div class=\"group-item-block\"\n    id=\"group-item-{{key}}\"\n    data-group-id=\"{{key}}\"\n    data-label=\"{{label}}\"\n    title=\"{{label}}\">\n    <img class=\"equip-group-icon\" src=\"/assets/custom/groups/{{fileName}}\"/>\n    <div class=\"equipped-item\"></div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/item.html",
    "content": "<div class=\"item-box\" id=\"item-{{id}}\">\n    <div class=\"image-container\">\n        <img src=\"/assets/custom/items/{{key}}.png\"/>\n    </div>\n    <div class=\"item-data-container\">\n        <span class=\"item-label\">{{label}}</span>\n        <span class=\"item-description\">{{description}}</span>\n        <div class=\"actions-container\">\n            {{&usable}}\n            {{&equipment}}\n            <div class=\"item-action-block item-trash\" id=\"item-trash-{{id}}\">\n                <img src=\"/assets/features/inventory/assets/trash.png\"/>\n                <div class=\"trash-confirm\" id=\"trash-confirm-{{id}}\">\n                    Are you sure?<br/>\n                    <span class=\"conf-yes\" id=\"trash-confirmed-{{id}}\">Yes</span> / <span id=\"trash-cancel-{{id}}\">No</span>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div class=\"item-qty\" id=\"item-qty-{{id}}\">{{qty}}</div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-accept.html",
    "content": "<div class=\"accept-trade accept-trade-{{playerId}}\">\n    <span>Accept trade from player {{playerName}}:</span>\n    <button class=\"accept-trade-yes\">Yes</button><button class=\"accept-trade-no\">No</button>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-action-remove.html",
    "content": "<div class=\"trade-action trade-action-{{tradeAction}}\">\n    <img class=\"btn-remove\" src=\"/assets/controls/bx.png\" alt=\"remove\"/>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-action.html",
    "content": "<div class=\"trade-action trade-action-{{tradeAction}}\">\n    <button>{{tradeAction}}</button>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-container.html",
    "content": "<div class=\"trade-container trade-container-{{tradeActionKey}}\">\n    <div class=\"trade-row trade-items-boxes\">\n        <div class=\"trade-col trade-col-1\">{{&tradeItemsBuy}}</div>\n        <div class=\"trade-col trade-col-2\">{{&tradeItemsSell}}</div>\n    </div>\n    <div class=\"trade-row\">{{&lastErrorMessage}}</div>\n    <div class=\"trade-row trade-confirm-actions\">\n        <div class=\"trade-col trade-col-1\">\n            <div class=\"trade-row\">{{&confirmRequirements}}</div>\n        </div>\n        <div class=\"trade-col trade-col-2\">\n            <button type=\"button\" class=\"confirm-action confirm-{{tradeActionKey}}\">{{tradeActionLabel}}</button>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-item-quantity.html",
    "content": "<input type=\"number\" value=\"{{quantityDisplay}}\"{{&quantityMaxDisplay}} min=\"1\"/>"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-item.html",
    "content": "<div class=\"item-box trade-item trade-item-{{tradeActionKey}} trade-item-{{id}}{{hiddenClass}}\">\n    <div class=\"image-container\">\n        <img src=\"/assets/custom/items/{{key}}.png\"/>\n    </div>\n    <div class=\"item-data-container\">\n        <span class=\"item-label\">{{label}}</span>\n        <span class=\"item-description\">{{description}}</span>\n    </div>\n    <div class=\"trade-requirements\">\n        {{&tradeRequirements}}\n    </div>\n    <div class=\"trade-rewards\">\n        {{&tradeRewards}}\n    </div>\n    <div class=\"actions-container trade-actions\">\n        {{&tradeAction}}\n        <div class=\"item-qty item-qty-{{id}}\">\n            {{&tradeQuantityContent}}\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-player-container.html",
    "content": "<div class=\"trade-container trade-container-{{tradeActionKey}}\">\n    <div class=\"trade-row trade-items-boxes-headers\">\n        <div class=\"trade-player-col trade-col-1 my-items\">{{myItemsTitle}}</div>\n        <div class=\"trade-player-col trade-col-2 pushed-to-trade\">{{pushedToTradeTitle}}</div>\n        <div class=\"trade-player-col trade-col-3 got-from-trade\">{{gotFromTradeTitle}}</div>\n    </div>\n    <div class=\"trade-row trade-items-boxes\">\n        <div class=\"trade-player-col trade-col-1 my-items\">{{&myItems}}</div>\n        <div class=\"trade-player-col trade-col-2 pushed-to-trade\">{{&pushedToTrade}}</div>\n        <div class=\"trade-player-col trade-col-3 got-from-trade\">{{&gotFromTrade}}</div>\n    </div>\n    <div class=\"trade-row trade-confirm-actions\">\n        <button type=\"button\" class=\"confirm-action confirm-{{tradeActionKey}}\">{{confirmLabel}}</button>\n        <button type=\"button\" class=\"disconfirm-action disconfirm-{{tradeActionKey}}\">{{disconfirmLabel}}</button>\n        <button type=\"button\" class=\"cancel-action cancel-{{tradeActionKey}}\">{{cancelLabel}}</button>\n        <span class=\"player-confirmed\">{{playerConfirmedLabel}}</span>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-requirements.html",
    "content": "<div class=\"item-requirements\" id=\"item-requirement-{{itemKey}}-{{requiredItemKey}}\">\n    <span class=\"requirement-key\">\n        <img src=\"/assets/custom/items/{{requiredItemKey}}.png\" title=\"{{requiredItemKey}}\"/>\n    </span>\n    <span class=\"requirement-qty\">{{requiredQuantity}}</span>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-rewards.html",
    "content": "<div class=\"item-rewards\" id=\"item-reward-{{itemKey}}-{{rewardItemKey}}\">\n    <span class=\"reward-key\">\n        <img src=\"/assets/custom/items/{{rewardItemKey}}.png\" title=\"{{rewardItemKey}}\"/>\n    </span>\n    <span class=\"reward-qty\">{{rewardQuantity}}</span>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/trade-start.html",
    "content": "<div class=\"start-trade start-trade-{{playerId}}\">\n    <button class=\"start-trade\">Trade</button>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/ui-equipment.html",
    "content": "<div class=\"equipment-ui\" id=\"equipment-ui\">\n    <img id=\"equipment-close\" class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div id=\"equipment-items\"></div>\n</div>\n<img class=\"open-ui-button\" id=\"equipment-open\" src=\"/assets/features/inventory/assets/equipment.png\" alt=\"open\"/>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/ui-inventory.html",
    "content": "<div class=\"inventory-ui\" id=\"inventory-ui\">\n    <img id=\"inventory-close\" class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div id=\"inventory-items\"></div>\n</div>\n<img class=\"open-ui-button\" id=\"inventory-open\" src=\"/assets/features/inventory/assets/inventory.png\" alt=\"open\"/>\n"
  },
  {
    "path": "theme/default/assets/features/inventory/templates/usable.html",
    "content": "<div class=\"item-action-block item-use\" id=\"item-use-{{id}}\" data-item-id=\"{{id}}\">\n    <img src=\"/assets/features/inventory/assets/use.png\" alt=\"Use\"/>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/rewards/templates/ui-rewards-list.html",
    "content": "<div class=\"rewards-content\">\n    {{#showRewardsTitle}}\n    <h3>{{&rewardsTitle}}</h3>\n    {{/showRewardsTitle}}\n    {{#acceptedReward}}\n    <div class=\"accepted-reward\">\n        {{&acceptedRewardMessage}}\n    </div>\n    {{/acceptedReward}}\n    <div class=\"rewards-table\">\n        {{#rewards}}\n        <div class=\"reward-container reward-{{&id}} reward-{{&activeClass}}\" data-reward-id=\"{{&id}}\">\n            {{#showRewardImage}}\n            <div class=\"reward-image-container\">\n                <img class=\"reward-image\" src=\"{{&rewardImagePath}}{{&rewardImage}}\" alt=\"{{&translated.label}}\"/>\n            </div>\n            {{/showRewardImage}}\n            <span class=\"reward-name\">{{&translated.label}}</span>\n            <span class=\"reward-description\">{{&translated.description}}</span>\n        </div>\n        {{/rewards}}\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/rewards/templates/ui-rewards.html",
    "content": "<div class=\"ui-box ui-dialog-box rewards-dialog-box\">\n    <img class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div class=\"box-title\">{{&title}}</div>\n    <div class=\"box-content\">{{&content}}</div>\n</div>\n<div class=\"open-ui-button box-open rewards-open\" id=\"rewards-open\">\n    <div id=\"rewards-notification-balloon\" class=\"hidden notification-balloon\">!</div>\n    <img src=\"/assets/features/rewards/assets/rewards.png\" alt=\"open\"/>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/scores/templates/ui-scores-table.html",
    "content": "{{#showScoresTitle}}\n<h3>{{&scoresTitle}}</h3>\n{{/showScoresTitle}}\n<div class=\"scores-table\">\n    {{#scores}}\n    <div class=\"score-container\">\n        <span class=\"score-player-name\">{{&playerName}}</span>\n        <span class=\"score-value\">{{&score}}</span>\n    </div>\n    {{/scores}}\n    {{#pages}}\n    <div class=\"pager-page\">\n        <a href=\"{{&pageLink}}\">{{&pageLabel}}</a>\n    </div>\n    {{/pages}}\n    {{#showCurrentPlayer}}\n    <div class=\"current-player-score-data\">\n        <span class=\"score-value\">{{&currentPlayerScore}}</span>\n    </div>\n    {{/showCurrentPlayer}}\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/scores/templates/ui-scores.html",
    "content": "<div class=\"ui-box ui-dialog-box scores-dialog-box\">\n    <img class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div class=\"box-title\">{{title}}</div>\n    <div class=\"box-content\">{{content}}</div>\n</div>\n<img  class=\"open-ui-button box-open scores-open\" src=\"/assets/features/scores/assets/scores.png\" alt=\"open\"/>\n"
  },
  {
    "path": "theme/default/assets/features/skills/templates/ui-class-path.html",
    "content": "<div class=\"class-path-container\">\n    <div class=\"class-path-label\"></div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/skills/templates/ui-experience.html",
    "content": "<div class=\"experience-container\">\n    <div class=\"experience-label\">{{experienceLabel}}</div>\n    <div class=\"current-experience\"></div>\n    <div class=\"next-level-experience\"></div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/skills/templates/ui-level.html",
    "content": "<div class=\"level-container\">\n    <div class=\"level-label\"></div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/skills/templates/ui-skill-box.html",
    "content": "<div class=\"skill-icon-container skill-icon-{{key}}\">\n    <img id=\"{{key}}\" src=\"/assets/custom/actions/controls/{{key}}.png\" alt=\"{{skillName}}\"/>\n</div>"
  },
  {
    "path": "theme/default/assets/features/skills/templates/ui-skills.html",
    "content": "<div class=\"ui-skills-controls ui-box ui-box-controls\">\n    <div class=\"skills-container action-buttons\">\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/snippets/templates/ui-snippets.html",
    "content": "<div class=\"settings-container\">\n    <div class=\"settings-row\">\n        <div class=\"col-full\">\n            <h3>{{snippetsTitle}}</h3>\n        </div>\n    </div>\n    <label for=\"snippets-setting\">{{snippetsLabel}}</label>\n    <select id=\"snippets-setting\" class=\"snippets-setting\"></select>\n    <div class=\"snippeets-notification\">{{snippetsNotification}}</div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/clan-accept.html",
    "content": "<div class=\"accept-clan accept-clan-{{playerId}}\">\n    <span>{{acceptTeamFromPlayerLabel}}</span>\n    <button class=\"accept-clan-yes\">{{yesLabel}}</button><button class=\"accept-clan-no\">{{noLabel}}</button>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/clan-container.html",
    "content": "<div class=\"clan-container clan-{{clanId}}\">\n    <div class=\"clan-row\">\n        <div class=\"title\">{{clanPlayersTitle}}</div>\n        <div class=\"clan-players-boxes\">\n            {{&clanPlayers}}\n        </div>\n    </div>\n    <div class=\"clan-row\">\n        <div class=\"title\">{{clanMembersTitle}}</div>\n        <div class=\"clan-members-boxes\">\n            {{&clanMembers}}\n        </div>\n    </div>\n    <div class=\"clan-row clan-actions\">\n        <div class=\"clan-disband\">\n            <button type=\"button\" class=\"clan-disband-action leave-{{clanId}}\">{{leaveActionLabel}}</button>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/clan-create.html",
    "content": "<div class=\"clan-create clan-create-{{playerId}}\">\n    <input name=\"clan-name-input\" class=\"clan-name-input\" type=\"text\" placeholder=\"{{clanNamePlaceholder}}\"/>\n    <button class=\"submit-clan-create\">{{createLabel}}</button>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/clan-invite.html",
    "content": "<div class=\"clan-invite clan-invite-{{playerId}}\">\n    <button class=\"clan-invite\">{{inviteLabel}}</button>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/clan-member-data.html",
    "content": "<div class=\"clan-member clan-member-{{playerId}}\">\n    <div class=\"member-name\">\n        <span>{{playerId}} - {{playerName}}</span>\n    </div>\n    {{&clanRemove}}\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/clan-player-data.html",
    "content": "<div class=\"clan-player clan-player-{{playerId}}\">\n    <div class=\"player-name\">\n        <span>{{playerId}} - {{playerName}}</span>\n    </div>\n    <div class=\"properties-list-container\">\n        {{&playerProperties}}\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/clan-remove.html",
    "content": "<div class=\"clan-remove-container\">\n    <img class=\"clan-remove-button clan-remove-player-{{playerId}}\" src=\"/assets/controls/bx.png\" alt=\"remove\"/>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/shared-property.html",
    "content": "<div class=\"property-box property-key-{{key}}\">\n    <div class=\"label\">\n        <span>{{label}}</span>\n    </div>\n    <div class=\"value\">\n        <span>{{value}}</span>\n    </div>\n    <div class=\"max\">\n        <span>{{max}}</span>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/team-accept.html",
    "content": "<div class=\"accept-team accept-team-{{playerId}}\">\n    <span>{{acceptTeamFromPlayerLabel}}</span>\n    <button class=\"accept-team-yes\">{{yesLabel}}</button><button class=\"accept-team-no\">{{noLabel}}</button>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/team-container.html",
    "content": "<div class=\"team-container team-{{teamId}}\">\n    <div class=\"team-row team-players-boxes\">\n        {{&teamMembers}}\n    </div>\n    <div class=\"team-row team-actions\">\n        <div class=\"team-disband\">\n            <button type=\"button\" class=\"team-leave-action leave-{{playerId}}\">{{leaveActionLabel}}</button>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/team-invite.html",
    "content": "<div class=\"team-invite team-invite-{{playerId}}\">\n    <button class=\"team-invite\">{{inviteLabel}}</button>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/team-player-data.html",
    "content": "<div class=\"team-player team-player-{{playerId}}\">\n    <div class=\"player-name\">\n        <span>{{playerName}}</span>\n    </div>\n    {{&playerRemove}}\n    <div class=\"properties-list-container\">\n        {{&playerProperties}}\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/team-remove.html",
    "content": "<div class=\"team-remove-container\">\n    <img class=\"team-remove-button team-remove-player-{{playerId}}\" src=\"/assets/controls/bx.png\" alt=\"remove\"/>\n</div>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/ui-clan.html",
    "content": "<div class=\"ui-box ui-dialog-box clan-dialog-box\">\n    <img class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div class=\"box-title\">{{title}}</div>\n    <div class=\"box-content\">{{content}}</div>\n</div>\n<img  class=\"open-ui-button box-open clan-open\" src=\"/assets/features/teams/assets/clan.png\" alt=\"open\"/>\n"
  },
  {
    "path": "theme/default/assets/features/teams/templates/ui-teams.html",
    "content": "<div class=\"ui-box ui-dialog-box teams-dialog-box\">\n    <img class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div class=\"box-title\">{{title}}</div>\n    <div class=\"box-content\">{{content}}</div>\n</div>\n<img  class=\"open-ui-button box-open teams-open\" src=\"/assets/features/teams/assets/team.png\" alt=\"open\"/>\n"
  },
  {
    "path": "theme/default/assets/html/dialog-box.html",
    "content": "<div class=\"ui-box ui-dialog-box\">\n    <img class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div class=\"box-title\">{{title}}</div>\n    <div class=\"box-content\">{{content}}</div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/layout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <title>Reldens | MMORPG Platform | By DwDeveloper</title>\n    <meta name=\"description\" content=\"Reldens, an open source MMORPG platform\"/>\n    <meta property=\"og:title\" content=\"Reldens | MMORPG Platform\"/>\n    <meta property=\"og:description\" content=\"Reldens, an open source MMORPG platform\"/>\n    <meta property=\"og:type\" content=\"website\"/>\n    <meta property=\"og:url\" content=\"https://demo.reldens.com/\"/>\n    <meta property=\"og:site_name\" content=\"Reldens\"/>\n    <meta property=\"og:locale\" content=\"en_US\"/>\n    <meta property=\"og:image\" content=\"https://cdn.dwdeveloper.com/assets/web/reldens-check.png\"/>\n    <meta property=\"og:image:width\" content=\"460\"/>\n    <meta property=\"og:image:height\" content=\"394\"/>\n    <meta property=\"og:image:alt\" content=\"Reldens MMORPG Platform Logo\"/>\n    <meta property=\"og:image:type\" content=\"image/png\"/>\n    <meta name=\"twitter:card\" content=\"summary_large_image\"/>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Play:300,300i,400,400i,500,500i,600,600i,700,700i\" rel=\"stylesheet\"/>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"https://www.gstatic.com/firebasejs/ui/4.6.0/firebase-ui-auth.css\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/assets/favicons/apple-touch-icon.png\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/assets/favicons/favicon-32x32.png\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/assets/favicons/favicon-16x16.png\"/>\n    <link rel=\"mask-icon\" href=\"/assets/favicons/safari-pinned-tab.svg\" color=\"#000000\"/>\n    <link rel=\"manifest\" href=\"/site.webmanifest\"/>\n    <meta name=\"apple-mobile-web-app-title\" content=\"Reldens\"/>\n    <meta name=\"application-name\" content=\"Reldens\"/>\n    <meta name=\"msapplication-TileColor\" content=\"#37517e\"/>\n    <meta name=\"theme-color\" content=\"#37517e\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"/css/styles.css\"/>\n</head>\n<body>\n    <div class=\"wrapper\" style=\"background-image: url(/assets/web/reldens-background.png);\">\n        <div class=\"header\">\n            <img id=\"your-logo\" src=\"/assets/web/reldens-your-logo-mage.png\" alt=\"reldens\"/>\n            <h1 class=\"title\">\n                - <strong>reldens</strong> - <span id=\"current-version\">demo -</span>\n                <br/>- your logo here -\n            </h1>\n        </div>\n        <div class=\"content\">\n            <div class=\"{{&contentKey}} row\">{{&content}}</div>\n        </div>\n        <div class=\"footer\">\n            <div class=\"copyright\">\n                <a href=\"https://www.dwdeveloper.com/\" target=\"_blank\">\n                    by D<span class=\"text-black text-lowercase\">w</span><span class=\"text-capitalize\">Developer</span>\n                </a>\n            </div>\n        </div>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "theme/default/assets/html/player-stat.html",
    "content": "<div class=\"stat-container stat-{{statKey}}\">\n    <span class=\"stat-label\">{{statLabel}}</span>\n    <span class=\"stat-value\">{{statValue}}</span>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/player-stats-bar.html",
    "content": "<div class=\"stat-bar-container stat-bar-{{statKey}}\">\n    <div class=\"stat-bar-wrapper\" style=\"background-color: {{inactiveColor}};\">\n        <div class=\"stat-bar-fill\" data-stat-key=\"{{statKey}}\" style=\"width: {{percentage}}%; background-color: {{activeColor}};\"></div>\n        <div class=\"stat-bar-label\">{{statLabel}}</div>\n        <div class=\"stat-bar-text\">{{currentValue}} / {{maxValue}}</div>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-action-box.html",
    "content": "<img id=\"{{key}}\" src=\"/assets/custom/actions/controls/{{key}}.png\" alt=\"{{actionName}}\"/>\n"
  },
  {
    "path": "theme/default/assets/html/ui-audio-category-row.html",
    "content": "<div class=\"settings-row\">\n    <div class=\"col-1\">\n        <label for=\"{{categoryKey}}\">{{categoryLabel}}</label>\n    </div>\n    <div class=\"col-2\">\n        <input type=\"checkbox\" id=\"{{categoryKey}}\" data-category-key=\"{{categoryKey}}\" class=\"audio-setting {{categoryKey}}\" value=\"{{categoryKey}}\"{{&categoryChecked}}/>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-audio.html",
    "content": "<div class=\"settings-container\">\n    <div class=\"settings-row\">\n        <div class=\"col-full\">\n            <h3>{{settingsTitle}}</h3>\n        </div>\n    </div>\n    {{&audioCategories}}\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-controls.html",
    "content": "<div class=\"ui-box ui-box-controls ui-box-controls-main-container\">\n    <div id=\"joystick\">\n        <div id=\"joystick-thumb\"></div>\n    </div>\n    <div class=\"arrows-container\">\n        <img id=\"left\" src=\"/assets/controls/left.png\" alt=\"left\"/>\n        <div class=\"vertical-buttons\">\n            <img id=\"up\" src=\"/assets/controls/up.png\" alt=\"up\"/>\n            <img id=\"down\" src=\"/assets/controls/down.png\" alt=\"down\"/>\n        </div>\n        <img id=\"right\" src=\"/assets/controls/right.png\" alt=\"right\"/>\n    </div>\n    <div class=\"action-buttons\"></div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-full-screen-button.html",
    "content": "<img id=\"full-screen-btn\" class=\"open-ui-button\" src=\"/assets/icons/full-screen.png\" alt=\"Go full screen\"/>\n"
  },
  {
    "path": "theme/default/assets/html/ui-instructions.html",
    "content": "<img class=\"open-ui-button\" id=\"instructions-open\" src=\"/assets/icons/instructions.png\" alt=\"open\"/>"
  },
  {
    "path": "theme/default/assets/html/ui-loading.html",
    "content": "<div class=\"default-loading-container\">\n    <img class=\"default-loading\" src=\"/assets/web/loading.gif\"/>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-minimap.html",
    "content": "<div class=\"minimap-ui hidden\" id=\"minimap-ui\">\n    <img id=\"minimap-close\" class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n</div>\n<img class=\"open-ui-button\" id=\"minimap-open\" src=\"/assets/icons/minimap.png\" alt=\"open\"/>\n"
  },
  {
    "path": "theme/default/assets/html/ui-option-button.html",
    "content": "<div class=\"ui-box ui-box-button-option\">\n    <button type=\"button\"\n        id=\"opt-{{id}}-{{object_id}}\"\n        data-option-value=\"{{value}}\"\n        class=\"button-option obj-{{object_id}} opt-{{id}}\">\n        {{label}}\n    </button>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-option-icon.html",
    "content": "<div class=\"ui-box ui-box-button-option\">\n    <img id=\"opt-{{id}}-{{object_id}}\"\n        data-option-value=\"{{value}}\"\n        class=\"button-option obj-{{object_id}} opt-{{id}}\"\n        src=\"{{icon}}\"\n        alt=\"{{label}}\"/>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-options-container.html",
    "content": "<div class=\"box-options-container\" id=\"{{id}}\"></div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-player-box.html",
    "content": "<div class=\"ui-box ui-box-player\">\n    <div class=\"player-name\"></div>\n    <button type=\"button\" id=\"logout\">Logout</button>\n    <div id=\"ui-player-extras\"></div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-player-stats.html",
    "content": "<div class=\"player-stats-ui\" id=\"player-stats-ui\">\n    <img id=\"player-stats-close\" class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div id=\"player-stats-container\"></div>\n</div>\n<img class=\"open-ui-button\" id=\"player-stats-open\" src=\"/assets/icons/book.png\" alt=\"open\"/>\n"
  },
  {
    "path": "theme/default/assets/html/ui-scene-label.html",
    "content": "<div class=\"ui-box ui-box-scene-data\">\n    <div class=\"scene-label\"></div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-settings-content.html",
    "content": "<div class=\"settings-ui hidden\" id=\"settings-ui\">\n    <div class=\"settings-content\">\n        <div id=\"settings-dynamic\"></div>\n        <img id=\"settings-close\" class=\"box-close\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    </div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/html/ui-settings.html",
    "content": "<img class=\"open-ui-button\" id=\"settings-open\" src=\"/assets/icons/settings.png\" alt=\"open\"/>\n"
  },
  {
    "path": "theme/default/assets/html/ui-target.html",
    "content": "<div class=\"ui-box box-target\" id=\"box-target\">\n    <img class=\"close-target\" src=\"/assets/game-ui/corner-x.png\" alt=\"close\"/>\n    <div id=\"target-container\"></div>\n</div>\n"
  },
  {
    "path": "theme/default/assets/maps/reldens-bots-forest-house-01-n0.json",
    "content": "{\n    \"backgroundcolor\": \"#000000\",\n    \"compressionlevel\": 0,\n    \"height\": 20,\n    \"infinite\": false,\n    \"orientation\": \"orthogonal\",\n    \"renderorder\": \"right-down\",\n    \"tileheight\": 32,\n    \"tilewidth\": 32,\n    \"type\": \"map\",\n    \"width\": 20,\n    \"nextlayerid\": 18,\n    \"nextobjectid\": 1,\n    \"properties\": [\n        {\n            \"name\": \"mapTitle\",\n            \"type\": \"string\",\n            \"value\": \"Bots Forest - House 1-0\"\n        }\n    ],\n    \"tilesets\": [\n        {\n            \"columns\": 14,\n            \"firstgid\": 1,\n            \"image\": \"reldens-bots-forest-house-01-n0.png\",\n            \"imageheight\": 442,\n            \"imagewidth\": 476,\n            \"margin\": 1,\n            \"name\": \"reldens-bots-forest-house-01-n0\",\n            \"spacing\": 2,\n            \"tilecount\": 169,\n            \"tileheight\": 32,\n            \"tilewidth\": 32,\n            \"tiles\": [\n                {\n                    \"id\": 1,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 2,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 3,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 4,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 5,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 6,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 7,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 8,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 9,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-top-left\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 1\n                        }\n                    ]\n                },\n                {\n                    \"id\": 10,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-top\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 1\n                        }\n                    ]\n                },\n                {\n                    \"id\": 11,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-top-right\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 1\n                        }\n                    ]\n                },\n                {\n                    \"id\": 12,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-top-left\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 2\n                        }\n                    ]\n                },\n                {\n                    \"id\": 13,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-top\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 2\n                        }\n                    ]\n                },\n                {\n                    \"id\": 14,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-top-right\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 2\n                        }\n                    ]\n                },\n                {\n                    \"id\": 15,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-middle-left\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 1\n                        }\n                    ]\n                },\n                {\n                    \"id\": 16,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-center\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 1\n                        }\n                    ]\n                },\n                {\n                    \"id\": 17,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-middle-right\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 1\n                        }\n                    ]\n                },\n                {\n                    \"id\": 18,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-middle-left\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 2\n                        }\n                    ]\n                },\n                {\n                    \"id\": 19,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-center\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 2\n                        }\n                    ]\n                },\n                {\n                    \"id\": 20,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-middle-right\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 2\n                        }\n                    ]\n                },\n                {\n                    \"id\": 21,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 22,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"groundTile\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 23,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-bottom-left\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 1\n                        }\n                    ]\n                },\n                {\n                    \"id\": 24,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-bottom-center\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 1\n                        }\n                    ]\n                },\n                {\n                    \"id\": 25,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-down-right\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 1\n                        }\n                    ]\n                },\n                {\n                    \"id\": 26,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-bottom-left\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 2\n                        }\n                    ]\n                },\n                {\n                    \"id\": 27,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-bottom-center\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 2\n                        }\n                    ]\n                },\n                {\n                    \"id\": 28,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"wall-down-right\"\n                        },\n                        {\n                            \"name\": \"variation\",\n                            \"type\": \"int\",\n                            \"value\": 2\n                        }\n                    ]\n                },\n                {\n                    \"id\": 49,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"border-bottom-right\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 50,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"border-bottom-left\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 51,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"border-bottom\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 52,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"border-top-right\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 53,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"border-right\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 54,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"border-top-left\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 55,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"border-left\"\n                        }\n                    ]\n                },\n                {\n                    \"id\": 56,\n                    \"properties\": [\n                        {\n                            \"name\": \"key\",\n                            \"type\": \"string\",\n                            \"value\": \"border-top\"\n                        }\n                    ]\n                }\n            ]\n        }\n    ],\n    \"layers\":[\n        {\n            \"id\":1,\n            \"data\":[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"ground\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 2,\n            \"data\":[55,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,53,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,51,0,0,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,50],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"collisions-map-border\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 3,\n            \"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],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"path\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0,\n            \"properties\": []\n        },\n        {\n            \"id\": 0,\n            \"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,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"return-to-main-map-change-points\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0,\n            \"properties\": [\n                {\n                    \"name\": \"change-point-for-bots-forest\",\n                    \"type\": \"int\",\n                    \"value\": 381\n                },\n                {\n                    \"name\": \"return-point-for-bots-forest\",\n                    \"type\": \"int\",\n                    \"value\": 361\n                },\n                {\n                    \"name\": \"return-point-x-bots-forest\",\n                    \"type\": \"int\",\n                    \"value\": 1\n                },\n                {\n                    \"name\": \"return-point-y-bots-forest\",\n                    \"type\": \"int\",\n                    \"value\": 18\n                },\n                {\n                    \"name\": \"return-point-position-bots-forest\",\n                    \"type\": \"string\",\n                    \"value\": \"up\"\n                },\n                {\n                    \"name\": \"return-point-isDefault-bots-forest\",\n                    \"type\": \"bool\",\n                    \"value\": true\n                },\n                {\n                    \"name\": \"change-point-for-bots-forest\",\n                    \"type\": \"int\",\n                    \"value\": 382\n                }\n            ]\n        },\n        {\n            \"id\": 39,\n            \"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,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-01-base\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0,\n            \"properties\": [\n                {\n                    \"name\": \"quantity\",\n                    \"type\": \"int\",\n                    \"value\": 1\n                }\n            ]\n        },\n        {\n            \"id\": 40,\n            \"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,24,25,25,25,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,89,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,122,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-01-collisions\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 41,\n            \"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,123,0,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-01-over-player\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 42,\n            \"data\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,69,69,69,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,11,11,11,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,17,17,17,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-01-collisions-over-player\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 43,\n            \"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,75,76,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,81,82,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-01-over-player-2\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 44,\n            \"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,35,36,66,35,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,41,78,40,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-01-over-player-3\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 45,\n            \"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,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-02-base\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0,\n            \"properties\": [\n                {\n                    \"name\": \"quantity\",\n                    \"type\": \"int\",\n                    \"value\": 1\n                }\n            ]\n        },\n        {\n            \"id\": 46,\n            \"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,42,43,44,25,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,59,60,86,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,159,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,162,117,118,118,119,0,0,0,0,0,0,0,0,0,0,0,0,0,160,161,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-02-collisions\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 47,\n            \"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,68,69,69,69,69,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,11,11,11,11,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,17,17,17,17,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,103,104,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-02-collisions-over-player\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 48,\n            \"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,32,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,38,39,73,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-02-collisions-over-player-2\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 49,\n            \"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,120,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-03-collisions\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        },\n        {\n            \"id\": 50,\n            \"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,99,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,108,96,0,97,108,96,0,0,0,0,0,0,0,0,0,0,0,0,0,106,98,105,0,106,98,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,0,0,0,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,108,96,0,97,108,96,0,0,0,0,0,0,0,0,0,0,0,0,0,106,98,105,0,106,98,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,0,0,0,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-03-base\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0,\n            \"properties\": [\n                {\n                    \"name\": \"quantity\",\n                    \"type\": \"int\",\n                    \"value\": 1\n                }\n            ]\n        },\n        {\n            \"id\": 51,\n            \"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,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\n            \"height\": 20,\n            \"width\": 20,\n            \"name\": \"room-03-over-player\",\n            \"type\": \"tilelayer\",\n            \"visible\": true,\n            \"opacity\": 1,\n            \"x\": 0,\n            \"y\": 0\n        }\n    ]\n}"
  },
  {
    "path": "theme/default/assets/maps/reldens-bots-forest.json",
    "content": "{ \"backgroundcolor\":\"#000000\",\n \"compressionlevel\":0,\n \"height\":145,\n \"infinite\":false,\n \"layers\":[\n        {\n         \"data\":[124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124],\n         \"height\":145,\n         \"id\":1,\n         \"name\":\"ground-respawn-area\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124,\n            124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124],\n         \"height\":145,\n         \"id\":2,\n         \"name\":\"collisions-map-border\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 135,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 141, 125,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 138, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 135, 141, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 135, 135, 135, 135, 141, 125, 138, 130, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 141, 125, 125, 125, 125, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 138, 130, 130, 130, 130, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 138, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 141, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 141, 125, 138, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 141, 125, 138, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 138, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 141, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 138, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 135, 135, 135, 141, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 125, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 138, 130, 130, 130, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 141, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 141, 125, 138, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 138, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 141, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 138, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 141, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 138, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 141, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 138, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 135, 135, 135, 135, 141, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 125, 125, 125, 125, 125, 125, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 130, 130, 130, 130, 130, 130, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":3,\n         \"name\":\"path\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"return-point-for-bots-forest-house-01-n0\",\n                 \"type\":\"int\",\n                 \"value\":20494\n                }, \n                {\n                 \"name\":\"return-point-for-default-bots-forest\",\n                 \"type\":\"int\",\n                 \"value\":4348\n                }, \n                {\n                 \"name\":\"return-point-position-bots-forest\",\n                 \"type\":\"string\",\n                 \"value\":\"down\"\n                }, \n                {\n                 \"name\":\"return-point-position-bots-forest-house-01-n0\",\n                 \"type\":\"string\",\n                 \"value\":\"down\"\n                }, \n                {\n                 \"name\":\"return-point-x-bots-forest\",\n                 \"type\":\"int\",\n                 \"value\":143\n                }, \n                {\n                 \"name\":\"return-point-x-bots-forest-house-01-n0\",\n                 \"type\":\"int\",\n                 \"value\":49\n                }, \n                {\n                 \"name\":\"return-point-y-bots-forest\",\n                 \"type\":\"int\",\n                 \"value\":29\n                }, \n                {\n                 \"name\":\"return-point-y-bots-forest-house-01-n0\",\n                 \"type\":\"int\",\n                 \"value\":141\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 56, 0, 53, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 31, 0, 0, 0, 0, 33, 0, 53, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 67,\n            0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0,\n            0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 53, 0, 0, 0, 0, 0, 51, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,\n            0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 49, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 34, 56, 0, 0, 47, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 47, 0, 0, 0, 48, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 34, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 31, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 53, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 54, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 82, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 52, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 56, 0, 0, 32, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 31, 0, 50, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 47, 0, 0, 33, 0, 0, 83, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 53, 48, 0, 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, 33, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 83, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 31, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 49, 49, 54, 83, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 56, 0, 0, 0, 0, 0, 0, 53, 0, 51, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 82, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 47, 0, 0, 0, 0, 51, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 54, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 55, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 54, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 47, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 55, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 47, 32, 82, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 50, 52, 0, 0, 0, 0, 0, 0, 0, 49, 55, 0, 0, 0, 31, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 0, 0, 82, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 52, 0, 50, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 30, 0, 0, 0, 0, 50, 0, 47, 0, 55, 0, 0, 0, 82, 0, 49, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,\n            0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 54, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            53, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 67, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 47, 0, 0, 0, 0, 55,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 47, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 50, 0, 0, 0, 32, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 34, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 83, 51, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0,\n            0, 0, 0, 32, 0, 54, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 33, 53, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 49, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 31, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0,\n            0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 30, 0, 82, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 47, 47, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 30, 0, 67, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 52, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 48, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 53, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 33, 0, 0, 0, 67, 0, 0, 0, 0, 0, 48, 82, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 52, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0,\n            50, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 54, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 82, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 55, 0, 0, 31, 0, 52, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 53, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 32, 0, 0, 82, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0,\n            0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 34, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 56, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 52,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 56, 0,\n            0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 34, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 67, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 52, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 56, 0, 0, 0, 0, 0, 0, 0, 30,\n            54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 48, 0, 0, 67, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 67, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 53, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 55, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 50, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 52, 0, 51, 0, 0, 31, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 50, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 48, 34, 0, 0, 0, 50, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 31, 0, 0, 32, 32, 0, 0, 48, 0, 0, 0, 0, 56, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 55, 0, 30, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 30, 48, 52, 30, 56, 0, 0, 52, 53, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 54, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 82, 0, 0, 0, 0, 0, 0, 47, 49, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 32, 32, 0, 0, 49, 33, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 48, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 53, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 54, 30, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 34, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 32, 0, 0, 34, 0, 0, 0, 0, 0, 0, 54, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 47, 0, 0, 0, 0, 0, 0, 30, 0, 0, 67, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 31, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 53, 0, 0, 0, 83, 54, 0, 53, 0, 0, 0, 0, 0,\n            0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 52, 0, 0, 0, 55, 48, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 49, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 30, 0, 0, 0, 34, 0, 0, 0, 0, 0, 54, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 82, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 53, 31, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 34, 83, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 51, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 82, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0,\n            0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 30, 0, 0, 0, 0, 0, 0, 82, 0, 0, 47, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 67, 0, 0, 0, 0, 0, 0, 54, 83, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 50, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 67, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0,\n            48, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 52, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 56, 48, 0, 0, 0, 0, 0, 0, 54, 31, 0, 83, 0, 0, 50, 0, 0, 0, 0, 48, 0, 49, 0, 0, 47, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 33, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 56, 0, 0, 0, 0, 50, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 47, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 82, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 51, 0, 52, 0, 0, 0,\n            0, 0, 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, 31, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 53, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 50, 83, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 32, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 82, 0, 0, 0, 0, 0, 0, 52, 0, 34, 0, 0, 0, 0, 0, 67, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 34, 0, 0, 48, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 67, 48, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 52, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 48, 0, 0, 33, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 51,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 51, 0, 83, 0, 0, 0, 34, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 55, 0, 0, 0, 0, 0, 0, 0, 31,\n            0, 54, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 51, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 34, 0, 0, 0, 0,\n            0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 51, 0, 0, 0, 49, 0, 0, 0, 53, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 30, 0, 0, 0, 0, 51, 0, 50, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 47, 0, 0, 0, 0, 47, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 82, 49, 0, 0, 0, 0, 49, 0, 0,\n            0, 0, 0, 82, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 30, 0, 0, 0, 0, 32, 0, 49, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 34, 52, 82, 0, 0, 0, 0, 0, 0, 32, 0, 51, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 31, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 82, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 51, 0, 0, 32, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 49, 33, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 34, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 82, 0, 0, 47, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 48, 0, 30, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 30, 51, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 34, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 48, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 67, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 50, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 67, 0, 0, 0, 0, 32, 0, 0, 0, 54, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 54, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 48, 0, 32, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 49, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 53, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 33, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 82, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 33, 0, 0, 0, 0,\n            54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 67, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0,\n            67, 0, 0, 0, 50, 34, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 51, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 51, 55, 0, 0, 0, 53, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 32, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 82, 0, 0, 0, 0, 0, 0, 67, 0, 56, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 82, 0, 0, 51, 47, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 48, 0, 0, 0,\n            0, 0, 0, 50, 0, 0, 0, 49, 0, 0, 0, 55, 51, 54, 0, 53, 0, 67, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 51, 0, 0, 34, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 54,\n            0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 33, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 54, 0, 0, 54, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 83, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0,\n            0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 55, 0, 0, 0, 33, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 34, 0, 0,\n            0, 54, 0, 0, 54, 0, 0, 0, 0, 0, 51, 0, 0, 51, 0, 0, 0, 0, 33, 51, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 83, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 51, 0, 0, 0, 0, 82, 0, 0, 0, 32, 0, 34, 0, 0, 0, 0, 0, 0,\n            32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 83, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 33, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0,\n            0, 0, 0, 53, 0, 0, 56, 55, 0, 0, 0, 33, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 83, 0, 0, 0, 0, 50, 0, 0, 0, 0, 52, 55, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, 53, 0, 32, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 31, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 55, 34, 0, 51, 49, 0, 0, 34, 0, 0, 56, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0,\n            0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 55, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 48, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 82, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 55, 54, 0, 0, 0,\n            52, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 83, 0, 48, 0, 50, 0, 0, 0, 34, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 48, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 49, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 82, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 31, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 33, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 34, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 48, 51, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 83,\n            0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 31, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 30, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 48, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 51, 31, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 49, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 31, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 83, 0, 0, 0, 0, 32, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 49, 0, 83, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 52, 0, 0, 49, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 83, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 48, 0, 0, 0, 0, 32, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 55, 0, 0, 0, 0, 0, 33, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 83, 0, 0, 0, 33, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 67, 0, 56, 0, 47, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 56, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 54, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 47, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 34, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 48, 0, 0, 0, 0, 0, 0, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0,\n            32, 0, 0, 52, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 67, 0, 34, 0, 0, 0, 0, 0, 0, 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, 34, 0, 0, 0, 0, 0, 83, 55, 55, 50, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 53, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 30, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 33, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 48, 0, 0, 0, 0, 0, 33, 0, 83, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,\n            0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 56, 31, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 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, 52, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 50, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 48, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 67, 0,\n            0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 55, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 50, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 82, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 31, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 82, 0,\n            0, 0, 0, 0, 52, 0, 0, 0, 0, 51, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 30, 0, 0,\n            0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 49, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 51, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0,\n            0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 48, 0, 50, 0, 48, 0, 0, 0, 0, 48, 31, 0, 0, 0, 0, 0, 67, 50, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 53, 30, 0, 0, 0, 0, 0, 0, 48, 0, 0, 54, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 47, 0, 67, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 82, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 48, 0, 0, 83, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 55, 0, 0, 0, 0,\n            55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 56, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 51, 47, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0,\n            0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0,\n            0, 34, 67, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 56, 47, 83, 0, 0, 0, 0, 0, 0, 0, 30, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 51, 0, 0, 56, 0, 0, 54, 0, 49, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 51, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 54, 0, 0, 48, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 33, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 0, 53, 0, 0, 54, 0, 0, 0, 0, 0, 0, 53, 33, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 53, 0, 0, 51, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 56, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 0, 67, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 33, 0, 67, 0, 0, 0, 52, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 52, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 50, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 33, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":4,\n         \"name\":\"ground-variations\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":4,\n         \"name\":\"root-01-base\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"quantity\",\n                 \"type\":\"int\",\n                 \"value\":3\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":5,\n         \"name\":\"root-01-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":6,\n         \"name\":\"root-02-collisions\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"quantity\",\n                 \"type\":\"int\",\n                 \"value\":2\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":7,\n         \"name\":\"root-02-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":8,\n         \"name\":\"tree-01-base\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"quantity\",\n                 \"type\":\"int\",\n                 \"value\":12\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":9,\n         \"name\":\"tree-01-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":10,\n         \"name\":\"tree-01-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":11,\n         \"name\":\"tree-02-base\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"quantity\",\n                 \"type\":\"int\",\n                 \"value\":10\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":12,\n         \"name\":\"tree-02-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 20, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 35, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 57, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":13,\n         \"name\":\"tree-02-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":14,\n         \"name\":\"tree-03-collisions\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"quantity\",\n                 \"type\":\"int\",\n                 \"value\":4\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 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, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":15,\n         \"name\":\"tree-03-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":16,\n         \"name\":\"tree-04-base\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"quantity\",\n                 \"type\":\"int\",\n                 \"value\":10\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":17,\n         \"name\":\"tree-04-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":18,\n         \"name\":\"tree-04-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":19,\n         \"name\":\"tree-05-collisions\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"quantity\",\n                 \"type\":\"int\",\n                 \"value\":20\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":20,\n         \"name\":\"tree-05-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":22,\n         \"name\":\"house-01-return-point\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"position\",\n                 \"type\":\"string\",\n                 \"value\":\"down\"\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":23,\n         \"name\":\"house-01-change-points\",\n         \"opacity\":1,\n         \"properties\":[\n                {\n                 \"name\":\"blockMapBorder\",\n                 \"type\":\"bool\",\n                 \"value\":true\n                }, \n                {\n                 \"name\":\"change-point-for-bots-forest-house-01-n0\",\n                 \"type\":\"int\",\n                 \"value\":20349\n                }, \n                {\n                 \"name\":\"compositeFileNames\",\n                 \"type\":\"string\",\n                 \"value\":\"house-composite\"\n                }, \n                {\n                 \"name\":\"elementTitle\",\n                 \"type\":\"string\",\n                 \"value\":\"House 1\"\n                }, \n                {\n                 \"name\":\"entryPosition\",\n                 \"type\":\"string\",\n                 \"value\":\"down-left\"\n                }, \n                {\n                 \"name\":\"entryPositionSize\",\n                 \"type\":\"int\",\n                 \"value\":2\n                }, \n                {\n                 \"name\":\"upperFloors\",\n                 \"type\":\"int\",\n                 \"value\":0\n                }],\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":24,\n         \"name\":\"house-01-shadow\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 178, 0, 180, 181, 176, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":25,\n         \"name\":\"house-01-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, 183, 184, 185, 186, 187, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 190, 191, 192, 193, 194, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 197, 198, 199, 200, 201, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 144, 143, 144, 145, 146, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 150, 149, 150, 151, 152, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 164, 165, 166, 167, 162, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":26,\n         \"name\":\"house-01-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 155, 156, 157, 158, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 169, 170, 171, 172, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":27,\n         \"name\":\"house-01-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 242, 242, 242, 242, 242, 242, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 242, 242, 242, 242, 0, 242, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":28,\n         \"name\":\"square-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 242, 242, 0, 0, 242, 242, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 242, 242, 242, 242, 242, 242, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":145,\n         \"id\":29,\n         \"name\":\"square-02-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":145,\n         \"x\":0,\n         \"y\":0\n        }],\n \"nextlayerid\":30,\n \"nextobjectid\":1,\n \"orientation\":\"orthogonal\",\n \"properties\":[\n        {\n         \"name\":\"mapTitle\",\n         \"type\":\"string\",\n         \"value\":\"Bots Forest\"\n        }],\n \"renderorder\":\"right-down\",\n \"tiledversion\":\"1.11.0\",\n \"tileheight\":32,\n \"tilesets\":[\n        {\n         \"columns\":17,\n         \"firstgid\":1,\n         \"image\":\"reldens-bots-forest.png\",\n         \"imageheight\":544,\n         \"imagewidth\":578,\n         \"margin\":1,\n         \"name\":\"reldens-bots-forest\",\n         \"spacing\":2,\n         \"tilecount\":272,\n         \"tileheight\":32,\n         \"tiles\":[\n                {\n                 \"id\":123,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"groundTile\"\n                        }]\n                }, \n                {\n                 \"id\":124,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"pathTile\"\n                        }]\n                }, \n                {\n                 \"id\":125,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"top-left\"\n                        }]\n                }, \n                {\n                 \"id\":127,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"middle-right\"\n                        }]\n                }, \n                {\n                 \"id\":128,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"top-right\"\n                        }]\n                }, \n                {\n                 \"id\":129,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"bottom-center\"\n                        }]\n                }, \n                {\n                 \"id\":130,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"bottom-left\"\n                        }]\n                }, \n                {\n                 \"id\":131,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"bottom-right\"\n                        }]\n                }, \n                {\n                 \"id\":134,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"top-center\"\n                        }]\n                }, \n                {\n                 \"id\":136,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"middle-left\"\n                        }]\n                }, \n                {\n                 \"id\":137,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"corner-bottom-right\"\n                        }]\n                }, \n                {\n                 \"id\":138,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"corner-bottom-left\"\n                        }]\n                }, \n                {\n                 \"id\":139,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"corner-top-right\"\n                        }]\n                }, \n                {\n                 \"id\":140,\n                 \"properties\":[\n                        {\n                         \"name\":\"key\",\n                         \"type\":\"string\",\n                         \"value\":\"corner-top-left\"\n                        }]\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":202\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":204\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":206\n                        }],\n                 \"id\":202\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":203\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":205\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":207\n                        }],\n                 \"id\":203\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":208\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":210\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":212\n                        }],\n                 \"id\":208\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":209\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":211\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":213\n                        }],\n                 \"id\":209\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":214\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":217\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":220\n                        }],\n                 \"id\":214\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":215\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":218\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":221\n                        }],\n                 \"id\":215\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":216\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":219\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":222\n                        }],\n                 \"id\":216\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":223\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":226\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":229\n                        }],\n                 \"id\":223\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":224\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":227\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":230\n                        }],\n                 \"id\":224\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":225\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":228\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":231\n                        }],\n                 \"id\":225\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":232\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":235\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":238\n                        }],\n                 \"id\":232\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":233\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":236\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":239\n                        }],\n                 \"id\":233\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":234\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":237\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":240\n                        }],\n                 \"id\":234\n                }],\n         \"tilewidth\":32\n        }],\n \"tilewidth\":32,\n \"type\":\"map\",\n \"version\":\"1.10\",\n \"width\":145\n}"
  },
  {
    "path": "theme/default/assets/maps/reldens-bots.json",
    "content": "{ \"backgroundcolor\":\"#000000\",\n \"compressionlevel\":0,\n \"height\":28,\n \"infinite\":false,\n \"layers\":[\n        {\n         \"data\":[111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, 0, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 0, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 114, 111, 111, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 115, 111, 113, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 113, 113, 113, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 113, 113, 111, 111, 111, 112, 0, 0, 112, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 111, 111, 111, 111, 112, 0, 0, 112, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 0, 111, 111, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":70,\n         \"name\":\"pathfinder\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"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, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":72,\n         \"name\":\"respawn-area-monsters-lvl-1-2\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"data\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 114, 111, 111, 111, 111, 111, 111, 111, 111, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 115, 111, 113, 111, 111, 111, 111, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 113, 113, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 113, 111, 111, 111, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 111, 111, 111, 111, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111],\n         \"height\":28,\n         \"id\":50,\n         \"name\":\"ground\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"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, 14, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 0, 14, 0, 0, 0, 0, 14, 15, 15, 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, 15, 0, 0, 0, 0, 0, 15, 16, 15, 17, 17, 17, 16, 15, 14, 15, 0, 15, 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, 16, 13, 0, 16, 14, 0, 0, 17, 16, 17, 14, 14, 17, 16, 16, 16, 17, 17, 16, 17, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 14, 14, 16, 14, 15, 16, 15, 14, 16, 16, 14, 16, 16, 16, 15, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 15, 16, 16, 14, 16, 17, 15, 16, 17, 15, 14, 16, 14, 15, 16, 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, 16, 17, 15, 16, 17, 16, 14, 17, 17, 16, 14, 15, 14, 17, 15, 0, 14, 16, 0, 0, 0, 0, 108, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 17, 0, 0, 0, 15, 15, 17, 14, 15, 14, 15, 17, 0, 15, 16, 17, 14, 14, 16, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 16, 0, 0, 0, 10, 17, 14, 17, 17, 15, 14, 15, 16, 0, 15, 14, 16, 0, 15, 16, 16, 0, 0, 0, 14, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 15, 17, 17, 15, 17, 0, 0, 0, 0, 16, 17, 16, 17, 15, 14, 0, 0, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 15, 16, 14, 15, 15, 14, 0, 0, 0, 15, 17, 15, 15, 16, 14, 0, 0, 0, 15, 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, 16, 0, 0, 0, 0, 15, 14, 14, 15, 0, 16, 17, 0, 15, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 17, 14, 0, 16, 0, 14, 17, 15, 14, 0, 16, 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, 30, 29, 0, 16, 17, 0, 15, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 21, 18, 19, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 20, 20, 19, 21, 18, 21, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 18, 20, 19, 18, 19, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 20, 20, 19, 21, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 17, 0, 0, 0, 0, 14, 14, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 0, 14, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 17, 16, 0, 0, 16, 16, 15, 14, 17, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 10, 15, 0, 11, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 16, 17, 16, 16, 0, 17, 17, 17, 17, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 15, 14, 16, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":51,\n         \"name\":\"ground-variations\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"data\":[110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 3, 4, 5, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, 93, 0, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 102, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":52,\n         \"name\":\"ground-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"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, 128, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 116, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 116, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 116, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 116, 138, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 117, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 0, 0, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129],\n         \"height\":28,\n         \"id\":68,\n         \"name\":\"river-animations-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"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, 72, 73, 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":53,\n         \"name\":\"bridge\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"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, 94, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":66,\n         \"name\":\"change-points\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"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, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":56,\n         \"name\":\"forest-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"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, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 86, 86, 86, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 97, 75, 76, 76, 76, 77, 98, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 88, 89, 89, 89, 90, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 88, 89, 89, 89, 90, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 88, 89, 89, 89, 90, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":57,\n         \"name\":\"trees-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"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, 69, 70, 71, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":73,\n         \"name\":\"objects-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        },\n        {\n         \"data\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 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, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 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, 42, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 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, 42, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":58,\n         \"name\":\"over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }],\n \"nextlayerid\":74,\n \"nextobjectid\":1,\n \"orientation\":\"orthogonal\",\n \"renderorder\":\"right-down\",\n \"tiledversion\":\"1.4.3\",\n \"tileheight\":32,\n \"tilesets\":[\n        {\n         \"columns\":14,\n         \"firstgid\":1,\n         \"image\":\"reldens-forest.png\",\n         \"imageheight\":408,\n         \"imagewidth\":476,\n         \"margin\":1,\n         \"name\":\"reldens-forest\",\n         \"spacing\":2,\n         \"tilecount\":168,\n         \"tileheight\":32,\n         \"tiles\":[\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":115\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":117\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":119\n                        }],\n                 \"id\":115\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":116\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":118\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":120\n                        }],\n                 \"id\":116\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":121\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":123\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":125\n                        }],\n                 \"id\":121\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":122\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":124\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":126\n                        }],\n                 \"id\":122\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":127\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":130\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":133\n                        }],\n                 \"id\":127\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":128\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":131\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":134\n                        }],\n                 \"id\":128\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":129\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":132\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":135\n                        }],\n                 \"id\":129\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":136\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":139\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":142\n                        }],\n                 \"id\":136\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":137\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":140\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":143\n                        }],\n                 \"id\":137\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":138\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":141\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":144\n                        }],\n                 \"id\":138\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":145\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":148\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":151\n                        }],\n                 \"id\":145\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":146\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":149\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":152\n                        }],\n                 \"id\":146\n                },\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":147\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":150\n                        },\n                        {\n                         \"duration\":200,\n                         \"tileid\":153\n                        }],\n                 \"id\":147\n                }],\n         \"tilewidth\":32\n        }],\n \"tilewidth\":32,\n \"type\":\"map\",\n \"version\":1.4,\n \"width\":48\n}\n"
  },
  {
    "path": "theme/default/assets/maps/reldens-forest.json",
    "content": "{ \"backgroundcolor\":\"#000000\",\n \"compressionlevel\":0,\n \"editorsettings\":\n    {\n     \"export\":\n        {\n         \"format\":\"json\",\n         \"target\":\"reldens-forest.json\"\n        }\n    },\n \"height\":28,\n \"infinite\":false,\n \"layers\":[\n        {\n         \"data\":[111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, 0, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 0, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 114, 111, 111, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 115, 111, 113, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 113, 113, 113, 111, 111, 0, 0, 0, 0, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 113, 113, 111, 111, 111, 112, 0, 0, 112, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 111, 111, 111, 111, 112, 0, 0, 112, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 0, 111, 111, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":70,\n         \"name\":\"pathfinder\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":72,\n         \"name\":\"respawn-area-monsters-lvl-1-2\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 114, 111, 111, 111, 111, 111, 111, 111, 111, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 115, 111, 113, 111, 111, 111, 111, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 113, 113, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 113, 111, 111, 111, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 113, 111, 111, 111, 111, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111],\n         \"height\":28,\n         \"id\":50,\n         \"name\":\"ground\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 14, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 0, 14, 0, 0, 0, 0, 14, 15, 15, 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, 15, 0, 0, 0, 0, 0, 15, 16, 15, 17, 17, 17, 16, 15, 14, 15, 0, 15, 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, 16, 13, 0, 16, 14, 0, 0, 17, 16, 17, 14, 14, 17, 16, 16, 16, 17, 17, 16, 17, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 14, 14, 16, 14, 15, 16, 15, 14, 16, 16, 14, 16, 16, 16, 15, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 15, 16, 16, 14, 16, 17, 15, 16, 17, 15, 14, 16, 14, 15, 16, 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, 16, 17, 15, 16, 17, 16, 14, 17, 17, 16, 14, 15, 14, 17, 15, 0, 14, 16, 0, 0, 0, 0, 108, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 17, 0, 0, 0, 15, 15, 17, 14, 15, 14, 15, 17, 0, 15, 16, 17, 14, 14, 16, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 16, 0, 0, 0, 10, 17, 14, 17, 17, 15, 14, 15, 16, 0, 15, 14, 16, 0, 15, 16, 16, 0, 0, 0, 14, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 15, 17, 17, 15, 17, 0, 0, 0, 0, 16, 17, 16, 17, 15, 14, 0, 0, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 15, 16, 14, 15, 15, 14, 0, 0, 0, 15, 17, 15, 15, 16, 14, 0, 0, 0, 15, 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, 16, 0, 0, 0, 0, 15, 14, 14, 15, 0, 16, 17, 0, 15, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 17, 14, 0, 16, 0, 14, 17, 15, 14, 0, 16, 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, 30, 29, 0, 16, 17, 0, 15, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 21, 18, 19, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 20, 20, 19, 21, 18, 21, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 18, 20, 19, 18, 19, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 20, 20, 19, 21, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 17, 0, 0, 0, 0, 14, 14, 0, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 0, 14, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 17, 16, 0, 0, 16, 16, 15, 14, 17, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 10, 15, 0, 11, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 16, 17, 16, 16, 0, 17, 17, 17, 17, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 15, 14, 16, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":51,\n         \"name\":\"ground-variations\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 3, 4, 5, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 92, 93, 0, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 102, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 106, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":52,\n         \"name\":\"ground-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 128, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 116, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 116, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 116, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 116, 138, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 123, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 138, 138, 117, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 0, 0, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129],\n         \"height\":28,\n         \"id\":68,\n         \"name\":\"river-animations-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 72, 73, 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":53,\n         \"name\":\"bridge\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 94, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":66,\n         \"name\":\"change-points\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":56,\n         \"name\":\"forest-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 86, 86, 86, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 97, 75, 76, 76, 76, 77, 98, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 88, 89, 89, 89, 90, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 88, 89, 89, 89, 90, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 104, 88, 89, 89, 89, 90, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":57,\n         \"name\":\"trees-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 69, 70, 71, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":73,\n         \"name\":\"objects-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, 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, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 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, 42, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 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, 42, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":58,\n         \"name\":\"over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }],\n \"nextlayerid\":74,\n \"nextobjectid\":1,\n \"orientation\":\"orthogonal\",\n \"renderorder\":\"right-down\",\n \"tiledversion\":\"1.4.3\",\n \"tileheight\":32,\n \"tilesets\":[\n        {\n         \"columns\":14,\n         \"firstgid\":1,\n         \"image\":\"reldens-forest.png\",\n         \"imageheight\":408,\n         \"imagewidth\":476,\n         \"margin\":1,\n         \"name\":\"reldens-forest\",\n         \"spacing\":2,\n         \"tilecount\":168,\n         \"tileheight\":32,\n         \"tiles\":[\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":115\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":117\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":119\n                        }],\n                 \"id\":115\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":116\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":118\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":120\n                        }],\n                 \"id\":116\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":121\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":123\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":125\n                        }],\n                 \"id\":121\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":122\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":124\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":126\n                        }],\n                 \"id\":122\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":127\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":130\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":133\n                        }],\n                 \"id\":127\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":128\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":131\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":134\n                        }],\n                 \"id\":128\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":129\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":132\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":135\n                        }],\n                 \"id\":129\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":136\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":139\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":142\n                        }],\n                 \"id\":136\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":137\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":140\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":143\n                        }],\n                 \"id\":137\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":138\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":141\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":144\n                        }],\n                 \"id\":138\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":145\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":148\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":151\n                        }],\n                 \"id\":145\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":146\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":149\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":152\n                        }],\n                 \"id\":146\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":147\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":150\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":153\n                        }],\n                 \"id\":147\n                }],\n         \"tilewidth\":32\n        }],\n \"tilewidth\":32,\n \"type\":\"map\",\n \"version\":1.4,\n \"width\":48\n}"
  },
  {
    "path": "theme/default/assets/maps/reldens-gravity.json",
    "content": "{ \"backgroundcolor\":\"#2294ff\",\n \"compressionlevel\":0,\n \"height\":20,\n \"infinite\":false,\n \"layers\":[\n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0,\n            3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],\n         \"height\":20,\n         \"id\":52,\n         \"name\":\"ground-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":30,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":20,\n         \"id\":66,\n         \"name\":\"change-points\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":30,\n         \"x\":0,\n         \"y\":0\n        }],\n \"nextlayerid\":74,\n \"nextobjectid\":1,\n \"orientation\":\"orthogonal\",\n \"renderorder\":\"right-down\",\n \"tiledversion\":\"1.8.4\",\n \"tileheight\":32,\n \"tilesets\":[\n        {\n         \"columns\":3,\n         \"firstgid\":1,\n         \"image\":\"reldens-gravity.png\",\n         \"imageheight\":32,\n         \"imagewidth\":100,\n         \"margin\":0,\n         \"name\":\"reldens-gravity\",\n         \"spacing\":2,\n         \"tilecount\":3,\n         \"tileheight\":32,\n         \"tilewidth\":32\n        }],\n \"tilewidth\":32,\n \"type\":\"map\",\n \"version\":\"1.8\",\n \"width\":30\n}"
  },
  {
    "path": "theme/default/assets/maps/reldens-house-1-2d-floor.json",
    "content": "{ \"compressionlevel\":0,\n \"editorsettings\":\n    {\n     \"export\":\n        {\n         \"format\":\"json\",\n         \"target\":\"reldens-house-1-2d-floor-nop.json\"\n        }\n    },\n \"height\":26,\n \"infinite\":false,\n \"layers\":[\n        {\n         \"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, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":78,\n         \"name\":\"collisions-background\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":75,\n         \"name\":\"background\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":74,\n         \"name\":\"ground\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":77,\n         \"name\":\"change-points\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 21, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 22, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 19, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 21, 18, 18, 18, 18, 18, 24, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 20, 15, 15, 15, 15, 15, 23, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 21, 18, 24, 0, 20, 15, 15, 15, 15, 15, 23, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 26, 25, 27, 0, 26, 25, 25, 19, 22, 25, 27, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 21, 18, 16, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 23, 0, 0, 0, 0, 0, 0, 0, 0, 20, 17, 18, 18, 16, 15, 15, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 17, 18, 18, 18, 18, 18, 18, 18, 18, 16, 15, 15, 15, 15, 15, 15, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":76,\n         \"name\":\"collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 3, 4, 5, 4, 4, 5, 4, 4, 5, 4, 4, 5, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 8, 8, 9, 8, 8, 9, 8, 8, 9, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 12, 12, 13, 12, 12, 13, 12, 12, 13, 12, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 6, 0, 3, 4, 6, 0, 0, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 10, 0, 7, 8, 10, 0, 0, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 14, 0, 11, 12, 14, 0, 0, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":79,\n         \"name\":\"collisions-walls\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }],\n \"nextlayerid\":80,\n \"nextobjectid\":1,\n \"orientation\":\"orthogonal\",\n \"renderorder\":\"right-down\",\n \"tiledversion\":\"1.4.3\",\n \"tileheight\":32,\n \"tilesets\":[\n        {\n         \"columns\":7,\n         \"firstgid\":1,\n         \"image\":\"reldens-house-1-2d-floor.png\",\n         \"imageheight\":170,\n         \"imagewidth\":238,\n         \"margin\":1,\n         \"name\":\"reldens-house-1-2d-floor\",\n         \"spacing\":2,\n         \"tilecount\":35,\n         \"tileheight\":32,\n         \"tilewidth\":32\n        }],\n \"tilewidth\":32,\n \"type\":\"map\",\n \"version\":1.4,\n \"width\":40\n}"
  },
  {
    "path": "theme/default/assets/maps/reldens-house-1.json",
    "content": "{ \"compressionlevel\":0,\n \"editorsettings\":\n    {\n     \"export\":\n        {\n         \"format\":\"json\",\n         \"target\":\".\"\n        }\n    },\n \"height\":26,\n \"infinite\":false,\n \"layers\":[\n        {\n         \"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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":21,\n         \"name\":\"ground\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 78, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, 81, 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":27,\n         \"name\":\"ground-over\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":22,\n         \"name\":\"change-points\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 31, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 28, 28, 33, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 34, 34, 34, 35, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 28, 0, 0, 28, 28, 28, 28, 28, 28, 28, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":23,\n         \"name\":\"walls-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 4, 5, 5, 6, 5, 5, 5, 6, 5, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 9, 10, 9, 9, 9, 10, 9, 9, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 13, 14, 13, 13, 13, 14, 13, 13, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":26,\n         \"name\":\"walls-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 16, 17, 0, 0, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 0, 40, 38, 39, 41, 42, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 21, 0, 47, 0, 0, 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 75, 36, 0, 54, 0, 0, 55, 56, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 77, 77, 68, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":24,\n         \"name\":\"objects-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 37, 37, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":28,\n         \"name\":\"collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":25,\n         \"name\":\"over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }],\n \"nextlayerid\":29,\n \"nextobjectid\":1,\n \"orientation\":\"orthogonal\",\n \"renderorder\":\"right-down\",\n \"tiledversion\":\"1.4.1\",\n \"tileheight\":32,\n \"tilesets\":[\n        {\n         \"columns\":10,\n         \"firstgid\":1,\n         \"image\":\"reldens-house-1.png\",\n         \"imageheight\":306,\n         \"imagewidth\":340,\n         \"margin\":1,\n         \"name\":\"reldens-house-1\",\n         \"spacing\":2,\n         \"tilecount\":90,\n         \"tileheight\":32,\n         \"tilewidth\":32,\n         \"transparentcolor\":\"#000000\"\n        }],\n \"tilewidth\":32,\n \"type\":\"map\",\n \"version\":1.4,\n \"width\":40\n}"
  },
  {
    "path": "theme/default/assets/maps/reldens-house-2.json",
    "content": "{ \"backgroundcolor\":\"#000000\",\n \"compressionlevel\":-1,\n \"editorsettings\":\n    {\n     \"export\":\n        {\n         \"target\":\".\"\n        }\n    },\n \"height\":26,\n \"infinite\":false,\n \"layers\":[\n        {\n         \"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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":11,\n         \"name\":\"ground\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":16,\n         \"name\":\"stairs\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 3, 4, 5, 4, 4, 4, 4, 4, 5, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 8, 8, 8, 8, 8, 9, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 12, 12, 12, 12, 12, 13, 12, 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, 0, 36, 33, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 40, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 6, 0, 62, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":12,\n         \"name\":\"walls-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 36, 33, 39, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 41, 40, 42, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 33, 39, 0, 55, 0, 57, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 40, 40, 42, 0, 55, 0, 57, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 33, 33, 33, 0, 0, 33, 33, 33, 33, 33, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":18,\n         \"name\":\"walls-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 15, 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 28, 29, 15, 16, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 48, 0, 47, 48, 19, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 74, 75, 27, 0, 0, 0, 0, 24, 25, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 77, 78, 46, 0, 0, 0, 0, 43, 44, 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, 0, 0, 0, 0, 0, 0, 79, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 72, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":13,\n         \"name\":\"objects-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 52, 53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 22, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":19,\n         \"name\":\"objects-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":17,\n         \"name\":\"over-objects-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 50, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":14,\n         \"name\":\"over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":26,\n         \"id\":15,\n         \"name\":\"change-points\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":40,\n         \"x\":0,\n         \"y\":0\n        }],\n \"nextlayerid\":20,\n \"nextobjectid\":1,\n \"orientation\":\"orthogonal\",\n \"renderorder\":\"right-down\",\n \"tiledversion\":\"1.4.1\",\n \"tileheight\":32,\n \"tilesets\":[\n        {\n         \"columns\":10,\n         \"firstgid\":1,\n         \"image\":\"reldens-house-2.png\",\n         \"imageheight\":306,\n         \"imagewidth\":340,\n         \"margin\":1,\n         \"name\":\"reldens-house-2\",\n         \"spacing\":2,\n         \"tilecount\":90,\n         \"tileheight\":32,\n         \"tilewidth\":32,\n         \"transparentcolor\":\"#000000\"\n        }],\n \"tilewidth\":32,\n \"type\":\"map\",\n \"version\":1.4,\n \"width\":40\n}"
  },
  {
    "path": "theme/default/assets/maps/reldens-town.json",
    "content": "{ \"backgroundcolor\":\"#000000\",\n \"compressionlevel\":0,\n \"editorsettings\":\n    {\n     \"export\":\n        {\n         \"target\":\".\"\n        }\n    },\n \"height\":28,\n \"infinite\":false,\n \"layers\":[\n        {\n         \"data\":[116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 85, 85, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 85, 85, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 85, 85, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 85, 85, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 85, 85, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 126, 129, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 126, 129, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 126, 129, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 126, 129, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 126, 121, 121, 121, 121, 121, 129, 116, 126, 129, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 132, 131, 125, 121, 121, 121, 123, 124, 122, 123, 130, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 126, 128, 131, 131, 131, 131, 125, 121, 123, 130, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 126, 129, 116, 116, 116, 116, 132, 121, 121, 123, 124, 124, 124, 124, 130, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 127, 122, 129, 116, 116, 116, 116, 116, 132, 121, 121, 121, 121, 121, 121, 123, 124, 124, 130, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 116, 132, 131, 133, 116, 116, 116, 116, 116, 116, 116, 116, 116, 132, 121, 121, 121, 121, 121, 123, 130, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 119, 116, 116, 116, 116, 116, 116, 116, 116, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 132, 121, 121, 121, 123, 130, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 120, 116, 118, 116, 116, 116, 116, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 132, 121, 121, 123, 130, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 118, 118, 118, 116, 116, 116, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 132, 121, 121, 123, 130, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 118, 118, 116, 116, 116, 117, 117, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 132, 121, 121, 123, 130, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 118, 116, 116, 116, 116, 117, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 132, 121, 121, 121, 121, 121, 121, 121, 121, 124, 124, 130, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 132, 121, 121, 121, 121, 121, 121, 121, 121, 121, 129, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 132, 131, 131, 131, 131, 131, 131, 131, 131, 133, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116],\n         \"height\":28,\n         \"id\":50,\n         \"name\":\"ground\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 90, 90, 0, 0, 39, 36, 0, 39, 37, 0, 0, 0, 0, 0, 0, 53, 52, 50, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 37, 37, 39, 0, 0, 0, 0, 0, 51, 51, 53, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 30, 28, 0, 0, 0, 0, 50, 53, 50, 50, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 112, 0, 0, 39, 37, 36, 37, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 36, 38, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 37, 37, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 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, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 112, 0, 0, 37, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 0, 0, 0, 37, 39, 36, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 26, 0, 0, 0, 0, 28, 38, 37, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 28, 0, 0, 0, 0, 0, 29, 28, 36, 37, 37, 109, 37, 0, 112, 30, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 27, 0, 52, 50, 0, 109, 0, 0, 112, 0, 0, 0, 30, 30, 0, 0, 0, 0, 0, 0, 26, 0, 0, 37, 0, 27, 38, 39, 28, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 52, 0, 0, 0, 0, 52, 52, 50, 50, 52, 51, 0, 0, 0, 0, 0, 30, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 38, 38, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 112, 0, 0, 0, 51, 0, 0, 0, 0, 0, 27, 51, 53, 52, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 0, 0, 0, 0, 29, 0, 51, 53, 50, 50, 0, 0],\n         \"height\":28,\n         \"id\":51,\n         \"name\":\"ground-variations\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[256, 256, 256, 256, 256, 243, 265, 265, 265, 244, 256, 256, 256, 256, 256, 256, 256, 256, 0, 0, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 265, 265, 275, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 0, 0, 274, 275, 0, 0, 273, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 103, 0, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 164, 167, 168, 169, 170, 165, 166, 0, 0, 0, 0, 0, 0, 110, 111, 0, 0, 0, 0, 0, 0, 0, 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, 185, 188, 0, 189, 190, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 236, 0, 233, 234, 233, 234, 0, 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 147, 149, 150, 151, 147, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 153, 155, 0, 157, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":52,\n         \"name\":\"ground-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[256, 256, 256, 256, 256, 243, 265, 265, 265, 244, 256, 256, 256, 256, 256, 256, 256, 256, 0, 0, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 0, 265, 265, 275, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 0, 0, 274, 275, 0, 0, 273, 274, 274, 274, 274, 0, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":68,\n         \"name\":\"river-animations\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":66,\n         \"name\":\"change-points\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":53,\n         \"name\":\"bridge\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 158, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 172, 173, 174, 175, 176, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 192, 193, 194, 195, 196, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205, 206, 207, 208, 209, 210, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 220, 221, 222, 223, 224, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 136, 135, 136, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 142, 141, 142, 143, 144, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 199, 200, 201, 202, 203, 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, 198, 199, 200, 201, 202, 203, 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, 198, 199, 200, 201, 202, 203, 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, 198, 199, 200, 201, 202, 203, 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, 212, 213, 214, 215, 216, 217, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 228, 229, 230, 231, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 137, 138, 135, 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 143, 144, 141, 143, 144, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":54,\n         \"name\":\"house-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 11, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":67,\n         \"name\":\"house-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"data\":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 94, 94, 94, 94, 94, 94, 94, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, 94, 94, 94, 94, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 99, 99, 99, 99, 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 105, 106, 106, 106, 106, 106, 107, 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, 113, 114, 114, 114, 114, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 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, 0, 0, 44, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":56,\n         \"name\":\"forest-collisions\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 55, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 0, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 65, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":57,\n         \"name\":\"trees-collisions-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 48, 0, 0, 76, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 162, 163, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 179, 180, 181, 182, 183, 184, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 54, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 79, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":58,\n         \"name\":\"over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }, \n        {\n         \"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, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n         \"height\":28,\n         \"id\":64,\n         \"name\":\"house-over-player\",\n         \"opacity\":1,\n         \"type\":\"tilelayer\",\n         \"visible\":true,\n         \"width\":48,\n         \"x\":0,\n         \"y\":0\n        }],\n \"nextlayerid\":69,\n \"nextobjectid\":1,\n \"orientation\":\"orthogonal\",\n \"renderorder\":\"right-down\",\n \"tiledversion\":\"1.3.1\",\n \"tileheight\":32,\n \"tilesets\":[\n        {\n         \"columns\":18,\n         \"firstgid\":1,\n         \"image\":\"reldens-town.png\",\n         \"imageheight\":578,\n         \"imagewidth\":612,\n         \"margin\":1,\n         \"name\":\"reldens-town\",\n         \"spacing\":2,\n         \"tilecount\":306,\n         \"tileheight\":32,\n         \"tiles\":[\n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":242\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":244\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":246\n                        }],\n                 \"id\":242\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":243\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":245\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":247\n                        }],\n                 \"id\":243\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":248\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":250\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":252\n                        }],\n                 \"id\":248\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":249\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":251\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":253\n                        }],\n                 \"id\":249\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":254\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":257\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":260\n                        }],\n                 \"id\":254\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":255\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":258\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":261\n                        }],\n                 \"id\":255\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":256\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":259\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":262\n                        }],\n                 \"id\":256\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":263\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":266\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":269\n                        }],\n                 \"id\":263\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":264\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":267\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":270\n                        }],\n                 \"id\":264\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":265\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":268\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":271\n                        }],\n                 \"id\":265\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":272\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":275\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":278\n                        }],\n                 \"id\":272\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":273\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":276\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":279\n                        }],\n                 \"id\":273\n                }, \n                {\n                 \"animation\":[\n                        {\n                         \"duration\":200,\n                         \"tileid\":274\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":277\n                        }, \n                        {\n                         \"duration\":200,\n                         \"tileid\":280\n                        }],\n                 \"id\":274\n                }],\n         \"tilewidth\":32\n        }],\n \"tilewidth\":32,\n \"type\":\"map\",\n \"version\":1.2,\n \"width\":48\n}"
  },
  {
    "path": "theme/default/browserconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n    <msapplication>\n        <tile>\n            <square150x150logo src=\"/assets/favicons/mstile-150x150.png\"/>\n            <TileColor>#000000</TileColor>\n        </tile>\n    </msapplication>\n</browserconfig>\n"
  },
  {
    "path": "theme/default/config.js",
    "content": ""
  },
  {
    "path": "theme/default/css/ads.scss",
    "content": "/**\n *\n * Reldens - Styles - Ads\n *\n */\n\n.ads-banner-container {\n    display: block;\n\n    &.hidden {\n        display: none;\n    }\n}\n\n#sdk__advertisement{\n    z-index: 10001 !important;\n}"
  },
  {
    "path": "theme/default/css/base.scss",
    "content": "/**\r\n *\r\n * Reldens - Styles - Base\r\n *\r\n */\r\n\r\n@use \"variables\" as *;\r\n\r\n* {\r\n    box-sizing: border-box;\r\n}\r\n\r\nbody, html {\r\n    height: 100%;\r\n    margin: 0;\r\n    padding: 0;\r\n}\r\n\r\nbody {\r\n    font-family: $reldensFont;\r\n    background-color: transparent;\r\n\r\n    &.game-engine-started {\r\n        user-select: none;\r\n    }\r\n\r\n    .wrapper {\r\n        display: flex;\r\n        flex-direction: column;\r\n        justify-content: space-between;\r\n        min-height: 100%;\r\n        overflow: auto;\r\n        z-index: 10000;\r\n        background-size: cover;\r\n        background-color: $cDarkBlue;\r\n        background-position: center;\r\n        background-repeat: no-repeat;\r\n\r\n        .header,\r\n        .footer,\r\n        .content {\r\n            width: 100%;\r\n        }\r\n\r\n        .header,\r\n        .footer {\r\n            color: $cWhite;\r\n        }\r\n\r\n        .header {\r\n            display: flex;\r\n            flex-wrap: wrap;\r\n            flex-direction: column;\r\n            align-items: center;\r\n            justify-content: center;\r\n            background: linear-gradient(\r\n                180deg,\r\n                rgba(0,0,0,0) 0%,\r\n                rgba(0,0,0,0.7) 50%,\r\n                rgba(0,0,0,0.7) 50%,\r\n                rgba(0,0,0,0) 100%\r\n            );\r\n            box-sizing: border-box;\r\n            height: fit-content;\r\n            flex-grow: 1;\r\n\r\n            .header-content {\r\n                display: flex;\r\n                flex-direction: row;\r\n                width: 100%;\r\n                max-width: 430px;\r\n                justify-content: center;\r\n                vertical-align: middle;\r\n                flex-wrap: wrap;\r\n                align-items: center;\r\n                flex-grow: 1;\r\n            }\r\n        }\r\n\r\n        .content {\r\n            height: 80%;\r\n            flex-grow: 1;\r\n        }\r\n\r\n        .footer {\r\n            display: flex;\r\n            height: 6%;\r\n            background-color: transparent;\r\n            padding: min(10px, 1%) 0;\r\n            flex-grow: 0;\r\n        }\r\n    }\r\n\r\n    input:focus,\r\n    input:active,\r\n    select:focus,\r\n    select:active {\r\n        outline: none;\r\n    }\r\n\r\n}\r\n\r\n.text-black {\r\n    color: $cBlack;\r\n}\r\n\r\n.hidden {\r\n    display: none;\r\n}\r\n\r\n.hidden-forced {\r\n    display: none !important;\r\n}\r\n\r\n.game-container {\r\n    height: 100%;\r\n}\r\n\r\nbody.game-engine-started {\r\n    overflow: hidden;\r\n\r\n    .wrapper {\r\n        height: 100%;\r\n        justify-content: start;\r\n\r\n        .content {\r\n            height: 94%;\r\n\r\n            .game-container {\r\n                display: flex;\r\n            }\r\n        }\r\n\r\n        .footer {\r\n            display: none;\r\n        }\r\n    }\r\n\r\n    &.full-screen-on {\r\n        .wrapper {\r\n            .header {\r\n                display: none;\r\n            }\r\n\r\n            .content {\r\n                height: 100%;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n.header {\r\n    #your-logo {\r\n        margin: 1rem 0;\r\n    }\r\n\r\n    h1 {\r\n        position: relative;\r\n        display: block;\r\n        margin: 0 0 0 2%;\r\n        padding: 0;\r\n        font-size: 1.5em;\r\n        box-sizing: border-box;\r\n\r\n        strong {\r\n            color: $cReldens;\r\n            font-weight: bold;\r\n        }\r\n\r\n    }\r\n\r\n    @media (max-height: 390px) {\r\n\r\n        h1 {\r\n            font-size: 1em;\r\n            padding-top: 0.2em;\r\n        }\r\n\r\n    }\r\n}\r\n\r\n.footer {\r\n    background: linear-gradient(90deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0.7) 20%, rgba(0,0,0,0.7) 80%, rgba(0,0,0,0) 100%);\r\n\r\n    .copyright {\r\n        position: relative;\r\n        display: block;\r\n        width: 100%;\r\n        margin: 0;\r\n        padding: 0;\r\n        text-align: center;\r\n\r\n        a, a:hover, a:visited {\r\n            display: block;\r\n            color: #fff;\r\n            text-decoration: none;\r\n            padding: 0;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n\r\n.content {\r\n    min-height: 300px;\r\n\r\n    .forms-container {\r\n        display: flex;\r\n        flex-direction: row;\r\n        height: 100%;\r\n        width: 100%;\r\n        max-width: $containerMaxWidth;\r\n        margin: 0 auto;\r\n        gap: 1rem;\r\n    }\r\n\r\n}\r\n\r\nbutton,\r\ninput[type=\"button\"],\r\ninput[type=\"submit\"] {\r\n    cursor: pointer;\r\n}\r\n\r\n.game-container {\r\n    background-color: $cDarkBlue;\r\n\r\n    .open-ui-button {\r\n        position: relative;\r\n        box-sizing: content-box;\r\n        max-width: 40px;\r\n        padding: 6px;\r\n        border: 2px solid $cWhite;\r\n        border-radius: 50%;\r\n        background-color: $cBlack70;\r\n        cursor: pointer;\r\n\r\n        img {\r\n            max-width: 40px;\r\n        }\r\n\r\n        &:hover {\r\n            padding: 4px;\r\n            border: 4px solid $cReldens;\r\n            background-color: $cGreyBlue50;\r\n        }\r\n    }\r\n\r\n    .ui-box-controls {\r\n        .arrows-container {\r\n            display: flex;\r\n            justify-content: center;\r\n            align-items: center;\r\n            vertical-align: middle;\r\n            img {\r\n                border-radius: 50%;\r\n            }\r\n        }\r\n\r\n        .skill-icon-container img {\r\n            border-radius: 50%;\r\n        }\r\n\r\n        .arrows-container,\r\n        .skill-icon-container {\r\n            img {\r\n                box-sizing: content-box;\r\n                max-width: 40px;\r\n                padding: 6px;\r\n                border: 2px solid $cWhite;\r\n                background-color: $cBlack70;\r\n                cursor: pointer;\r\n\r\n                &:hover {\r\n                    background-color: $cGreyBlue50;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n.row {\r\n    display: flex;\r\n    position: relative;\r\n    width: 100%;\r\n    max-width: 500px;\r\n    margin: 0 auto 10px;\r\n    padding: 0;\r\n    background-color: rgba(255, 255, 255, 0.6);\r\n    border: 1px solid #ccc;\r\n    box-shadow: 10px 10px 14px 2px rgba(0, 0, 0, 0.6);\r\n\r\n    &.row-disclaimer {\r\n        max-width: 98%;\r\n    }\r\n\r\n    &.hidden, &.row-0:has(.guest-form.hidden) {\r\n        display: none;\r\n    }\r\n}\r\n\r\n.disclaimer {\r\n    text-align: center;\r\n    max-width: 80%;\r\n    margin: 0 auto;\r\n    padding: 10px 2%;\r\n    background-color: transparent;\r\n}\r\n\r\n.col-2 {\r\n    display: flex;\r\n    position: relative;\r\n    flex-direction: column;\r\n    flex-wrap: wrap;\r\n    width: 100%;\r\n    align-items: center;\r\n}\r\n\r\n@media (max-width: 725px) {\r\n\r\n    .row {\r\n        max-width: none;\r\n    }\r\n\r\n    .col-2 {\r\n        width: 90%;\r\n        padding: 0;\r\n        margin: 0 auto;\r\n    }\r\n\r\n    .footer {\r\n        display: none;\r\n    }\r\n\r\n    .content {\r\n        height: 92%;\r\n\r\n        .forms-container {\r\n            flex-direction: column;\r\n        }\r\n    }\r\n\r\n}\r\n\r\n@media (min-width: 725px) and (max-width: 751px) {\r\n    form .input-box.reg-re-password label {\r\n        margin-top: 1px;\r\n    }\r\n}\r\n\r\n#login-form,\r\n#guest-form,\r\n#register-form,\r\n#forgot-form {\r\n    width: 100%;\r\n    display: block;\r\n    margin: 0 0 10px;\r\n    padding: 0;\r\n\r\n    &.hidden {\r\n        display: none;\r\n    }\r\n}\r\n\r\n#guest-form {\r\n    .loading-container {\r\n        width: 100%;\r\n    }\r\n}\r\n\r\n.forgot-password-content {\r\n    flex-direction: column;\r\n\r\n    .input-box {\r\n        padding: 1rem 2rem 2rem;\r\n        text-align: center;\r\n    }\r\n}\r\n\r\n.response-error {\r\n    padding: 1rem;\r\n    margin-bottom: 0;\r\n    background: rgba(255, 255, 255, 0.8);\r\n    color: #ff0000;\r\n    font-weight: 600;\r\n\r\n    &:empty {\r\n        padding: 0;\r\n    }\r\n}\r\n\r\nh3.form-title {\r\n    width: 100%;\r\n    text-align: center;\r\n    background: #f2f2f2;\r\n    padding: 10px 0;\r\n    margin-top: 0;\r\n    border-bottom: 1px solid #666;\r\n}\r\n\r\n#reldens div:first-child {\r\n    z-index: 200;\r\n}\r\n\r\nform {\r\n    &.hidden {\r\n        display: none;\r\n    }\r\n\r\n    .input-box {\r\n        display: flex;\r\n        position: relative;\r\n        flex-direction: row;\r\n        justify-content: center;\r\n        width: 100%;\r\n        margin-bottom: 10px;\r\n\r\n        &.hidden {\r\n            display: none;\r\n        }\r\n\r\n        &.submit-container,\r\n        &.terms-and-conditions-link-container {\r\n            display: flex;\r\n            flex-direction: column;\r\n            flex-wrap: wrap;\r\n            align-items: center;\r\n            justify-content: center;\r\n            margin-bottom: 0;\r\n\r\n            &.guest-submit {\r\n                justify-content: center;\r\n            }\r\n\r\n            .loading-container {\r\n                width: auto;\r\n                margin-top: 1rem;\r\n            }\r\n        }\r\n\r\n        label {\r\n            display: block;\r\n            position: relative;\r\n            font-size: 12px;\r\n            margin-top: 10px;\r\n            width: 40%;\r\n            text-align: right;\r\n        }\r\n\r\n        input {\r\n            display: block;\r\n            position: relative;\r\n            border: 1px solid $cLightGrey;\r\n            padding: 8px;\r\n            box-shadow: 4px 4px 8px 0 #0009;\r\n        }\r\n\r\n        input[type=\"text\"],\r\n        input[type=\"email\"],\r\n        input[type=\"password\"] {\r\n            width: 50%;\r\n            max-width: 268px;\r\n        }\r\n\r\n    }\r\n\r\n}\r\n\r\n.player {\r\n    width: 100px;\r\n    height: 100px;\r\n    position: absolute;\r\n    padding-top: 24px;\r\n    box-sizing: border-box;\r\n    left: 0;\r\n    top: 0;\r\n}\r\n\r\n.ui-box {\r\n    position: relative;\r\n    z-index: 1001;\r\n    display: block;\r\n    margin: 0;\r\n    padding: 0;\r\n\r\n    button {\r\n        display: block;\r\n        position: relative;\r\n        padding: 4px 10px;\r\n        margin: 0;\r\n        border: 1px solid #ccc;\r\n        box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.9);\r\n    }\r\n}\r\n\r\n.box-title {\r\n    font-size: 1rem;\r\n}\r\n\r\n.box-target {\r\n    display: none;\r\n    position: relative;\r\n    top: 276px;\r\n    left: 10px;\r\n    background-color: rgba(0, 0, 0, 0.5);\r\n    padding: 10px;\r\n    border: 2px solid #ffff;\r\n    border-radius: 10px;\r\n\r\n    #target-container {\r\n        width: 100%;\r\n    }\r\n}\r\n\r\n.scene-label,\r\n.box-target {\r\n    color: #fff;\r\n}\r\n\r\n.ui-box-scene-data {\r\n    top: 30px;\r\n    padding: 15px;\r\n}\r\n\r\n.box-player-stats {\r\n    top: 20px;\r\n    left: -60px;\r\n}\r\n\r\n.ui-box.ui-box-controls {\r\n    position: relative;\r\n    bottom: 66px;\r\n    left: 66px;\r\n\r\n    img:active {\r\n        opacity: 1;\r\n    }\r\n\r\n}\r\n\r\n.ui-box-controls {\r\n    .action-buttons, .vertical-buttons {\r\n        display: flex;\r\n        flex-direction: column;\r\n        gap: 10px;\r\n    }\r\n\r\n    .action-buttons {\r\n        width: auto;\r\n\r\n        .skill-icon-container {\r\n            position: relative;\r\n\r\n            &.cooldown::after {\r\n                content: '';\r\n                position: absolute;\r\n                top: 0;\r\n                left: 0;\r\n                width: 100%;\r\n                height: 100%;\r\n                border-radius: 50%;\r\n                background: conic-gradient(rgba(0, 0, 0, 0.7) var(--angle), rgba(0, 0, 0, 0.1) var(--angle));\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n.button-opacity-off {\r\n    opacity: 1 !important;\r\n}\r\n\r\n.ui-box-player {\r\n    width: 100%;\r\n    top: 66px;\r\n    left: 66px;\r\n    max-width: 240px;\r\n    padding: 14px;\r\n    background-color: rgba(0, 0, 0, 0.5);\r\n    text-align: left;\r\n    word-break: break-all;\r\n\r\n    @media (max-width: 600px) {\r\n        max-width: 170px;\r\n    }\r\n}\r\n\r\n.ui-dialog-box {\r\n    display: none;\r\n    float: left;\r\n    width: 280px;\r\n    min-height: 200px;\r\n    padding: 15px;\r\n    background: #000000;\r\n    color: $cWhite;\r\n    word-wrap: break-word;\r\n    font-size: 12px;\r\n}\r\n\r\n.box-close,\r\n.close-target {\r\n    width: 24px;\r\n    position: absolute;\r\n    right: -12px;\r\n    top: -12px;\r\n    cursor: pointer;\r\n}\r\n\r\n.box-open {\r\n    cursor: pointer;\r\n}\r\n\r\n.box-content {\r\n    min-height: 40px;\r\n    max-height: 120px;\r\n    overflow: auto;\r\n    margin: 10px 0;\r\n}\r\n\r\n.box-options-container {\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 10px;\r\n    margin-top: 1rem;\r\n}\r\n\r\n.player-name {\r\n    padding: 0 0 10px;\r\n    text-align: center;\r\n    color: $cWhite;\r\n}\r\n\r\n.stat-container {\r\n    display: flex;\r\n    justify-content: space-between;\r\n}\r\n\r\nspan.stat-label {\r\n    color: #00ffff;\r\n}\r\n\r\n.loading-container {\r\n    float: left;\r\n    text-align: center;\r\n\r\n    img {\r\n        max-width: 40px;\r\n    }\r\n\r\n    .hidden {\r\n        display: none;\r\n    }\r\n}\r\n\r\n#player-stats-open {\r\n    top: 20px;\r\n    right: 60px;\r\n}\r\n\r\n#full-screen-btn {\r\n    top: 20px;\r\n    right: 134px;\r\n}\r\n\r\n.player-stats-ui {\r\n    min-width: 100px;\r\n    top: 64px;\r\n    right: calc(100% + 72px);\r\n    font-size: 14px;\r\n    display: none;\r\n    float: left;\r\n    position: relative;\r\n    min-height: 100px;\r\n    padding: 20px;\r\n    background: #000000;\r\n    color: $cWhite;\r\n}\r\n\r\n#player-stats-container {\r\n    position: relative;\r\n    min-width: 150px;\r\n    max-width: 260px;\r\n    word-wrap: break-word;\r\n    overflow: auto;\r\n    font-size: 12px;\r\n}\r\n\r\n#forgot_reset {\r\n    margin: 0 auto;\r\n    max-width: 720px;\r\n}\r\n\r\n#ui-player-extras {\r\n    display: flex;\r\n    flex-direction: column;\r\n    padding: 10px 0 0 0;\r\n    margin: 10px 0;\r\n    color: #fff;\r\n}\r\n\r\n.notification-balloon {\r\n    position: absolute;\r\n    top: -10px;\r\n    left: -10px;\r\n    box-sizing: content-box;\r\n    padding: 5px;\r\n    line-height: 15px;\r\n    height: 15px;\r\n    width: 15px;\r\n    background-color: red;\r\n    color: #ffffff;\r\n    border-radius: 50%;\r\n    text-align: center;\r\n    font-size: 14px;\r\n}\r\n"
  },
  {
    "path": "theme/default/css/chat.scss",
    "content": "/**\n *\n * Reldens - Styles - Chat\n *\n */\n\n@use \"variables\" as *;\n\n.chat-ui {\n    float: left;\n    position: relative;\n    top: -270px;\n    left: -426px;\n    padding: 20px;\n    min-width: 300px;\n    max-width: 300px;\n    min-height: 200px;\n    background: #000000;\n    color: $cWhite;\n    /* help for chrome issue with scale on phaser dom elements\n    will-change: transform;\n    transform: scale(1.011);\n    */\n}\n\n#chat-contents {\n    display: block;\n    font-size: 12px;\n    height: 100%;\n    width: 100%;\n\n    .tabs-container {\n        display: block;\n        position: relative;\n        height: 100%;\n    }\n\n    .tabs-headers {\n        height: 20%;\n        position: relative;\n        display: block;\n        width: 100%;\n        min-height: 26px;\n\n        .tab-label {\n            display: inline-block;\n            padding-right: 6px;\n            border-right: 1px solid #fff;\n            cursor: pointer;\n\n            &.active {\n                font-weight: bold;\n            }\n\n            &:last-child {\n                border-right: none;\n            }\n        }\n    }\n\n    .tabs-contents {\n        height: 60%;\n        display: block;\n        overflow-y: auto;\n        max-height: 150px;\n\n        .tab-content {\n            display: none;\n            overflow-y: auto;\n\n            &.active {\n                display: block;\n            }\n        }\n    }\n}\n\n#chat-messages {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 92%;\n    height: 72%;\n    padding: 2%;\n    word-wrap: break-word;\n    overflow: auto;\n    user-select: auto;\n    font-family: $normalFont;\n    font-size: 12px;\n}\n\n#chat-input {\n    position: absolute;\n    bottom: 15px;\n    width: 70%;\n    outline: none;\n    user-select: auto;\n    font-family: $normalFont;\n}\n\n#chat-send {\n    position: absolute;\n    bottom: 15px;\n    right: 15px;\n    width: 16%;\n}\n\n#chat-open {\n    position: absolute;\n    top: -66px;\n    left: -66px;\n}\n"
  },
  {
    "path": "theme/default/css/firebase.scss",
    "content": "/**\n *\n * Reldens - Styles - Firebase\n *\n */\n\n.firebase-row-container {\n    flex-direction: column;\n}\n\n#firebaseui-auth-container {\n    display: block;\n    max-width: 400px;\n    margin: 10px auto;\n    padding: 6px 0;\n}\n\n.firebase-container {\n    display: block;\n    float: left;\n    width: 100%;\n    margin: 0 0 2%;\n    padding: 0;\n\n    &.hidden {\n        display: none;\n    }\n}\n\n#firebase-login {\n    display: block;\n    width: 100%;\n    margin: 0;\n    padding: 0;\n}\n\n.firebase-auth-container {\n    flex-direction: column;\n    gap: 10px;\n    width: fit-content;\n    display: flex;\n    text-align: center;\n    margin: 0 auto 10px;\n}\n\n.firebase-auth-btn {\n    padding: 10px 16px;\n    color: white;\n    font-weight: 500;\n    cursor: pointer;\n    border: none;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-family: 'Open Sans', sans-serif;\n    transition: background-color 0.3s;\n    position: relative;\n    box-shadow: 6px 4px 10px 2px #0009;\n}\n\n.firebase-google-btn {\n    background-color: #4285F4;\n}\n\n.firebase-google-btn:hover {\n    background-color: #3367D6;\n}\n\n.firebase-facebook-btn {\n    background-color: #3b5998;\n}\n\n.firebase-facebook-btn:hover {\n    background-color: #2d4373;\n}\n\n.firebase-github-btn {\n    background-color: #333;\n}\n\n.firebase-github-btn:hover {\n    background-color: #222;\n}\n"
  },
  {
    "path": "theme/default/css/game-over.scss",
    "content": "/**\n *\n * Reldens - Styles - Game Over\n *\n */\n\n@use \"variables\" as *;\n\n#game-over {\n    z-index: 2000;\n    position: absolute;\n    left: 0;\n    overflow: visible;\n    width: 92%;\n    height: 90%;\n    padding: 10% 4% 0;\n    margin: 0;\n    background-color: rgba(0,0,0,0.7);\n    color: $cWhite;\n    cursor: default;\n\n    .game-over-content {\n        display: block;\n        float: left;\n        width: 100%;\n        height: 280px;\n        overflow-x: hidden;\n        overflow-y: auto;\n\n        h3 {\n            text-align: center;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "theme/default/css/instructions.scss",
    "content": "/**\n *\n * Reldens - Styles - Instructions\n *\n */\n\n@use \"variables\" as *;\n\n#instructions-open {\n    position: absolute;\n    top: -132px;\n    left: -66px;\n}\n\n#instructions {\n    z-index: 2000;\n    overflow: visible;\n    padding: 0;\n    margin: 0;\n    right: auto;\n    color: $cWhite;\n    cursor: default;\n    width: 100%;\n    max-width: min(90vw, 500px);\n    height: 100%;\n    max-height: min(80vh, 500px);\n    position: fixed;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n\n    .instructions-content {\n        display: block;\n        float: left;\n        width: 100%;\n        height: 280px;\n        box-sizing: border-box;\n        padding: 1rem;\n        overflow-x: hidden;\n        overflow-y: auto;\n\n        h3 {\n            text-align: center;\n        }\n\n        ul {\n            padding: 0 0 0 6%;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "theme/default/css/items-system.scss",
    "content": "/**\n *\n * Reldens - Styles - Items System\n *\n */\n\n@use \"variables\" as *;\n\n#inventory-open {\n    top: 90px;\n    right: 60px;\n}\n\n#equipment-open {\n    top: 160px;\n    right: 60px;\n}\n\n#inventory-items,\n#equipment-items {\n    position: relative;\n    word-wrap: break-word;\n    overflow: auto;\n    font-size: 12px;\n}\n\n#inventory-items {\n    width: 268px;\n    height: 200px;\n}\n\n#equipment-items {\n    width: 268px;\n    height: 225px;\n}\n\n.inventory-ui,\n.equipment-ui {\n    display: none;\n    float: left;\n    position: relative;\n    min-height: 100px;\n    padding: 20px;\n    background: $cBlack;\n    color: $cWhite;\n}\n\n.inventory-ui {\n    min-width: 160px;\n    top: 80px;\n    right: 360px;\n}\n\n.equipment-ui {\n    min-width: 160px;\n    top: 100px;\n    right: 360px;\n}\n\n@media (max-height: 400px) {\n\n    .equipment-ui {\n        top: 80px;\n    }\n\n}\n\n.item-box,\n.group-item-block {\n    float: left;\n    display: block;\n    width: 50px;\n    height: 50px;\n    margin-bottom: 6px;\n}\n\n.item-box {\n    .item-data-container {\n        display: none;\n        position: absolute;\n        top: 54px;\n        left: 16%;\n        z-index: 2;\n        width: 64%;\n        text-align: center;\n        background: $cBlack60;\n        padding: 4px;\n        color: $cWhite;\n        border: 1px solid $cWhite;\n        border-radius: 10px;\n        font-style: italic;\n    }\n\n    .item-qty,\n    .image-container {\n        display: block;\n        float: left;\n        width: 100%;\n        text-align: center;\n        cursor: pointer;\n\n        img {\n            border-radius: 6px;\n        }\n    }\n\n    .actions-container {\n        display: block;\n        width: 100%;\n        position: relative;\n\n        .item-action-block {\n            position: relative;\n            float: left;\n            max-width: 32px;\n            margin: 5px 5px 0;\n\n            img {\n                max-width: 32px;\n                cursor: pointer;\n            }\n\n        }\n\n    }\n\n    .trash-confirm {\n        display: none;\n        min-width: 96px;\n\n        span {\n            cursor: pointer;\n            padding: 5px;\n            border: 1px solid;\n            margin: 5px;\n            display: inline-block;\n        }\n\n    }\n\n}\n\n.item-box:nth-child(4n) .item-data-container,\n.item-box:nth-child(5n) .item-data-container {\n    right: 50px;\n    left: auto;\n}\n\n.item-label,\n.item-description {\n    display: block;\n}\n\n.group-item-block {\n    position: relative;\n\n    .equip-group-icon {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 1;\n        opacity: 0.2;\n        border: 1px solid $cWhite;\n    }\n\n    .equipped-item {\n        position: relative;\n        top: 0;\n        left: 0;\n        z-index: 2;\n    }\n\n    .image-container img {\n        min-width: 50px;\n    }\n\n    .item-qty,\n    .item-data-container .item-description,\n    .item-data-container .item-trash {\n        display: none;\n    }\n\n    .item-data-container {\n        min-width: 50px;\n\n        .actions-container .item-action-block {\n            float: none;\n            margin: 5px auto;\n        }\n\n    }\n\n}\n\n#group-item-weapon,\n#group-item-shield,\n#group-item-armor,\n#group-item-gauntlets {\n    display: block;\n    width: 50%;\n}\n\n#group-item-helmet,\n#group-item-boots {\n    display: block;\n    width: 100%;\n\n    .equip-group-icon {\n        max-width: 50px;\n        left: 40%;\n    }\n\n    .equipped-item {\n        display: block;\n        margin: 0 auto;\n        max-width: 50px;\n        min-height: 50px;\n    }\n\n}\n\n#group-item-weapon,\n#group-item-armor {\n\n    .equip-group-icon {\n        max-width: 50px;\n        right: 20px;\n        left: auto;\n    }\n\n    .equipped-item {\n        position: absolute;\n        right: 20px;\n        left: auto;\n    }\n\n}\n\n#group-item-shield,\n#group-item-gauntlets {\n\n    .equip-group-icon {\n        max-width: 50px;\n        right: auto;\n        left: 20px;\n    }\n\n    .equipped-item {\n        position: absolute;\n        right: auto;\n        left: 20px;\n    }\n\n}\n\n.start-trade {\n    margin-bottom: 10px;\n}\n\n.trade-container {\n    display: flex;\n    width: 100%;\n    height: 100%;\n    flex-direction: column;\n\n    .player-confirmed {\n        display: block;\n        width: 100%;\n        margin-top: 10px;\n        padding: 4px;\n        background: rgba(0, 0, 0, 0.4);\n        border: 1px solid $cReldens;\n        border-radius: 6px;\n        font-weight: 700;\n        color: $cWhite;\n        text-align: center;\n\n        &:empty {\n            border: none;\n            background: transparent;\n        }\n    }\n\n    .trade-row {\n        position: relative;\n        float: left;\n        display: block;\n        min-width: 300px;\n\n        &.trade-items-boxes {\n            min-height: 280px;\n\n            .trade-col, .trade-player-col {\n                min-height: 280px;\n            }\n\n        }\n\n    }\n\n    .trade-confirm-actions {\n        padding-top: 10px;\n        display: flex;\n        flex-direction: row;\n        flex-grow: 0;\n        flex-wrap: wrap;\n        justify-content: center;\n    }\n\n    .confirm-action,\n    .disconfirm-action,\n    .cancel-action {\n        min-height: 25px;\n        margin-left: 15px;\n    }\n\n    .trade-col {\n        position: relative;\n        float: left;\n        display: block;\n        width: 46%;\n        min-width: 100px;\n        min-height: 25px;\n        margin: 0;\n        padding: 0 1%;\n    }\n}\n\n.ui-dialog-box.type-trade.trade-in-progress {\n    min-width: 380px;\n    max-width: 450px;\n\n    .box-content {\n        height: 400px;\n        max-height: 100%;\n        width: 342px;\n    }\n\n    .trade-player-col {\n        width: 32%;\n        display: block;\n        float: left;\n        position: relative;\n    }\n}\n\n.trade-item {\n    display: block;\n    position: relative;\n    height: auto;\n\n    &.hidden {\n        display: none;\n    }\n\n    .trade-action-remove {\n        position: absolute;\n        right: -10px;\n\n        img {\n            max-width: 20px;\n            cursor: pointer;\n        }\n    }\n\n    .image-container {\n        cursor: pointer;\n    }\n}\n\n.my-items .trade-item {\n    .actions-container.trade-actions {\n        display: none;\n\n        &.trade-actions-expanded {\n            display: block;\n            position: absolute;\n            top: 54px;\n            left: 0;\n            z-index: 3;\n            background: $cBlack;\n            border: 1px solid $cWhite;\n            border-radius: 6px;\n            padding: 4px;\n\n            input, button {\n                border: 0;\n                margin: 6px auto 2px;\n                width: 100%;\n                float: none;\n                position: relative;\n                display: block;\n                max-width: 100%;\n                text-align: center;\n                padding: 4px 0;\n            }\n\n            .requirement-key img, .reward-key img {\n                max-width: 16px;\n            }\n        }\n    }\n}\n\n.pushed-to-trade .trade-item .actions-container.trade-actions,\n.got-from-trade .trade-item .actions-container.trade-actions {\n    display: block;\n}\n"
  },
  {
    "path": "theme/default/css/joystick.scss",
    "content": "/**\n *\n * Reldens - Styles - Joystick\n *\n */\n\n@use \"variables\" as *;\n\n#joystick {\n    width: 100px;\n    height: 100px;\n    border-radius: 50%;\n    background-color: $cGrey;\n    position: relative;\n    margin: 0;\n    opacity: 0.8;\n}\n\n.ui-box.ui-box-controls.ui-box-joystick {\n    @media (max-width: 725px) {\n        bottom: 38px;\n        left: 130px;\n    }\n}\n\n.game-container {\n    .joystick-small-resolutions-only {\n        #joystick {\n            display: none;\n        }\n\n        @media (max-width: 725px) {\n            #joystick {\n                display: block;\n            }\n\n            .arrows-container {\n                display: none;\n            }\n        }\n    }\n}\n\n#joystick-thumb {\n    width: 50px;\n    height: 50px;\n    border-radius: 50%;\n    background-color: $cWhite;\n    position: absolute;\n    top: 25px;\n    left: 25px;\n    cursor: pointer;\n    transition: background-color 0.2s;\n}\n"
  },
  {
    "path": "theme/default/css/minimap.scss",
    "content": "/**\n *\n * Reldens - Styles - Mini Map\n *\n */\n\n#minimap-open {\n    top: 0;\n    left: 0;\n}\n\n.minimap-ui {\n    position: relative;\n    top: 26px;\n    left: 26px;\n    display: block;\n    float: left;\n    background: transparent;\n\n    &.hidden {\n        display: none;\n    }\n}\n"
  },
  {
    "path": "theme/default/css/player-selection.scss",
    "content": "/**\n *\n * Reldens - Styles - Player Selection\n *\n */\n\n@use \"variables\" as *;\n\n.game-started {\n    &.game-engine-started {\n        #player-selection {\n            display: none;\n        }\n    }\n\n    #player-selection {\n        display: flex;\n\n        &.hidden {\n            display: none;\n        }\n    }\n}\n\n#player-selection {\n    display: none;\n    max-width: $containerMaxWidth;\n    margin: 0 auto;\n    padding: 0;\n\n    .selection-forms-container {\n        display: flex;\n        flex-direction: row;\n        flex-wrap: wrap;\n        justify-content: space-evenly;\n        gap: 2rem;\n        width: 100%;\n        padding: 0;\n        margin: 0 auto;\n\n        form {\n            flex-wrap: wrap;\n            width: 100%;\n            margin: 0;\n            display: flex;\n            max-width: 500px;\n            align-items: flex-start;\n\n            &.hidden {\n                display: none;\n            }\n\n            .select-element {\n                position: relative;\n                max-width: fit-content;\n                min-width: 250px;\n                padding: 8px;\n                margin: 0 auto;\n                border: 1px solid $cLightGrey;\n                text-align: center;\n            }\n\n            .player-creation-additional-info {\n                width: 100%;\n            }\n\n            .class-path-select-avatar {\n                background-position: top left;\n                display: block;\n                margin: 10px auto;\n            }\n\n            .input-box {\n                flex-direction: column;\n                justify-content: center;\n                align-items: center;\n                flex-wrap: wrap;\n\n                label {\n                    width: 100%;\n                    text-align: center;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "theme/default/css/player-stats-bars.scss",
    "content": "/**\n *\n * Reldens - Styles - Player Stats Bars\n *\n */\n\n@use \"variables\" as *;\n\n.stat-bar-container {\n    margin: 5px 0;\n}\n\n.stat-bar-wrapper {\n    position: relative;\n    width: 100%;\n    height: 20px;\n    border: 1px solid rgba(255, 255, 255, 0.3);\n    overflow: hidden;\n}\n\n.stat-bar-fill {\n    position: absolute;\n    left: 0;\n    top: 0;\n    height: 100%;\n    transition: width 0.3s ease;\n}\n\n.stat-bar-label,\n.stat-bar-text {\n    position: absolute;\n    top: 0;\n    height: 100%;\n    display: flex;\n    align-items: center;\n    font-size: 11px;\n    color: $cWhite;\n    text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);\n    pointer-events: none;\n    z-index: 200;\n}\n\n.stat-bar-label {\n    left: 5px;\n}\n\n.stat-bar-text {\n    right: 5px;\n}\n"
  },
  {
    "path": "theme/default/css/rewards-events.scss",
    "content": "/**\n *\n * Reldens - Styles - Rewards\n *\n */\n\n@use \"variables\" as *;\n\n.rewards-dialog-box {\n    min-width: 160px;\n    top: 260px;\n    right: 360px;\n}\n\n@media (max-height: 400px) {\n\n    .rewards-dialog-box {\n        top: 50px;\n    }\n\n}\n\n.rewards-open {\n    top: 450px;\n    right: 60px;\n}\n\n#box-rewards {\n    width: 260px;\n\n    .box-content {\n        min-height: 200px;\n    }\n}\n\n.rewards-table {\n    position: relative;\n    word-wrap: break-word;\n    overflow: auto;\n    font-size: 10px;\n    width: 100%;\n    min-height: 120px;\n\n\n    .reward-container {\n        float: left;\n        display: block;\n        width: 50px;\n        height: 50px;\n        margin-bottom: 6px;\n\n        &.reward-active {\n            cursor: pointer;\n        }\n\n        .reward-image-container, .reward-name {\n            display: block;\n            float: left;\n            width: 100%;\n            text-align: center;\n            font-size: 10px;\n        }\n\n        &.reward-inactive {\n            .reward-image-container, .reward-name {\n                opacity: 0.4;\n            }\n        }\n\n        .reward-description {\n            display: none;\n            position: absolute;\n            top: 54px;\n            left: 16%;\n            z-index: 200;\n            max-width: 120px;\n            background: $cBlack;\n            padding: 4px;\n            color: $cWhite;\n            border: 1px solid $cWhite;\n            font-size: 10px;\n            font-style: italic;\n        }\n\n        &:hover {\n            .reward-description {\n                display: block;\n            }\n        }\n    }\n}\n\n.reward-container:nth-child(4n) .reward-description,\n.reward-container:nth-child(5n) .reward-description {\n    right: 50px;\n    left: auto;\n}\n"
  },
  {
    "path": "theme/default/css/scores.scss",
    "content": "/**\n *\n * Reldens - Styles - Scores\n *\n */\n\n@use \"variables\" as *;\n\n.scores-dialog-box {\n    min-width: 160px;\n    top: 260px;\n    right: 360px;\n\n    .box-content {\n        min-height: 160px;\n    }\n}\n\n@media (max-height: 400px) {\n\n    .scores-dialog-box {\n        top: 50px;\n    }\n\n}\n\n.scores-open {\n    top: 370px;\n    right: 60px;\n}\n\n.scores-content {\n    flex-direction: column;\n\n    h3 {\n        text-align: center;\n    }\n\n    .scores-table {\n        padding: 1rem 2rem 2rem;\n    }\n\n    .score-container {\n        display: flex;\n        justify-content: space-between;\n        margin-bottom: 0.5rem;\n    }\n}\n"
  },
  {
    "path": "theme/default/css/settings.scss",
    "content": "/**\n *\n * Reldens - Styles - Settings\n *\n */\n\n@use \"variables\" as *;\n\n#settings-open {\n    position: absolute;\n    top: -198px;\n    left: -66px;\n}\n\n#settings-ui {\n    z-index: 2000;\n    overflow: visible;\n    padding: 0;\n    margin: 0;\n    right: auto;\n    color: $cWhite;\n    cursor: default;\n    width: 100%;\n    max-width: min(90vw, 500px);\n    height: 100%;\n    max-height: min(80vh, 500px);\n    position: fixed;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n\n    .settings-content {\n        display: block;\n        float: left;\n        width: 100%;\n        height: 280px;\n        box-sizing: border-box;\n        padding: 1rem;\n        overflow-x: hidden;\n        overflow-y: auto;\n\n        .settings-container {\n            display: block;\n            float: left;\n            width: 100%;\n            margin-top: 20px;\n\n            &:first-child {\n                margin-top: 0;\n            }\n        }\n\n        .settings-row {\n            display: block;\n            width: 100%;\n            margin: 0;\n            padding: 0;\n\n            .col-1 {\n                text-align: right;\n            }\n\n            .col-1,\n            .col-2 {\n                position: relative;\n                float: left;\n                display: block;\n                width: 48%;\n                margin: 0 2% 0 0;\n                padding: 0;\n            }\n\n            h3 {\n                text-align: center;\n            }\n\n        }\n\n    }\n\n    #settings-dynamic .settings-row:first-child h3:first-child {\n        margin-top: 0;\n    }\n\n}\n"
  },
  {
    "path": "theme/default/css/skills.scss",
    "content": "/**\n *\n * Reldens - Styles - Skills\n *\n */\n\n@use \"variables\" as *;\n\n#class-path-select {\n    width: 54%;\n    max-width: 268px;\n    float: right;\n    display: block;\n    position: relative;\n    border: 1px solid $cLightGrey;\n    padding: 8px 1%;\n    margin: 0;\n}\n\n.player-selection-additional-info,\n.avatar-container {\n    display: block;\n    float: left;\n    width: 100%;\n}\n\n.class-path-container,\n.level-container,\n.experience-container {\n    display: block;\n    width: 100%;\n    margin: 6px auto 0;\n}\n\n.level-container,\n.experience-container {\n    font-size: 11px;\n}\n\n.experience-container {\n    div {\n        float: left;\n        margin: 0 8px 0 0;\n    }\n\n    .current-experience::after {\n        content: '/';\n        margin: 0 4px;\n    }\n\n}\n\n.ui-skills-controls.ui-box-controls {\n    bottom: 66px;\n    left: 202px;\n}\n\n.skills-container.action-buttons {\n    flex-direction: row;\n}\n"
  },
  {
    "path": "theme/default/css/styles.scss",
    "content": "/**\n *\n * Reldens - Styles\n *\n */\n\n@use \"variables\" as *;\n@use \"base\";\n@use \"player-selection\";\n@use \"game-over\";\n@use \"instructions\";\n@use \"settings\";\n@use \"minimap\";\n@use \"skills\";\n@use \"firebase\";\n@use \"chat\";\n@use \"items-system\";\n@use \"teams\";\n@use \"terms-and-conditions\";\n@use \"ads\";\n@use \"scores\";\n@use \"joystick\";\n@use \"rewards-events\";\n@use \"player-stats-bars\";\n@use \"wooden-ui\";\n"
  },
  {
    "path": "theme/default/css/teams.scss",
    "content": "/**\n *\n * Reldens - Styles - Teams\n *\n */\n\n@use \"variables\" as *;\n\n.teams-dialog-box {\n    min-width: 160px;\n    top: 200px;\n    right: 360px;\n}\n\n.clan-dialog-box {\n    float: left;\n    position: relative;\n    min-width: 160px;\n    min-height: 100px;\n    top: 250px;\n    right: 360px;\n    /* help for chrome issue with scale on phaser dom elements\n    will-change: transform;\n    transform: scale(1.009);\n    */\n\n    .box-title {\n        font-size: 1rem;\n    }\n\n    .clan-row {\n        display: block;\n        float: left;\n        width: 100%;\n        margin-top: 10px;\n    }\n\n    .clan-name-input {\n        outline: none;\n        border: 1px solid #ccc;\n        padding: 8px;\n        display: block;\n        position: relative;\n        box-shadow: 4px 4px 8px #0009;\n        margin-bottom: 1rem;\n    }\n\n    .default-loading-container img{\n        max-width: 48px;\n    }\n\n}\n\n@media (max-height: 400px) {\n\n    .teams-dialog-box {\n        top: 50px;\n    }\n\n    .clan-dialog-box {\n        top: 80px;\n    }\n\n}\n\n.clan-open {\n    top: 230px;\n    right: 60px;\n}\n\n.teams-open {\n    top: 300px;\n    right: 60px;\n}\n\n.team-player,\n.property-box,\n.properties-list-container {\n    width: 100%;\n    float: left;\n    display: block;\n    position: relative;\n    padding: 0;\n    margin: 0 0 5px;\n}\n\n.player-name {\n    float: left;\n    display: block;\n    width: 90%;\n    text-align: left;\n    cursor: pointer;\n}\n\n.properties-list-container {\n    cursor: pointer;\n}\n\n.team-remove-container {\n    float: left;\n    display: block;\n    width: 10%;\n\n    .team-remove-button {\n        position: absolute;\n        top: 0;\n        right: 0;\n        max-width: 24px;\n        cursor: pointer;\n    }\n\n}\n\n.property-box {\n    float: left;\n    padding: 0;\n    margin: 0;\n\n    div {\n        float: left;\n    }\n\n    .label {\n        margin-right: 10px;\n    }\n\n    .value {\n        margin-right: 6px;\n    }\n\n}\n\n.team-leave-action {\n    float: right;\n}\n\n.clan-member {\n    min-height: 24px;\n    vertical-align: middle;\n    line-height: 24px;\n\n    .member-name {\n        float: left;\n    }\n\n    .clan-remove-container {\n        float: right;\n        cursor: pointer;\n\n        img {\n            max-width: 24px;\n            position: relative;\n            top: 0;\n        }\n    }\n}\n"
  },
  {
    "path": "theme/default/css/terms-and-conditions.scss",
    "content": "/**\n *\n * Reldens - Styles - Terms and Conditions\n *\n */\n\n@use \"variables\" as *;\n\n.modal-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: rgba(0, 0, 0, 0.5);\n    z-index: 1999;\n    display: none;\n}\n\n.modal-overlay.active {\n    display: block;\n}\n\n#terms-and-conditions {\n    z-index: 2000;\n    position: fixed;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    overflow: visible;\n    width: 100%;\n    max-width: min(90vw, 800px);\n    height: 100%;\n    max-height: min(80vh, 500px);\n    margin: 0;\n    background-color: $cDarkBlue;\n    color: $cWhite;\n    cursor: default;\n\n    &.wooden-box {\n        background:\n            linear-gradient($cDarkBlue, $cDarkBlue) repeat center,\n            url('../assets/game-ui/wood-left-right.png') repeat-y left,\n            url('../assets/game-ui/wood-left-right.png') repeat-y right,\n            url('../assets/game-ui/wood-top-bottom.png') repeat-x top,\n            url('../assets/game-ui/wood-top-bottom.png') repeat-x bottom;\n        background-origin: padding-box, border-box, border-box, border-box, border-box;\n        background-clip: padding-box, border-box, border-box, border-box, border-box;\n    }\n\n    .scrollable {\n        max-height: 280px;\n        padding: 2% 4%;\n    }\n\n    .terms-and-conditions-text {\n        display: block;\n        float: left;\n        width: 100%;\n        overflow-x: hidden;\n        overflow-y: auto;\n        margin-bottom: 15px;\n        max-height: 60vh;\n\n        h3 {\n            text-align: center;\n        }\n\n        .terms-body {\n            overflow-y: auto;\n            width: 92%;\n            padding: 2% 4%;\n        }\n    }\n\n    .input-box button {\n        display: block;\n        position: relative;\n        margin-top: 1rem;\n        border: 1px solid $cLightGrey;\n        padding: 8px;\n        box-shadow: 4px 4px 8px 0 #0009;\n    }\n\n    .box-close {\n        width: 30px;\n        box-shadow: -2px 2px 4px #000;\n\n        &:hover {\n            box-shadow: -2px 2px 4px #fff;\n        }\n    }\n}\n\n.terms-and-conditions-link-container.hidden {\n    display: none;\n}\n\n.terms-and-conditions-link {\n    text-align: right;\n    cursor: pointer;\n    font-size: 12px;\n    text-decoration: underline;\n}\n\n.terms-box {\n    display: block;\n    padding: 2%;\n    margin: 2%;\n}\n"
  },
  {
    "path": "theme/default/css/variables.scss",
    "content": "/**\n *\n * Reldens - Styles - Variables\n *\n */\n\n$normalFont: Verdana, Geneva, sans-serif;\n$reldensFont: \"Play\", sans-serif;\n$cReldens: #2f7dde;\n$cDarkBlue: #37517e;\n$cGreyBlue: #283b5b;\n$cGreyBlue50: rgba(25, 60, 92, 0.5);\n$cGreyBlue60: rgba(18, 45, 71, 0.8);\n$cDarkBlue280: rgba(6, 25, 44, 0.8);\n$cWhite: #ffffff;\n$cLightGrey: #cccccc;\n$cGrey: #333333;\n$cBlack: #000000;\n$cBlack80: rgba(0, 0, 0, 0.8);\n$cBlack70: rgba(0,0,0,0.7);\n$cBlack60: rgba(0, 0, 0, 0.6);\n\n$containerMaxWidth: 1200px;\n"
  },
  {
    "path": "theme/default/css/wooden-ui.scss",
    "content": "@use \"variables\" as *;\n\n.wooden-box {\n    position: relative;\n    padding: 0;\n    border: 10px solid transparent;\n    margin: 1rem 0;\n    background:\n        url('../assets/game-ui/background-pattern.png') repeat center,\n        url('../assets/game-ui/wood-left-right.png') repeat-y left,\n        url('../assets/game-ui/wood-left-right.png') repeat-y right,\n        url('../assets/game-ui/wood-top-bottom.png') repeat-x top,\n        url('../assets/game-ui/wood-top-bottom.png') repeat-x bottom;\n    background-origin: padding-box, border-box, border-box, border-box, border-box;\n    background-clip: padding-box, border-box, border-box, border-box, border-box;\n    box-shadow: 6px 4px 10px 2px #0009;\n\n    &::before {\n        content: \"\";\n        position: absolute;\n        z-index: 10;\n        inset: 0;\n        background-image:\n            url('../assets/game-ui/corner.png'),\n            url('../assets/game-ui/corner.png'),\n            url('../assets/game-ui/corner.png'),\n            url('../assets/game-ui/corner.png');\n        background-position: 0 0, 100% 0, 0 100%, 100% 100%;\n        background-repeat: no-repeat;\n        background-size: 24px;\n        margin: -10px;\n        pointer-events: none;\n    }\n\n    .box-close {\n        z-index: 20;\n    }\n\n    input::placeholder,\n    textarea::placeholder {\n        color: #555;\n        opacity: 1;\n    }\n}\n\n.ui-box-player,\n.ui-box-scene-data,\n.ui-dialog-box,\n.inventory-ui,\n.equipment-ui,\n.chat-ui,\n.player-stats-ui,\n.settings-ui,\n#instructions,\n#game-over {\n    border: 10px solid transparent;\n    background:\n        url('../assets/game-ui/wood-left-right.png') repeat-y left,\n        url('../assets/game-ui/wood-left-right.png') repeat-y right,\n        url('../assets/game-ui/wood-top-bottom.png') repeat-x top,\n        url('../assets/game-ui/wood-top-bottom.png') repeat-x bottom,\n        $cDarkBlue280;\n    background-origin: border-box, border-box, border-box, border-box, border-box;\n    background-clip: border-box, border-box, border-box, border-box, padding-box;\n    box-shadow: 6px 4px 10px 2px #0009;\n\n    &::before {\n        content: \"\";\n        position: absolute;\n        inset: -11px;\n        pointer-events: none;\n        background:\n            url('../assets/game-ui/corner.png') top left no-repeat,\n            url('../assets/game-ui/corner.png') top right no-repeat,\n            url('../assets/game-ui/corner.png') bottom left no-repeat,\n            url('../assets/game-ui/corner.png') bottom right no-repeat;\n        background-size: 24px;\n        z-index: 10;\n    }\n\n    .box-close {\n        z-index: 20;\n    }\n}\n\n.inventory-ui,\n.equipment-ui,\n.chat-ui,\n.player-stats-ui,\n.ui-box-player,\n.ui-box-scene-data {\n    border-width: 8px;\n    box-shadow: 5px 3px 8px 2px #0009;\n\n    &::before {\n        inset: -9px;\n        background-size: 20px;\n    }\n}\n"
  },
  {
    "path": "theme/default/es-index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n    <title>Reldens | MMORPG Platform | By DwDeveloper</title>\n    <meta name=\"description\" content=\"Reldens, plataforma open source para crear MMORPG games\"/>\n    <meta property=\"og:title\" content=\"Reldens | MMORPG Platform\"/>\n    <meta property=\"og:description\" content=\"Reldens, plataforma open source para crear MMORPG games\"/>\n    <meta property=\"og:type\" content=\"website\"/>\n    <meta property=\"og:url\" content=\"https://demo.reldens.com/\"/>\n    <meta property=\"og:site_name\" content=\"Reldens\"/>\n    <meta property=\"og:locale\" content=\"es_ES\"/>\n    <meta property=\"og:image\" content=\"https://cdn.dwdeveloper.com/assets/web/reldens-check.png\"/>\n    <meta property=\"og:image:width\" content=\"460\"/>\n    <meta property=\"og:image:height\" content=\"394\"/>\n    <meta property=\"og:image:alt\" content=\"Reldens MMORPG Platform Logo\"/>\n    <meta property=\"og:image:type\" content=\"image/png\"/>\n    <meta name=\"twitter:card\" content=\"summary_large_image\"/>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Play:300,300i,400,400i,500,500i,600,600i,700,700i\" rel=\"stylesheet\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"assets/favicons/apple-touch-icon.png\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"assets/favicons/favicon-32x32.png\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"assets/favicons/favicon-16x16.png\"/>\n    <link rel=\"mask-icon\" href=\"assets/favicons/safari-pinned-tab.svg\" color=\"#000000\"/>\n    <link rel=\"manifest\" href=\"./site.webmanifest\"/>\n    <meta name=\"apple-mobile-web-app-title\" content=\"Reldens\"/>\n    <meta name=\"application-name\" content=\"Reldens\"/>\n    <meta name=\"msapplication-TileColor\" content=\"#37517e\"/>\n    <meta name=\"theme-color\" content=\"#37517e\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0\"/>\n    <script type=\"text/javascript\" id=\"reldens-initial-config\" src=\"./config.js\"></script>\n    <script type=\"module\" src=\"./index.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"./css/styles.scss\"/>\n</head>\n<body>\n    <div class=\"wrapper\">\n        <div class=\"header\">\n            <div class=\"header-content\">\n                <img id=\"your-logo\" src=\"./assets/web/reldens-your-logo-mage.png\" alt=\"reldens\"/>\n                <h1 class=\"title\">\n                    - <strong>reldens</strong> <span id=\"current-version\">demo -</span>\n                    <br/>- tu logo aqui -\n                </h1>\n            </div>\n        </div>\n        <div class=\"content\">\n            <div class=\"row row-disclaimer\">\n                <div class=\"disclaimer\">\n                    Descargo: Reldens no es solo un juego, es una plataforma para crear juegos.\n                    <br/>Esta es una demostraci&oacute;n para mostrar cu&aacute;ntas funciones est&aacute;n disponibles en la plataforma.\n                </div>\n            </div>\n            <div class=\"forms-container\">\n                <div class=\"col-2 col-left\">\n                    <div class=\"row wooden-box\">\n                        <form name=\"login-form\" id=\"login-form\" class=\"login-form\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Login</h3>\n                            <div class=\"input-box login-username\">\n                                <input type=\"text\" name=\"username\" id=\"username\" class=\"required\" required autocomplete=\"on\" placeholder=\"Nombre de Usuario\"/>\n                            </div>\n                            <div class=\"input-box login-password\">\n                                <input type=\"password\" name=\"password\" id=\"password\" class=\"required\" required autocomplete=\"off\" placeholder=\"Password\"/>\n                            </div>\n                            <div class=\"input-box submit-container login-submit\">\n                                <input type=\"submit\" value=\"Entrar\"/>\n                                <div class=\"loading-container hidden\">\n                                    <img src=\"./assets/web/loading.gif\" alt=\"Cargando...\"/>\n                                </div>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                    </div>\n                    <div class=\"row wooden-box\">\n                        <form name=\"guest-form\" id=\"guest-form\" class=\"guest-form\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Jugar como invitado</h3>\n                            <!-- enable the config general/users/allowGuestUserName and uncomment the following to allow guest usernames:\n                            <div class=\"input-box guest-username\">\n                                <input type=\"text\" name=\"guest-username\" id=\"guest-username\" class=\"required\" required placeholder=\"Nombre de usuario\"/>\n                            </div>\n                            -->\n                            <div class=\"input-box submit-container guest-submit\">\n                                <input type=\"submit\" value=\"Jugar\"/>\n                            </div>\n                            <div class=\"loading-container hidden\">\n                                <img src=\"./assets/web/loading.gif\" alt=\"Cargando...\"/>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                    </div>\n                    <div class=\"row wooden-box forgot-password-container hidden\">\n                        <form name=\"forgot-form\" id=\"forgot-form\" class=\"forgot-form\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Olvid&eacute; mi contrase&ntilde;a</h3>\n                            <div class=\"input-box forgot-email\">\n                                <input type=\"email\" name=\"forgot-email\" id=\"forgot-email\" class=\"required email\" required autocomplete=\"off\" placeholder=\"Email\"/>\n                            </div>\n                            <div class=\"input-box submit-container forgot-submit\">\n                                <input type=\"submit\" value=\"Solicitar\"/>\n                                <div class=\"loading-container hidden\">\n                                    <img src=\"./assets/web/loading.gif\" alt=\"Cargando...\"/>\n                                </div>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                    </div>\n                </div>\n                <div class=\"col-2 col-right\">\n                    <div class=\"row wooden-box firebase-row-container hidden\">\n                        <form name=\"firebase-login\" id=\"firebase-login\" class=\"firebase-login\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Firebase Registration</h3>\n                            <div class=\"input-box firebase-username\">\n                                <input type=\"text\" name=\"firebase-username\" id=\"firebase-username\" class=\"required\" required placeholder=\"Usuario\"/>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                        <div class=\"firebase-container\">\n                            <div id=\"firebase-auth-container\" class=\"firebase-auth-container\"></div>\n                        </div>\n                    </div>\n                    <div class=\"row wooden-box\">\n                        <form name=\"register-form\" id=\"register-form\" class=\"register-form\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Crear Cuenta</h3>\n                            <div class=\"input-box reg-email\">\n                                <input type=\"email\" name=\"reg-email\" id=\"reg-email\" class=\"required email\" required placeholder=\"Email\"/>\n                            </div>\n                            <div class=\"input-box reg-username\">\n                                <input type=\"text\" name=\"reg-username\" id=\"reg-username\" class=\"required\" required placeholder=\"Nombre de Usuario\"/>\n                            </div>\n                            <div class=\"input-box reg-password\">\n                                <input type=\"password\" name=\"reg-password\" id=\"reg-password\" class=\"required\" required autocomplete=\"off\" placeholder=\"Contrase&ntilde;a\"/>\n                            </div>\n                            <div class=\"input-box reg-re-password\">\n                                <input type=\"password\" name=\"reg-re-password\" id=\"reg-re-password\" class=\"required\" required autocomplete=\"off\" placeholder=\"Reescribe contrase&ntilde;a\"/>\n                            </div>\n                            <div class=\"input-box hidden terms-and-conditions-link-container\">\n                                <p class=\"terms-and-conditions-link\">Acepta nuestros T&eacute;rminos y Condiciones (haz clic aqu&iacute;).</p>\n                            </div>\n                            <div class=\"input-box submit-container reg-submit\">\n                                <input type=\"submit\" value=\"Registrarse\"/>\n                                <div class=\"loading-container hidden\">\n                                    <img src=\"./assets/web/loading.gif\" alt=\"Cargando...\"/>\n                                </div>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                    </div>\n                </div>\n            </div>\n            <div id=\"terms-and-conditions\" class=\"hidden wooden-box\">\n                <div class=\"terms-and-conditions-text\">\n                    <h3 class=\"terms-heading\">T&eacute;rminos y Condiciones</h3>\n                    <div class=\"terms-body\"></div>\n                </div>\n                <div class=\"terms-box\">\n                    <input type=\"checkbox\" id=\"accept-terms-and-conditions\">\n                    <label class=\"accept-terms-and-conditions-label\" for=\"accept-terms-and-conditions\">\n                        Acepto estos T&eacute;rminos y Condiciones\n                    </label>\n                    <div class=\"input-box\">\n                        <button class=\"terms-and-conditions-accept-close\">Close</button>\n                    </div>\n                </div>\n                <img id=\"terms-and-conditions-close\" class=\"box-close terms-and-conditions-accept-close\" src=\"./assets/game-ui/corner-x.png\" alt=\"close\"/>\n            </div>\n            <div id=\"instructions\" class=\"hidden\">\n                <div class=\"instructions-content\">\n                    <h3>Instructions</h3>\n                    <ul>\n                        <li>Mu&aacute;vete con las flechas o usando W-A-S-D.</li>\n                        <li>Utiliza el clic izquierdo para seguir un camino, pero por ahora, para cambiar a otra escena, debes atravesar el punto de cambio (como el puente en la parte superior o las puertas de las casas).</li>\n                        <li>Utiliza clic derecho o TAB para apuntar a enemigos o jugadores cercanos.</li>\n                        <li>Debes tener un objetivo para ejecutar una habilidad/acci&oacute;n.</li>\n                        <li>Utiliza los botones de la pantalla para activar las diferentes habilidades/acciones del jugador.</li>\n                    </ul>\n                    <img id=\"instructions-close\" class=\"box-close\" src=\"./assets/game-ui/corner-x.png\" alt=\"close\"/>\n                </div>\n            </div>\n            <div id=\"game-over\" class=\"hidden\">\n                <div class=\"game-over-content\">\n                    <h3>\n                        ¡Moriste!<br/><br/>\n                        S&oacute;lo espera...<br/><br/>\n                        ¡Seras revivido automaticamente para esta demostracion!\n                    </h3>\n                </div>\n            </div>\n            <div id=\"player-selection\" class=\"hidden\">\n                <div class=\"selection-forms-container\">\n                    <form\n                        name=\"player-selector-form\"\n                        id=\"player-selector-form\"\n                        class=\"player-selector-form wooden-box hidden\"\n                        action=\"#\"\n                        method=\"post\">\n                        <h3 class=\"form-title\">\n                            <label for=\"player-select-element\">Seleccionar Personaje</label>\n                        </h3>\n                        <div class=\"input-box player-select-box\">\n                            <select\n                                class=\"input-box select-element\"\n                                id=\"player-select-element\"\n                                name=\"player-select-element\">\n                            </select>\n                        </div>\n                        <div class=\"player-selection-additional-info\"></div>\n                        <div class=\"input-box submit-container player-select-submit\">\n                            <input type=\"submit\" value=\"Iniciar\"/>\n                            <div class=\"loading-container hidden\">\n                                <img src=\"./assets/web/loading.gif\" alt=\"Cargando...\"/>\n                            </div>\n                        </div>\n                        <div class=\"player-selection-form-errors\"></div>\n                    </form>\n                    <form name=\"player-create-form\"\n                        id=\"player-create-form\"\n                        class=\"player-create-form wooden-box hidden\"\n                        action=\"#\"\n                        method=\"post\">\n                        <h3 class=\"form-title\">Create Player</h3>\n                        <div class=\"input-box player-create-name\">\n                            <input type=\"text\" name=\"new-player-name\" id=\"new-player-name\" class=\"required\" required placeholder=\"Nombre\"/>\n                        </div>\n                        <div class=\"player-creation-additional-info\"></div>\n                        <div class=\"input-box submit-container player-create-submit\">\n                            <input type=\"submit\" value=\"Crear y comenzar\"/>\n                            <div class=\"loading-container hidden\">\n                                <img src=\"./assets/web/loading.gif\" alt=\"Cargando...\"/>\n                            </div>\n                        </div>\n                        <div class=\"input-box response-error\"></div>\n                    </form>\n                </div>\n            </div>\n            <div class=\"game-container hidden\">\n                <!--\n                @NOTE: if you change the \"reldens\" ID also make sure to update the RELDENS_CLIENT_PARENT and the\n                RELDENS_CLIENT_SCALE_PARENT variables in the .env file.\n                -->\n                <div id=\"reldens\"></div>\n            </div>\n        </div>\n        <div class=\"footer\">\n            <div class=\"copyright\">\n                <a href=\"https://www.dwdeveloper.com/\" alt=\"DwDeveloper\" target=\"_blank\">by DwDeveloper</a>\n            </div>\n        </div>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "theme/default/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <title>Reldens | MMORPG Platform | By DwDeveloper</title>\n    <meta name=\"description\" content=\"Reldens, an open source MMORPG platform\"/>\n    <meta property=\"og:title\" content=\"Reldens | MMORPG Platform\"/>\n    <meta property=\"og:description\" content=\"Reldens, an open source MMORPG platform\"/>\n    <meta property=\"og:type\" content=\"website\"/>\n    <meta property=\"og:url\" content=\"https://demo.reldens.com/\"/>\n    <meta property=\"og:site_name\" content=\"Reldens\"/>\n    <meta property=\"og:locale\" content=\"en_US\"/>\n    <meta property=\"og:image\" content=\"https://cdn.dwdeveloper.com/assets/web/reldens-check.png\"/>\n    <meta property=\"og:image:width\" content=\"460\"/>\n    <meta property=\"og:image:height\" content=\"394\"/>\n    <meta property=\"og:image:alt\" content=\"Reldens MMORPG Platform Logo\"/>\n    <meta property=\"og:image:type\" content=\"image/png\"/>\n    <meta name=\"twitter:card\" content=\"summary_large_image\"/>\n    <link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Play:300,300i,400,400i,500,500i,600,600i,700,700i\" rel=\"stylesheet\"/>\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"assets/favicons/apple-touch-icon.png\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"assets/favicons/favicon-32x32.png\"/>\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"assets/favicons/favicon-16x16.png\"/>\n    <link rel=\"mask-icon\" href=\"assets/favicons/safari-pinned-tab.svg\" color=\"#000000\"/>\n    <link rel=\"manifest\" href=\"./site.webmanifest\"/>\n    <meta name=\"apple-mobile-web-app-title\" content=\"Reldens\"/>\n    <meta name=\"application-name\" content=\"Reldens\"/>\n    <meta name=\"msapplication-TileColor\" content=\"#37517e\"/>\n    <meta name=\"theme-color\" content=\"#37517e\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0\"/>\n    <script type=\"text/javascript\" id=\"reldens-initial-config\" src=\"./config.js\"></script>\n    <script type=\"module\" src=\"./index.js\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"./css/styles.scss\"/>\n</head>\n<body>\n    <div class=\"wrapper\">\n        <div class=\"header\">\n            <div class=\"header-content\">\n                <img id=\"your-logo\" src=\"./assets/web/reldens-your-logo-mage.png\" alt=\"reldens\"/>\n                <h1 class=\"title\">\n                    - <strong>reldens</strong> <span id=\"current-version\">demo -</span>\n                    <br/>- your logo here -\n                </h1>\n            </div>\n        </div>\n        <div class=\"content\">\n            <div class=\"row row-disclaimer\">\n                <div class=\"disclaimer\">\n                    Disclaimer: Reldens is not just a game, is a platform to create games.\n                    <br/>This is a demo to show how many features are available on the platform.\n                </div>\n            </div>\n            <div class=\"forms-container\">\n                <div class=\"col-2 col-left\">\n                    <div class=\"row wooden-box\">\n                        <form name=\"login-form\" id=\"login-form\" class=\"login-form\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Login</h3>\n                            <div class=\"input-box login-username\">\n                                <input type=\"text\" name=\"username\" id=\"username\" class=\"required\" required autocomplete=\"on\" placeholder=\"Username\"/>\n                            </div>\n                            <div class=\"input-box login-password\">\n                                <input type=\"password\" name=\"password\" id=\"password\" class=\"required\" required autocomplete=\"off\" placeholder=\"Password\"/>\n                            </div>\n                            <div class=\"input-box submit-container login-submit\">\n                                <input type=\"submit\" value=\"Submit\"/>\n                                <div class=\"loading-container hidden\">\n                                    <img src=\"./assets/web/loading.gif\" alt=\"Loading...\"/>\n                                </div>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                    </div>\n                    <div class=\"row wooden-box\">\n                        <form name=\"guest-form\" id=\"guest-form\" class=\"guest-form\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Play as a Guest</h3>\n                            <!-- enable the config general/users/allowGuestUserName and uncomment the following to allow guest usernames:\n                            <div class=\"input-box guest-username\">\n                                <input type=\"text\" name=\"guest-username\" id=\"guest-username\" class=\"required\" required placeholder=\"Username\"/>\n                            </div>\n                            -->\n                            <div class=\"input-box submit-container guest-submit\">\n                                <input type=\"submit\" value=\"Play\"/>\n                                <div class=\"loading-container hidden\">\n                                    <img src=\"./assets/web/loading.gif\" alt=\"Loading...\"/>\n                                </div>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                    </div>\n                    <div class=\"row wooden-box forgot-password-container hidden\">\n                        <form name=\"forgot-form\" id=\"forgot-form\" class=\"forgot-form\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Forgot password</h3>\n                            <div class=\"input-box forgot-email\">\n                                <input type=\"email\" name=\"forgot-email\" id=\"forgot-email\" class=\"required email\" required autocomplete=\"off\" placeholder=\"Email\"/>\n                            </div>\n                            <div class=\"input-box submit-container forgot-submit\">\n                                <input type=\"submit\" value=\"Request\"/>\n                                <div class=\"loading-container hidden\">\n                                    <img src=\"./assets/web/loading.gif\" alt=\"Loading...\"/>\n                                </div>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                    </div>\n                </div>\n                <div class=\"col-2 col-right\">\n                    <div class=\"row wooden-box firebase-row-container hidden\">\n                        <form name=\"firebase-login\" id=\"firebase-login\" class=\"firebase-login\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Firebase Registration</h3>\n                            <div class=\"input-box firebase-username\">\n                                <input type=\"text\" name=\"firebase-username\" id=\"firebase-username\" class=\"required\" required placeholder=\"Username\"/>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                        <div class=\"firebase-container\">\n                            <div id=\"firebase-auth-container\" class=\"firebase-auth-container\"></div>\n                        </div>\n                    </div>\n                    <div class=\"row wooden-box\">\n                        <form name=\"register-form\" id=\"register-form\" class=\"register-form\" action=\"#\" method=\"post\">\n                            <h3 class=\"form-title\">Create Account</h3>\n                            <div class=\"input-box reg-email\">\n                                <input type=\"email\" name=\"reg-email\" id=\"reg-email\" class=\"required email\" required placeholder=\"Email\"/>\n                            </div>\n                            <div class=\"input-box reg-username\">\n                                <input type=\"text\" name=\"reg-username\" id=\"reg-username\" class=\"required\" required placeholder=\"Username\"/>\n                            </div>\n                            <div class=\"input-box reg-password\">\n                                <input type=\"password\" name=\"reg-password\" id=\"reg-password\" class=\"required\" required autocomplete=\"off\" placeholder=\"Password\"/>\n                            </div>\n                            <div class=\"input-box reg-re-password\">\n                                <input type=\"password\" name=\"reg-re-password\" id=\"reg-re-password\" class=\"required\" required autocomplete=\"off\" placeholder=\"Re-type password\"/>\n                            </div>\n                            <div class=\"input-box hidden terms-and-conditions-link-container\">\n                                <p class=\"terms-and-conditions-link\">Accept our Terms and Conditions (click here).</p>\n                            </div>\n                            <div class=\"input-box submit-container reg-submit\">\n                                <input type=\"submit\" value=\"Register\"/>\n                                <div class=\"loading-container hidden\">\n                                    <img src=\"./assets/web/loading.gif\" alt=\"Loading...\"/>\n                                </div>\n                            </div>\n                            <div class=\"input-box response-error\"></div>\n                        </form>\n                    </div>\n                </div>\n            </div>\n            <div id=\"terms-and-conditions\" class=\"hidden wooden-box\">\n                <div class=\"terms-and-conditions-text\">\n                    <h3 class=\"terms-heading\">Terms and conditions</h3>\n                    <div class=\"terms-body\"></div>\n                </div>\n                <div class=\"terms-box\">\n                    <input type=\"checkbox\" id=\"accept-terms-and-conditions\">\n                    <label class=\"accept-terms-and-conditions-label\" for=\"accept-terms-and-conditions\">\n                        I agree to these Terms and Conditions\n                    </label>\n                    <div class=\"input-box\">\n                        <button class=\"terms-and-conditions-accept-close\">Close</button>\n                    </div>\n                </div>\n                <img id=\"terms-and-conditions-close\" class=\"box-close terms-and-conditions-accept-close\" src=\"./assets/game-ui/corner-x.png\" alt=\"close\"/>\n            </div>\n            <div id=\"instructions\" class=\"hidden\">\n                <div class=\"instructions-content\">\n                    <h3>Instructions</h3>\n                    <ul>\n                        <li>Move with the arrows or using W-A-S-D.</li>\n                        <li>\n                            Use left click to follow a path but for now to change to another scene you need to walk\n                            through the change point (like the bridge at the top, or the houses doors).\n                        </li>\n                        <li>Use right-click or TAB to target near enemies or players.</li>\n                        <li>You must have a target to execute a skill/action.</li>\n                        <li>Use the screen-buttons to activate the different player skills/actions.</li>\n                    </ul>\n                    <img id=\"instructions-close\" class=\"box-close\" src=\"./assets/game-ui/corner-x.png\" alt=\"close\"/>\n                </div>\n            </div>\n            <div id=\"game-over\" class=\"hidden\">\n                <div class=\"game-over-content\">\n                    <h3>\n                        You died!<br/><br/>\n                        Just wait...<br/><br/>\n                        You will be automatically revived for this demo!\n                    </h3>\n                </div>\n            </div>\n            <div id=\"player-selection\" class=\"hidden\">\n                <div class=\"selection-forms-container\">\n                    <form\n                        name=\"player-selector-form\"\n                        id=\"player-selector-form\"\n                        class=\"player-selector-form wooden-box hidden\"\n                        action=\"#\"\n                        method=\"post\">\n                        <h3 class=\"form-title\">\n                            <label for=\"player-select-element\">Select Player</label>\n                        </h3>\n                        <div class=\"input-box player-select-box\">\n                            <select\n                                class=\"input-box select-element\"\n                                id=\"player-select-element\"\n                                name=\"player-select-element\">\n                            </select>\n                        </div>\n                        <div class=\"player-selection-additional-info\"></div>\n                        <div class=\"input-box submit-container player-select-submit\">\n                            <input type=\"submit\" value=\"Start\"/>\n                            <div class=\"loading-container hidden\">\n                                <img src=\"./assets/web/loading.gif\" alt=\"Loading...\"/>\n                            </div>\n                        </div>\n                        <div class=\"player-selection-form-errors\"></div>\n                    </form>\n                    <form name=\"player-create-form\"\n                        id=\"player-create-form\"\n                        class=\"player-create-form wooden-box hidden\"\n                        action=\"#\"\n                        method=\"post\">\n                        <h3 class=\"form-title\">Create Player</h3>\n                        <div class=\"input-box player-create-name\">\n                            <input type=\"text\" name=\"new-player-name\" id=\"new-player-name\" class=\"required\" required placeholder=\"Player Name\"/>\n                        </div>\n                        <div class=\"player-creation-additional-info\"></div>\n                        <div class=\"input-box submit-container player-create-submit\">\n                            <input type=\"submit\" value=\"Create & Start\"/>\n                            <div class=\"loading-container hidden\">\n                                <img src=\"./assets/web/loading.gif\" alt=\"Loading...\"/>\n                            </div>\n                        </div>\n                        <div class=\"input-box response-error\"></div>\n                    </form>\n                </div>\n            </div>\n            <div class=\"game-container hidden\">\n                <!--\n                @NOTE: if you change the \"reldens\" ID also make sure to update the RELDENS_CLIENT_PARENT and the\n                RELDENS_CLIENT_SCALE_PARENT variables in the .env file.\n                -->\n                <div id=\"reldens\"></div>\n            </div>\n        </div>\n        <div class=\"footer\">\n            <div class=\"copyright\">\n                <a href=\"https://www.dwdeveloper.com/\" alt=\"DwDeveloper\" target=\"_blank\">by DwDeveloper</a>\n            </div>\n        </div>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "theme/default/index.js",
    "content": "/**\n *\n * Reldens - Index\n *\n */\n\nif(window.trustedTypes?.createPolicy){\n    trustedTypes.createPolicy('default', {\n        createHTML: s => s,\n        createScriptURL: s => s\n    });\n}\n\n// to set logger level and trace, this needs to be specified before the game manager is required:\nconst urlParams = new URLSearchParams(window.location.search);\nwindow.RELDENS_LOG_LEVEL = (urlParams.get('logLevel') || 7);\nwindow.RELDENS_ENABLE_TRACE_FOR = Number(urlParams.get('traceFor') || 'emergency,alert,critical');\n// debug events (warning! this will output in the console ALL the event listeners and every event fired):\n// reldens.events.debug = 'all';\n\nconst { GameManager } = require('reldens/client');\nconst { ClientPlugin } = require('../plugins/client-plugin');\n\nlet reldens = new GameManager();\n// @NOTE: you can specify your game server and your app server URLs in case you serve the client static files from\n// a different location.\n// reldens.gameServerUrl = 'wss://localhost:8000';\n// reldens.appServerUrl = 'https://localhost:8000';\nreldens.setupCustomClientPlugin('customPluginKey', ClientPlugin);\nwindow.addEventListener('DOMContentLoaded', () => {\n    reldens.clientStart();\n});\n\n// client event listener example with version display:\nreldens.events.on('reldens.afterInitEngineAndStartGame', () => {\n    reldens.gameDom.getElement('#current-version').innerHTML = reldens.config.client.gameEngine.version+' -';\n});\n\n// demo message removal:\nreldens.events.on('reldens.startGameAfter', () => {\n    reldens.gameDom.getElement('.row-disclaimer')?.remove();\n});\n\nreldens.events.on('reldens.activateRoom', (room) => {\n    room.onMessage('*', (message) => {\n        // @TODO - BETA - Replace 'rski.Bc' by the constant ACTION_SKILL_BEFORE_CAST, standardize events names.\n        // filter skills before the cast message:\n        if('rski.Bc' !== message.act){\n            return;\n        }\n        // skills cold down animation sample:\n        let skillKey = (message.data?.skillKey || '').toString();\n        let skillDelay = Number(message.data?.extraData?.sd || 0);\n        if('' !== skillKey && 0 < skillDelay){\n            let skillElement = reldens.gameDom.getElement('.skill-icon-'+skillKey);\n            if(!skillElement){\n                return;\n            }\n\n            let startTime = Date.now();\n            let endTime = startTime + skillDelay;\n\n            function updateCooldown() {\n                let currentTime = Date.now();\n                let remainingTime = endTime - currentTime;\n                if(0 >= remainingTime){\n                    skillElement.style.setProperty('--angle', '360deg');\n                    skillElement.classList.remove('cooldown');\n                    return;\n                    // stop the animation when time is up.\n                }\n                let progress = (skillDelay - remainingTime) / skillDelay;\n                let angle = progress * 360;\n                skillElement.style.setProperty('--angle', `${angle}deg`);\n                requestAnimationFrame(updateCooldown);\n            }\n\n            skillElement.classList.add('cooldown');\n            skillElement.style.setProperty('--angle', '0deg');\n            updateCooldown();\n        }\n    });\n});\n\n// global access is not actually required, the app can be fully encapsulated:\nwindow.reldens = reldens;\n"
  },
  {
    "path": "theme/default/site.webmanifest",
    "content": "{\n    \"name\": \"Reldens\",\n    \"short_name\": \"Reldens\",\n    \"start_url\": \"/\",\n    \"display\": \"standalone\",\n    \"theme_color\": \"#000000\",\n    \"background_color\": \"#000000\",\n    \"icons\": [\n        {\n            \"src\": \"assets/favicons/android-icon-144x144.png\",\n            \"sizes\": \"144x144\",\n            \"type\": \"image/png\",\n            \"purpose\": \"any\"\n        },\n        {\n            \"src\": \"assets/favicons/android-icon-192x192.png\",\n            \"sizes\": \"192x192\",\n            \"type\": \"image/png\"\n        },\n        {\n            \"src\": \"assets/favicons/android-icon-512x512.png\",\n            \"sizes\": \"512x512\",\n            \"type\": \"image/png\",\n            \"purpose\": \"maskable\"\n        }\n    ]\n}\n"
  },
  {
    "path": "theme/index.js.dist",
    "content": "/**\n *\n * Reldens - NPM Test\n *\n * ServerPlugin initialization and events.\n * This is a test example file on how the server can be initialized.\n *\n */\n\n// required the module:\nconst { ServerManager } = require('reldens/server');\n\n// custom plugin (if you like to implement customizations, do it in the server-plugin):\nconst { ServerPlugin } = require('./theme/plugins/server-plugin');\n// you can find an example of the server file in node_modules/reldens/theme/packages/server-plugin.js\n// create a server instance passing the current root:\nlet appServer = new ServerManager({\n    projectRoot: __dirname, // we need to pass the server root\n    projectThemeName: '{{yourThemeName}}', // if the project theme is not specified then \"default\" will be used\n    jsSourceMaps: '1' === process.env.RELDENS_JS_SOURCEMAPS, // enable JS source maps to debug the client on your IDE\n    cssSourceMaps: '1' === process.env.RELDENS_CSS_SOURCEMAPS,\n    customPlugin: ServerPlugin\n});\n\nconsole.log('TEST - All these are TEST logs that you can remove from your index file.');\n\n// events debug:\n// appServer.events.debug = 'all'; // or any string containing multiple events keys.\n// setup as you need:\nappServer.events.on('reldens.serverConfigFeaturesReady', (props) => {\n    console.log('TEST - Events test reldens.serverConfigFeaturesReady success!');\n});\n\n// blocked admin actions test (remove to enable the admin actions):\nif('1' === process.env.RELDENS_BLOCKED_ADMIN){\n    appServer.events.on('reldens.afterCreateAdminManager', (event) => {\n        console.log('DEMO - Hardcoded event to disable CRUD Administration Panel.');\n        let blackList = [];\n        for(let driverResource of event.serverManager.serverAdmin.resources){\n            let entityRoute = '/'+driverResource.entityPath;\n            blackList.push(entityRoute + event.serverManager.serverAdmin.savePath);\n            blackList.push(entityRoute + event.serverManager.serverAdmin.deletePath);\n        }\n        event.serverManager.serverAdmin.blackList['1'] = blackList; // block registered users\n        event.serverManager.serverAdmin.blackList['2'] = blackList; // block guest users\n        event.serverManager.serverAdmin.blackList['99'] = blackList; // block admin users\n    });\n    // custom users authentication test:\n    appServer.events.on('reldens.roomLoginOnAuth', (props) => {\n        // deny login for users the incorrect role:\n        if(4 === props.loginResult.user.role_id){\n            props.result.confirm = false;\n        }\n    });\n}\n\n// run the server!\nconsole.log('TEST - ServerPlugin starting...');\nappServer.createServers().then(() => {\n    console.log('TEST - CREATED APP SERVER INSTANCE!');\n    appServer.start().then(() => {\n        console.log('TEST - SERVER UP AND RUNNING!');\n    }).catch((err) => {\n        console.log('TEST - ServerPlugin error:', err);\n        process.exit();\n    });\n});\n"
  },
  {
    "path": "theme/plugins/bot.js",
    "content": "/**\n *\n * Reldens - Load Test Bot\n *\n * Run with:\n * withMovement=3000 withChat=10000 node theme/plugins/bot.js --numClients 50 --room reldens-bots-forest --endpoint http://localhost:8080 --output ./logs/bots-console.log\n */\n\nconst { ConfigManager } = require('reldens/lib/config/client/config-manager');\nconst { ChatConst } = require('reldens/lib/chat/constants');\nconst { GameClient } = require('reldens/lib/game/client/game-client');\nconst { GameConst } = require('reldens/lib/game/constants');\nconst { sc } = require('@reldens/utils');\nlet botsCounter = 1;\nlet startTimer = new Date().getTime();\n\nasync function main (options)\n{\n\n    let chatIntervalMs = Number(process.env.withChat || 0);\n    let movementIntervalMs = Number(process.env.withMovement || 0);\n    let randomGuestName = 'guest-bot-'+sc.randomChars(12);\n    console.log('Running bot #'+botsCounter+' - User \"'+randomGuestName+'\".', {movementIntervalMs, chatIntervalMs});\n    botsCounter++;\n    let botTimer = new Date().getTime();\n    console.log('Time between bots: '+(botTimer - startTimer));\n    startTimer = botTimer;\n\n    let userData = {\n        isGuest: true,\n        isNewUser: true,\n        username: randomGuestName,\n        password: randomGuestName,\n    };\n\n    let gameClient = new GameClient(options.endpoint, new ConfigManager());\n    let gameRoom = await gameClient.joinOrCreate('room_game', userData);\n\n    console.log('Joined GameRoom \"'+gameRoom.roomId+'\" successfully!', randomGuestName);\n\n    function createPlayer(gameMessage)\n    {\n        userData.password = gameMessage.guestPassword;\n        gameRoom.send('*', {\n            act: GameConst.CREATE_PLAYER,\n            formData: {\n                'new-player-name': randomGuestName + '-player',\n                'class_path_select': '1',\n                'selectedScene': options.roomName\n            }\n        });\n    }\n\n    async function joinBootsRoom(canMove)\n    {\n        let reldensBootsRoom = await gameClient.joinOrCreate(options.roomName, userData);\n        console.log('Joining room \"'+options.roomName+'\" (ID \"'+gameRoom.roomId+'\"): '+userData.username);\n        return new Promise((resolve) => {\n            reldensBootsRoom.onStateChange.once((state) => {\n                if(!state.players || !state.players.has){\n                    console.log('State synced but players collection not ready:', randomGuestName);\n                    resolve({reldensBootsRoom, canMove});\n                    return;\n                }\n                console.log('State synced, player ready:', randomGuestName);\n                reldensBootsRoom.onMessage('*', async (roomMessage) => {\n                    // console.log('Message from ReldensBots', roomMessage.act);\n                    if(GameConst.GAME_OVER === roomMessage.act){\n                        // console.log('Player is dead: '+randomGuestName+'.');\n                        canMove = false;\n                    }\n                    if(GameConst.REVIVED === roomMessage.act){\n                        // console.log('Player was revived: '+randomGuestName+' at: '+((new Date()).getTime())+'.');\n                        canMove = true;\n                    }\n                });\n                resolve({reldensBootsRoom, canMove});\n            });\n        });\n    }\n\n    async function initializeChatMessages(reldensBootsRoom)\n    {\n        if(0 < chatIntervalMs){\n            setInterval(() => {\n                // send a general chat message on the room:\n                reldensBootsRoom?.send('*', {\n                    act: ChatConst.CHAT_ACTION,\n                    m: 'Hello ' + userData.username + '! This is a load test bot message. Date: ' + (new Date()).getTime()\n                });\n            }, chatIntervalMs);\n        }\n    }\n\n    function initializeMovement(canMove, reldensBootsRoom)\n    {\n        if(0 < movementIntervalMs){\n            setInterval(() => {\n                if(!canMove){\n                    // console.log('Player \"'+userData.username+'\" is dead.');\n                    return;\n                }\n                // start moving the player:\n                reldensBootsRoom?.send('*', {\n                    dir: sc.randomValueFromArray([GameConst.LEFT, GameConst.RIGHT, GameConst.DOWN, GameConst.UP])\n                });\n                // stop moving the player:\n                setTimeout(() => {\n                    reldensBootsRoom?.send('*', {act: GameConst.STOP});\n                }, 1000);\n            }, movementIntervalMs);\n        }\n    }\n\n    gameRoom.onMessage('*', async (gameMessage) => {\n        if(gameMessage.error){\n            console.log(gameMessage.error);\n            return false;\n        }\n\n        if(GameConst.START_GAME === gameMessage.act){\n            createPlayer(gameMessage);\n        }\n\n        if(GameConst.CREATE_PLAYER_RESULT === gameMessage.act){\n            userData.isNewUser = false;\n            userData.selectedPlayer = gameMessage.player.id;\n            userData.selectedScene = options.roomName;\n            let canMove = true;\n\n            let joinResult = await joinBootsRoom(canMove);\n            let reldensBootsRoom = joinResult.reldensBootsRoom;\n            canMove = joinResult.canMove;\n\n            await initializeChatMessages(reldensBootsRoom);\n\n            initializeMovement(canMove, reldensBootsRoom);\n        }\n    });\n\n}\n\n(async () => {\n    let loadtest = await import('@colyseus/loadtest');\n    loadtest.cli(main);\n})();\n"
  },
  {
    "path": "theme/plugins/client-plugin.js",
    "content": "/**\n *\n * Reldens - Theme - Client Plugin\n *\n */\n\nconst { PluginInterface } = require('reldens/lib/features/plugin-interface');\nconst { Npc1 } = require('./objects/client/npc1');\n\nclass ClientPlugin extends PluginInterface\n{\n\n    setup(props)\n    {\n        this.events = props.events;\n        this.events.on('reldens.beforeJoinGame', (props) => {\n            this.defineCustomClasses(props);\n        });\n    }\n\n    defineCustomClasses(props)\n    {\n        // example on how to define a custom class with a plugin:\n        let customClasses = props.gameManager.config.client.customClasses;\n        if(!customClasses['objects']){\n            customClasses.objects = {};\n        }\n        customClasses.objects['people_town_1'] = Npc1;\n    }\n\n}\n\nmodule.exports.ClientPlugin = ClientPlugin;\n"
  },
  {
    "path": "theme/plugins/objects/client/npc1.js",
    "content": "/**\n *\n * Reldens - Npc1\n *\n * Custom animation object sample.\n *\n */\n\nconst { AnimationEngine } = require('reldens/lib/objects/client/animation-engine');\n\nclass Npc1 extends AnimationEngine\n{\n\n    constructor(gameManager, props, currentPreloader)\n    {\n        // @TODO - BETA - This is an example of client side customizations.\n        super(gameManager, props, currentPreloader);\n    }\n\n}\n\nmodule.exports.Npc1 = Npc1;\n"
  },
  {
    "path": "theme/plugins/objects/server/healer.js",
    "content": "/**\n *\n * Reldens - Healer\n *\n * This is an example object class, it extends from the NpcObject class and then define the specific parameters for the\n * behavior and animations.\n *\n */\n\nconst { NpcObject } = require('reldens/lib/objects/server/object/type/npc-object');\nconst { GameConst } = require('reldens/lib/game/constants');\n\nclass Healer extends NpcObject\n{\n\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        let superResult = await super.executeMessageActions(client, data, room, playerSchema);\n        if(false === superResult){\n            return false;\n        }\n        let givePotions = true;\n        let selectedOption = ((this.options[data.value] || {})?.value || '').toString();\n        if('' === selectedOption){\n            return false;\n        }\n        if('1' === selectedOption){\n            givePotions = false;\n            this.restoreHp(room, playerSchema, client);\n        }\n        if('3' === selectedOption){\n            givePotions = false;\n            this.restoreMp(playerSchema, room, client);\n        }\n        if(givePotions){\n            await this.giveRewards(playerSchema, client);\n        }\n    }\n\n    restoreMp(playerSchema, room, client)\n    {\n        // update and save the player:\n        playerSchema.stats.mp = playerSchema.statsBase.mp;\n        room.savePlayerStats(playerSchema, client).then(() => {\n            // update ui box:\n            let activationData = {act: GameConst.UI, id: this.id, content: 'Your MP points has been restored!'};\n            // update the target:\n            client.send('*', activationData);\n        }).catch((err) => {\n            console.log(err);\n        });\n    }\n\n    restoreHp(room, playerSchema, client)\n    {\n        // update and save the player:\n        let affectedProperty = room.config.get('client/actions/skills/affectedProperty');\n        playerSchema.stats[affectedProperty] = playerSchema.statsBase[affectedProperty];\n        room.savePlayerStats(playerSchema, client).then(() => {\n            // update ui box:\n            let activationData = {act: GameConst.UI, id: this.id, content: 'Your HP points has been restored!'};\n            // update the target:\n            client.send('*', activationData);\n        }).catch((err) => {\n            console.log(err);\n        });\n    }\n\n    async giveRewards(playerSchema, client)\n    {\n        let healPotion = playerSchema.inventory.manager.createItemInstance('heal_potion_20');\n        let magicPotion = playerSchema.inventory.manager.createItemInstance('magic_potion_20');\n        let result = await playerSchema.inventory.manager.addItems([healPotion, magicPotion]);\n        if(!result){\n            console.log('Error while adding items.', {result, playerSchema});\n            let contentMessage = 'Sorry, I was not able to give you any items, contact the administrator.';\n            client.send('*', {act: GameConst.UI, id: this.id, content: contentMessage});\n            return false;\n        }\n        let responseMessage = 'Then I will give you some items for later, you never know...';\n        let activationData = {act: GameConst.UI, id: this.id, content: responseMessage};\n        client.send('*', activationData);\n        return true;\n    }\n}\n\nmodule.exports.Healer = Healer;\n"
  },
  {
    "path": "theme/plugins/objects/server/quest-npc.js",
    "content": "/**\n *\n * Reldens - Quest NPC\n *\n * This is an example object class, it extends from the NpcObject class and then define the specific parameters for the\n * behavior and animations.\n *\n */\n\nconst { NpcObject } = require('reldens/lib/objects/server/object/type/npc-object');\nconst { GameConst } = require('reldens/lib/game/constants');\n\nclass QuestNpc extends NpcObject\n{\n\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        let superResult = await super.executeMessageActions(client, data, room, playerSchema);\n        if(false === superResult){\n            return false;\n        }\n        let selectedOption = this.options[data.value];\n        if(!selectedOption){\n            return false;\n        }\n        if('' === (selectedOption.value).toString()){\n            return;\n        }\n        if('2' === (selectedOption.value).toString()){\n            client.send('*', {act: GameConst.CLOSE_UI_ACTION, id: this.id});\n            return true;\n        }\n        // check the amount of coins:\n        let coinsItem = playerSchema.inventory.manager.findItemByKey('coins');\n        if(false !== coinsItem && 10 <= coinsItem.qty){\n            let contentMessage = 'You have too many already.';\n            client.send('*', {act: GameConst.UI, id: this.id, content: contentMessage});\n            return false;\n        }\n        // check and remove a tree branch if possible:\n        let treeItem = playerSchema.inventory.manager.findItemByKey('branch');\n        if(false === treeItem){\n            let contentMessage = 'You do not have any tree branches!';\n            client.send('*', {act: GameConst.UI, id: this.id, content: contentMessage});\n            return false;\n        }\n        let removeResult = await playerSchema.inventory.manager.decreaseItemQty(treeItem.uid, 1);\n        if(false === removeResult){\n            console.log(`Error while adding item \"${selectedOption.key}\"`);\n            let contentMessage = 'Sorry, I was not able to remove the required item, contact the administrator.';\n            client.send('*', {act: GameConst.UI, id: this.id, content: contentMessage});\n            return false;\n        }\n        // add the new coin:\n        coinsItem = playerSchema.inventory.manager.createItemInstance('coins');\n        if(false === await playerSchema.inventory.manager.addItem(coinsItem)){\n            console.log(`Error while adding item \"${selectedOption.key}\"`);\n            let contentMessage = 'Sorry, I was not able to give you the item, contact the administrator.';\n            client.send('*', {act: GameConst.UI, id: this.id, content: contentMessage});\n            return false;\n        }\n        let activationData = {act: GameConst.UI, id: this.id, content: 'All yours!'};\n        client.send('*', activationData);\n        return true;\n    }\n\n}\n\nmodule.exports.QuestNpc = QuestNpc;\n"
  },
  {
    "path": "theme/plugins/objects/server/weapons-master.js",
    "content": "/**\n *\n * Reldens - Merchant\n *\n * This is an example object class, it extends from the NpcObject class and then define the specific parameters for the\n * behavior and animations.\n *\n */\n\nconst { NpcObject } = require('reldens/lib/objects/server/object/type/npc-object');\nconst { GameConst } = require('reldens/lib/game/constants');\n\nclass WeaponsMaster extends NpcObject\n{\n\n    async executeMessageActions(client, data, room, playerSchema)\n    {\n        let superResult = await super.executeMessageActions(client, data, room, playerSchema);\n        if(false === superResult){\n            return false;\n        }\n        let selectedOption = this.options[data.value];\n        if(!selectedOption){\n            return false;\n        }\n        if(playerSchema.inventory.manager.findItemByKey(selectedOption.key)){\n            let contentMessage = 'You already have the item.';\n            client.send('*', {act: GameConst.UI, id: this.id, content: contentMessage});\n            return false;\n        }\n        let itemObj = playerSchema.inventory.manager.createItemInstance(selectedOption.key);\n        if(false === await playerSchema.inventory.manager.addItem(itemObj)){\n            console.log(`Error while adding item \"${selectedOption.key}\" on \"${this.key}\".`);\n            let contentMessage = 'Sorry, I was not able to give you the item, contact the admin.';\n            client.send('*', {act: GameConst.UI, id: this.id, content: contentMessage});\n            return false;\n        }\n        let contentMessage = 'Do not forget to equip your new '+selectedOption.label+' before go to the battle.';\n        client.send('*', {act: GameConst.UI, id: this.id, content: contentMessage});\n    }\n\n}\n\nmodule.exports.WeaponsMaster = WeaponsMaster;\n"
  },
  {
    "path": "theme/plugins/server-plugin.js",
    "content": "/**\n *\n * Reldens - Theme - Server Plugin\n *\n */\n\nconst { Healer } = require('./objects/server/healer');\nconst { QuestNpc } = require('./objects/server/quest-npc');\nconst { WeaponsMaster } = require('./objects/server/weapons-master');\nconst { PluginInterface } = require('reldens/lib/features/plugin-interface');\n\nclass ServerPlugin extends PluginInterface\n{\n\n    setup(props)\n    {\n        this.events = props.events;\n        this.events.on('reldens.beforeInitializeManagers', (props) => {\n            this.defineCustomClasses(props);\n        });\n    }\n\n    defineCustomClasses(props)\n    {\n        let customClasses = props.serverManager.configManager.configList.server.customClasses;\n        if(!customClasses['objects']){\n            customClasses.objects = {};\n        }\n        if(!customClasses['roomsClass']){\n            customClasses.roomsClass = {};\n        }\n        // @TODO - BETA - Clean up all the custom classes, by default these can be all default objects with all the\n        //   data coming from the storage. Leave just a custom class as sample like the \"Npc1\" on the client-plugin.\n        customClasses.objects['npc_2'] = Healer;\n        customClasses.objects['npc_4'] = WeaponsMaster;\n        customClasses.objects['npc_5'] = QuestNpc;\n    }\n\n}\n\nmodule.exports.ServerPlugin = ServerPlugin;\n"
  }
]