Advertisement
Guest User

Untitled

a guest
Jul 25th, 2017
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 141.22 KB | None | 0 0
  1. {"success":{"puzzle":{"chatRoom":"wondev-woman","title":"Wondev Woman","previewBinaryId":13495065201583,"id":329,"leaderboardPublicId":"wondev-woman","hints":[],"level":"multi","handle":"wondev-woman","detailsPageUrl":"/multiplayer/bot-programming/wondev-woman"},"testType":"PUZZLE","currentQuestion":{"hasActivityInCurrentDivision":true,"arena":{"arenaCodinGamer":{"arenaId":20,"divisionId":130,"roomIndex":0,"codinGamerId":832306,"eligibleForPromotion":false},"division":{"arenaId":20,"divisionId":130,"creationTime":1499847718478,"lastPromotionTime":1501005471001,"promotionInterval":10800,"divisionIndex":4,"sameRules":true,"resetCode":false},"id":20,"league":{"divisionIndex":4,"divisionCount":7,"openingLeaguesCount":2,"openingDate":1501084800000},"timeToPromotion":7428463},"hasAgent":true,"question":{"nbPlayersMin":2,"nbPlayersMax":2,"viewer":"/*\n * #########################################################\n * #### ####\n * #### EDIT FROM HERE ####\n * #### ####\n * #########################################################\n */\n\n/**\n * Shorthand function to get a random integer in [0;a[ or [a;b[\n */\nfunction randInt(a, b) {\n if (b \u0026\u0026 b \u003e a)\n return a + Math.floor(Math.random() * (b - a));\n return Math.floor(Math.random() * a);\n}\n\n/**\n * Gets the number from [a;b] at percentage u\n */\nfunction lerp(a, b, u) {\n if (a \u003c\u003d b) {\n return a + (b - a) * u;\n } else {\n return b + (a - b) * (1 - u);\n }\n}\n\n/**\n * Gets the percentage position in [a;b] of number v\n */\nfunction unlerpUnclamped(a, b, v) {\n return (v - a) / (b - a);\n}\n\nfunction lerpColor(start, end, amount) {\n var from \u003d {\n r: (start \u0026 0xFF0000) \u003e\u003e 16,\n g: (start \u0026 0x00FF00) \u003e\u003e 8,\n b: (start \u0026 0x0000FF)\n };\n var to \u003d {\n r: (end \u0026 0xFF0000) \u003e\u003e 16,\n g: (end \u0026 0x00FF00) \u003e\u003e 8,\n b: (end \u0026 0x0000FF)\n };\n var result \u003d {\n r: lerp(from.r, to.r, amount) \u003c\u003c 16,\n g: lerp(from.g, to.g, amount) \u003c\u003c 8,\n b: lerp(from.b, to.b, amount)\n };\n return result.r | result.g | result.b;\n}\n\n/**\n * Gets the angle between start \u0026 end at percentage amount\n */\nfunction lerpAngle(start, end, amount, maxDelta) {\n while (end \u003e start + Math.PI)\n end -\u003d Math.PI * 2;\n while (end \u003c start - Math.PI)\n end +\u003d Math.PI * 2;\n var value;\n if (maxDelta !\u003d\u003d undefined \u0026\u0026 Math.abs(end - start) \u003e maxDelta) {\n value \u003d end;\n } else {\n value \u003d (start + ((end - start) * amount));\n }\n return (value % (Math.PI * 2));\n}\n\n/**\n * Gets the x,y coordinate between 2 points at percentage p\n */\nfunction lerpPosition(from, to, p) {\n return {\n x: lerp(from.x, to.x, p),\n y: lerp(from.y, to.y, p)\n };\n}\n\n/**\n * Gets the percentage position in [a;b] of number v, clamped into [0;1]\n */\nfunction unlerp(a, b, v) {\n return Math.min(1, Math.max(0, unlerpUnclamped(a, b, v)));\n}\n\n/**\n * Constant for physics values\n */\nvar PER_SEC \u003d 1 / 1000;\n\nvar Drawer \u003d function () {\n this.debugMode \u003d false;\n this.toDestroy \u003d [];\n};\n\nDrawer.requirements \u003d {\n PIXI: \u0027PIXI4\u0027\n};\nDrawer.VERSION \u003d 2;\nDrawer.WIDTH \u003d 1920;\nDrawer.HEIGHT \u003d 1080;\nDrawer.CENTER \u003d {\n x: 0.5,\n y: 0.5,\n};\n\nDrawer.prototype.destroy \u003d function () {\n if (this.alreadyLoaded) {\n this.renderer.destroy();\n this.endCallback \u003d null;\n }\n this.destroyed \u003d true;\n};\n\nDrawer.prototype.destroyScene \u003d function (scope) {\n for (var i \u003d 0, l \u003d this.toDestroy.length; i \u003c l; ++i) {\n var texture \u003d this.toDestroy[i];\n texture.destroy(true);\n }\n this.toDestroy \u003d [];\n};\n\n/** Mandatory */\nDrawer.prototype.getGameName \u003d function () {\n return \"WondevWoman\";\n};\n\nDrawer.getGameRatio \u003d function () {\n return Drawer.WIDTH / Drawer.HEIGHT;\n};\n\n/** Mandatory */\nDrawer.prototype.getResources \u003d function () {\n var url \u003d \u0027https://cdn-games.codingame.com/wondev/compressed/\u0027;\n // var url \u003d \u0027/CodeRings/wondev/\u0027;\n return {\n baseUrl: url,\n images: {\n Background_OK: \u0027Background_OK.jpg\u0027,\n logo: \u0027logo.png\u0027\n },\n spines: {},\n sprites: [\u0027poof.json\u0027, \u0027gleam.json\u0027, \u0027sprites.json\u0027, \u0027push.json\u0027],\n fonts: [],\n others: []\n };\n};\n\nDrawer.prototype.getOptions \u003d function () {\n var drawer \u003d this;\n return [{\n get: function () {\n return drawer.debugMode;\n },\n set: function (value) {\n drawer.debugMode \u003d value;\n drawer.setDebug(value);\n },\n title: \u0027DEBUG MODE\u0027,\n values: {\n \u0027ON\u0027: true,\n \u0027OFF\u0027: false\n }\n }];\n};\n\nDrawer.prototype.setDebug \u003d function (v) {\n this.asyncRenderingTime \u003d Drawer.RenderTimeout;\n};\n\n/** Mandatory */\nDrawer.prototype.initPreload \u003d function (scope, container, progress, canvasWidth, canvasHeight) {\n scope.canvasWidth \u003d canvasWidth;\n scope.canvasHeight \u003d canvasHeight;\n\n scope.loaderProgress \u003d new PIXI.Text(\u0027100\u0027, {\n fontSize: (canvasHeight * 0.117),\n fontFamily: \u0027Lato\u0027,\n fontWeight: \u0027900\u0027,\n fill: \u0027white\u0027,\n align: \u0027center\u0027\n });\n\n scope.loaderProgress.anchor.y \u003d 1;\n scope.loaderProgress.anchor.x \u003d 1.3;\n scope.progress \u003d scope.realProgress \u003d progress;\n scope.loaderProgress.position.y \u003d canvasHeight;\n\n scope.progressBar \u003d new PIXI.Graphics();\n container.addChild(scope.progressBar);\n container.addChild(scope.loaderProgress);\n};\n\n/** Mandatory */\nDrawer.prototype.preload \u003d function (scope, container, progress, canvasWidth, canvasHeight, obj) {\n scope.progress \u003d progress;\n};\n\n/** Mandatory */\nDrawer.prototype.renderPreloadScene \u003d function (scope, step) {\n var stepFactor \u003d Math.pow(0.998, step);\n scope.realProgress \u003d stepFactor * scope.realProgress + (1 - stepFactor) * scope.progress;\n scope.loaderProgress.text \u003d ((scope.realProgress * 100).toFixed(0));\n scope.loaderProgress.position.x \u003d scope.realProgress * scope.canvasWidth;\n\n scope.progressBar.clear();\n\n scope.progressBar.beginFill(0x0, 1);\n scope.progressBar.drawRect(0, 0, scope.canvasWidth * scope.realProgress + 1, scope.canvasHeight);\n scope.progressBar.endFill();\n\n scope.progressBar.beginFill(0x3f4446, 1);\n scope.progressBar.drawRect(scope.canvasWidth * scope.realProgress, 0, scope.canvasWidth, scope.canvasHeight);\n scope.progressBar.endFill();\n return true;\n};\n\n\n/** Mandatory */\nDrawer.prototype.initDefaultScene \u003d function (scope, container, canvasWidth, canvasHeight) {\n var scene \u003d new Drawer.PIXI.Container();\n\n var logo \u003d Drawer.PIXI.Sprite.fromFrame(\u0027logo\u0027);\n logo.anchor.x \u003d logo.anchor.y \u003d 0.5;\n logo.x \u003d Drawer.WIDTH / 2;\n logo.y \u003d 340;\n scope.logo \u003d logo;\n\n scene.scale.x \u003d canvasWidth / 1920;\n scene.scale.y \u003d canvasHeight / 1080;\n scene.addChild(logo);\n\n var demoContainer \u003d new Drawer.PIXI.Container();\n\n this.initDefaultFrames(Drawer.DEMO.playerCount, Drawer.DEMO.frames, Drawer.DEMO.agents);\n /** **************************************************************************************************************************************** */\n this.preconstructScene(this.initData, this.scope, demoContainer, this.initWidth, this.initHeight);\n this.initScene(this.scope, demoContainer, this.frames, true);\n this.updateScene(this.scope, this.question, this.frames, this.currentFrame, this.progress, 1, this.reasons[this.currentFrame], true);\n /** **************************************************************************************************************************************** */\n this.currentFrame \u003d -1;\n container.addChild(demoContainer);\n container.addChild(scene);\n\n scope.demo \u003d demoContainer;\n scope.demotime \u003d 0;\n scope.updateTime \u003d 0;\n scope.frameTime \u003d 0;\n};\n\nDrawer.prototype.initDefaultFrames \u003d function (playerCount, frames, agents) {\n var drawer \u003d this;\n var loader \u003d new Drawer.PIXI.loaders.Loader(window.location.origin);\n\n this.playerInfo \u003d agents.map(function (agent, index) {\n var agentData \u003d {\n name: agent.name || \u0027Anonymous\u0027,\n color: drawer.parseColor(agent.color),\n number: index,\n index: agent.index,\n type: agent.type,\n isMe: agent.type \u003d\u003d\u003d \u0027CODINGAMER\u0027 \u0026\u0026 agent.typeData.me\n };\n\n return agentData;\n });\n\n var firstFrame \u003d frames[0];\n this._frames \u003d frames;\n this.playerCount \u003d playerCount;\n this.reasons \u003d [];\n this.frames \u003d [];\n\n this.frames.push(this.parseFrame(this.handleInitFrame(firstFrame), true, this.frames, this.initData, this.playerCount));\n for (var i \u003d 1; i \u003c this._frames.length; ++i) {\n var temp \u003d this._frames[i];\n var header \u003d temp[0].split(\" \");\n if (header.length \u003e 2) {\n this.reasons[i] \u003d header[2];\n }\n this.frames.push(this.parseFrame(temp.slice(1, -1), header[0] \u003d\u003d \u0027KEY_FRAME\u0027, this.frames, this.initData, this.playerCount));\n }\n this.asyncRenderingTime \u003d Drawer.RenderTimeout;\n\n};\n\nDrawer.prototype.getDefaultOverSampling \u003d function () {\n return 2;\n};\nDrawer.prototype.canSwapPlayers \u003d function () {\n return true;\n};\n\n/** Mandatory */\nDrawer.prototype.renderDefaultScene \u003d function (scope, step) {\n step \u003d Math.min(80, step);\n\n this.currentFrame \u003d this.currentFrameTemp || 0;\n\n scope.frameTime +\u003d step * this.getFrameSpeed();\n scope.updateTime +\u003d step;\n scope.demotime +\u003d step / 1000;\n\n var animProgress \u003d Math.max(0, Math.min(1, (scope.demotime - 1) / 0.5));\n scope.logo.alpha \u003d animProgress;\n scope.logo.scale.x \u003d scope.logo.scale.y \u003d 3 - animProgress * 2;\n\n if (scope.demotime \u003e 1.5 \u0026\u0026 scope.demotime \u003c\u003d 2.2) {\n var amplitude \u003d Math.max(0, 1 - (scope.demotime - 1.5) / 0.7) * 15;\n\n scope.shakeZone.x \u003d (Math.random() * 2 - 1) * amplitude;\n scope.shakeZone.y \u003d (Math.random() * 2 - 1) * amplitude;\n } else {\n scope.shakeZone.x \u003d scope.shakeZone.y \u003d 0;\n }\n var updateInterval \u003d 30;\n var frameInterval \u003d 480;\n\n if (scope.updateTime \u003e\u003d updateInterval) {\n scope.updateTime -\u003d updateInterval;\n this.progress \u003d unlerp(0, frameInterval, scope.frameTime);\n this.updateScene(this.scope, this.question, this.frames, this.currentFrame, this.progress, 1, this.reasons[this.currentFrame], true);\n }\n\n if (scope.frameTime \u003e\u003d frameInterval) {\n scope.frameTime -\u003d frameInterval;\n this.currentFrame \u003d (this.currentFrame + 1) % this.frames.length;\n }\n this.renderScene(this.scope, this.question, this.frames, this.currentFrame, this.progress, 1, this.reasons[this.currentFrame], step, true);\n\n this.currentFrameTemp \u003d this.currentFrame;\n this.currentFrame \u003d -1;\n return true;\n};\n\nDrawer.prototype.endDefaultScene \u003d function (scope, step) {\n return true;\n};\n\n/** Mandatory */\nDrawer.prototype.parseInitData \u003d function (question, viewLines, playerCount) {\n var line \u003d 1;\n var size \u003d +viewLines[line++];\n var gameVersion \u003d +viewLines[line++];\n var unitsPerPlayer \u003d +viewLines[line++];\n\n return {\n gameVersion: gameVersion,\n unitsPerPlayer: unitsPerPlayer,\n playerCount: playerCount,\n size: size\n };\n};\n\n/** Mandatory */\nDrawer.prototype.getInitLineCount \u003d function (lines) {\n return +lines[0];\n};\n\n\n\n/** Mandatory */\nDrawer.prototype.parseFrame \u003d function (lines, keyFrame, previousFrames, initData) {\n var frame \u003d {\n keyFrame: keyFrame\n };\n // frame.previous \u003d previousFrames[previousFrames.length - 1] || frame;\n var previous \u003d previousFrames[previousFrames.length - 1] || frame;\n while (!previous.keyFrame) {\n frame.subFrame \u003d previous;\n previous \u003d previous.previous;\n }\n frame.previous \u003d previous;\n\n frame.number \u003d previousFrames.length;\n var line \u003d 0;\n units \u003d [];\n for (var i \u003d 0; i \u003c initData.unitsPerPlayer * initData.playerCount; ++i) {\n var rawUnit \u003d lines[line++].split(\u0027 \u0027);\n var unit \u003d {\n x: +rawUnit[0],\n y: +rawUnit[1],\n pushCode: +rawUnit[2]\n };\n units.push(unit);\n }\n var grid \u003d [];\n for (var y \u003d 0; y \u003c initData.size; ++y) {\n var row \u003d lines[line++];\n grid.push(row);\n }\n var players \u003d [];\n var alivePlayers \u003d 0;\n for (var k \u003d 0; k \u003c 2; ++k) {\n var playerData \u003d lines[line++].split(\u0027;\u0027);\n var rawPlayer \u003d playerData[0].split(\u0027 \u0027);\n var playerMessage \u003d playerData[1];\n var player \u003d {\n score: +rawPlayer[0],\n alive: (rawPlayer[1] \u003d\u003d\u003d \u00271\u0027),\n message: playerMessage\n };\n if (player.alive) {\n alivePlayers++;\n }\n players.push(player);\n }\n\n frame.players \u003d players;\n frame.grid \u003d grid;\n frame.units \u003d units;\n frame.alivePlayers \u003d alivePlayers;\n frame.whoJustPlayed \u003d +lines[line++];\n return frame;\n};\n\n/**\n * Adds pixi instance \u0027child\u0027 to pixi instance \u0027container\u0027 as a display child and as a property named \u0027property\u0027\n * \n * @returns the child instance\n */\nDrawer.prototype.sub \u003d function (container, property, child, at) {\n container[property] \u003d child;\n if (isNaN(at)) {\n container.addChild(child);\n } else {\n container.addChildAt(child, at);\n }\n\n return child;\n};\n\n/**\n * Returns the scale needed to fit (srcWidth, srcHeight) inside (maxWidth, maxHeight)\n */\nDrawer.prototype.fitAspectRatio \u003d function (srcWidth, srcHeight, maxWidth, maxHeight, padding) {\n padding \u003d padding || 0;\n return Math.min(maxWidth / (srcWidth + padding), maxHeight / (srcHeight + padding));\n};\n\n/**\n * Interacts with the developer window. For debug purposes.\n */\nDrawer.prototype.customAction \u003d function (param) {\n var scope \u003d this.scope;\n var d \u003d scope.drawer;\n var width \u003d lerp(0, 1920, param);\n var height \u003d lerp(0, 1080, param);\n var ratio \u003d Math.min(960 / width, 540 / height);\n var canvas \u003d document.getElementsByTagName(\u0027canvas\u0027)[0];\n canvas.width \u003d width;\n canvas.height \u003d height;\n canvas.style.width \u003d width + \"px\";\n canvas.style.height \u003d height + \"px\";\n this.init(canvas, width, height, null, 1 / ratio);\n\n return window.DBG;\n};\n\nDrawer.prototype.preconstructScene \u003d function (initData, scope, container, canvasWidth, canvasHeight) {\n scope.canvasHeight \u003d canvasHeight;\n scope.canvasWidth \u003d canvasWidth;\n\n scope.renderables \u003d [];\n scope.updatables \u003d [];\n\n scope.drawer \u003d this;\n\n scope.time \u003d 0;\n scope.endTime \u003d 0;\n scope.previousFrame \u003d 0;\n scope.previousProgress \u003d 0;\n\n scope.initData \u003d initData;\n scope.playerInfo \u003d this.playerInfo;\n scope.playerMap \u003d {};\n scope.playerMap[scope.playerInfo[0].index] \u003d scope.playerInfo[0];\n scope.playerMap[scope.playerInfo[1].index] \u003d scope.playerInfo[1];\n\n\n\n container.scale.x \u003d canvasWidth / Drawer.WIDTH;\n container.scale.y \u003d canvasHeight / Drawer.HEIGHT;\n\n scope.toPixel \u003d (1 / container.scale.x) * (this.oversampling || 1);\n};\n\n/** Mandatory */\nDrawer.prototype.initScene \u003d function (scope, container, frames, demo) {\n //Game constants\n scope.gameStartPhase \u003d 0;\n scope.gameZone \u003d {\n x: 512,\n y: 167,\n w: 1408 - 513,\n h: 1062 - 167\n };\n scope.unitScale \u003d 0.7;\n scope.unitMaxScale \u003d 1;\n scope.cellSize \u003d 179;\n scope.cellFrames \u003d [\u0027case_0\u0027, \u0027case_1\u0027, \u0027case_2\u0027, \u0027case_3\u0027, \u0027case_4_1\u0027];\n scope.poofFrames \u003d [\u0027anime_apparition0001\u0027, \u0027anime_apparition0002\u0027, \u0027anime_apparition0003\u0027, \u0027anime_apparition0004\u0027, \u0027anime_apparition0005\u0027, \u0027anime_apparition0006\u0027, \u0027anime_apparition0007\u0027, \u0027anime_apparition0008\u0027, \u0027anime_apparition0009\u0027, \u0027anime_apparition0010\u0027, \u0027anime_apparition0011\u0027, \u0027anime_apparition0012\u0027, \u0027anime_apparition0013\u0027, \u0027anime_apparition0014\u0027, \u0027anime_apparition0015\u0027, \u0027anime_apparition0016\u0027, \u0027anime_apparition0017\u0027, \u0027anime_apparition0018\u0027, \u0027anime_apparition0019\u0027, \u0027anime_apparition0020\u0027];\n scope.gleamFrames \u003d [\u0027anime_score0001\u0027, \u0027anime_score0002\u0027, \u0027anime_score0003\u0027, \u0027anime_score0004\u0027, \u0027anime_score0005\u0027, \u0027anime_score0006\u0027, \u0027anime_score0007\u0027, \u0027anime_score0008\u0027, \u0027anime_score0009\u0027, \u0027anime_score0010\u0027, \u0027anime_score0011\u0027, \u0027anime_score0012\u0027, \u0027anime_score0013\u0027, \u0027anime_score0014\u0027, \u0027anime_score0015\u0027, \u0027anime_score0016\u0027, \u0027anime_score0017\u0027, \u0027anime_score0018\u0027, \u0027anime_score0019\u0027, \u0027anime_score0020\u0027, \u0027anime_score0021\u0027, \u0027anime_score0022\u0027, \u0027anime_score0023\u0027, \u0027anime_score0024\u0027, \u0027anime_score0025\u0027];\n scope.pushFrames \u003d [\u0027anime_attaque0001\u0027, \u0027anime_attaque0002\u0027, \u0027anime_attaque0003\u0027, \u0027anime_attaque0004\u0027, \u0027anime_attaque0005\u0027, \u0027anime_attaque0006\u0027, \u0027anime_attaque0007\u0027, \u0027anime_attaque0008\u0027, \u0027anime_attaque0009\u0027, \u0027anime_attaque0010\u0027];\n\n var tooltip;\n if (!demo) {\n scope.end \u003d this.createEndScene(scope, frames[frames.length - 1]);\n tooltip \u003d this.createTooltip(scope);\n }\n\n // Layering\n var background \u003d this.createBackground(scope);\n var grid \u003d this.createGrid(scope, frames, demo);\n var units \u003d this.createUnits(scope, demo);\n var gleams \u003d this.createGleams(scope);\n var pushes \u003d this.createPushes(scope);\n var hud \u003d this.createHud(scope);\n var game \u003d scope.game \u003d new PIXI.Container();\n\n game.x \u003d scope.gameZone.x;\n game.y \u003d scope.gameZone.y;\n game.scale.x \u003d scope.gameZone.w / (scope.initData.size * scope.cellSize);\n game.scale.y \u003d scope.gameZone.h / (scope.initData.size * scope.cellSize);\n\n game.addChild(grid);\n game.addChild(gleams);\n game.addChild(units);\n game.addChild(pushes);\n container.addChild(background);\n container.addChild(game);\n container.addChild(hud);\n if (!demo) {\n container.addChild(tooltip);\n container.addChild(scope.end);\n }\n scope.shakeZone \u003d container;\n};\n\nDrawer.prototype.createTooltip \u003d function (scope) {\n var tooltip \u003d scope.tooltip \u003d new PIXI.Container();\n var background \u003d this.sub(tooltip, \u0027background\u0027, new PIXI.Graphics());\n var label \u003d this.sub(tooltip, \u0027label\u0027, this.generateText(\u0027\u0027, 36, 0xFFFFFF, \u0027left\u0027));\n\n\n background.beginFill(scope.hudColor, scope.hudAlpha);\n background.drawRect(0, 0, 200, 185);\n background.endFill();\n background.x \u003d -10;\n background.y \u003d -10;\n//TODO: error when moving from 4,4 to 4,5...\n tooltip.pivot.x \u003d 60;\n tooltip.pivot.y \u003d 80;\n\n tooltip.visible \u003d false;\n\n return tooltip;\n};\n\nfunction getMouseMoveFunc(scope) {\n return function (ev) {\n if (scope.tooltip) {\n var point \u003d ev.data.getLocalPosition(scope.drawer.container);\n scope.tooltip.x \u003d point.x;\n scope.tooltip.y \u003d point.y;\n // \u003d(\n var x \u003d Math.floor(lerp(0, scope.initData.size,unlerp(scope.gameZone.x, scope.gameZone.x + scope.gameZone.w, point.x)));\n var y \u003d Math.floor(lerp(0, scope.initData.size,unlerp(scope.gameZone.y, scope.gameZone.y + scope.gameZone.h, point.y)));\n \n scope.tooltip.label.text \u003d \"X: \" + x + \"\\nY: \" + y;\n scope.tooltip.showing \u003d { x: x, y: y };\n scope.tooltip.visible \u003d !!(scope.cells[y] \u0026\u0026 scope.cells[y][x]);\n scope.tooltip.background.width \u003d scope.tooltip.label.width + 20;\n scope.tooltip.background.height \u003d scope.tooltip.label.height + 20;\n\n \n }\n };\n}\n\n\nDrawer.prototype.createGrid \u003d function (scope, frames, demo) {\n var h;\n var layer \u003d new PIXI.Container();\n for (h \u003d 0; h \u003c\u003d 4; ++h) {\n layer.addChild(new PIXI.Container());\n }\n\n scope.cells \u003d [];\n if (!demo) {\n layer.interactive \u003d true;\n layer.mousemove \u003d getMouseMoveFunc(scope);\n }\n var map \u003d frames[0].grid;\n for (var y \u003d 0; y \u003c scope.initData.size; ++y) {\n var row \u003d {};\n for (var x \u003d 0; x \u003c scope.initData.size; ++x) {\n var cell \u003d map[y][x];\n if (cell !\u003d \u0027.\u0027) {\n var pile \u003d [];\n for (h \u003d 0; h \u003c\u003d 4; ++h) {\n var level \u003d PIXI.Sprite.fromFrame(scope.cellFrames[h]);\n pile.push(level);\n level.x \u003d x * scope.cellSize + scope.cellSize / 2;\n level.y \u003d y * scope.cellSize + scope.cellSize / 2;\n layer.getChildAt(h).addChild(level);\n this.anchor(level, Drawer.LEVEL_ANCHOR[h]);\n if (h \u003e 0) {\n var poof \u003d PIXI.extras.AnimatedSprite.fromFrames(scope.poofFrames);\n poof.x \u003d level.x;\n poof.y \u003d level.y;\n this.anchor(poof, Drawer.CENTER);\n level.poof \u003d poof;\n level.poof.loop \u003d false;\n layer.getChildAt(h).addChild(poof);\n }\n\n }\n row[x] \u003d pile;\n\n }\n }\n scope.cells.push(row);\n }\n return layer;\n};\nDrawer.wordWrap \u003d function (text) {\n var wordWrapWidth \u003d this._style.wordWrapWidth;\n var self \u003d this;\n text \u003d text.replace(/\\w+/g, function (text) {\n if (self.context.measureText(text).width \u003e wordWrapWidth) {\n var list \u003d [];\n while (text.length \u003e 0) {\n var length \u003d 1;\n while (length \u003c\u003d text.length \u0026\u0026 self.context.measureText(text.slice(0, length)).width \u003c wordWrapWidth) {\n length++;\n }\n list.push(text.slice(0, length - 1));\n text \u003d text.slice(length - 1);\n }\n return list.join(\u0027\\n\u0027);\n }\n return text;\n });\n return this._wordWrap(text);\n};\n\nDrawer.renderHUD \u003d function (step, scope) {\n var hud \u003d scope.hud;\n for (var k \u003d 0; k \u003c 2; ++k) {\n var show \u003d hud.show[k];\n var stepFactor \u003d Math.pow(0.993 + (0.007 * (scope.speed || 1) / 10), step);\n var targetAlpha \u003d show ? 1 : 0;\n var bubble \u003d hud.bubbles[k];\n var speech \u003d bubble.speech;\n if (targetAlpha \u003d\u003d 1) {\n bubble.alpha \u003d 1;\n } else {\n bubble.alpha \u003d bubble.alpha * stepFactor + targetAlpha * (1 - stepFactor);\n }\n speech.alpha \u003d bubble.alpha;\n }\n\n};\n\nDrawer.prototype.createHud \u003d function (scope) {\n scope.renderables.push({\n render: Drawer.renderHUD\n });\n var layer \u003d new PIXI.Container();\n var swords \u003d new PIXI.Container();\n var hudScale \u003d 1.1;\n layer.addChild(swords);\n scope.hud \u003d {\n show: [],\n scores: [],\n names: [],\n bubbles: []\n };\n for (var k \u003d 0; k \u003c 2; ++k) {\n var sword \u003d PIXI.Sprite.fromFrame(\u0027sword\u0027);\n swords.addChild(sword);\n var totalWidth \u003d Drawer.WIDTH / hudScale;\n if (k \u003d\u003d 1) {\n sword.scale.x \u003d -1;\n sword.x \u003d totalWidth;\n }\n\n var name \u003d scope.playerMap[k].name;\n var color \u003d scope.playerMap[k].color;\n var label \u003d this.generateText(name, 60, color, k \u003d\u003d\u003d 0 ? \u0027left\u0027 : \u0027right\u0027);\n var score \u003d this.generateText(\"0\", 60, color, \u0027center\u0027);\n var avatarContainer \u003d new PIXI.Container();\n var mask \u003d new PIXI.Graphics();\n var avatar \u003d new PIXI.Sprite(scope.playerMap[k].avatar);\n var bubble \u003d PIXI.Sprite.fromFrame(\u0027dial\u0027);\n bubble.alpha \u003d 0;\n\n label.style.strokeThickness \u003d 2 * scope.toPixel;\n score.style.strokeThickness \u003d 2 * scope.toPixel;\n\n var avatarX \u003d 141;\n var scoreX \u003d 232;\n var labelX \u003d 276;\n var bubbleX \u003d 72;\n var avatarWidth \u003d 116;\n mask.beginFill(0, 1);\n mask.drawCircle(avatarWidth / 2, avatarWidth / 2, avatarWidth / 2);\n mask.endFill();\n avatar.width \u003d avatar.height \u003d avatarWidth;\n avatarContainer.x \u003d k \u003d\u003d\u003d 0 ? avatarX : (totalWidth - avatarX);\n avatarContainer.y \u003d 7;\n avatarContainer.pivot.x \u003d avatarWidth / 2;\n avatar.mask \u003d mask;\n score.x \u003d k \u003d\u003d\u003d 0 ? scoreX : (totalWidth - scoreX);\n score.y \u003d 34;\n label.x \u003d k \u003d\u003d\u003d 0 ? labelX : (totalWidth - labelX);\n label.y \u003d 34;\n\n bubble.scale.x \u003d k \u003d\u003d\u003d 0 ? 1 : -1;\n bubble.x \u003d k \u003d\u003d\u003d 0 ? bubbleX : (totalWidth - bubbleX);\n bubble.y \u003d 173;\n var speech \u003d new PIXI.Text(\u0027\u0027, {\n fontFamily: \u0027Lato\u0027,\n fontWeight: 700,\n fontSize: 40,\n fill: color,\n align: \u0027center\u0027,\n wordWrap: true,\n wordWrapWidth: 300\n });\n speech._wordWrap \u003d speech.wordWrap;\n speech.wordWrap \u003d Drawer.wordWrap;\n this.anchor(speech, Drawer.CENTER);\n speech.x \u003d bubble.x + (k \u003d\u003d\u003d 0 ? bubble.width / 2 : -bubble.width / 2);\n speech.y \u003d bubble.y + 68;\n\n bubble.speech \u003d speech;\n\n avatarContainer.addChild(mask);\n avatarContainer.addChild(avatar);\n layer.addChild(avatarContainer);\n layer.addChild(label);\n layer.addChild(score);\n layer.addChild(bubble);\n layer.addChild(speech);\n\n scope.hud.scores.push(score);\n scope.hud.names.push(label);\n scope.hud.bubbles.push(bubble);\n }\n\n this.scale(layer, hudScale);\n return layer;\n};\n\nDrawer.prototype.createBackground \u003d function (scope) {\n var layer \u003d PIXI.Sprite.fromFrame(\u0027Background_OK\u0027);\n return layer;\n};\n\nDrawer.prototype.createPushes \u003d function (scope) {\n var layer \u003d new PIXI.Container();\n scope.pushes \u003d [];\n for (var j \u003d 0; j \u003c scope.initData.playerCount; ++j) {\n for (var k \u003d 0; k \u003c scope.initData.unitsPerPlayer; ++k) {\n var push \u003d PIXI.extras.AnimatedSprite.fromFrames(scope.pushFrames);\n scope.pushes.push(push);\n push.anchor.x \u003d 164 / 500;\n push.anchor.y \u003d 0.4226688102893891;\n\n layer.addChild(push);\n }\n }\n return layer;\n};\n\nDrawer.prototype.createGleams \u003d function (scope) {\n var layer \u003d new PIXI.Container();\n scope.gleams \u003d [];\n for (var j \u003d 0; j \u003c scope.initData.playerCount; ++j) {\n for (var i \u003d 0; i \u003c scope.initData.unitsPerPlayer; ++i) {\n var gleam \u003d PIXI.extras.AnimatedSprite.fromFrames(scope.gleamFrames);\n this.anchor(gleam, Drawer.CENTER);\n\n gleam.loop \u003d false;\n gleam.stop();\n layer.addChild(gleam);\n scope.gleams.push(gleam);\n }\n }\n return layer;\n};\n\nDrawer.renderUnit \u003d function (step, scope) {\n var stepFactor \u003d Math.pow(0.993, step);\n if (scope.gameStartPhase \u003e\u003d 2 \u0026\u0026 scope.speed \u003d\u003d\u003d 0 \u0026\u0026 Math.abs(scope.currentFrame - scope.prevFrame) \u003c\u003d 1) {\n this.x \u003d this.x * stepFactor + this.targetX * (1 - stepFactor);\n this.y \u003d this.y * stepFactor + this.targetY * (1 - stepFactor);\n } else {\n this.x \u003d this.targetX;\n this.y \u003d this.targetY;\n }\n this.debug.x \u003d this.x;\n this.debug.y \u003d this.y;\n};\n\nDrawer.prototype.createUnits \u003d function (scope, demo) {\n var layer \u003d new PIXI.Container();\n scope.units \u003d [];\n\n for (var j \u003d 0; j \u003c scope.initData.playerCount; ++j) {\n for (var i \u003d 0; i \u003c scope.initData.unitsPerPlayer; ++i) {\n var unit \u003d PIXI.Sprite.fromFrame(\u0027Player_\u0027 + (scope.playerInfo[j].index + 1));\n var dark \u003d 0x0;\n var index \u003d this.generateText(i.toString(), 60, dark, \u0027center\u0027);\n index.anchor.y \u003d 0.5;\n var debug \u003d new PIXI.Container();\n var g \u003d new PIXI.Graphics();\n g.lineStyle(scope.toPixel * 3, dark, 1);\n g.beginFill(scope.playerInfo[j].color, 1);\n g.drawCircle(0, 0, 44);\n g.endFill();\n debug.addChild(g);\n debug.addChild(index);\n\n var player \u003d j;\n var color \u003d scope.playerInfo[player].color;\n unit.player \u003d player;\n this.anchor(unit, Drawer.PLAYER_ANCHOR);\n this.scale(unit, scope.unitScale);\n\n unit.debug \u003d debug;\n debug.graphic \u003d g;\n if (scope.initData.unitsPerPlayer \u003e 1 \u0026\u0026 !demo) {\n Object.defineProperty(debug, \u0027visible\u0027, {\n get: this.getIsDebugModeFunc(this)\n });\n Object.defineProperty(unit, \u0027visible\u0027, {\n get: this.getIsDebugModeFunc(this, true)\n });\n } else {\n debug.visible \u003d false;\n }\n scope.renderables.push(unit);\n unit.render \u003d Drawer.renderUnit;\n layer.addChild(unit);\n layer.addChild(debug);\n scope.units.push(unit);\n }\n }\n return layer;\n};\n\nDrawer.prototype.getIsDebugModeFunc \u003d function (drawer, untrue) {\n return function () {\n if (untrue) {\n return !drawer.debugMode;\n }\n return drawer.debugMode;\n }\n};\n\nDrawer.prototype.anchor \u003d function (obj, anchor) {\n obj.anchor.x \u003d anchor.x;\n obj.anchor.y \u003d anchor.y;\n};\n\nDrawer.prototype.scale \u003d function (obj, scale) {\n obj.scale.x \u003d scale;\n obj.scale.y \u003d scale;\n};\n\nDrawer.PLAYER_ANCHOR \u003d {\n x: 57 / 105,\n y: 48 / 105\n};\nDrawer.LEVEL_ANCHOR \u003d [{\n x: 0.5,\n y: 0.5\n}, {\n x: 0.5,\n y: 0.5\n}, {\n x: 88 / 168,\n y: 79 / 168\n}, {\n x: 65.5 / 123,\n y: 58 / 123\n\n}, {\n x: 88 / 169,\n y: 81 / 167\n}];\n\n/**\n * A few transition functions contained within [0,1] on both axes\n */\nDrawer.easeOutQuint \u003d function (t) {\n return 1 + (--t) * t * t * t * t;\n};\nDrawer.easeOutQuad \u003d function (t) {\n return t * (2 - t);\n};\nDrawer.easeOutCubic \u003d function (t) {\n return (--t) * t * t + 1;\n};\n\n\nDrawer.BELL \u003d function (x) {\n return 1 - Math.pow((x - 0.5) * 2, 2);\n};\n\nDrawer.WHOMP \u003d function (x) {\n var n \u003d 0.785398;\n if (x \u003c n) {\n return Drawer.BELL(unlerp(0, n, x)) / 2;\n } else {\n return -Drawer.BELL(unlerp(n, 1, x)) / 4;\n }\n};\n\nDrawer.UNWHOMP \u003d function (x) {\n var n \u003d 1 - 0.785398;\n if (x \u003c n) {\n return -Drawer.BELL(unlerp(0, n, x)) / 4;\n } else {\n return Drawer.BELL(unlerp(n, 1, x));\n }\n};\n\nDrawer.EASE \u003d function (t) {\n return t \u003c 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n};\nDrawer.EASEOUTBOUNCE \u003d function (t) {\n if (t \u003c (1 / 2.75)) {\n return (7.5625 * t * t);\n } else if (t \u003c (2 / 2.75)) {\n return (7.5625 * (t -\u003d (1.5 / 2.75)) * t + 0.75);\n } else if (t \u003c (2.5 / 2.75)) {\n return (7.5625 * (t -\u003d (2.25 / 2.75)) * t + 0.9375);\n } else {\n return (7.5625 * (t -\u003d (2.625 / 2.75)) * t + 0.984375);\n }\n};\nDrawer.TREMOR \u003d function (t) {\n return Math.sin(t * 10) * 0.5 * Math.cos(t * Math.PI / 2);\n}\n\nvar NO_PUSH \u003d 0;\nvar DID_PUSH \u003d 1;\nvar GOT_PUSHED \u003d 2;\n\n\nDrawer.prototype.updateUnits \u003d function (frame, progress, data, scope) {\n var f;\n\n scope.frameSpeed \u003d 1;\n for (var i \u003d 0; i \u003c scope.initData.unitsPerPlayer * scope.initData.playerCount; ++i) {\n var unit \u003d scope.units[i];\n var from \u003d data.previous.units[i];\n var to \u003d data.units[i];\n var fromHeight \u003d +(data.previous.grid[from.y][from.x]);\n var toHeight \u003d +(data.grid[to.y][to.x]);\n var moveP \u003d unlerp(0, 0.5, progress);\n var gleamP \u003d unlerp(0.5, 1, progress);\n var height \u003d lerp(fromHeight, toHeight, moveP);\n var push \u003d scope.pushes[i];\n push.visible \u003d false;\n unit.rotation \u003d 0;\n\n var pos;\n if (to.pushCode \u003d\u003d GOT_PUSHED) {\n var pushP \u003d unlerp(0.5, 1, moveP);\n if (from.x !\u003d to.x || from.y !\u003d to.y) {\n pos \u003d lerpPosition(from, to, Drawer.easeOutQuint(pushP));\n if (moveP \u003c 1) {\n scope.frameSpeed \u003d 0.75;\n }\n height \u003d lerp(fromHeight, toHeight, pushP);\n } else {\n unit.rotation \u003d Math.PI / 8 * Drawer.TREMOR(pushP);\n pos \u003d to;\n }\n } else if (to.pushCode \u003d\u003d DID_PUSH) {\n var idx \u003d 0;\n var pushTarget;\n var finalDest;\n for (var k \u003d 0; k \u003c data.units.length; ++k) {\n if (data.units[k].pushCode \u003d\u003d GOT_PUSHED) {\n pushTarget \u003d data.previous.units[k];\n finalDest \u003d data.units[k];\n }\n }\n var n \u003d 1 - 0.785398 + 0.2;\n var powP \u003d unlerp(n, 1, moveP);\n var pushHeight \u003d +(data.grid[pushTarget.y][pushTarget.x]);\n height \u003d lerp(toHeight, pushHeight, Drawer.BELL(moveP));\n if (powP \u003e 0 \u0026\u0026 powP \u003c 1) {\n push.visible \u003d true;\n push.x \u003d unit.x;\n push.y \u003d unit.y;\n push.rotation \u003d Math.atan2(finalDest.y - to.y, finalDest.x - to.x);\n }\n f \u003d lerp(0, scope.pushFrames.length - 0.01, powP);\n push.gotoAndStop(f);\n\n\n pos \u003d lerpPosition(to, pushTarget, Drawer.UNWHOMP(moveP));\n\n } else {\n pos \u003d lerpPosition(from, to, moveP);\n }\n\n var gleam \u003d scope.gleams[i];\n unit.targetX \u003d pos.x * scope.cellSize + scope.cellSize / 2;\n unit.targetY \u003d pos.y * scope.cellSize + scope.cellSize / 2;\n\n gleam.x \u003d unit.x;\n gleam.y \u003d unit.y;\n\n var scale \u003d lerp(scope.unitScale, scope.unitMaxScale, unlerpUnclamped(0, 4, height));\n if (fromHeight \u003c toHeight \u0026\u0026 (to.pushCode !\u003d GOT_PUSHED)) {\n scale *\u003d 1 + Drawer.BELL(moveP);\n }\n this.scale(unit, scale);\n if (data.previous.players[unit.player].alive \u0026\u0026 !data.players[unit.player].alive) {\n unit.tint \u003d lerpColor(0xFFFFFF, 0x999999, progress);\n unit.rotation \u003d Math.PI / 8 * Drawer.TREMOR(progress);\n } else if (data.players[unit.player].alive) {\n unit.tint \u003d 0xFFFFFF;\n } else {\n unit.tint \u003d 0x999999;\n }\n\n if (toHeight \u003d\u003d 3 \u0026\u0026 data.players[unit.player].score \u003e data.previous.players[unit.player].score \u0026\u0026 (from.x !\u003d to.x || from.y !\u003d to.y)) {\n gleam.visible \u003d progress \u003e\u003d 0.5 \u0026\u0026 progress \u003c 1;\n f \u003d lerp(0, scope.gleamFrames.length - 0.01, gleamP);\n gleam.gotoAndStop(f);\n if (gleam.visible) {\n this.scale(unit, scale + Drawer.WHOMP(gleamP));\n scope.frameSpeed \u003d 0.5;\n }\n } else {\n gleam.visible \u003d false;\n }\n\n // unit.debug.x \u003d unit.x;\n // unit.debug.y \u003d unit.y;\n unit.debug.scale.x \u003d unit.scale.x;\n unit.debug.scale.y \u003d unit.scale.y;\n unit.debug.rotation \u003d unit.rotation;\n unit.debug.graphic.tint \u003d unit.tint;\n\n }\n};\n\nDrawer.prototype.updateHud \u003d function (frame, progress, data, scope) {\n var k;\n var playerMap \u003d {};\n for (k \u003d 0; k \u003c scope.playerInfo.length; ++k) {\n var info \u003d scope.playerInfo[k];\n playerMap[k] \u003d info.index;\n }\n\n for (k \u003d 0; k \u003c 2; ++k) {\n scope.hud.scores[playerMap[k]].text \u003d (progress \u003c\u003d 0.5 ? data.previous : data).players[k].score.toString();\n\n var speech \u003d scope.hud.bubbles[playerMap[k]].speech;\n var message \u003d data.players[k].message;\n this.scale(speech, 1);\n speech.style.wordWrapWidth \u003d 300;\n\n if (message) {\n speech.text \u003d message;\n }\n if (speech.height \u003e 120) {\n this.scale(speech, 120 / speech.height);\n speech.style.wordWrapWidth *\u003d 1 / speech.scale.x;\n var scale \u003d this.fitAspectRatio(speech.width, speech.height, 300, 120, 0);\n speech.scale.x *\u003d scale;\n speech.scale.y *\u003d scale;\n\n\n }\n scope.hud.show[playerMap[k]] \u003d message;\n }\n};\n\nDrawer.prototype.updateGrid \u003d function (frame, progress, data, scope, demo) {\n\n // What cell is being built and when in the frame should the animation be?\n var buildP \u003d 1;\n var from \u003d data;\n var to \u003d data;\n var dark \u003d 0x888888;\n\n if (progress \u003c\u003d 0.5) {\n // Active player moving\n from \u003d data.previous;\n to \u003d data.previous;\n } else {\n // Active player building\n from \u003d data.previous;\n to \u003d data;\n buildP \u003d unlerp(0.5, 1, progress);\n }\n\n for (var y \u003d 0; y \u003c scope.initData.size; ++y) {\n for (var x \u003d 0; x \u003c scope.initData.size; ++x) {\n if (data.grid[y][x] \u003d\u003d\u003d \u0027.\u0027)\n continue;\n var fromHeight \u003d +from.grid[y][x];\n var toHeight \u003d +to.grid[y][x];\n var pile \u003d scope.cells[y][x];\n\n for (var h \u003d 1; h \u003c\u003d 4; ++h) {\n var level \u003d pile[h];\n level.poof.visible \u003d level.poof.playing;\n level.visible \u003d toHeight \u003e\u003d h;\n if (h \u003e\u003d 1 \u0026\u0026 h \u003c\u003d 3 \u0026\u0026 fromHeight \u003d\u003d\u003d 3 \u0026\u0026 toHeight \u003d\u003d 4) {\n level.tint \u003d lerpColor(0xFFFFFF, dark, buildP);\n } else if (h \u003e\u003d 1 \u0026\u0026 h \u003c\u003d 3 \u0026\u0026 toHeight \u003d\u003d 4) {\n level.tint \u003d dark;\n } else {\n level.tint \u003d 0xFFFFFF;\n }\n if (toHeight \u003d\u003d\u003d h \u0026\u0026 fromHeight !\u003d\u003d toHeight) {\n var hit \u003d 0.367;\n level.alpha \u003d unlerp(0, hit, buildP);\n this.scale(level, lerp(2, 1, Drawer.EASEOUTBOUNCE(buildP)));\n if (!demo \u0026\u0026 this.debugMode) {\n for (var k \u003d 0; k \u003c scope.playerInfo.length; ++k) {\n var info \u003d scope.playerInfo[k];\n if (info.index \u003d\u003d\u003d data.whoJustPlayed) {\n if (k \u003d\u003d\u003d 0) {\n level.tint \u003d 0xFFFF00;\n } else {\n level.tint \u003d 0xFF0000;\n }\n }\n }\n }\n if (buildP \u003c hit) {\n level.poof.gotoAndStop(0);\n level.poof.visible \u003d false;\n } else {\n if (!level.poof.playing \u0026\u0026 (scope.currentFrame \u003e scope.previousFrame || scope.currentFrame \u003d\u003d\u003d scope.previousFrame \u0026\u0026 scope.currentProgress \u003e scope.previousProgress)) {\n level.poof.animationSpeed \u003d Math.min(1, (scope.speed * scope.frameSpeed) || 1);\n level.poof.gotoAndPlay(0);\n level.poof.visible \u003d true;\n }\n }\n\n } else {\n level.alpha \u003d 1;\n this.scale(level, 1);\n }\n }\n }\n }\n};\n\n/** Mandatory */\nDrawer.prototype.updateScene \u003d function (scope, question, frames, frameNumber, progress, speed, reason) {\n /** ************************************* */\n /* SYNCHRONOUS */\n /** ************************************* */\n var frame \u003d frames[frameNumber];\n if (scope.gameStartPhase \u003c 2) {\n scope.gameStartPhase++;\n }\n \n scope.prevFrame \u003d (!scope.currentFrame \u0026\u0026 scope.currentFrame !\u003d\u003d 0) ? frameNumber : scope.currentFrame;\n\n if (frameNumber \u003d\u003d\u003d 0) {\n progress \u003d 1;\n }\n\n progress \u003d Math.min(1, progress * 1.2);\n\n scope.currentFrame \u003d frameNumber;\n scope.currentProgress \u003d progress;\n scope.reason \u003d reason;\n scope.speed \u003d speed;\n\n this.updateUnits(frameNumber, progress, frame, scope);\n this.updateGrid(frameNumber, progress, frame, scope);\n this.updateHud(frameNumber, progress, frame, scope);\n\n for (var i \u003d 0; i \u003c scope.updatables.length; ++i) {\n scope.updatables[i].update(frameNumber, progress, frame, scope);\n }\n scope.previousFrame \u003d frameNumber;\n scope.previousProgress \u003d progress;\n};\nDrawer.prototype.createFinisher \u003d function (finisher, scope) {\n var layer \u003d new PIXI.Container();\n\n //text, size, color, align)\n\n var avatarSize \u003d 75 * 2;\n /** ************************************* */\n var avatarContainer \u003d new PIXI.Container();\n avatarContainer.y \u003d 0;\n avatarContainer.x \u003d 0;\n\n var backgroundAvatar \u003d new PIXI.Graphics();\n backgroundAvatar.beginFill(0xffffff);\n backgroundAvatar.alpha \u003d 0.1;\n backgroundAvatar.drawRect(0, 0, 300, 150);\n avatarContainer.addChild(backgroundAvatar);\n\n var avatarBorder \u003d new PIXI.Graphics();\n avatarBorder.lineStyle(1, 0xffffff);\n avatarBorder.alpha \u003d 0.5;\n avatarBorder.drawRect(0, 0, 150, 150);\n avatarContainer.addChild(avatarBorder);\n\n var avatar \u003d new PIXI.Sprite(finisher.player.avatar);\n avatar.width \u003d avatar.height \u003d 150;\n\n var rank \u003d this.generateText(finisher.rank.toString(), 96, finisher.player.color, \u0027center\u0027);\n rank.anchor.y \u003d 0.5;\n rank.position.x \u003d 200;\n rank.position.y \u003d 70;\n avatarContainer.addChild(rank);\n\n var rankLetter \u003d this.generateText(finisher.rank \u003d\u003d 1 ? \u0027ST\u0027 : \u0027ND\u0027.toString(), 42, finisher.player.color, \u0027left\u0027);\n rankLetter.position.x \u003d 230;\n rankLetter.position.y \u003d 40;\n avatarContainer.addChild(rankLetter);\n\n var hudAvatar \u003d new PIXI.Container();\n hudAvatar.addChild(avatar);\n\n avatarContainer.addChild(hudAvatar);\n\n /** ************************************* */\n\n var name \u003d this.generateText(finisher.player.name.toUpperCase(), 64, finisher.player.color, \u0027left\u0027, true);\n var scoreLabel \u003d this.generateText(((finisher.score \u003e\u003d 0) ? finisher.score.toString() : \u0027-\u0027), 90, finisher.player.color, \u0027left\u0027, finisher.player.color, true);\n\n name.x \u003d 330;\n name.y \u003d -4;\n scoreLabel.x \u003d 330;\n scoreLabel.y \u003d 64;\n\n layer.addChild(avatarContainer);\n layer.addChild(name);\n layer.addChild(scoreLabel);\n\n return layer;\n};\n\nDrawer.prototype.createEndScene \u003d function (scope, lastFrame) {\n\n var layer \u003d new PIXI.Container();\n\n var background \u003d new PIXI.Graphics();\n background.beginFill(0, 0.85);\n background.drawRect(0, 0, Drawer.WIDTH, Drawer.HEIGHT);\n background.endFill();\n\n layer.backgroundRanking \u003d background;\n\n\n var titleRanking \u003d new PIXI.Sprite.fromFrame(\u0027logo\u0027);\n titleRanking.anchor.x \u003d titleRanking.anchor.y \u003d 0.5;\n layer.titleRanking \u003d titleRanking;\n\n titleRanking.position.x \u003d Drawer.WIDTH / 2;\n titleRanking.position.y \u003d 240;\n\n var podium \u003d [];\n for (var i \u003d 0; i \u003c scope.initData.playerCount; ++i) {\n podium.push({\n score: lastFrame.players[i].score,\n player: scope.playerInfo[i],\n rank: 0\n });\n }\n podium.sort(function (a, b) {\n return b.score - a.score;\n });\n\n scope.finishers \u003d [];\n var finishers \u003d new PIXI.Container();\n var curRank \u003d 1;\n var elem;\n for (i \u003d 0; i \u003c podium.length; ++i) {\n if (i \u003e 0 \u0026\u0026 podium[i - 1].score !\u003d podium[i].score) {\n curRank++;\n }\n\n podium[i].rank \u003d curRank;\n elem \u003d this.createFinisher(podium[i], scope);\n finishers.addChild(elem);\n scope.finishers.push(elem);\n }\n\n\n\n scope.finishers[0].position.x \u003d (Drawer.WIDTH - scope.finishers[0].width) / 2;\n scope.finishers[1].position.x \u003d (Drawer.WIDTH - scope.finishers[0].width) / 2;\n scope.finishers[1].position.y \u003d 200;\n finishers.y \u003d 380 + 100;\n\n layer.addChild(background);\n layer.addChild(titleRanking);\n layer.addChild(finishers);\n\n\n layer.visible \u003d false;\n return layer;\n};\n\nDrawer.prototype.initEndScene \u003d function (scope, failure) {\n scope.endSceneViewed \u003d false;\n\n if (scope.end) {\n var end \u003d scope.end;\n end.backgroundRanking.alpha \u003d 0;\n end.titleRanking.scale.x \u003d end.titleRanking.scale.y \u003d 10;\n }\n};\n\nDrawer.prototype.destroyEndScene \u003d function (scope) {\n var end \u003d scope.end;\n end.titleRanking.visible \u003d false;\n end.visible \u003d false;\n};\n\nDrawer.prototype.renderEndScene \u003d function (scope, step, failure) {\n var i;\n var endOfEnd \u003d 10000;\n if (scope.endTime \u003d\u003d\u003d 0) {\n this.initEndScene(scope, failure);\n }\n\n var end \u003d scope.end;\n end.visible \u003d true;\n\n var backS \u003d 0;\n var backD \u003d 400;\n var backP \u003d unlerp(backS, backS + backD, scope.endTime);\n end.backgroundRanking.alpha \u003d backP * 0.9;\n\n var logoS \u003d 400;\n var logoD \u003d 600;\n var logoP \u003d unlerp(logoS, logoS + logoD, scope.endTime);\n end.titleRanking.scale.x \u003d end.titleRanking.scale.y \u003d 0.001 + lerp(10, 0.64, logoP);\n end.titleRanking.visible \u003d !!logoP;\n\n var rankS \u003d 1000;\n var rankD \u003d 300;\n for (i \u003d 0; i \u003c scope.finishers.length; ++i) {\n var p \u003d unlerp(rankS + rankD * i, rankS + rankD * i + rankD, scope.endTime);\n scope.finishers[i].alpha \u003d p;\n }\n\n var shakeForceMax \u003d 10;\n var strength \u003d 0.4;\n var shakeTime \u003d 0, shakeP \u003d 0;\n\n if (logoP \u003e\u003d 1) {\n shakeTime \u003d 400;\n shakeP \u003d unlerp(logoS + logoD, logoS + logoD + shakeTime, scope.endTime);\n }\n\n var shakeForce \u003d shakeP ? lerp(shakeForceMax, 0, unlerp(1 - strength, 1, shakeP)) : 0;\n var shakeX \u003d shakeForce * Math.cos(2 * scope.endTime);\n var shakeY \u003d shakeForce * Math.sin(scope.endTime);\n\n // scope.container.x \u003d shakeX;\n // scope.container.y \u003d shakeY;\n // end.backgroundRanking.x \u003d shakeX - 20;\n // end.backgroundRanking.y \u003d shakeY - 20;\n\n scope.endTime +\u003d step;\n\n if (scope.endTime \u003e\u003d endOfEnd \u0026\u0026 !scope.endSceneViewed) {\n if (this.endCallback) {\n this.endCallback();\n }\n scope.endSceneViewed \u003d true;\n }\n};\nDrawer.prototype.renderRenderables \u003d function (step, scope) {\n var next \u003d [];\n for (var i \u003d 0; i \u003c scope.renderables.length; ++i) {\n var updatable \u003d scope.renderables[i];\n var remove \u003d updatable.render(step, scope);\n if (!remove) {\n next.push(updatable);\n }\n }\n scope.renderables \u003d next;\n};\n\n/** Mandatory */\nDrawer.prototype.renderScene \u003d function (scope, question, frames, frameNumber, progress, speed, reason, step, demo) {\n /** ************************************* */\n /* ASYNCHRONOUS */\n /** ************************************* */\n step \u003d Math.min(80, step);\n\n var endFrame \u003d !this.debugMode \u0026\u0026 (frameNumber \u003d\u003d frames.length - 1 \u0026\u0026 progress \u003d\u003d 1);\n\n if (endFrame \u0026\u0026 !demo) {\n this.renderEndScene(scope, step, (reason !\u003d \"Win\"));\n } else {\n if (scope.endTime \u003e 0) {\n this.destroyEndScene(scope);\n }\n scope.endTime \u003d 0;\n }\n\n this.renderRenderables(step, scope);\n\n return true;\n};\n\n/**\n * Optional\n */\nDrawer.prototype.getFrameSpeed \u003d function (frameNumber, playerSpeed) {\n //Will be multiplied by current playerSpeed\n var coeff \u003d 0.5;\n return ((this.scope \u0026\u0026 this.scope.frameSpeed) || 1) * coeff;\n};\n\n/*\n * #########################################################\n * #### ####\n * #### EDIT TO HERE ####\n * #### ####\n * #########################################################\n */\n\nDrawer.RenderTimeout \u003d window.location.origin \u003d\u003d\u003d \"http://localhost\" ? Infinity : 20000;\n\nDrawer.prototype.getCurrentState \u003d function () {\n if (this.loaded \u003e\u003d 1) {\n if (this.currentFrame \u003e\u003d 0) {\n return \u0027game\u0027;\n } else {\n return \u0027startScreen\u0027;\n }\n } else {\n return \u0027loading\u0027;\n }\n};\n\nDrawer.prototype.enableAsyncRendering \u003d function (enabled) {\n this.asyncRendering \u003d enabled;\n this.asyncRenderingTime \u003d Drawer.RenderTimeout;\n};\n\nDrawer.prototype.purge \u003d function () {\n this.scope \u003d {};\n this.changed \u003d true;\n\n this.container.interactiveChildren \u003d false;\n this.container.destroy({\n texture: false,\n children: true\n });\n this.container \u003d null;\n this.container \u003d new PIXI.Container();\n};\n\nDrawer.prototype.reinitScene \u003d function () {\n if (this.loaded \u003e\u003d 1) {\n\n this.destroyScene(this.scope);\n this.purge();\n this.asyncRenderingTime \u003d Drawer.RenderTimeout;\n this.preconstructScene(this.initData, this.scope, this.container, this.initWidth, this.initHeight);\n this.initScene(this.scope, this.container, this.frames);\n this.updateScene(this.scope, this.question, this.frames, this.currentFrame, this.progress, this.speed, this.reasons[this.currentFrame]);\n this.changed \u003d true;\n }\n\n};\n\nDrawer.prototype.reinitDefaultScene \u003d function () {\n if (this.loaded \u003e\u003d 1) {\n this.intro \u003d true;\n this.purge();\n this.asyncRenderingTime \u003d Drawer.RenderTimeout;\n this.initDefaultScene(this.scope, this.container, this.initWidth, this.initHeight);\n this.changed \u003d true;\n }\n};\n\nDrawer.prototype.reinitLoadingScene \u003d function () {\n if (this.loaded \u003c 1) {\n this.purge();\n this.asyncRenderingTime \u003d Drawer.RenderTimeout;\n this.initPreload(this.scope, this.container, this.loaded, this.initWidth, this.initHeight);\n }\n};\n\nDrawer.prototype.reinit \u003d function (force) {\n if (this.loaded \u003e\u003d 1) {\n if (this.currentFrame \u003e\u003d 0 \u0026\u0026 !this.intro) {\n this.reinitScene();\n } else {\n if (!this.intro || force)\n this.reinitDefaultScene();\n }\n } else {\n this.reinitLoadingScene();\n }\n};\n\nDrawer.prototype.animate \u003d function (time) {\n if (this.destroyed) {\n return;\n }\n\n if (!this.lastRenderTime)\n this.lastRenderTime \u003d time;\n var step \u003d time - this.lastRenderTime;\n if (this.asynchronousStep) {\n step \u003d this.asynchronousStep;\n }\n if (this.onBeforeRender) {\n this.onBeforeRender();\n }\n\n //this.asyncRenderingTime \u003d Drawer.RenderTimeout;\n if (this.loaded \u003c 1) {\n this.changed |\u003d this.renderPreloadScene(this.scope, step);\n } else if (this.changed || (this.asyncRendering \u0026\u0026 this.asyncRenderingTime \u003e 0)) {\n if (this.currentFrame \u003c 0) {\n this.changed |\u003d this.renderDefaultScene(this.scope, step);\n } else if (this.intro) {\n this.changed \u003d true;\n if (this.endDefaultScene(this.scope, step)) {\n this.intro \u003d false;\n this.reinit(true);\n }\n } else {\n this.changed |\u003d this.renderScene(this.scope, this.question, this.frames, this.currentFrame, this.progress, this.speed, this.reasons[this.currentFrame], step);\n }\n }\n if (this.changed) {\n this.renderer.render(this.container);\n this.changed \u003d false;\n } else {\n // if (this.renderer.plugins \u0026\u0026 this.renderer.plugins.interaction)\n // this.renderer.plugins.interaction.update();\n }\n if (this.onAfterRender) {\n this.onAfterRender();\n }\n var self \u003d this;\n this.lastRenderTime \u003d time;\n if (!this.destroyed)\n requestAnimationFrame(this.animate.bind(this));\n\n this.asyncRenderingTime -\u003d step;\n};\n\nDrawer.prototype.handleInitFrame \u003d function (frame) {\n this.question \u003d frame[1];\n var header \u003d frame[0].split(\" \");\n this.currentFrame \u003d header[1] | 0;\n this.progress \u003d 1;\n if (header.length \u003e 2)\n this.reasons[0] \u003d header[2];\n frame \u003d frame.slice(2);\n var startLine \u003d this.getInitLineCount(frame);\n this.initView \u003d frame.slice(0, startLine);\n this.initData \u003d this.parseInitData(this.question, this.initView, this.playerCount);\n return frame.slice(startLine, -1);\n};\n\nDrawer.prototype._initFrames \u003d function (playerCount, frames) {\n var firstFrame \u003d frames[0];\n if (firstFrame[0] \u003d\u003d \u0027-1\u0027) {\n this.currentFrame \u003d -1;\n return;\n }\n this._frames \u003d frames;\n this.playerCount \u003d playerCount;\n this.reasons \u003d [];\n this.frames \u003d [];\n this.frames.push(this.parseFrame(this.handleInitFrame(firstFrame), true, this.frames, this.initData));\n for (var i \u003d 1; i \u003c this._frames.length; ++i) {\n var temp \u003d this._frames[i];\n var header \u003d temp[0].split(\" \");\n if (header.length \u003e 2) {\n this.reasons[i] \u003d header[2];\n }\n this.frames.push(this.parseFrame(temp.slice(1, -1), header[0] \u003d\u003d \u0027KEY_FRAME\u0027, this.frames, this.initData));\n }\n\n};\n\nDrawer.prototype.isTurnBasedGame \u003d function () {\n return true;\n};\n\nDrawer.prototype.initFrames \u003d function (frames, agents) {\n if (this.playerInfo) {\n this.playerInfo.forEach(function (playerInfo) {\n if (playerInfo.avatar) {\n playerInfo.avatar.destroy(true);\n }\n });\n }\n\n var drawer \u003d this;\n\n var loader \u003d new PIXI.loaders.Loader(window.location.origin);\n this.playerInfo \u003d agents.map(function (agent, index) {\n var agentData \u003d {\n name: agent.name || \u0027Anonymous\u0027,\n color: drawer.parseColor(agent.color),\n number: index,\n index: agent.index,\n type: agent.type,\n isMe: agent.type \u003d\u003d\u003d \u0027CODINGAMER\u0027 \u0026\u0026 agent.typeData.me,\n avatar: null\n };\n\n loader.add(\u0027avatar\u0027 + index, agent.avatar, { loadType: 2 }, function (event) {\n agentData.avatar \u003d event.texture;\n });\n return agentData;\n });\n this.loading \u003d true;\n loader.on(\u0027complete\u0027, function (loader) {\n drawer._initFrames(agents.length, frames);\n drawer.loading \u003d false;\n drawer.reinit(false);\n });\n loader.on(\u0027error\u0027, function (e) {\n console.warn(e);\n });\n loader.load();\n};\n/*\nDrawer.prototype.initFrames \u003d function(playerCount, frames, playerMapper, playerNames) {\n if (playerNames)\n this.playerNames \u003d playerNames;\n if (playerMapper)\n this.playerMapper \u003d playerMapper;\n this._initFrames(playerCount, frames);\n this.reinit(false);\n};\n*/\nDrawer.prototype.update \u003d function (currentFrame, progress, speed) {\n if (this.currentFrame \u003e\u003d 0) {\n this.asyncRenderingTime \u003d Drawer.RenderTimeout;\n this.changed \u003d true;\n this.speed \u003d speed;\n this.currentFrame \u003d currentFrame;\n this.progress \u003d progress;\n if (this.loaded \u003e\u003d 1 \u0026\u0026 !this.intro) {\n this.updateScene(this.scope, this.question, this.frames, currentFrame, progress, this.speed, this.reasons[this.currentFrame]);\n }\n }\n};\n\nDrawer.prototype.parseColor \u003d function (color) {\n if (Array.isArray(color)) {\n var i;\n var parsedColor \u003d [];\n for (i \u003d 0; i \u003c color.length; ++i) {\n parsedColor.push(this.parseColor(color[i]));\n }\n return parsedColor;\n } else {\n if (color.toUpperCase() \u003d\u003d \u0027#ffae16\u0027.toUpperCase()) {\n color \u003d \u0027#ff8f16\u0027;\n }\n return parseInt(color.substring(1), 16);\n }\n};\n\nDrawer.prototype.init \u003d function (canvas, width, height, colors, oversampling, endCallback) {\n var key;\n PIXI \u003d Drawer.PIXI || PIXI;\n this.oversampling \u003d oversampling || 1;\n this.canvas \u003d $(canvas);\n if (colors)\n this.colors \u003d this.parseColor(colors);\n this.asyncRendering \u003d true;\n this.asyncRenderingTime \u003d 0;\n this.destroyed \u003d false;\n this.asynchronousStep \u003d null;\n var self \u003d this;\n this.initWidth \u003d width | 0;\n this.initHeight \u003d height | 0;\n this.endCallback \u003d endCallback || this.endCallback;\n\n if (!this.alreadyLoaded) {\n this.toDestroy \u003d [];\n this.alreadyLoaded \u003d true;\n // Initialisation\n this.question \u003d null;\n this.scope \u003d null;\n this.currentFrame \u003d -1;\n this.loaded \u003d 0;\n // Engine instanciation\n this.container \u003d new PIXI.Container();\n var resources \u003d this.getResources();\n this.renderer \u003d this.createRenderer(this.initWidth, this.initHeight, canvas);\n var loader \u003d new PIXI.loaders.Loader(resources.baseUrl);\n for (key in resources.images) {\n loader.add(key, resources.images[key]);\n }\n var i;\n for (i \u003d 0; i \u003c resources.sprites.length; ++i) {\n loader.add(resources.sprites[i]);\n }\n for (i \u003d 0; i \u003c resources.fonts.length; ++i) {\n loader.add(resources.fonts[i]);\n }\n for (key in resources.spines) {\n loader.add(key, resources.spines[key]);\n }\n for (i \u003d 0; i \u003c resources.others.length; ++i) {\n loader.add(resources.others[i]);\n }\n\n self.scope \u003d {};\n loader.on(\u0027start\u0027, function (loader, resource) {\n requestAnimationFrame(self.animate.bind(self));\n self.initPreload(self.scope, self.container, self.loaded \u003d 0, self.initWidth, self.initHeight);\n });\n loader.on(\u0027progress\u0027, function (loader, resource) {\n if (loader.progress \u003c 100) {\n self.preload(self.scope, self.container, self.loaded \u003d loader.progress / 100, self.initWidth, self.initHeight, resource);\n }\n });\n\n loader.on(\u0027complete\u0027, function () {\n for (key in resources.images) {\n if (resources.images.hasOwnProperty(key)) {\n PIXI.Texture.addTextureToCache(loader.resources[key].texture, key);\n }\n }\n for (key in resources.spines) {\n if (resources.spines.hasOwnProperty(key)) {\n PIXI.AnimCache[key] \u003d PIXI.AnimCache[resources.baseUrl + resources.spines[key]];\n }\n }\n self.loaded \u003d 1;\n self.reinit(true);\n self.changed \u003d true;\n });\n loader.on(\u0027error\u0027, function (e) {\n console.warn(e);\n });\n loader.load();\n } else {\n this.changed \u003d true;\n this.renderer.resize(this.initWidth, this.initHeight);\n this.reinit(true);\n }\n};\nDrawer.prototype.createRenderer \u003d function (width, height, canvas) {\n return PIXI.autoDetectRenderer(width, height, {\n view: canvas,\n clearBeforeRender: false,\n preserveDrawingBuffer: false\n });\n};\n\n/**\n * Turns a graphic into a texture, saves the texture for later destruction\n */\nDrawer.prototype.generateTexture \u003d function (graphics) {\n var tex \u003d this.renderer.generateTexture(graphics);\n this.toDestroy.push(tex);\n return tex;\n};\n\n/**\n * Creates a Text and keeps the texture for later destruction\n */\nDrawer.prototype.generateText \u003d function (text, size, color, align) {\n\n // var bitmap \u003d size * this.scope.canvasWidth / this.oversampling \u003e\u003d 30 * 960;\n // var bitmap \u003d size * this.scope.canvasWidth / 1 \u003e\u003d 30 * 960;\n var bitmap \u003d false;\n var textEl;\n if (bitmap) {\n textEl \u003d new PIXI.extras.BitmapText(text, {\n font: size + \u0027px agency_80\u0027,\n tint: color\n });\n textEl.lineHeight \u003d size;\n } else {\n textEl \u003d new PIXI.Text(text, {\n fontSize: Math.round(size / 1.2) + \u0027px\u0027,\n fontFamily: \u0027Lato\u0027,\n fontWeight: \u0027bold\u0027,\n fill: color\n });\n textEl.lineHeight \u003d Math.round(size / 1.2);\n }\n if (align \u003d\u003d\u003d \u0027right\u0027) {\n textEl.anchor.x \u003d 1;\n } else if (align \u003d\u003d\u003d \u0027center\u0027) {\n textEl.anchor.x \u003d 0.5;\n }\n return textEl;\n};\n\nDrawer.prototype.isReady \u003d function () {\n return this.loaded \u003e\u003d 1;\n};\n\nDrawer.DEMO \u003d {\n playerCount: 2,\n agents: [{\n index: 0,\n name: \u0027Player 1\u0027,\n avatar: \u0027/servlet/fileservlet?id\u003d\u0027 + 1715936252943 + \u0027\u0026format\u003dviewer_avatar\u0027,\n type: \u0027DEFAULT\u0027,\n color: \u0027#ffae16\u0027,\n typeData: {\n me: true,\n nickname: \u0027Player 1\u0027\n }\n }, {\n index: 1,\n name: \u0027Player 2\u0027,\n avatar: \u0027/servlet/fileservlet?id\u003d\u0027 + 1717001354716 + \u0027\u0026format\u003dviewer_avatar\u0027,\n type: \u0027DEFAULT\u0027,\n color: \u0027#ff1d5c\u0027,\n typeData: {\n me: false,\n nickname: \u0027Player 2\u0027\n }\n }],\n frames: [\n [\n \"KEY_FRAME 0\",\n \"WondevWoman\",\n \"4\",\n \"6\",\n \"2\",\n \"2\",\n \"5 4 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"3 3 0\",\n \"000000\",\n \"000000\",\n \"000000\",\n \"000000\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 1\",\n \"4 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"3 3 0\",\n \"000000\",\n \"000000\",\n \"000000\",\n \"000001\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 2\",\n \"4 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"3 2 0\",\n \"000000\",\n \"000000\",\n \"000010\",\n \"000001\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 3\",\n \"4 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"3 2 0\",\n \"000000\",\n \"000000\",\n \"000011\",\n \"000001\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 4\",\n \"4 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"3 3 0\",\n \"000000\",\n \"000000\",\n \"000011\",\n \"000011\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 5\",\n \"4 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"3 3 0\",\n \"000000\",\n \"000000\",\n \"000011\",\n \"000012\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 6\",\n \"4 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 2 0\",\n \"000000\",\n \"000000\",\n \"000011\",\n \"000112\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 7\",\n \"5 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 2 0\",\n \"000000\",\n \"000000\",\n \"000012\",\n \"000112\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 8\",\n \"5 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"5 2 0\",\n \"000000\",\n \"000000\",\n \"000012\",\n \"000122\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 9\",\n \"4 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"5 2 0\",\n \"000000\",\n \"000000\",\n \"000022\",\n \"000122\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 10\",\n \"4 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 2 0\",\n \"000000\",\n \"000000\",\n \"000022\",\n \"000222\",\n \"000000\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 11\",\n \"5 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 2 0\",\n \"000000\",\n \"000000\",\n \"000022\",\n \"000222\",\n \"000001\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 12\",\n \"5 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 3 0\",\n \"000000\",\n \"000000\",\n \"000022\",\n \"000322\",\n \"000001\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 13\",\n \"4 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 3 0\",\n \"000000\",\n \"000000\",\n \"000022\",\n \"000422\",\n \"000001\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 14\",\n \"4 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"5 3 0\",\n \"000000\",\n \"000000\",\n \"000022\",\n \"000422\",\n \"000002\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 15\",\n \"4 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"5 3 0\",\n \"000000\",\n \"000000\",\n \"000122\",\n \"000422\",\n \"000002\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 16\",\n \"4 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 2 0\",\n \"000000\",\n \"000000\",\n \"000222\",\n \"000422\",\n \"000002\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 17\",\n \"5 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 2 0\",\n \"000000\",\n \"000000\",\n \"000222\",\n \"000422\",\n \"000003\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 18\",\n \"5 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 3 0\",\n \"000000\",\n \"000000\",\n \"000222\",\n \"000422\",\n \"000004\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 19\",\n \"5 3 1\",\n \"4 5 0\",\n \"1 4 0\",\n \"3 4 2\",\n \"000000\",\n \"000000\",\n \"000222\",\n \"000432\",\n \"000004\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 20\",\n \"5 3 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 4 0\",\n \"000000\",\n \"000000\",\n \"000222\",\n \"000442\",\n \"000004\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 21\",\n \"5 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 4 0\",\n \"000000\",\n \"000000\",\n \"000232\",\n \"000442\",\n \"000004\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 22\",\n \"5 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"5 5 0\",\n \"000000\",\n \"000000\",\n \"000232\",\n \"000442\",\n \"000014\",\n \"000000\",\n \"0 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 23\",\n \"4 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"5 5 0\",\n \"000000\",\n \"000000\",\n \"000233\",\n \"000442\",\n \"000014\",\n \"000000\",\n \"1 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 24\",\n \"4 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 4 0\",\n \"000000\",\n \"000000\",\n \"000233\",\n \"000442\",\n \"000014\",\n \"000001\",\n \"1 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 25\",\n \"5 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"4 4 0\",\n \"000000\",\n \"000000\",\n \"000243\",\n \"000442\",\n \"000014\",\n \"000001\",\n \"2 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 26\",\n \"5 2 0\",\n \"4 5 0\",\n \"1 4 0\",\n \"5 3 0\",\n \"000000\",\n \"000000\",\n \"000243\",\n \"000442\",\n \"000024\",\n \"000001\",\n \"2 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 27\",\n \"5 2 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"5 3 0\",\n \"000000\",\n \"000000\",\n \"000243\",\n \"000442\",\n \"000024\",\n \"000011\",\n \"2 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 28\",\n \"5 2 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"4 4 0\",\n \"000000\",\n \"000000\",\n \"000243\",\n \"000442\",\n \"000024\",\n \"000021\",\n \"2 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 29\",\n \"5 3 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"4 4 0\",\n \"000000\",\n \"000000\",\n \"000244\",\n \"000442\",\n \"000024\",\n \"000021\",\n \"2 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 30\",\n \"5 3 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"4 5 0\",\n \"000000\",\n \"000000\",\n \"000244\",\n \"000442\",\n \"000124\",\n \"000021\",\n \"2 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 31\",\n \"4 4 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"4 5 0\",\n \"000000\",\n \"000000\",\n \"000244\",\n \"000443\",\n \"000124\",\n \"000021\",\n \"2 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 32\",\n \"5 3 2\",\n \"5 5 0\",\n \"1 4 0\",\n \"4 5 1\",\n \"000000\",\n \"000000\",\n \"000244\",\n \"000443\",\n \"000134\",\n \"000021\",\n \"2 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 33\",\n \"4 4 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"4 5 0\",\n \"000000\",\n \"000000\",\n \"000244\",\n \"000444\",\n \"000134\",\n \"000021\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 34\",\n \"4 4 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 4 0\",\n \"000000\",\n \"000000\",\n \"000244\",\n \"001444\",\n \"000134\",\n \"000021\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 35\",\n \"4 5 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 4 0\",\n \"000000\",\n \"000000\",\n \"000244\",\n \"001444\",\n \"000144\",\n \"000021\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 36\",\n \"4 5 0\",\n \"5 5 0\",\n \"2 3 0\",\n \"3 4 0\",\n \"000000\",\n \"000000\",\n \"001244\",\n \"001444\",\n \"000144\",\n \"000021\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 37\",\n \"3 5 2\",\n \"5 5 1\",\n \"2 3 0\",\n \"3 4 0\",\n \"000000\",\n \"000000\",\n \"001244\",\n \"001444\",\n \"000144\",\n \"000031\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 38\",\n \"3 5 0\",\n \"5 5 0\",\n \"3 2 0\",\n \"3 4 0\",\n \"000000\",\n \"000000\",\n \"001244\",\n \"002444\",\n \"000144\",\n \"000031\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 39\",\n \"2 4 0\",\n \"5 5 0\",\n \"3 2 0\",\n \"3 4 0\",\n \"000000\",\n \"000000\",\n \"001244\",\n \"012444\",\n \"000144\",\n \"000031\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 40\",\n \"2 4 0\",\n \"5 5 0\",\n \"3 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"001244\",\n \"012444\",\n \"000144\",\n \"000041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 41\",\n \"3 4 0\",\n \"5 5 0\",\n \"3 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"001244\",\n \"012444\",\n \"000144\",\n \"001041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 42\",\n \"3 4 0\",\n \"5 5 0\",\n \"2 3 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"001344\",\n \"012444\",\n \"000144\",\n \"001041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 43\",\n \"3 4 1\",\n \"5 5 0\",\n \"1 2 2\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"001344\",\n \"013444\",\n \"000144\",\n \"001041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 44\",\n \"3 4 0\",\n \"5 5 0\",\n \"2 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"001344\",\n \"014444\",\n \"000144\",\n \"001041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 45\",\n \"2 5 0\",\n \"5 5 0\",\n \"2 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"001344\",\n \"014444\",\n \"000244\",\n \"001041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 46\",\n \"2 5 0\",\n \"5 5 0\",\n \"1 3 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"002344\",\n \"014444\",\n \"000244\",\n \"001041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 47\",\n \"3 4 0\",\n \"5 5 0\",\n \"1 3 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"002344\",\n \"014444\",\n \"000244\",\n \"002041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 48\",\n \"3 4 0\",\n \"5 5 0\",\n \"2 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"002344\",\n \"024444\",\n \"000244\",\n \"002041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 49\",\n \"2 5 0\",\n \"5 5 0\",\n \"2 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"002344\",\n \"024444\",\n \"001244\",\n \"002041\",\n \"3 1;\",\n \"0 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 50\",\n \"2 5 0\",\n \"5 5 0\",\n \"3 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"003344\",\n \"024444\",\n \"001244\",\n \"002041\",\n \"3 1;\",\n \"1 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 51\",\n \"3 4 0\",\n \"5 5 0\",\n \"3 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"003344\",\n \"024444\",\n \"002244\",\n \"002041\",\n \"3 1;\",\n \"1 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 52\",\n \"3 4 0\",\n \"5 5 0\",\n \"2 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"003444\",\n \"024444\",\n \"002244\",\n \"002041\",\n \"3 1;\",\n \"2 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 53\",\n \"2 5 0\",\n \"5 5 0\",\n \"2 2 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"003444\",\n \"024444\",\n \"012244\",\n \"002041\",\n \"3 1;\",\n \"2 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 54\",\n \"2 5 0\",\n \"5 5 0\",\n \"1 3 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"004444\",\n \"024444\",\n \"012244\",\n \"002041\",\n \"3 1;\",\n \"2 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 55\",\n \"2 4 0\",\n \"5 5 0\",\n \"1 3 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"004444\",\n \"024444\",\n \"022244\",\n \"002041\",\n \"3 1;\",\n \"2 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 56\",\n \"2 4 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"004444\",\n \"124444\",\n \"022244\",\n \"002041\",\n \"3 1;\",\n \"2 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 57\",\n \"1 3 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"004444\",\n \"224444\",\n \"022244\",\n \"002041\",\n \"3 1;\",\n \"2 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 58\",\n \"1 3 0\",\n \"5 5 0\",\n \"2 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"004444\",\n \"224444\",\n \"022344\",\n \"002041\",\n \"3 1;\",\n \"2 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 59\",\n \"1 3 1\",\n \"5 5 0\",\n \"3 4 2\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"004444\",\n \"224444\",\n \"023344\",\n \"002041\",\n \"3 1;\",\n \"2 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 60\",\n \"1 3 0\",\n \"5 5 0\",\n \"2 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"004444\",\n \"224444\",\n \"023444\",\n \"002041\",\n \"3 1;\",\n \"3 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 61\",\n \"1 4 0\",\n \"5 5 0\",\n \"2 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"004444\",\n \"324444\",\n \"023444\",\n \"002041\",\n \"3 1;\",\n \"3 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 62\",\n \"1 4 0\",\n \"5 5 0\",\n \"1 3 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"004444\",\n \"324444\",\n \"024444\",\n \"002041\",\n \"3 1;\",\n \"3 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 63\",\n \"0 3 0\",\n \"5 5 0\",\n \"1 3 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"104444\",\n \"324444\",\n \"024444\",\n \"002041\",\n \"4 1;\",\n \"3 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 64\",\n \"0 3 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"104444\",\n \"324444\",\n \"024444\",\n \"003041\",\n \"4 1;\",\n \"3 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 65\",\n \"1 3 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"104444\",\n \"424444\",\n \"024444\",\n \"003041\",\n \"4 1;\",\n \"3 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 66\",\n \"1 3 0\",\n \"5 5 0\",\n \"2 5 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"104444\",\n \"424444\",\n \"024444\",\n \"013041\",\n \"4 1;\",\n \"4 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 67\",\n \"1 4 0\",\n \"5 5 0\",\n \"2 5 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"104444\",\n \"434444\",\n \"024444\",\n \"013041\",\n \"4 1;\",\n \"4 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 68\",\n \"1 4 0\",\n \"5 5 0\",\n \"1 5 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"104444\",\n \"434444\",\n \"024444\",\n \"014041\",\n \"4 1;\",\n \"4 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 69\",\n \"1 3 0\",\n \"5 5 0\",\n \"1 5 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"204444\",\n \"434444\",\n \"024444\",\n \"014041\",\n \"5 1;\",\n \"4 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 70\",\n \"1 3 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"204444\",\n \"434444\",\n \"024444\",\n \"024041\",\n \"5 1;\",\n \"4 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 71\",\n \"0 2 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"204444\",\n \"444444\",\n \"024444\",\n \"024041\",\n \"5 1;\",\n \"4 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 72\",\n \"0 2 0\",\n \"5 5 0\",\n \"1 5 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"204444\",\n \"444444\",\n \"034444\",\n \"024041\",\n \"5 1;\",\n \"4 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 73\",\n \"1 2 0\",\n \"5 5 0\",\n \"1 5 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"304444\",\n \"444444\",\n \"034444\",\n \"024041\",\n \"5 1;\",\n \"4 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 74\",\n \"1 2 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"304444\",\n \"444444\",\n \"034444\",\n \"034041\",\n \"5 1;\",\n \"5 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 75\",\n \"1 2 0\",\n \"5 5 0\",\n \"1 4 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"304444\",\n \"444444\",\n \"034444\",\n \"034041\",\n \"5 0;Well done!\",\n \"5 1;\",\n \"\"\n ],\n [\n \"KEY_FRAME 76\",\n \"1 2 0\",\n \"5 5 0\",\n \"1 5 0\",\n \"3 5 0\",\n \"000000\",\n \"000000\",\n \"304444\",\n \"444444\",\n \"044444\",\n \"034041\",\n \"5 0;\",\n \"6 1;\",\n \"\"\n ]\n ]\n};","languages":["Bash","C","C#","C++","Clojure","Dart","F#","Go","Groovy","Haskell","Java","Javascript","Lua","ObjectiveC","OCaml","Pascal","Perl","PHP","Python","Python3","Ruby","Rust","Scala","Swift","Swift3","VB.NET"],"stubGenerator":"read size:int\nread unitsPerPlayer:int\ngameloop\nloop size read row:word(size)\nloop unitsPerPlayer read unitX:int unitY:int\nloop unitsPerPlayer read otherX:int otherY:int\nread legalActions:int\nloop legalActions read atype:word(30) index:int dir1:word(2) dir2:word(2)\nwrite MOVE\u0026BUILD 0 N S","id":71563,"initialId":71563,"type":"ARENA","statement":"\u003c!-- Autogenerated file! Do not edit directly. --\u003e\n\u003cdiv class\u003d\"statement_back\" id\u003d\"statement_back\" style\u003d\"display:none\"\u003e\u0026nbsp;\u003c/div\u003e\n\n\u003cdiv class\u003d\"statement-body\"\u003e\u003c!-- LEAGUE ALERT --\u003e\n\u003cdiv style\u003d\"color: #7cc576; \n background-color: rgba(124, 197, 118,.1);\n padding: 20px;\n margin-right: 15px;\n margin-left: 15px;\n margin-bottom: 10px;\n text-align: left;\"\u003e\n\u003cdiv style\u003d\"text-align: center; margin-bottom: 6px\"\u003e\u003cimg src\u003d\"//cdn.codingame.com/smash-the-code/statement/league_wood_04.png\" /\u003e\u003c/div\u003e\n\n\u003cp style\u003d\"text-align: center; font-weight: 700; margin-bottom: 6px;\"\u003eSummary of the new rules.\u003c/p\u003e\n\u003cbr /\u003e\n\u003cspan class\u003d\"statement-league-alert-content\"\u003eYou\u0026#39;re only able to see enemy units adjacent to one of yours. \u003c/span\u003e\u003c/div\u003e\n\u003c!-- GOAL --\u003e\u003c!-- LEAGUES wood3 wood2 wood1 bronze --\u003e\n\n\u003cdiv class\u003d\"statement-section statement-goal\"\u003e\n\u003ch2\u003e\u003cspan class\u003d\"icon icon-goal\"\u003e\u0026nbsp;\u003c/span\u003e \u003cspan\u003eThe Goal\u003c/span\u003e\u003c/h2\u003e\n\n\u003cdiv class\u003d\"statement-goal-content\"\u003eScore more points than your opponent.\u003c/div\u003e\n\u003c/div\u003e\n\u003c!-- RULES --\u003e\n\n\u003cdiv class\u003d\"statement-section statement-rules\"\u003e\n\u003ch2\u003e\u003cspan class\u003d\"icon icon-rules\"\u003e\u0026nbsp;\u003c/span\u003e \u003cspan\u003eRules\u003c/span\u003e\u003c/h2\u003e\n\n\u003cdiv\u003e\n\u003cdiv class\u003d\"statement-rules-content\"\u003eThe game is played on a square grid of a given size. Both players start with two units placed randomly on the grid.\u003cbr /\u003e\n\u003cbr /\u003e\nBoth players take it in turns to perform one action with one of their units. To score points, players must get a unit to climb up cells and reach a height of 3 levels.\u003cbr /\u003e\n\u003cbr /\u003e\n\u003cb\u003eThe grid\u003c/b\u003e\n\n\u003cul\u003e\n\t\u003cli\u003eCells can be floors or holes. A floor is represented by an integer, a hole is represented by a dot (\u003cconst\u003e.\u003c/const\u003e). Holes are considered as outside the playable area.\u003c/li\u003e\n\t\u003cli\u003eEach cell in the playable area has a \u003cb\u003eheight\u003c/b\u003e going from \u003cconst\u003e0\u003c/const\u003e to \u003cconst\u003e3\u003c/const\u003e. A height of \u003cconst\u003e4\u003c/const\u003e is outside the playable area.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cbr /\u003e\n\u003cb\u003eThe units\u003c/b\u003e\n\n\u003cul\u003e\n\t\u003cli\u003eEach unit occupies a cell in the playable area of the grid and has the power to \u003caction\u003eMOVE\u003c/action\u003e or \u003caction\u003ePUSH\u003c/action\u003e, and then \u003caction\u003eBUILD\u003c/action\u003e.\u003c/li\u003e\n\t\u003cli\u003eA unit may move to any neighboring cell, including diagonals. The unit may only move on the same level, step up \u003cb\u003eone level\u003c/b\u003e or step down any number of levels.\u003c/li\u003e\n\t\u003cli\u003eAfter every movement, the unit must be able to build onto an adjacent cell of its new position. This causes the cell in question to gain \u003cconst\u003e1\u003c/const\u003e unit of height. If the height reaches level \u003cconst\u003e4\u003c/const\u003e, the cell is considered removed from play.\u003c/li\u003e\n\t\u003cli\u003e\u003cb\u003eIf either of your units moves onto a level \u003cconst\u003e3\u003c/const\u003e cell, you score 1 point.\u003c/b\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cb\u003eActions\u003c/b\u003e\u003cbr /\u003e\n\u003cbr /\u003e\nEvery turn, one unit must perform one of two actions:\n\u003cul\u003e\n\t\u003cli\u003e\u003caction\u003eMOVE\u0026amp;BUILD\u003c/action\u003e: The unit moves in a given direction on the grid, then causes a neighbor cell to gain 1 unit of height.\u003c/li\u003e\n\t\u003cli\u003e\u003caction\u003ePUSH\u0026amp;BUILD\u003c/action\u003e: The unit pushes a neighboring enemy unit in a given direction then places an extra level on the cell the pushed unit had occupied.\u003c/li\u003e\n\u003c/ul\u003e\nA unit may not push another in just any direction. \u003cb\u003eIt must be the same as between them, or one of the two closest directions\u003c/b\u003e. Additionally, the rules for moving still apply for a push. It is therefore not possible to push a unit out of the map or up more than one level.\u003cbr /\u003e\n\u003cbr /\u003e\n\u003cbr /\u003e\nYou may not move a unit onto a cell if the unit cannot build from it.\u003cbr /\u003e\n\u003cbr /\u003e\nProviding an invalid action or taking too long to respond will cause you to be out of the game. However, \u003cb\u003eyou do not lose your points\u003c/b\u003e.\u003cbr /\u003e\n\u003cbr /\u003e\nThe game is over \u003cb\u003eonce neither player can play\u003c/b\u003e. Note: the game may end early if only one player is in the game and they have the highest score.\u003cbr /\u003e\n\u003cstrong\u003eSource code:\u003c/strong\u003e\u003cbr /\u003e\n\u003cbr /\u003e\nThe source code of the game is available on our Github at this address: \u003ca href\u003d\"https://github.com/CodinGame/WondevWoman/\"\u003ehttps://github.com/CodinGame/WondevWoman/\u003c/a\u003e\u003c/div\u003e\n\u003c!-- Victory conditions --\u003e\n\n\u003cdiv class\u003d\"statement-victory-conditions\"\u003e\n\u003cdiv class\u003d\"icon victory\"\u003e\u0026nbsp;\u003c/div\u003e\n\n\u003cdiv class\u003d\"blk\"\u003e\n\u003cdiv class\u003d\"title\"\u003eVictory Conditions\u003c/div\u003e\n\n\u003cdiv class\u003d\"text\"\u003eHave more points than your opponent at the end of the game.\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c!-- PROTOCOL --\u003e\n\n\u003cdiv class\u003d\"statement-section statement-protocol\"\u003e\n\u003ch2\u003e\u003cspan class\u003d\"icon icon-protocol\"\u003e\u0026nbsp;\u003c/span\u003e \u003cspan\u003eGame Input\u003c/span\u003e\u003c/h2\u003e\n\u003c!-- Protocol block --\u003e\n\n\u003cdiv class\u003d\"blk\"\u003e\n\u003cdiv class\u003d\"title\"\u003eInitialization input\u003c/div\u003e\n\n\u003cdiv class\u003d\"text\"\u003e\u003cspan class\u003d\"statement-lineno\"\u003eLine 1\u003c/span\u003e: an integer \u003cvar\u003esize\u003c/var\u003e for the size of the square grid.\u003c/div\u003e\n\n\u003cdiv class\u003d\"text\"\u003e\u003cspan class\u003d\"statement-lineno\"\u003eLine 2\u003c/span\u003e: an integer \u003cvar\u003eunitsPerPlayer\u003c/var\u003e for the number of units each player controls. \u003cem\u003eAlways \u003cconst\u003e2\u003c/const\u003e for this league.\u003c/em\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c!-- Protocol block --\u003e\n\n\u003cdiv class\u003d\"blk\"\u003e\n\u003cdiv class\u003d\"title\"\u003eInput for one game turn\u003c/div\u003e\n\n\u003cdiv class\u003d\"text\"\u003e\u003cspan class\u003d\"statement-lineno\"\u003eFirst \u003cvar\u003esize\u003c/var\u003e lines\u003c/span\u003e: \u003cvar\u003esize\u003c/var\u003e characters representing one \u003cvar\u003erow\u003c/var\u003e of the grid. A dot (\u003cconst\u003e.\u003c/const\u003e) for an unplayable cell or an integer \u003cvar\u003e height \u003c/var\u003e for the cell\u0026#39;s current level.\u003cbr /\u003e\n\u003cspan class\u003d\"statement-lineno\"\u003eNext \u003cvar\u003eunitsPerPlayer\u003c/var\u003e lines\u003c/span\u003e: \u003cvar\u003eunitX\u003c/var\u003e, \u003cvar\u003eunitY\u003c/var\u003e the coordinates of one of your units.\u003cbr /\u003e\n\u003cspan class\u003d\"statement-lineno\"\u003eNext \u003cvar\u003eunitsPerPlayer\u003c/var\u003e lines\u003c/span\u003e: \u003cvar\u003eotherX\u003c/var\u003e, \u003cvar\u003eotherY\u003c/var\u003e the coordinates of one of your opponent\u0026#39;s units.\u003cbr /\u003e\nIf the unit is not visible to you, the values will be \u003cconst\u003e-1 -1\u003c/const\u003e.\u003cbr /\u003e\n\u003cspan class\u003d\"statement-lineno\"\u003eNext line\u003c/span\u003e: \u003cvar\u003elegalActions\u003c/var\u003e, an integer for the number of valid actions you may play this turn.\u003cbr /\u003e\n\u003cspan class\u003d\"statement-lineno\"\u003eNext \u003cvar\u003elegalActions\u003c/var\u003elines\u003c/span\u003e: \u003cvar\u003eatype\u003c/var\u003e, \u003cvar\u003eindex\u003c/var\u003e, \u003cvar\u003edir1\u003c/var\u003e, \u003cvar\u003edir2\u003c/var\u003e: the parameters of a valid command you may output this turn.\u003cbr /\u003e\nFor instance, in the action \u003caction\u003eMOVE\u0026amp;BUILD 0 N SW\u003c/action\u003e, \u003cvar\u003eatype\u003c/var\u003e is \u003cconst\u003eMOVE\u0026amp;BUILD\u003c/const\u003e, \u003cvar\u003eindex\u003c/var\u003e designates the unit at index \u003cconst\u003e0\u003c/const\u003e, which may move north and build to the south-west.\u003c/div\u003e\n\u003c/div\u003e\n\u003c!-- Protocol block --\u003e\n\n\u003cdiv class\u003d\"blk\"\u003e\n\u003cdiv class\u003d\"title\"\u003eOutput for one game turn\u003c/div\u003e\n\n\u003cdiv class\u003d\"text\"\u003e\u003cspan class\u003d\"statement-lineno\"\u003eOne line\u003c/span\u003e: one of the following:\n\n\u003cul style\u003d\"padding-bottom: 0; margin-bottom: 0;\"\u003e\n\t\u003cli\u003e\u003caction\u003eMOVE\u0026amp;BUILD\u003c/action\u003e followed by \u003cvar\u003eindex\u003c/var\u003e for the unit you wish to perform the action, \u003cvar\u003edir1\u003c/var\u003e for the direction in which the unit will move, \u003cvar\u003edir2\u003c/var\u003e for the direction of the cell the unit will raise the level of.\u003c/li\u003e\n\t\u003cli\u003e\u003caction\u003ePUSH\u0026amp;BUILD\u003c/action\u003e followed by \u003cvar\u003eindex\u003c/var\u003e for the unit you wish to perform the action, \u003cvar\u003edir1\u003c/var\u003e for the direction in which the unit will push, \u003cvar\u003edir2\u003c/var\u003e for the direction in which the pushed unit will be pushed.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cbr /\u003e\nYou may append text to your action, it will be displayed in the viewer.\n\u003cp\u003eThe possible directions are: \u003caction\u003eN\u003c/action\u003e, \u003caction\u003eNE\u003c/action\u003e, \u003caction\u003eE\u003c/action\u003e, \u003caction\u003eSE\u003c/action\u003e, \u003caction\u003eS\u003c/action\u003e, \u003caction\u003eSW\u003c/action\u003e, \u003caction\u003eW\u003c/action\u003e, \u003caction\u003eNW\u003c/action\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c!-- Protocol block --\u003e\n\n\u003cdiv class\u003d\"blk\"\u003e\n\u003cdiv class\u003d\"title\"\u003eConstraints\u003c/div\u003e\n\n\u003cdiv class\u003d\"text\"\u003e\u003cconst\u003e5\u003c/const\u003e \u0026le; \u003cvar\u003esize\u003c/var\u003e \u0026le; \u003cconst\u003e7\u003c/const\u003e\u003cbr /\u003e\n\u003cvar\u003eunitsPerPlayer\u003c/var\u003e \u003d \u003cconst\u003e2\u003c/const\u003e\u003cbr /\u003e\n\u003cconst\u003e0\u003c/const\u003e \u0026le; \u003cvar\u003elegalActions\u003c/var\u003e \u0026le; \u003cconst\u003e176\u003c/const\u003e\u003cbr /\u003e\nResponse time per turn \u0026le; \u003cconst\u003e50\u003c/const\u003ems\u003cbr /\u003e\nResponse time for the first turn \u0026le; \u003cconst\u003e1000\u003c/const\u003ems\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n","duration":698400,"userId":-2,"index":0,"title":"Wondev Woman - Level 4 - Puzzle"},"answer":{"code":"#pragma GCC optimize(\"Ofast,inline,omit-frame-pointer,unroll-loops\")\n#include\u003calgorithm\u003e\n#include \u003cfstream\u003e\nusing namespace std;\nconstexpr char en85[]{\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%\u0026()*+-;\u003c\u003d\u003e?@^_`{|}~\"};\nchar de85[256];\nconst string Base85_Binary{\"e??420s#R700000000000suY$0RR91_+~%\u003d00000KmY\u0026$00000000000000000000Kma%Z0sue\u0026000000RR911poj50000000000002M$00000002M$00000DR\u003d+?00000DR\u003d+?00000001BW000000RR911^@s6h\u003dCCR00000h\u003dFkc00000h\u003dFkc0000000000000000000000000001BW000003sdUPRZv(VJP{2R000007%2e\u00267%2e\u002600IC2lmGw#4gdfE7y|%5k\u003ce?8OBwrZ#ah\u003cmg*0B}Gf6*h?TKjf)G^lKSG9AH*RdjgG}yTj)eDCC?BPyh(C;|OHYS-j)+Ts*_dG0gbH\u003d\u003e\u003d+L}CpMYiW)7Tn\u0026xV4OQ!%+`4p@\u003dK%;cr|mu!Y0nL\u003e0A)t_DC_;LDs@6G~lN\u003cRxq@O979w?kPa073oju}nNlZ;MLzsL|7*qo\u003cPHG\u003cievx)4oLt27y|$RZq^`^tf7~7DxP(~7e+7w!\u0026!h4a\u003ePCVB7Ih%YHN^eE\u003eYJH_-Cch04AiRy3T^*M$~44aEIM?7w`!yFt3MW$%jr1ckOXt2v\u0026F7AN+{Vj**8)_gHUN\u0026?e3%kS7hoQMa?DB!jI!*jGf3`E^IGSV`S@QBgi1\u0026-o0y\u003cv4CbrLNV3A%gE$;v;@j)geo@4r2LT8n#}}VSUs|;sXnU?EM0HQd2nZnniTw^MlBqB)zXEt\u003cb%r%)%u4{-S;#^bTX%P0QB`Ds+W51tEk8i~\u003ecX_$r9vkL\u003e(%S7j5^{^1`2EyTL1KOy|?7VSdi``Nf?sV^Cm+B|Q@p%~yAhzOY!gPflWaGO}aoG\u0026bu+\u003c\u002697q)KxW4;XQ^Qo-oM5)L\u003eFlcLU}vU{T7FD7biA{A6P+Y6n3eQXYgvi2TBj}{HkkI^-0(9-ED2rrNZ`ICW@IoHRd7X@^-ek)sRe8a6S\u0026{;r3cvrr+d6E!@Tp_E(r9M^gQ0\u003dH@9VNxYT~-1V\u003cU7el\u0026Hu7P)oj@l!dq^$XrHy(?U0W`E`w9kogOEoF\u003e-+_(\u0026g\u003eESPdSyTuoZmPQbFmfWi+))K\u003dRDWdV2wk\u0026T;CX_Xc5\u003d%F1lIB!*Fg#qpo\u003c\u003e\u0026e\u0026NXr%}i6R\u003ciC1_KxMuZ!a!6-MRLbh$f*M0Y\u003d2E{p1ikXVvD47S~|MogAAtTN0w_h9vvxdz%Iu^ssh!Lr+t(^jdrF)RmO\u0026PZasjVkHd@@2i*+Q3Kcm7q7Rwr!-Sq(sZ\u0026N;EX?63#G8tK|jQ-OoQj+D1rJ\u003dG3iUC6L`TJ$;+rL)}Ha~1F\u003cO^3yeblDkwr@~MOW22ik*W8+gpwY%;iWQL+max20Yi#$f3`0A\u003d$;cetmT*m-Ktde*Y\u003eXXy)$a8c0|@SAd`c!D#oiKTKjaMjqtUuhlGBT}^_LcK?y_-5ype%q$mMDTow4p`Ykq7\u003c@W\u003cdwHyl{GdkI`\u0026k_;FKEh9EUv679m4`J9~2jLDj2_UtxdU5-Uv^WNpB|3AeTjd1HQ~5ULJ%d$ia\u003dNQtgJF5kxo}hp1l(JfQbQNud#Cc++6qKnec_Wv(b^0!Q-CVEl\u0026`_e%~{@HnJ\u003d\u003cpm@QZ~oTb+HH^\u0026W8SnVwlM`m^{0\u003eAO\u003cTUqFYLP8_rq2hq7|3avf@i5Fes44yTTh!3D@G2e{_Ew\u003eOR~d?*Lf4(a*|SP4\u003dt)Uf4|k@pcH~S$Yf+\u003c@Bq%}-FkAdz\u0026mv\u0026m5$!^!^cm3+rH_KE8b}j5nR4^%+Xl?(sA$Y\u003e`rxdfUzn!\u003et\u003dpom5XlXFEB\u003d(0k\u003eoda+3V(taohVzm~e29Ve8*nGr%N^Hi4|zS\u003d({\u003dYR)|qg$QB~Jgx8qxJFICsC`wXqVWus{?\u003cVz{JTkb*_-T_I#!W3tY`+qnBR%X?6dNNGW}LgaEtPm29flMq6\u003c8MJuFMDvc%zGbABFL8BGz35IxeMT)Arxnl%KqNHn\u002646o8NIS|+|))Nn2}\u003e0$Q6df|2jMGUN)j3`NhK}_1Mz**Vn2o2DWAHAPAcv{Jdhx`KuWFbQ7Ac(oW4hH7H5PC^\u003eZn%+\u003e9Ra?aL^v!fXeJ5KA2}qN*o@vY`+1sz;PCESu2ygKdl\u003c}F0+X8\u0026dFLYAQdHB^43?@z(cs|Skv1bgg2$bUCPxwQui#KOS-_!E4}Fp0tbmRyA*BbZA2Ep-J9`$jcJ`zbr!km\u0026nB*zOLv4Vg8OYtlw%60GO\u0026oYVe`$f7KJbVa{;g~weLEi#-2X#O$vNTGu!sKtvHua52qV2LwqNq55Ot1~td6e_+Y+*;EV-7MW;*tp!XQSF{nA(X(P?lIzsr-@K@Mtg3z1UEvZ9n}p{P830|v;sm\u003cI^-e$MU*6NN?Dtfzr(G2(e7i\u003cxL*1T!Y#Q*#a\u003eTtF8Z)JXrtOG7kUEl\u003c(lYuUdM`5ta\u003ean*q##{\u0026dvXGNlMiYuNEXneXZzi\u003eAJt`zN10awU0{JfP\u003du~lgY)Dx56\u003cc_B7hYdx6rRy!L+5aJ_5BI*;3z!!{lq^#rLKN;sos!\u003eyvf;t^kk7%lYgWVXl;!3g1{EH\u003doh5Fyg*@z1dq\u0026?HtxHbp-AdN4JPxbMz3$nju|QZx-wJ@gVc\u003eGq3XhX`?;u2MjUlV0Z\u0026aY23qBN@Frhp5GJd-CC(57^*|iQ_ITaDwb|bU1wR)F;LVBn9TzAvK{BpNyGt{cILuwFpFs2S5qmO9n9467}{jh!?)10?~G^P)+WuQ*kro3O0\u003c!88RU%d)*I50-\u0026Ew#+Md4pM7HZP+pLEf\u003ebjy-m@N`zsa|G6_E8gTWTg~JRV\u003cZaW$gb_)%K\u003eCM^I_!s9IXKqACcaq2c^\u003cFeu?\u003dFoXY2$ScHRHZID^C\u003ed\u003c%vzpwudDCARam%^5F!xdn}`zwT849F{xKnG{p#_B2s\u003d+^WeUVlC0wsYar}uN09t+A@oINwwC|s0j~#sv\u003e|1ZJ?G\u003dwf9bi7{i|f1lZ2KN\u0026f0\u0026Y-jSA+zQBR{utmK@9p!v;`69GsYAb)\u003e?HyhkZz4+PZ)l33{fkEgj\u0026_tTtLCzXdRTTLn$yh;4He7A;`1JU69\u003dse@#`x*1F_!p;ZHMsBjR~sSP-EZe1u*W{`7q\u003efJ89qdC|3QJhm-%QjqxN63\u003eCJwwrFDPZRXB*(#ewDacJq)X(n$R\u003cey+kz_{%OmBHHqD7EF\u003c{sHhjIfc^Ju\u003cCwqS\u003eH(G~hfnM{9#\u00261DcGKx+_T2|I8Q1W4O1jTIon`Y-N@i(^*2k06)EXS6;q6EiErp({Ib`{bt#RPAw?rk_Dnx\u003c5LLyr^Y7v{-o$6\u003dfmMbZYe%bA9Z\u003cEVDI{HTibSWBD\u003e#JocN7oGV\u003d7eEC(AQ@rbQV8|BK`m6G806p2a@n%8bIyovWI+bb\u003efjW$ZQ@$tP6?*PzK*3IikGQa43K!c@Ct|V+bEpPzaQJ3hf\u0026\u003dl#\u003ep-HIh+6#|BQ^5}5U@y!Bg;00I\u0026DQgxPP+_CPZ;MRaUdJjoJ~}%5-}fVvkk\u00269_D~GZhf;qC\u003dYL93Nj;0BA`(y%(J\u0026@t|~X2uOA~I{q?\u003d)pvL-A{Uh^N\u0026i5q#6dHZFg\u0026nnEfk+)e^;uHVYq*S;OaVu9\u003dM{x_$m*EUbz!9+^d?!PiaE2sAL2\u0026#eTA)8{O;60@+9Q\u003c0n{miq\u0026As2y0DXvqi?pg^X!!qpxd$EqJ\u003csk@\u003e^{*Whj;rRXOA!?}0#1)8V;JgNJ9~7@f*f\u003dwvtA1N$s\u0026r*Ibk(27$Lm0\u003dw_z!lPZ^H\u0026BROVFtO4}\u003cyyuQfH*e804yiyv0T+X~W|E}q\u003d;e;!V04wF#%Mf;Di0WHJsBJC_T#\u003dGJ{-~VaLO\u0026\u003eT0iPmY\u003eSi;5f;1Ze8|Jp12N!s72?fYA5$~jLWGSh\u003cBzr-6_sRL@a9-8NXV`_cUW`50fb1p`ed~0vw82RwFuyNliQ@+%d)kVP(r%8$}nz#Q~\u003dM\u003d^j5e+Iq59T3y4p9SSTE%`y1P{+vaF869xiJtfX9\u003cVFbOJmzARmxqW01q\u003d4!i_58Fh4OxzQ\u003e4kch\u003cfMbE}rk4cV4_zm\u003drr_R+\u003c(aQnc3zAai--0R-Dt\u003ed6?}bfjFpMHZ%{IEM%cHfjPFNC|3ezzwZk+!6ut?|VrBbwCCT72Ic^0zrr;NFLwnbm_4aZi(\u0026s;??\u003c38V#KmzE7|H59TA{5\u003ev*ih6_uTwTXGWIP-7cjM\u0026n)t7o\u003eT`w(X7ci+e?l}3k}\u003eTi\u003eQynj8q\u003cnbn^e7)gQHprSni@+\u003dEofmkq^innDq3QP%YC\u003dF9a8nPY{8cW5\u003d^3`K8IK\u003dJlTGjmx_fidPo+H%1lx1GEBOqY6Qq\u0026CrCSUz%MTpabXfdKr}at@)+)qM8uHYy_N\u00262+UvL1s8!(YFqNLaMDcBhCinK1ug-}it464w(Ze\u0026S101pN!\u003dYI5d~@nl\u003e!l!B5G5zago;?\u003c$X-P{aj\u003czJfjYd\u003ef#W@5#|vd`KaGwQUlLI5Ux?@Jke3ob\u0026SJ\u00268D~NfN#|1~huhb!Uw?7pf?#\u003eMiv(iLqV\u0026+#3wQUY@\u003dIM(z@yg988FjjQ}$PARAOkjYJz}ZgiTr3;\u003efpK1\u003d\u003e\u003ch\u003d+b{f*_\u003d!ABafRExrW6U\u003e;W2$nMqSOZQCAWD42512lw6(rF5v`@eaXq9eo(#8~XFT(+\u003db\u003dvF7n5ZJK*M1Ny_AA;d(`px5OJW2ch*e!Yoz;8G2\u0026$\u003ePz\u003c5d0rd;;QcQO`y+ljY15(**D\u003epm6!Lfdkg(\u0026);-{(b{Ba\u003dGlL\u003ci@5x@\u003c4XaZRn8^*Di\u003c\u003dkwZLlyfvl_4e$q)q2!\u0026~821lf7MwNjE9*k89Q7+CNB{t2Be742\u003dj{GMh+;49\u003d(a|)!!5y7TM4jqlrcB(G6uS}?rl(Xwj9mY\u003d~!\u003dIaa#D\u003c-bK)~0LkopNk95se4XC\u0026{c-By45xbW\u0026}x\u003dWPj#x%A0C5oC0\u003en_aX\u003dT0\u003eYaQsyL4h6w^+V;TGU*eT5k%\u003enIvc}r{K^j((;(cT\u003e\u00268wb-x\u0026U`MK%+\u003c@|E8Kq\u003c}$TjCu_kF4nwC\u003cdSf!TwpjSX*%X(\u003cQe;0W4D0w+8ZF6M(!axLNnnA5o~oP1F\u003c\u003eh9f1q7\u003d\u0026eKoNmPkT|ibS#v-h%}YEI)nyyh~jbb6lznCAv5w\u003da8(AUU!YHnjY`j2Z6@NL|$Xd*}E`VKzc1I(R$jf63Q$NeVmb@3U(7UoatDG\u0026\u003c\u003e\u0026+)l\u003deJ8tF#0%Ym3Dv?IlvwV0M\u003e*c8Oqpd!}%{LHmIV-THag~P#8$lo))W#Bv9WI+v#2o?8T?e~QGxQ-`~9k\u003erFj3w)ze1O{ClcgKb;w-?Y1%\u0026zi4Mcg8\u003e-K\u0026\u003d$3O9N{AEpLK0#a8NjooWPQVi9p~x_FEgb;EcdM}fA(a?($gIR)XVo*JTp5\u003d^aLG3a)8\u003cK\u003ck_pAKrl9NSZuFp`XdoH538}%Ga%qcG\u003e#Y)Jo-_bwa8LEu^)4hJ\u003eAp-UJ5F0-boAD9Zz!G8NNubt(B\u003cRPzeRxwwM+)75H(NYbIa)b-_Fbl`B3Ubm5dR\u003dYeYKL(@vPaG8GpwDKrA6g^W\u0026_3}yGqnK#kDSIq*JDCh8ezK6cKbUbp~kYoF-0\u003dtNrlt48UXlo37c%bO6FxR;m?8O%_F2\u003d194BjB)2Z\u0026ILsA?^?j7MfQ`*CzuFbZl9cZMi^(Mp33$n\u0026T9\u0026PkeOHF|R)P0}@_;(;_G\u003cpv7s^`XNG3s*WL1;PEhe2`JtpT2}@NWYoJivYo!s762AVkt0XG{8h$wiuR0{FdX92SfH8n5oLxEWsRp%vTCH4@YVB;oL4@$;km(|0OrX)mm*)TnV\u0026E!?qY_22r0\u0026^EqyRb\u003cKa0O*A^\u0026\u003e\u003e-\u003cFFn\u0026P*j8J!)qVuva4wQSvX8loDc\u003e05\u003dZ;B`NG|V}W{4}kb|FKYHjZS#RL84H;qCz15J7kxfn0TVo1SzGZ_jr$%4628Gf%;pH7h(b$(6y;!$|ZXSdLpP5X3E*!UM#lN\u00262_\u003dFM$\u0026$5^Xtq$hODo%gLAlyGL!e%ro|YNRhoiUp;rRO\u003cf\u003c#!9|$n;Aa(\u003cAPkhkt\u003doGs5MfSR~c9nVsIHmuLo-x1gZsr+*W\u0026QBkQbBpXFj}?VAu#mJW?v*!6Bns5yGa$iDwQ(twg9oiXr?wc1`Wv\u003dr\u0026L1c`\u003e_A\u003d6an_C\u003c\u003d4i(ZM\u003eLEyLL-al$+qkdtjBljygv-iTtZ^)n3q049HWCl7eP)!I;L;Kcvc+3-PvP($GVsAcG_0Q!\u003dsibFh}2r0o%D9-E8{ZVQI$5LQS8P`WP0*gF$\u003e__Z4d7yo6$zOv!b$?AVxQ?+WZi-oR?njn5d#mF#YM|WSCy6PLcScZ8jt`kVut32yUX06HTS-A-mMs(Nc_ZzE^Ml*4g8UOas\u003d^(SZ+JqG1*C2kU3J9dD\u003coBUzJh+LCx!f(9`gEx(d2*\u0026O3iokA^*Y5Dar}y@^m`IStoph`fS$sf@?PfU8h{xZ3Q\u0026V5^nrN{FHD251(*8lZz$q6Bxy%|{}}z}Z-DF?1A2XdMYJ@A0Rqy\u003cridr~NB723WpJfJ(~bVKLvfHQFdm#UpwYR5_m9\u0026U;L\u003cDTG09_)z1\u0026$m8?LEm6?KdN7)c#gx@d*3n\u003dm_My@U!\u003cre\u003dV#j%w#ZR%VNoRA}Z3O9@#\u003d1!JUzIN83p#$C#\u003eYItsGq8v(J4Y2jJ|9VH+je@\u003eqeNN6L(Aw;*K(qD8!Q}2K?p(b?ajL~q-LEpL;EH`-rEtuEv)$\u002685\u0026xJ?OqB\u0026t7*7zFztL3^u\u003dw^cE%#DXA\u003c\u003cOnR3;3d`{;axsu~D7rKSm\u0026s1GVErouqPbT5^nNxW5!JSm_d\u003e|?cU\u003eXOIkjlFimA\u003eM?mNi9Aumb1\u003ee7\u003eF4\u0026PelZxF8NYPE80B8Vb`?Be6wcc?S3dvHj#+X*rj-Huxo$(D^)W?vBbmZJ{e\u003enZgM%;Q!b0gOhRJl28_b3Umfe\u003de\u003cQ}WH@hsi!4^#`I{hNkmAJ(0-\u003dOURlvkKL-5%llG!kb}Z0m)ybhX}^a{4\u003e;iCcAafkM\u003esi7o?r{|*icwjSmQ$\u003ccrrz+9\u003e*-}(l@k9#PF0N^G05y{ayPvGSZH`t5\u003cTqy)dJbl}8yf2-wB5J(e;9E65\u003dXP!4fyrgg\u003c)sqvnvn2tjUc5Q*~mN{FQ*ZMR\u0026n7$x#p52TbMBKT_ne{z-OA9K2yvU\u003dkOyh@$1whVAu)L9\u003c\u003e4jS5A(79W{z;?o8{q!*kg\u0026Fmom$5W!YrI9dJ6QqiuE`@Jsf2FE\u0026@6JJV*XaMOkPQQgpUpY-GI\u003ekreB?%@Lq4WK_yK\u003ez{rhZdLJz6Ahn7GjVjR2mKju(xyGep1RKZ*!6jeJB@GpdQK\u003dNv08\u0026{wJjVgUfiCZ;A7kyBKIr(oo\u003cvhMsoBWs\u003c4FqB8~7-y~(x{!o7J98t$IaFu#V5EyK\u003d8M0D$O5vxx;N2?!cSJ\u0026Pz\u003c-nR$-z{)Ih9$$c`lYkWJZxbJFLh%j`YZwHNEeNO!233nM?6A|H**cxzj}g603_P}~`|?c!OskC\u003ee97RfkLRm?cRW\u0026by0;ZpfJRsqE3\u003c3w-Y@_PgxfzA;w47?_`0W+E!^Rd{o7`b688_yO?F\u003e-S0-Fog3`IMOTt`RV2Av\u00261bpyTgEO)KH!wqeICUld)G8Lud~Zq;I5KvW6c)G@pphPm6t{;(h#^uptJH@Y\u003cPQ)Th;_G|H\u003dW\u003d}S25+8NlFI{gKt31xjI5V|_AFVKq)D5kdm5*L+lLgPMk14DG\u003e;kVJ\u003eKLG5\u0026BhlLQm*aMcv3@%C7S!!\u00269Q8}3Y{?)fK;XcOEV*KCj\u0026riYx!K+Se8%5cGoxl-EmB8u\u003c%PCJ?7`KO`$ujvVXWg\u003dVb(OR$9QM\u0026V\u003el2hih%H\u003c|^p\u003dp*A458}-9OekOqJi217L#In4dv}Yl3p|w\u003c6ly`^6g+MD;J_;0!MP{bLLmroWc5K66!x!Hl\u003e-IP#o~qc\u003c5n$EQJ5!m\u0026{VitcNz}J^jEUoLEDE$oihRIpW5QTVZdLUedzD-C$BT_Hqen4RK!yw{W*VtdalGM$pssSBe7sUgr\u003cT%0V+3?}aZ7OiRj6M+$C8X($XdQs;Tl)^Uu_m~cn^T`^#^Qze4Q7kOGoBujLv1(-;~-noIR\u003dm`;dDi*etZc)$Q6zr\u003ete?vAe^G5aye\u0026@PEaIY|2bu^dEGbg3hj\u003cF_U\u0026Y2vf25tV769$r_IvV}$^4G\u003d?wuQAO~!+}xNlno^py{S#Gwec*RIKs)sBKW#MwAax)Z_0MaJk|VTBwg^~\u003ddpOR*5X`(9L%AC@JPA{ojpOZkEF\u0026RbGY82}mM_S\u003c?Yo4%\u003c~jVk\u003d\u003d\u003c1gFeBZ_#Yaga*ZBKwPbAOt)NV!3wXx\u0026ys@{MyQFy9!GUi5zCd^7wV5)ZXFGRRjc4P6FiP^KqPe6@rN|E%O)!EYq9Tm)bu)6o^VfB2rT2\u003eaU)\u003cNYuh{2xVcS%cfbs1J)v*mhG!IHIWB^BQuElYz$?U(BTeN9Q*4Cz\u0026%3+2\u0026cNJFE(UNhhxY_FEG\u0026\u0026+))R%FE8sm|)-j+wL\u003cEul;PnF~;7\u0026-\u003dE\u0026_`BADLVVIGI\u003e_2^!6\u003e)ert!\u003c}-+4`_?U1Po{(6le\u003cZ|}7w$5sV!)7bGcC@6iIjd|I%Y^@4CVNo^QI|Z93(%2pUYP1(l{})h\u0026G{^F74v8+\u003c`7bL^eyD!gwwlIoH2cR\u003e@FS?W!#{hJGkjAiT5y+_2Ao^0y@h__M!NC#W@}GV$`*viQe!@3C+%77O`FTcNp)S1ok!\u003dF)$Q_Q993x+H{A5`_(HW1\u003e#}Y7d\u003d\u003e;\u003dqGR2({KN);v2|ajA\u003ef03vs)KRJ|(yFHmFrB9Evo6{|eyM\u00269\u003eaFQTi?U^*vtgCMvqsYhZ8tmeAo5\u003dG$cYZa@\u003cnIui^rR3\u003epf|kLI\u0026F)Mcrf~)jVw8bS8!F#d+@sGbDLDtxd$J-LVBT(%$-OCHhmV?_(6@x1sv5ZB8~jc*S?^r-YL5j|sbr4v-hGqcs(\u003c_Z5q;S_GJ~;z{AW0;PVvWf@*R\u0026mrsN4WX(X66HT%sS@cF2On\u0026m|RZUr6G+6i*xntEWLv0Q\u003dUX\u003eKm@cMEsgzf$n|lx%m\u003dC%P\u0026rqB_@t5;+zK`$Pn+Z3bZTC(Jy*!)`?tbf1%{A|0x|8y+w0o\u0026l$kzKn\u003d17-$bn41Y2Qo0~PG{cm\u003dCL!LPd6\u003eeN_qsSJ!#Fmpxt+GP\u0026-wpn~ikAzjuuO@7?c7FSpN^1cL7E-MgRT^\u0026HLG`SI\u0026`iPO5H;WGNAzCsJq@HP028bgEUFxn#ZmxeC1O}S@~m99uE2_xy(;hKnzc~IIr+cH)DHHqwuNxmo)H)Qt9bo?{`!%8?n\u003do1B\u003dR3Ifa*GK8Lpj)nWrmF5?N5nqnE!i-kRiVXMhrH#%3vlYV8Uze_~\u003c4RMkbE9Bey7x\u003dC\u0026b);oNj3OdrT{S~AA+wEIxqxcvUPCEhqy51f#S%M6mJW\u003etQ!W8hVcU~qQ{v?c6eREd5L|F)NAC{^@C\u003dkJXoU?dAH4N)5!*P4I91b+T8EaqC-_!`bgE1*%%%7\u003cVH!x+DKer2H1`;Q\u003em?cXWYu3)f!HKUzS0~t_\u0026t0cQkv3}I;s2n#@3\u0026A)d|_\u003d$$H}EmHx*!AW;\u0026St\u0026|WCciJzD#`V3VvPh4WKA5AXQRw8G?E*_KtH`\u003dgXsf64R}0VXenY3_l\u0026^rK\u0026f4xTJ;Y0Q*B6$\u0026JDv%fK)+m{aqwQa^*TqOiXE5zESPE_BzgV\u003cI2d)PsJsjAO)3nFR7GBGrlTWfmq?4H1ovbJJgkpS\u003dAn!+-`d)p\u003cWwrEjsU!66tH@cm!Tp5$$\u0026$bk3-jG7#7w0`%2*wqeSWn*eCOb#V7}Q;)d|h)|({\u0026*Av~61\u003dT2EG)?60rws*2_RBLH4oFub8@-\u003dauzFu~)nQ)bLfkR#2p+2yoQTS-t*SiUMZ\u0026ivWaQhcB7#Pt_nC24S?wym3DD)eL#+E~;1gA;4d~$;or@bT$?xPqFq8XwI|vtEWpBz4T3k(0u)0+V!mG(wu-i0^Ex-3VqLB6iD^O+E?-_%ZY+T9;foV\u00268yB#As2X\u003deol?|o4_gd*@;g9lN@;sEusC)|Z%4%1CYp4AYbUu\u0026s#oe;lwVTCUf1_;a@\u003d+\u003eBb(3za4{kE2snf@TLX!M^gT|(R_2$7}\u003dH\u003dibZClfUT42z+u!^vzQPP!OT;~ds8\u003ee7qh8r1Jo1FJ7Zm\u003c0wr|z3\u003eKX2r4@B$ZPHAK2B)rq^{Ibta{u|Tp_sUPAnD\u003eT\u003ejatp\u003do{{Lx\u003eCzk9{-^\u003e{tlFn$De0r5Guhola*A9oygiAxq\u003eM*HrL@;\u003dDXJ)n@hao!Y$27UlRGDQP^@6\u0026vCS@\u003eMde+N$ezNc#*li}K0\u003d8uEYa2b\u003c\u003d4RXAqv?YQMzfx}\u003d|*)@*)oGsrGt;0%w{(d\u003d#kIRI3?;KTiSeV0$d3YA1bu+\u0026h_1cSvm}7njShRGUFAo^t%5\u003cs*s~Ly\u0026*u~k?6u\u003ef_tojRFtvBWk\u003d@O5lp\u0026\u003c7AB{^\u003eJ8cDb(d7rVcL^+\u003d*VSr$o!MbZ_3zIUXHk)k@w|v-SSl_yq9UwZV)7ub$Yx\u0026qtWT_#0$6TdUdufeV3bQ*rlN\u003dz$rH\u003e2`q\u003cW0zw8H#g%(Z$hZNZ-eD38a?uSw;{Dmx@nLK)2((FcfDAlMz\u003eEs+93MeQ{UpjoK#\u0026JD\u003ejsh\u003dr\u003c%z^^6Ra2L;$p@a0_CwEWPKrOL7t6luxyOUETn3aH`CB%@^%(0p{qY2uLVy\u003cSPGW\u003diMw$Qw+%Ucj!JYz7V9Lohy?O;tSu+dw$gyvg;G)v@?jeUA#4IjecXY`9~r#Rr^WfteU-y%4q8JHJr*?P\u003cE(--\u003eTRJY7Pjm^a6{t\u0026kxrJ?TfPruv1p{y%$Ks+;C;AEDUc)f5qK\u003e;uzH}bCXv#ruTs4{t`nI+fVReNP#(D\u0026I+0ZY*4@\u003dGY(4v2\u003dc7P3^menfCJAPrIa}Dd^JHw(0\u003cBKgClkwB_epp4y\u003dC~SDsCaldFHymV?fW)$ISi0pc\u003e;3pJ{{03P64?ekak\u003eN2mih\u003eeRtzHl\u003dMtCn*xv?4v`n_D1ZBthd7%ia$J\u003d~16tQ\u003cfoWw9L\u003c0C`0S*{%uqfp@q-l35IVj5$pn%VdOuHU?}T3P6X*ZmsqD29WzZQBF\u003dv%5UFUIb$TN2^Syjd\u003d`g7}pQnlTtIioW!mI\u0026-GEYz0K-?-$UwjzTG~;\u003eW\u003e$9|x;Plv5??\u003dg;\u0026`-sM4U;o2\u003eEhqGu4o?v\u003em0I%o|6Gfcf9Q(siq!+\u003d\u0026Bj2$\u0026V\u003e\u003e%J-4rAbLLPo8!r\u003c`h2a8Az#Krt{DAM#rK%W!#MkP$TFSla7sA8lU4-iIVD\u003c@gl\u0026TQsB8_Z?iXnY@\u0026NPp!mnZSRHBsHPi1B\u003dEbQoacxidl4yf2A@N8g!y-C9xL?m\u003cJlgEK_YccjtiK5}~Mcf1TlfIn#MLHN5Oy`?Fd5X3mxny*(U4!ON\u0026#ac22!Bh+E4xI{TD7{Tn@Sv6t1veJvSNz*Y(1r\u003dcE)R\u003e5!\u003e*8(*#d4bW{?6b\u0026$E_`ZF\u0026w8ob}c5u(6ZFTJ}TrrS@STi0V#A0~\u003cO08A*\u003eq~~oLErZS9seAOyJ5`$sS{7(a+0bB3qO$?@|3rL@LrVz!z|$w)tyFo?R\u003cH;#ZXEc2f^o\u003e-?AkoULxw\u003e!NHF5@oyJ1i1G(mFjLosG2Nu!`YLH#Po1VGUKH|hswR@\u003epjjBc?dt3n(+0;3*eEECTP^aSv^|*`(9uSfM@eahlaA5h\u003dm$md)6mQyyhID2F\u003c~FxLd9^!XJPqTUD_IH5YcJH@xmynG%\u003dKuBEH)6Bm!TQqMOJv+$DqkekOxUpAHvO`^U7\u0026~4wuDE9kCxm-;S$y(0{v1Sat@C84(OI?U~v*_B{#ykk^I|Rq+Z`wBSVpyp(}B\u003eFoi}@rqrx(r*o}hJq!STxO0tj)OGdm9e647nBAGnt4b1o%N{}O+X?3(Trq}Rs*#!cQ$S0LBMMumwSMbRB5mL321`zL%@F@A2ffR9!Rj23H?{gDTwvEJP}WoyJpufdX`$Lb?8g8AE^J^J5m^r?-REUC6(ZN*yPw3+P^l\u003d@\u003cumwU08ti61np-m8Qh^Jx3pDX0xZiT(||-x3(iRZSWsp)\u003d9Z#fpw#\u003d8-H(XdY^|dP8H\u003ewsi$zj@a9Oeq)gsFE)K+cpbPU}CGp%h`q0OakX}`hrKY-Re7(9O3\u003cEJCu\u003dLD*boRMPY^|WrW;A@q8RYsk_VrC%\u00264p?zXU3r\u003eThGpOBOlMd52\u003e5)Ps?S-Z589((\u0026qBKvrnIlLaCU8eZ4jVWL-ih\u003ctU\u0026ltG\u0026e%QOnw}I_p1WXTUo?hTg)UqaX~5Ya}r%\u003dlckal?6RqQWL(Yx%?}vXi@*y(E4?nw^7OB4?3!nR;3XoxJz|wNx~iR3|\u0026|xsBBcSHZg5)De%\u003cbGmiN#p$E7SmCD92GEtazut5Nv%_WM;z+lOk8L5%\u003c5yPvgc5wHNXUPdBGT5\u003difF2+01V#UuKdw2EkA\u0026jZk\u0026NHt180j2$B1%6zT@5\u003ci`z+uD3A!Rot4x\u003e@d`10\u003c2-Cgl\u003eF~f?hnU+q{hyYX0T-IaZ$fR{p;)Ezx9Q|DMDt_#o%uOnG3-Hnxp%GPI|jdv;yc@maEh;`?iLr$vcrk^#J?1q)E~\u003c#Htsh|DiLpBv;C\u003c!k|DN8\u003c\u003eL(PU#)3qDsIN?;gYQ$AZbY+NuX2*|O7fbD1p-e+v%\u003cGRag8I}ddtx!f+yn3\u003cCNhT4VaJZqh_L}s~?eJ5(R\u003cK?SJnDD}DqbY8hiqow%l%0izpe\u003e9L\u003c#5ifMSp!pwUjYd@{xm%m(iE#ids;zelTa0v+8@SsUR1#odF_CDg!pZsFk**1EQcDdZm8zyGHHx6tXjn-kL9GxE$TNl9v#Qmv)`bI+\u003clW5Y;\u003e*1i{Jx4E`iBf`I{On{uw(+Bseg$wGXntXD7S_n0g@D1~`-+D026SUf7#\u003d3v*x-UOA\u0026%^#~au+Km*bI9o0_~;D%*laKg-l-)PpgdT\u003c%SWt(R\u0026w(blgNRb-^U|R37Y-aua@nRBB#2WV21IhwBi~AE@C8M!\u003e0P7\u003eb\u003do\u003e4v0S$nfsW1D06o)BqoE|R;Q3)3~G\u003e_$zwhHG^W@BSX^@\u003ciJCTf5F\u0026w0+-s{!9NisC(H_sKO%{`D9Hh$Xl\u003cYUT@(\u003dg1c\u003caold\u003dxGPb{Ob|6i9})lwEW;r}xBs;W2LVd{JObtHow99Tc*Ge;Ts0vO9\u003dmkrkyQn_bhcGG?Pma6g;g#c%oHW4nT?-\u003d^\u0026V^1)5X*fL;ZW-A4`jEPQK+2AOG?}93s_28SzDC(k)Vc)*8f%LUyw||TldItnK`46iMN8Q~4%oczoEb?Zu^f04Z%{$AIgiFiazLX5(qB7a\u003cWWOPisAJ|Ht5EZLO2l4OBLCU5%P*j%W9?^V;Cw~Qf(H~jH\u003c*L?#gtnqE`JY}C_iqueVHzRC9$9Y`7aM-V|}aMB%Cg$S|E\u00260`#nF\u003eXC;2Ki9216c-l1\u003e*?vTa)PeQq?kP%YG?0pOA\u003ds?KF1STPL\u0026u?iGk9}wZ(EhFiosXmV`q;K_0A!*typc25SzyMcb+Xws7YiN6GMUL|HUnPiPDs$8;lL1cI7\u003dLE(\u0026eCF5E`ok8At\u003e77u~N4jswJ*onHG^?nn(C5DFTyJS#pJ0~+RczO+d#lNDM9\u003c`atZ(+nz\u0026NXruL3Q7AaGEn5{0*1\u0026UHewbk)jS^MI-Ex-l_%E0|\u003d6zF\u0026+!_+RbigcJeQBiG)u{pn;xR*$w\u0026(D}\u003cWFBBJ391h$k_n\u003c--6e\u0026G`9^S0gbrcYQ7aqsr\u0026*6^ZsDtw;+q3MeU^oxz5s#be}JX*2?O\u0026D@(EAitty7Y#$\u003eBtup@\u003ca7OxzW~Ujzo5(I}j$ggFBcqxVU%Ft#a\u0026OAm-ojmvN~?x*waWU|vBN\u003e4rwkcJ2lSv1^#QrjDL3hW|L02ek8tFh6+AQqh|6V(rtF*\u003cgBn8h\u003dBin~o(12+61?-a};SQHBD(Vvq%5IJ-PS5Q;9Co*)4\u003e\u0026{8Q;sS@!ugJ+6hRxb+ATTRA?J%`cFE}U\u003dH(FGC-BH(T\u003e6ZMqL\u0026^IQFj\u003d)^8l(JaHxD\u003d-\u003dWustEcyJ00eBN_B-rmIbuzuDQ0l\u0026Ig(5u7~xU$Yt6NM}mV`7xTi4m0fl#fCSf+}*\u003c\u003dtw}q\u003cn$tA`j}t(BK@3LR!t%rMR\u003dI{GAAPh%9lcAPBY4%r@BCxqIB61\u0026@d9dI$\u003eU(@QNhh$\u003eVLr#32H*\u0026$^XBn{JjQBn\u003c-7PpTsde\u003eWyK\u0026}8OVh^a4\u003ecWid^Q\u003cTlW#7ynY2EdE@7Yk2Qdxi}zFTo{$1aGl~XN-B\u0026$Ea(DfzrU\u003e*L8Gj\u003eyVcEp\u0026!r4ipQlyGaBAd#IRYA!+?e\u0026rln?sDFv}m2B\u003c$Wn^IJK\u003eU(zk-6!h^P#TKrTOM``\u0026i7wKEqEGJ`}_z4bDy@9Js;6\u003ehD1y|nAEtXIq6uNq^ABvivV$mDWpA\u003cA)Xd%4Ww^FnQh5_R_e#\u0026E_PafWre||UOJl\u0026z8qQhv;M(*RI\u003dAd\u003c8E\u003eAX?@PP*7l5CXhfjm644h{x81PJH}9+y%f#x^AWY_qk6L\u003eVPiTY\u003dh\u003eE#A4o4l!nIVTlPFs8K$nF~LI+4{)_!t;Cs{Iy8ZwNr}KvA+iyRjt%q7zg6Gcatfpo-U?(UcW}0|+#lMVIN~WSif~\u003czIaKg2Ip_HPnp#N#E#}47`%A@r-!pLF0*XpP\u003eK)?4MR1YisRTw}eK}I`e(*BH71{@}PzT?|gJiGYy8$k6QXt7d3U))|YUZ`|?K2ek+F(R4%7}f})Ap@}sCj11J^izoo~8f|wLk%O?H3hr9NPZogm\u003e\u0026GLqmyg0VCjKUy_T#pt(V{Xz_mfmoe;R1x\u0026^Qh^C+~wmqMq4G}Dn\u003e1FhSNk%M9b7R_}r|BuQc$X\u003e56C\u003dT(~iytSD|BgV$OpPE#7CEE(yqDz+#AutSyR%wjs2^^t*{Au?uXZ%\u0026*q;Ca*3X77VEy*95YKH\u003cy;DDQ84p4v!rJ0_-+wy?y_z(jWHtcWEQOWl$*slo(%lFbY`Zk8*O_TntpqO}!R93+H1tvQ#O-bOqR\u003c}m86J9k87{cD?7{c`G)$8|NwF^2VGy+7+}gzHJ#G9UkKQC-v0\u003e!b^VyP4;KCmNM;yxHYx?Yrtqh6`kZ`up_8{#gXmg|9}2a6q$210!G\u003eH)q(simJduta`H`K`|9*@x2ImSe`5d\u003ci|ggr\u0026^G7#v4H$nrLP@fT)D%XKl}o9sa4`)ei)!-h4v`iedcUIphOzh))9zoA4\u0026fer1gw*Ya)!!rvlW\u0026APOu46~?qCArCyA`b_J$szb\u003coUT{pm$O\u0026eicq\u0026fAzmt$ywNqa-d))yu7M;`jI6kN9~$\u003cFQd|49dR_%|2*reweU5ewM\u003c9V~6?0$zQ0NQwiBHXC\u0026\u003dp~4F-7#yyk|BM\u003dD1{G!\u00267L8oZtxGdLAB3gMSftb?Eqk@KJgn@6SH-k9JyU!(Dx}I!\u003esQR49T}JE3T!%+-SMOzbQ`w}G\u003dd#%o8TL9@CZ^X|\u003db-Sn73HFX9dv!F6~WXaSHqF44B+~KObq}*n@dl6V6\u003c^u{zNiw!H!uZXjshV`dCBbr~gL+~?9;eKeMNoumOB)s#VosEp(#_i31DFMCz26\u0026SZx;fEu#kC%1!BYuD*?-}Wc2E(I_k*7K1c0XGGAIdI|m)m%yVE$Bq|z\u003cg64BL)b1ewk+4NIt32hjEJ^s~{_0QO!^jaTa9OWEqg?naKD;z+Tn0YwHL-R\u003ddqws9$JT9P!7yC9$Y@h;4}w42*zh%ioBVmVt!\u003ew\u003c2r;)w1t5TL*m*lE)*RO%\u002654gf4lFny(eZhQYcDdc*RTTIy1beCN0#lJste\u003cpJjA(d*Ukuoj#UAoR!7dsW\u003ev7YtmN+?4~yTuw$Qt$v}dbU0oiR}{4\u0026@sAKew\u003cy)J3Js^Qu!-zKpLoMPAGWcA4h5cw2R3n)MT@fhvq@?@`q1ieMNM+e%!k%yN@(^3*r!E%4WVXZab\u003d4C`dLI*v)DN|S~TSV3tWa3o^Y)L_F5PvJW\u0026s~*Jr$Uj\u003eZB^JfP3`C8$_nHLB}INAY%_RFRSbbhdIt3^U*GpwLSN^|)ME{;Ra?F9!ncIiD_Au^M@*YYPbPSm\u0026?!)\u003en{r\u003chJC0#aHF\u003ckX#kvRnw)t8Wm8%\u003cH\u003cn-%~$xQG0_WFZpIUPiU?LaoQz$`r3c_k*!%2`qew#nDvQ#\u003eEuU|6OeC^0_hO{*S#{dsE\u0026dxsJrVeT(qA\u003e-+kQ!lTCqQ\u003cJlkX1!#UVGQ85h42|CWpwG7q}L9Ef;E`Z0i}^VyCvAscAA{r\u003d8ernb*ESDuXrG@a9v+I%NLypc\u003d|MMfW10@)xcbI1%#)u-IyYY^9lDgy\u003eom@_0\u00266D\u0026M}^M09njIp(Nj5(d7Gt#NQ%oYxmbuN|pWHI?M1?1QeR9LhpvQ@!;\u003e_r?tUUtDERv@6Ba3(o3XLa3Q!5@eW|g$PG+%C1$RpAD}s6EV5TYwvD_b\u003ck1##Cc`Gw\u003cdDrS1)xl#VWS)KPC5lEYh}L`O7f4e\u0026O;IV7G8cBc6-m;fXYA0L`HL*tM5Z$8w~~9OLi?JD%Dj^MQR8EQUVEf_f%dVX%Q}1CeCcaqgTqS!|vX+b~t27t$Cgl8Esw$Jp9@9Z\u00260Cs?W^;^7fQ\u003ewSQRuAuwLOexyWFi)g^3VR$)7!+y9(RTc4QWz2w_;UjpYDmTt~!MMj!p3e~Vpc?n*\u003ec^XHEdoysH}ahHnUqIWzNlW\u003cNL;^}(S)GV0-$#T%yu_};tm8~{mDef*EM%\u003cLpFD3AEi|N-@z8r9f|\u003e\u0026LLj\u0026`5D{\u00267zg^HOhSLGRuB(l\u0026!|pq@(luloUl`_51_Q3Cx0fmmA|qqrfNS|KWw2(Ao83^8wrnrImQYCS6An+mI~cuF)#6P8(N$xNibl+6LqCBeb(GutHFz}iRB?~akZ1$\u003e)S+rHK;i~twJ%K*Fb}WEy3kp?\u003cO6fsfWy\u00267S\u003do#Q6p*||(L1BHkv5YG+\u003dy@s1zzwa^8?)yPr;?u#\u003cW@^I1qXKd}P\u0026ebPcfY(1Y6%t9_is7aJQSv3ytLw0Ou5VN)Ne2`eGBO+o(_x(-5;K-zKtfNd0O2eY3J33~\u003eS0}4f6oWSJmT\u0026gBYav^I0dtCQ5+\u003eJKUR}1cE\u003c%K#0Jo?`uv*}@`|FTFfJknvXq3O\u003cfMNsZ9pVVf\u003cQS_evId15v8GO(kcq~`$p!6b}UgKr?1VDN1tZFn8D{O_~c\u003er^\u0026)${2Jdnc+\u003eG\u0026!dUg({KPLL@?u\u0026L()eOkw\u003eHmRMn4k)JH4sEWyhOG$IG{k~}p\u003e8;665lzS_M\u003dhRjmR*}jN9jXTJI8VmDV3wU@FwZd8f\u003cErWg~z)2pXe4d5C1RSgybC!j}RH5`930qJO`ro13Ga_vsF\u003dZxhkbBs\u003e0evMpFInzp2B%vyRpcy)RLW-oV\u0026vsEdO\u0026~}%vnXwvv\u003c\u003eNX\u003dhTz88qeclao|$X2*nu_O|Ck(pZoN6$t\u003eB6BmWI`~_IA3\u003dt|pRHC6o72u;2P{z^j;%xP#j4ch6d``|malJ%}-\u003dU16^im47Cap+uDoOosnEkfwuZ_s?Y|)i^+`j4v?RXTjmUX{G*\u00269O+u\u0026!V3\u0026aVhBS1ew7rlMRwj9Uotu6jVe1b?!i6?hl9Im^3Xb4hl#L)VP\u003d}J2yo?2C%B8}9|mMue6*cO5$FW~\u003du7-cL*J`pV2oC!l\u003e%zSQ~bJFafeplAD)Y4Z9*?i`6_`+Bn+npkVT5Zv\u003dsEhuYK1zc\u003dBR-8oS`cgEH`XZB{y*c|F\u003eemCp(N#3+QH%R\u003c|D2ETcWK$1iLE;vpg9?yKKBD4!Z\u003ejWp`taYTeqn@Wc09%|K4oO#u\u003d$e%bMgmr^)I`J9)E`$*3)YHeO+L6~^un)^rB\u003ev3eTd01\u0026x9Ml\u003e@U}($AJXN-CD3cMdNDDg9RdU8*tjXx^5owTLjJ5tqMbu(5p;dz^u6\u003d3OqY~gH3qy7Y-;6(zK\u003c68#~Z?kIC\u003cneb!-W+\u003eE#z75zAvy7)S\u003dgW^@Fb\u003djJKNOAGwJA8pS;-(#GR%Tl4XZxmhCu\u003d6jrS+`}_}8Y1n9}OqIKywqo6j5pCp`bt+u*)MY%Qsf6k~ZHbxBMuy6NH1D+Yj\u003dSbg6Vv\u003d\u003e!2tkCi{-cDC4#GcrQl)X-(MCYNk%#+\u0026h4rT2|pUMAsWd$+Y%OHX}fXVrP\u0026J@EofH2*aIJDKnA\u003e7T5v6?VmZ^DebSi+LzYs\u003d_v!;1EWAd\u003e*ab5X?$K{EIL#!J\u0026Xf~tZ%)RH2vZ\u003c0+Rq7Tyn7Ns0|^ZD-o4h(\u003e13wSh}eU\u003dmf\u003eb46xJ|{#OmN46ND;+n222BBrbu(iXDr\u003e9wxI4RS0;Q`Y;`}\u002632`l{PKpCFNb0`@S\u003db\u003cj-Bx9698wFus#92\u0026-gMx*zY6b-VlIFdfK2uD$MQcrfp4YEP?CA~;F`~4f`F^WyE;8tUp@mHx7a\u003e3|JbkrUgb\u003c4(WZNmekY)2|z$gOgA53U3F^6vQdI$*23jrerPd@LJMctPFxHG-4%J5R-J6f~@)-9WpY1V);\u003dX4nmp;WgbLBemD5xx+9NBf!A\u0026*}`8h37bon?Hf05_\u003d{;m`x+4K`fPVbe%w8C_X2MWAv0rI2O2b\u003cr\u003ca7$\u003e2H-wdCvNdU6`mSeGJqJ9J0urpI5q9?\u0026ga@F\u0026Am@R_i7wmBY0\u003dN`3(|GAdz\u003daYJFTXjw5c1GZgRI\u003dKaZ20!;YhDj#+wsC*Nt)!!kE4YFNHSeTn}feT9ID#hlfIYC(0JCkg*Hhd2nyb@YmFOwWh8WKkzRh*@l;!\u003cnG^c!krc$Mu_(AQG;D?NnuPyPE8!QZq%o1cHNBU*U+83jy;t;NhN*S~9-*9OkYbkuT0Cc\u003ec0f+R@wu*^_(q\u0026+o!Q(Hn\u003dc%fgs71#I1Qn`1zq~8VR\u003d}p6A~XRQ#tEBRpTC|zL+H9Fbpi\u003e-X!b#bR_Gh6iZNv%4%)Jum{$Aid5Tbw65#tM(vfLK@P\u0026I+XMy\u003dp$Eh`e?tK4f-1DJbu-|Q\u0026!{iK%\u00263`ns}(jeVq\u003d#\u003cP`aeplS}kLx{lW4{(4T3l6O-T)nJ*Mj4D!\u003eFrZGXG!b~+wh(VgTTt`1^*\u0026%%20_R@W-eQ\u003eL)#bfoXKJ~\u00261#`Es_AYIf;\u003cec04i#sc\u003eWXq@L7A{Ygkx5AQ\u003eP}Gu!1-S02@7Px1G^{4Wk\u003ep%o~\u003cLBZ+\u003e5M\u003dKqa\u003eV-a4@Kf++QnH{$n?*!b`gFDBLc+O)QWutJdd(p9x\u00261B2ruen`^JdvJ1)0Y(NbKZA6DAIs`int;NsO;t\u003e{n~^NqcfbZ!E3@ad\u003c-%^Y\u003c@@-N--lI+2ItS(VBWU|k3U@YOJI%rQ5Ptl3*EjijNWC?+vo@cy|IIx\u003e)TsLg4?O+fSd#doGMmBdeVPrRjn6ug~!C1P`pAI(L{($@1y{x4$mSD1JJ\u003e7jC3aX\u003c5p\u003dv^G+%QGxokfjLZ^rfc^e7y6;wa59A%rH%\u003e^k_2H+\u003d??uB)vP4%m{nVwqpfdUnmyco+7hGQCQ(aOD#fv|j2cGgIXwPaITSUDbut\u0026Og?5$?5pfNgJ(b2\u003eS@8sb2Cnq5)%wo*p\u003e}`WR1${G@6j@}!Yqtp!12iT?3GU({)oL?iEUn}\u003e0w*U~VOw$0KziBQ{|^v-4B^mrz7(lL+g\u003du(D|4I\u003en1@!_zgcb7rx?hTHvG74IV(im\u0026\u003clw6CTsdZfkNZ#4!\u0026Ujw$`n?loY$`p{2G-8BqltUgzc+xZYmQsTo(K`\u0026pB-Trxn@|q)LKd78r*R}e`kCqV%xVYb#5hoyP*e!0VeOvpIR(sY;9jHdU\u003d1+07k\u003db!msUNlUKIX;#FbStWM8WTIW!jfZS5B8_VhhoBztROTg%pEM-N(j5@4bU`s2kboSu\u003eDEZkf!$\u0026x(`0}\u003edu\u003cY\u003c\u003er*++uq$+t\u003dxyDQ-)h^RYRTyDv+?K^d)RtN0N!F\u003d\u003e(X8uyf`rD\u003e9FAJ\u0026\u0026t~d85;QHZXc)tt(%?wuMGGwqEjxOr``LkmV*t0\u003exAaF4HPr;VDo4N1DLrLo3jap6#XC33ZZSHwhfCcxkG*^gBPR!yHd~`leJ+?B@cApj_JHk+veifQxT#iyWx!3W$)8E}{bUkvvb1\u0026\u003e+ry1dQc}3ARl+d7iphF5rRFpC@ON8E$UjG*AjD*63HrKDrJ6+g\u003d;JR{IE^4NDz^Th^fxBTBLsP9nn5{6kp\u003edn{IX(n9uT^VnM;emK\u003dPG$%ZyX\u003d81u))5geo1H_~~\u0026s\u003eg\u0026fWBfB\u0026A?Bkdt5SfyJNtNU0tAn-2ki0@|EUh}lqp^17GQH^k+K0\u003e3o;oG\u003eJAoekO\u003cYqW|s%m7_NZ\u003dijum!\u003dCn-We$~@L(0r?GF)mi$O#6G#mJmo{xkPp1P\u0026Q5`V_G7{o$cGV6)OPVC^$N9)2Pm*d5#h}UH-}ZprJ*i6@?#@Z6}BOOFf%FO#B7xQS2ZeK{kI}YPT4)Y~BX32MROqAEU;2pmX-M{J2QoNtYWU!M^XvVujw^%quV$0\u003e`!rdHlBu4y{-Je+\u0026KmI5y*X2LBM1%ja5Wc7|YMOx}-G\u0026cW^{R4@L5RBu%FwQarkKB(+K-T\u003c%\u003cy%4e}n9\u0026v))_0?ulEGqFxpq-$wpH3d-EC\u003epeY-fRkvV78^$^$cUzT3_{\u003dk\u0026^XFD;48UE}8)wKb6j!FXVe1PehA3NrgL55WbV9v7e_LYkXZoiM#OdNtzDr\u003eycfB4Y)@b)Lo#~E-q-z4C%)!-~3CB}Z-AZF`d9Wc)i)5Ae7v+g`PTBEPAxynOTt\u0026^P}qJ8f-tp7h~g9+0)4PZd*0~rSi|3KTXW93nn3p(\u003cRH;22M-iJEZ0zR^K@?$0yJ(rU2C5#E%#e9G1%d8MZU;L+2(le$Fh%o\u003c!T}mNp\u003d28oUlZ2Uh)v\u003dyzR})|*B1~+zU5%c\u0026bl@felC4vw4Cs#6_fIN\u003eUTG4d73!O}Zg14G!!4K%w+NymKI?A!jhJ\u0026SUHReQ0yllfR4#\u003d4dJ+~|?bM%3_c20x\u003e)a!sEV\u003d|*ZaXH92\u003eV9j1{}gg-m?1tZjQc9Vjo}nw@A)s+RXD0jF6A2CyU+h8}WB5gT~TGtrmQzuB}u\u003e5?U+#7zG{?e~+3(g3Hmj{msfJ{??;SIH\u003d?*uD3YvYo%hIZc\u003cY8BE\u003dvR@J~X%nPuog{tLm\u0026Cip*#0zZ8?N1#xlKOR++nE-kj%;XEs{*HDRlnS6!`M3rl+CVj9\u0026x0r%?dC)W@ybT9LvWEo!wiEqKhNm\u003csow5V\u003e+YIMfocPGf4y99MTGBw-e;@Y|65bRbN_9Ex^r1lNu\u003dJA;CN63`wNZQ{%MDEsJkH^yElsi))kjcWXx)ZMlOK{Y\u003dAl5)}H9zj!ZSQ\u003c;1+Szu\u0026diEC{ezY{\u003eKcW\u003cyRuh-\u003e@5x}Nady\u0026+8)IfqCPYY71Z@\u0026@NiKCjDcRcr8!??$rJeSuN\u0026%Q7euN?~SvS0Ugr+wlMBGVW*MhJZ+G!kBWed%\u0026\u0026f\u0026\u0026gP\u003dc2K^3?X*M(kK{Esa~jZG6bxI%AgZ|kgN(yW#h~Pfe3Ei_ifc-|hTz^B\u003co*4jw7;hFS3JS#{Nh06VsyK\u00263KC{?!$OV1%49oppTx^h0eWNrI+X77\u003e\u003e\u003eKT?|--9Kt~-{D!#^YXu6~a7wmheb%Rt^a$s%z81#UH8f|Jt_W*v^93o@9A5\u003d!@%\u003emImY\u003dI2y5#RNl;xgONmA!yBu!HDRVl1(q@C2!9ut!~HzG3_fHl(5?U7yb@bqiLKeg(tsrv#xy5_olH-b3cAdxerVj+2SIp5\u003e\u003dln8^(H\u0026l1rftAlomS-f5B%6c!D)eOclE`?Dw83~Y#\u003chG%@\u0026QWOfUk(O5sOO\u0026\u003eW$Z~7vd_Y9lWsO#+@FrYN-Y8A*oRt\u003dFlig$e1w~Q;\u003dPak\u003eT`5vf`K25zxd}bLXY\u003eV$phPePwznz+-D}Q5cO)R(z@n1-FAZW5x_QCvodM1mi{\u003eC{7@)Uj!7(zz4dP6rAF-!$Zqxj7qle711ygLl5G}`_\u003d44H\u003cEN9c$nr;Qj_6g{vv0aP*EF\u003daya)lDp5A;Oz@$yQVMhX~\u00269+UNtQ;(O6F\u0026|YH7uj;H9lSB^9Md|4^-c5(c?#K^F\u003e\u003caN~h)7AX5nw\u003c@||rtt\u003dLK^IcyVa\u0026}f#GJ+C\u0026ArkQLuRtuO#%ueCQ0#^xT*V6n!55gG*wVj*9Ba9!U5wmTwolzR@7\u003c+gWR_0}C}H1j0`orWv@!#\u003cLC-ev6gl#|ztJh(_k?SQn;exs\u003crv3R\u003eXrRUbs1XmF(%D$n?\u003dhsC@05Z^\u0026jy4lqRKt)(qeV{iGirr%Ip#gCr62drIc0sE46bsr_($%7Kk!rR^wu6$A`m2#fvobPqA68S}l3Fo%5gYpjc+Xad_?Ykfy+0lN9pll;mCz!J$UI-G_lKDNor)XmQ*j#As^u`U4\u003en\u003dR|AuTT\u003e5`bH_thoK\u0026eMpv*nQ3U\u003cEjJT+958YD`a^;TOU9-ur6$uaq^3syH!YfG\u003ciVHI?_GO^T3jB\u0026u\u003e*RNsIJ\u003cI8!*LVEl#dF$8aRPH\u0026RMHv\u003csOUTI{ozhtj6^Tkyfs3gU}yYYrYdB5yK~q%$!#ZLlPYjw$hXeZc9)vN;H@+g^H@3OYO\u0026URBqtj*l7U(f3A?#rWdMu^\u003dM2f2l\u003evvS!Svbk7i!)%4`tWB-ej8is;{IktWa\u0026$1H3;cz}n}ovk7ozE^TI%)Vc+LhA`NBdV^tiA\u0026h1YK?g|ArPXhQSk\u003eRCuyoOOcaCLaY|iX\u003eeii+hZyI+pH}`sOC}-L#{CC85+|@\u003dNoFZ;t4IC(H!xfG4S6V?6jIDE!\u003c4^JA\u003e9}4M-2f^0(6XetuCC_hIQqA?;h;n5TmF9#gFZ|qYrU_xxw?lnCbO)5vtqz;v4s-2TBG%@-^8L3v95s*A3wxU2EfJ$RHfufbnXU$g;*J%wiD5vR50\u0026D37s8@_IO(Q\u00267$T8KsccL22g}YuoSDDam$9Eoe\u003c@)\u003ddR9zE(E9z~\u003ezdw*\u003cSb\u003dtCh2IQ@FopRX\u003c\u0026d+mblgJ+\u003cNTy$\u0026_KQnp?q*xNAf@0_rok\u003d}}uc\u0026+LfD+ApC(?NJDb\u003du\u003cu!;1jcoQt_d@HX{wGAJrTz4U$)~4;F\u0026n(P\u002628DWxO{9cQtj3QHNn`Rai6GPgSAy3_5D{Wp+drN\u003cMtG{buDrNFw\u003e#@~yDBR#yR~XGDddkVcQ2opES\u0026UFTlJe-p3L;rAPDRt)@sn^4w@)wN*HI*Q;ks7Lq\u003d\u003djTRIlKnk\u003dhfwOoNk7V\u003d;pA2awl1i1QiN%|FFUh*\u003ec`flPE?u\u0026e(v3BcvMvf%n;$}BLWGekJ|K;xLkANX+CHCu4sCKol{~D5PGCY@VA~zM11{%tT_Lbm(\u0026ky\u003cm{it7n(\u0026w1e7bjiRfp;+C_n!IeoW\u003cd(+KicjxV$+kKasarMCWIJpv\u0026Kqvlzv0bhk7s2cOHXiJXr2mpe}Bs95W00K9Zqs4N*RyfG7DHmsuYZ*)Cu;\u003eTDjp2jAh\u003c4ZlQn2W(nvtFmu@lAxU!8FzvXPs+ucNFg3s2enBN4dd!Q1za$l-aPYOQYlD5\u003clBOWfkEirnZ4\u003cmQARc4s@+iGw`U\u003d_Bm\u0026F6Im()B|}q{yA!Tby%3Y*k?*FK0DBG-7NXYuH\u003cqaF{K;R^yy{r6Zp_$|BFHS%*19m_\u003do\u003e(@zoeVViOLlgMWmMgjtdk*7yM9*zGEqvat{dAM+Yd;RyB\u003cj(Ag*RjG6jX)_rCGr\u003d\u003c%@sg5\u0026Dhlsc4yS\u003c1pKn52*V|)mL$lp?~n{v\u003el5dB^ji\u003cJ5dWUB^KcVhu8@aXB`B3*SJ)G1pj3FhMfT~nwG3G2cYHfEANF_so~-U*;oS*j9mkj@\u003cOl|LvZVbB2FviRdyohvbmro35b)P+\u003dEJ5^hKW%a\u003c0{k)xoPXSY(M+PnoQw!G4*@AqWe*J?~8|thvhN$y7;`0;Nf{WwZs~j5!NTQc3r\u003e\u003e*\u003eVf)am2`Z8hUVy!kM~$\u003cd**j8a$vT!sGI`}Faw0(fJ|r+Smk~^R)#r{0Tas?neVI5oxtZ@^0o_\u003eIYsXo*ch;(dDV$#_phwyjX{($\u003enWWVKmXua\u003dq-_iOX\u003dh?1Qaa}I@U929XcLVbn$v+AGruYR6IvcOE\u0026*!nexYZih\u003c-ap\u0026VzVb!B6JK%g(9wA$(m2VK@{zpXTE}ABp6VbpQV9+y!)Of95TOsDdp!OO)C-F?Rr2gB27\u003emEoj\u003c-~ZXX5%Dye?hW\u00264BSdj$G+mdQIpCcT7mwoxnQX(SPI#$l_R)syr8(2*$hR_()q_6pWl!v1d\u0026?@raJUUYMI_Q\u0026-hQSE_oC6ndPyj$^MV?wY5k@ZE5ZMyO*+nDxI5JenJvR7\u003diw^nZa+\u003d5Y4(^4^m\u002606%FnGVWIPunLf@AFWr$FZC17`VxQ!X@RVdx#Pl^Ad0\u003e\u003e%16E*Ups1oCnxSq!2lQ-KxW$^_c#K@;Ksd|HON){P%i\u003epgdB}Xpdw7%Fcc4vtM^@y^WBej}B-f\u003dt-;rj2?g(YQcgD@fcUW@LG_gFV-KrgG~Xjr;7Y-vU~bhjt3g6#oG7(#X8r5UJt$jN4xboDn}@eL}$xo$j@UKWn)xxf#k`9{$;_W\u0026lsB~oxTOM2wovZN#z{Y#$*1SCe?C-ZqP8vP;1-taCq{Lvdr2#vQe5G5Y`O8l\u0026*^r){#3{I;l0Q\u003c9qsFl*CEIeLXu\u003eB%z0VZz0UOEEMj_@IvQ`Ng5`?Pu^LaAuJZSk50PHP1%jpUIQp\u003ccR_Nk7B-g(%--\u0026bc_}xv?WM)+#3!%7aJ_h6$q|Ki^jW?Dq?\u003eH3|j)5ck\u0026a%sP_ZI*iwi1A1m1ipQsy\u003dnCY$eRo()8uGHmewpVl41UTDh`{|pNN^KW67y#r\u0026@G*pohRbAbA2I5Ni09XtMoEb8_1\u003e6FbGalrzlx!S!D_#c$VRdx-sA)J%sZ)M|rVJ;C!j~?87+~L@|9;N;+FHewl**(~%!Lo\u003ea\u003cF(yji@*0^D~ppGC8{dgq_Xmv|V^Zw;A\u003e#lr2OPx@TK\u0026pLuL\u003e$l\u003dC(r\u003d3\u003cf#vpip9Rd_GaRDI4R0zgY7ifM*o_\u003dhrhsae-8\u003cUB^Dv#DoD4$?m\u003cY2Pt\u0026(3`)S}}*\u0026dV%Y~e9epM3(^7A\u0026)7WVfWq9U2+@PIOeZ3u\u003dO*\u003eum^t\u003e(e}IkO9Po\u003cK^qJK9Hau\u003dg!\u003dU!ALXxM*p*6i\u003ebS2W)L`YPTt|0OWi*y@!FL!9U\u0026m`8;{za\u003c8`CG6k\u003erDSP2BvM3+N~1r#t_1^Nn\u003eTcSXN9qpx@y-UZuw^~Z*jj\u003eU{\u003dh_OXz9*ySGlwM_SC\u0026_c|02Yj5c46d`f{{gL!!$-Pd\u003eP^84XW_Kvi@BsqywLUvTgs6#EUO?PKNPayzzOifd03I-K1IaHt_JBPkq7U)lEO{Ewmwuf9u5v5%PtoBD4;2M?`xS_y8sNwbovuh\u0026mkb*o(hxj%~(S+;4~j#jo?\u003cL$%@`pC1Ay%UcIf7_PR8-Ti\u003e+Oh76$xV)f{|46(FnD-h_ZP_yJ~ekZiOX\u003c7wl4k2#(EM(r(*\u003c_{A3$4^Cn!eS0#xlz2TO\u003cJd;^C^2fpX\u0026XN`Ee\u003e2#6f\u003c\u003eg}@xw@)0uLt)zlu\u003dn1h+I44kbj}hD`16@3%F~J_-$g`Uxd2Up9$Z+ocl1PyjQ^idcv}\u0026e\u0026SPR+ya(f-J{Dy(*WC0$4#^V?}F?wy4?nGLvGom0e3EkyT;20*X|H\u003e\u0026)i{V9o%NO\u003eEmI+eawl*N||\u0026qhv8qut\u003c}x)IwyFOB-J1\u003e\u0026oMp\u003e\u003ds_6FSq$@E1W_PyExFeePPd#(Z~OlyLVtbj+AlMQNbC)dNB1Cb}Y8@WgUy08\u003e;g(hLgr47lzA@@3D~Whr}k)fo%yl0gOd9q\u003dtUt9qEhTlYVLzt{EFZ0)-\u003de\u003c\u003ceU$F0M\u00264xr\u003e~hZKEZonfW$Y\u0026cPLXxzPjoE5!ZLQqXK!tPMJUU\u003drMWRL5MhyB+9A0*rECtXOnrhSq{\u003dd3HuVWoiW`nt\u003e6p+t^jWcm?pNl-|0g*1?QaZ)0?Ms*aS^gPFuzT;Zo)$1hOEbHBCT1T`)\u003eZ\u00266st\u003c+jn~$O~u{?JzY\u003d)tnsTx\u0026t%\u0026Rv#sL8hu4?c$G@AjG6t;s(sEVz0ZvP\u0026X~_$06gi+_hIE?!}eImD1{94xH(RC@!HqA^lU6DiQ`XV^Y`OCxTh-5sW@V\u003cl^tOrj8-RNR+sqjDj0_+\u003cZBuDh5n@Ok#^%tXUR`rrz|6\u003d{EK;CKXF\u003eE{?j|l$GoPIB@nHQ|2WXWH0\u0026${d)plC?pIPzRZ2185(J+VmI\u003cC9kk\u003c_lQVo\u0026;D|9JCyRqKybw#K)S)NOi$1h|1\u003e?\u003cK0WPR\u003ehkZACC!w#a?r#^Ni)yR+jOq`?idH\u003eX\u0026\u003c\u003eu(RA5T8g8+ldErLyc2ga4BM\u003eGFX27Bf_J0Xk#Pcwg7UQtcke\u003dF+etJdAgk-Nk\u003cjhB5V4;!Nssbb;Bu)lku0DY{~Cth~JVEJkPSps(dK`yj7G57o`Tn;0i\u003d*\u003c@+~-S)vFs$X$}l\u003c%@\u0026Mb_VaZ%a\u003dmM_^KXU7d(Vs_S2Sr\u003dA;6p}##ejhhZHug-Rfh7!#Rv{$ov+HVoXb!hfe\u0026YTpLnHH1_ST2Qr@U\u003d6(HI4-qk;-~Qp8GW^1ogH99@2kyg8B3?I\u0026dn{D)H)wq_LvB8;Ln$u(hs\u00260xzOarY1hVQ7Ozx{OP^t*3XPVb~`;q$6WbNZ(|@CH?J8QbC5J\u003e$66w?lI-c_zM5yR;ac7-5y0Th6lTR2gt_rS*}R;Vg%tTpx?6zM24D5Lo{N;VC4dDqU;n\u003cr|BJ8$f0a3eD\u003cI7g0?N$~!^maMy~(Ni3hAO`\u0026l!xUMt~g\u003cYLEUxW4`N4TL^\u003dVj29\u003e)?|5UiXe8bkOfJzvFsRDkV4\u003cI@P9?~GXD7ihdDi9Drw24`iVDOfkbmzVHLK\u003e6G}B6IEZf{C?Ql~p_AygDlj~Ac%2`sBk*9LePq?_it3CRy{u@`xl\u003djL\u003egi~Afc@QkvUoYePDiA*Zh5#RNz$TxmLbq0s0EPl\u003d%zZfsk;xp*2_l\u0026Oh7}QqWdA+n9lPPbS\u0026%D{EKZx^GvXaeDHK_E`j!FJ9dTBQ{@lSOnhf2x`E-88Z4A*xJY;LnP-V1\u003ccpcr8En?ffX(RU08*lW|8rKMmp\u003dR$YJN~a#ip1iwjDCn)*0p;xK{hdKLu!NDU@U;;cz#a0RNmjC9^cDziJiY3j5r-Uq@jlI@AcNuB-R48\u0026)~Ffe\u003er1N\u003dVjO-h7he6bds\u003dKwVkN%X2PtboUfk2I54XSif$7#kpBetWMH%2\u0026){6Zqo8Q`2OkuB^!AK^?cniRSF4uFyBmZ1j\u003d-?\u003dHX\u003e}~Wwq-urR5CKQCe%;^b59^nzQJM!G_|q!VYNz\u003cHfgc4e1h04JS2rOt1*|_oc\u003d9\u003e\u003d-YMf0i(lsBG@uCV??ht2N5pLZNASCCb\u003e{ly`k?jrTrEG+gCJ(\u003eugGU%LnF7O{N0ppeGgBn;f0\u003d6Bok*NEH3\u003dmtz#M_Ub6Q{#c3q\u003cRlDEHS7E?(xxey663KMu\u003d9z\u003d2dE7C+V$o_9}UU1U2lR_VvCp!\u003ebG3tGPOoP2p^m\u003dZgGo;vsJIeSicXJH~#lul19;jx+#r\u00265Ne}D5GI3@zx#xly1YQUZ)?@9LfeeFvx{0U\u003e^IZsSz$#5\u003cVo%JaG\u0026ye@2BU9Wvi{LeBWKvel)TXaymjsMGjo-wQZ\u0026{rg~\u003dE(Js\u003dzzP};D^}kBU8+0AE\u003dZm\u0026KItpIkP\u003d\u003e{ksiLtgtp\u003dTi48SNKyBji8$}HIz^Nu}XFi*`rXh3YZA$*_x34SQTNh6u0m%S3Cho3sQ!ya$*(HT-kXI5WuV\u003dW\u003evL*rJtEz6Po57iVe60I)9)Zy+%U?1Ep2G(BbUVW$;0oNwvpn3Qg{`SD7$#L{Y%K8}gkDrj3))!d-gxFDsL;PVhIjsf;8AK1bgeyYQA1K\u0026)ZRmu-22PdnI{HJ-ydFFXWNuykh?LF-}!XGuO_pkFszF0WbCA\u003eeVUU0l4JHexpNw#9IbqCry`M%b*@fa)GUr-QN\u0026zuSH|8pXfu~i-B!lkmIS)ZQD{\u0026CGwuok+8IC2{$@ra#?\u003dHKyDTiZF)?6}mVX\u003cnNVW5\u003e-lMvzB8hF)T4~qNuU@%jJ\u003d6U37`++P3%U_{C`gBMk+BiW^53e#)Ls\u003dRdb\u003djP_Eond8\u003ctBZk2U0Ykyv7WFUtVJc+n8@5YLrBxndW|3\u003dl~WJJ~lm8PGc1Un6zFR\u003ej{\u003cjf%Cu8xr\u003chT`2SoUn8QE_)@4(#AHI\u003eeHm?\u003eafK$\u003d8VyRb5S0!u!T1I2#HeB8IgU-POUV!eSs2EC8#C)snd#V\u003chh__FD\u003d#F|{4LB*VK!@ok+?;gW7l\u0026+Q$IlhfnbbZBE9h$xBW|0kpw$eo9e{N-ZBeu\u003e\u003dD5Ea{;SVV0#}he\u003cp5Vr^35pW*X79p*|RyM$ySJT_cyBb4h~5KG@?!)lCTr0ce(+OX9{\u003dlH0U\u00268OploT9Z_~GHs\u003cM9kJ#a36bcMZ\u003cK?i%eq\u003csq\u003cv(+1wUN%Y5hZ\u003e$^8fxJ2g(EK87YSzollkXK7TEK%a0CcXY?oJ{cdm4nw{C;@n#Wh!{8Q{fOk\u003e\u0026ARRS(KJ85o%NKK*;YE%!~n^QB{JbTY6e@Cn5$9TUnrMBF)~(nC8Z1qS9A9svaSg1b%#@*3Wg4ohOF5Af8k-UnI^|W`cXkhhk-7S9azfFT8U\u003e0eP}S##z!Hjs9U\u003cr-W(gT#)RK_uyZ*|()\u003cQfp5wiWi@C~F4egs@aYE%\u0026qkNvulK;xU$h\u0026JPal#+GL5%b\u003c5*P9b^iQRn4M9pULB@nq\u003e57-r7c$3?$Hif1@%lMJ;QguhVY?gf;b{{BjiQe^a(CZba\u003e(-6*Th7\u003cMk}1b_3I8!1(%KlvT%Ci7^%GOM$\u003d64i7z6m5$zk}YRgX%rDsi|)O7$z\u0026M1i^Gd;|C2(~L}XJ\u003eQ}\u003ekg`B(zH`\u0026L0R2fo_5kG59t}U\u0026X\u003cMVxV(|Ce5|M`WXtFL\u003c3_c0SD9\u0026Z\u003cgOam1x6B3L5T0mUby0v2a;^$U\u003eZ\u003cRy0L\u003eshAo-gayh3#Be2Y5R}_2_LkFteh)%U3_SH#buY)NkR^8J4don-3w8T\u003do4r4nYc)gl-O|9R|N#vTD\u003cPoEfO5A5#^fB{2C`S3;Yi^V#w@F^~QK7uV8I1Ey*eO;h%p#uISk\u00263jW!dIr1zSc#y7S80Y(b8fdEuj;v^;Q0sDT#PM14|Nlc%H!afnh\u003cs\u003e;P!Rda;0B{U\u003cSJp*BHqCiO8%\u003c;7%0(i++$AX9\u003d?O\u003dyZPxiP\u003eOux!MMiS7{1C\u003dovt|\u003cyS_vzFHvAz)%X5p+Lwh3gnP#@71{tLAfc1LRBd}l$3zb*5*|I^tZHGvb2-p6rk?Y%#Pg7MDxSX`euUZm\u0026nD3ZRnqam^ex+wRE+zP2L$qMr+pl?tf`\u0026e_ur\u003d~UnDUV+(R|h60f6Nj!8N4~%v)8(Th%!ipQU~r27PIb8\u003e_5HhkaNtThJ?(\u0026gFa|g_\u0026m33;^BKG1p\u003cGd2Qr^6kbt6`8ME\u003c8hc0UD!p_!m)~TiBzFtL%vwB1YC\u003ehd4?mAB}Utpl\u0026w6*uJZNsIyEPPtS\u003d@yrvmBiw7xu009bE1T\u003ey{~bzccz\u003er%E}ebM;?$-\u003d7XE%owp-asDBy0fr26IWM5KvkW\u003dgM9Z+Na|3T\u003d0N8HXX\u003cFAt$P_Yg#Scu30{UgVrW%)Sh8xxjcH!NMMW*59F%PF$V;vu|tZLbs\u003cv#a_iVLLN\u003d4;f~3qpV+ApjZingX2Kj2i%%+#%FWMhAu6M?k`d5D#_!92x915D!S\u003cbcVY2V\u0026QU~\u003e^qWqtY}i@ITKFZUX^\u003d#gV90qo!TCDEjBwU5\u003d0y\u003dPZN^m;OCy8AAXLFJ(he(8\u003c\u003e?GA{?_jTnh_\u003e`\u0026fgY4B)1su#\u003dR`%u{`xW!`fIRVZwGXE5p#g*RNogLMXx(lKkVg-X-YyY?{8BLsLB2_Cm4C\u003dsqt@B_JWqP+V)0wF(FQ3kjNnF\u0026)LYuwPw_8uZA*+Gi4ia*2\u003c{P\u003e*X+{5H\u0026I\u0026y2A2\u003ei!I~?{-dg%(F#giV`27\u0026T#|!KC0+V^d2)@_\u0026@rhCd^w\u003d%+%gT3MkfMYdKr)RK$q983{||wcTD?qLHvvX\u0026t*K5EpH+d\u003eNsBiU\u003c-P2\u003cJwCqq\u003eXsDvrxg\u003cV6rQuah\u003ciqUr\u003d!7rohTIq~L)FSFU!LWTwNS@@MTHvT|%2-{l`Y-f0A@_HU%g\u0026KEW-g3Kb4gfhG@{~FGPwF7~is!4k1zr5Z-LYwmvp-L|AuWm\u0026hbp?i4tV|V3x{BPMFD^~Zaf-wxT\u003eg%n`xCZipKoYY|\u0026CZ({5s+ug%k}(Mql$h0BTrj5-CHfIzKNNlE`W2quY|Lwll1_?OY\u0026h%MBSt@D\u003cw?oB)kK16C!S^(?jmsv8\u003c8f\u003dveqQqr{XX@)#j!|?bsE-(!f3JA!_04ubq}40i\u003eN;314qf9*{sDb+@PF-*0LHX(LppZQcJe!G*U~0888Tf22M\u003ef!6i#x\u003eQ4Mkmp`Gz(MPRBK)QSm4J\u003cO4%1mEp%VvktOqCQG45cJ)M-CrelxWf$OmuMA?m0;Sm(xUWrLxp)-){%k}#1uOukf\u003d(ZkIcOE@_vKEamo*t|J\u0026zpk@J^7axf9zK5\u003c1t(|*!Cu#dmEz3!}_;(X!WoW\u0026E__|YBPFV%J*OSSMQZMxw@LNLr#7rq{9X\u0026v;+IWD~*foqX*-sBNjQzP@~\u003dC\u0026_ZSPEttbqC1DN9$EUbN\u003dFf#BRMbzDF80Y6(k\u003d+rB6ENn?u8vjsQ@;POq~YE5gNf_r0m0lm3auEg}r2!IK|)*Q|SqGCdo^FJb{!dw3^\u003eEG\u003c(57j*t|B0jk3Bk|xX|E\u003dI\u00264-eoclIY}RVEw`\u0026I\u003c8gm8%EnPC8#!$ZJ}kzOBzFC1auTfur#g*\u003dR}z6kR@\u003da\u003e^}i@4q3ARCBA1R\u003dMRAK!S*A?VdNmhk26CRE|m6^l\u003dPh\u0026V++;QbQpsz~z2om)wI_D#!KamTpx_\u003clox9xU~NMfG)E\u0026\u003dMoE;5Ugt~TPSGwfO_TbaTZN%`943uQoG\u00260QlGc\u003c^zk;w4W!znwS4HrGc99{L9|ExY1h5\u003d9lo`orQE+\u003cZg6\u003etS0mZ_\u003ez\u003d8ab;pGjid;|Vx\u003c^L8`M{Nlxqpa;Naba1t#u7X\u003e\u003cO`{)%)chuQJpoBhl%(b7_SDZkBm0Vy}0b*WIw@MVY}cQB--3jd1e\u0026L^gIeFC^rOSt\u003c#\u003el\u003dK9T7x}A5C\u003c@Igq0WN)b7EMbSO$e@rhAJms{p%M#Ns{v^l;9ZIi~Be_+~hWNw}w7Z$EDZf\u003cyjMc\u003d^oYMF@(03lgX3{vUb^;GL$uEo1;zk?;}d8v-o9^TdwLOR2a21q#Sk-D4vYosX9wkv3x)%~XSDjr^ZUQ1`1\u003dbeU{%9ny480IU\u0026@t\u0026qb31$PW\u003e{TOI2VV%SO8N)DIZYpI)WS_^vCrd8L$?s|U11SD#D3ew\u003eFhO#$?wW!A^TqNqO-j#VXc\u003evHKgI\u003c\u003eTCL)Mw7O\u0026pDrY\u003efX)\u0026%g9*PdoD\u003d%B@`4?uJAIn~GKMM\u003c_yePooRFEB!UiojiS\u0026*up{Do\u0026aAYL\u003cqHo;QuxUEqI#IPv4^UsPVS-B94y;jn}w^-Ed5aFL{?A6?5dA9ya*GKgcwXRqBLAnY46uFKAiq|UFUPfJCq@(DC)z032TIz3qO*C2yOf?-9?as^~(wlJGf8q8d^9RF6sB%\u003c26T802ImC5{X6;mhQM+}f\u003d@y6X8T5a#CjO#*7p2`x`lZ*n2eL0`ZmdKmaT?Z7)PpdpXmfM?JYYAD\u003cF(U`\u0026FRf@^+s4BYB!f-TdtjFJEjYb2SR1~B4B{Wd$Khc9C;5tIm)7gZgP5+Ed\u003cul*2s#mTkeO)Lvtwxj^F0%|6o5Tq5)FS\u003d-#`KUtE`m%F-tgeqU-$\u003eGdl\u0026bEWEX-e**\u003c)F3NWfBi`5gk\u003dEZc)D}0`h|w_JbQ!J-(Nl4UhX\u0026vEz%uS\u0026H-eLw}!k4SO0c\u0026Ap8h_7FwoVco6`07\u0026;i0LhD6\u003c*LCc)oRx*a276x?yvf(QBPJ4EUjyX8p3wYE^Vx}1w\u003eu9~wGjA_N(7p)pU2GwQ86v0a5E4LbMRAft`BbscYKunm)?kxpF#260\u003efz2UPrfZL3}{0\u0026jewBqT}VNLMNj0b*6nArj?zkn{|)LAied#GnIzQ)rBb|S68zpn$vdXq\u003eMId\u003e~mh\u003e(i7YVBPnl$c(zSL#})EEF-\u003d\u003cl\u003ega1\u003e7O{O`e1)GqBbV?_y4Y_4zacUqTQbi44}HfNnUq*##`mwyY15+py}Vi5PQA\u003e{dC(\u003emPfJ+@xr#9gAxng2tK*!P;jvMUT6f+yOSs-B\u003d1%LRf7m?kbaB\u003cKFgy5X7EQ`4Q?Y\u0026QvniQbY*JsYT}O$G88@pB*pjcl@c#\u003c?AH@@_*e`a+ct!zOR{$zo8$BlbUD|hD2M6+Te{|ZKZxfY4(6Ii*gR(S;7Ir`r@3+WQ6y~v1DnbERl?{S1j%?32SvGNj+p2~_U}cNnEI\u003cfRxFRpVA\u003cc@`!\u003d8FvqAoe\u003cp`\u003dBlx3Lnw*xNR6OdqT7?_bd(G}DG!2SZ`1f5w\u003e@;^u*X0k%^\u003dR|`}vY\u003cE7G\u003cVOdcSed\u003c{lXb}HiZtc61@Epd1ZWk!zuw!QW4@\u003ehAX{!bop8u1glCVa6%CQ|\u003eP)2VX%%g\u003dlDcGS*|M1wVG@?)0(AT^kI@8%z-r|5g^$*E6@PXWC_D)lRy\u003d99x\u003dr41i\u0026FS@;}dShS@8PNNN@*pa\u003e1+Zd8ZUOV{VHcC};nh_%`3@Co05_IIL|}tLDueI%4ozq+n\u0026)s6S`%5C}E`3T8xh3u2btb`Z(4uT$m\u0026DHhPU^thrAs(NKgeB8+HaLO}*NIS6A-r}b%AEr?l{jvn8mrmvJP^Q^{(x\u003ctz*VgZuw-C$hBuFvdZC\u0026H0i1^tt)!8a)H287EF#qX$$l8\u003e$+7R18;kRwiTp9n;yepPSdg021wZ}hVqV\u003c*\u003dQBk)a4Ya!sn\u003dDyg-q1\u0026BJ(X^4H_*\u0026i7Jf|jSDFfLkMrH}TWt8\u0026B;6Tt2x$NYY$\u003e@~Wl#;BVG*Yj!K8#!#xbB-!r#ksIJ$_}PR\u003d^(sUwAeS$odFoSLYmTTh`2mh+Y@{_QN\u003d_I@fKuFj\u003e%HN~V|2ux8OdjRJyEyx4UAYWFp2`#)IBYY3ayko2+P!IuEaQ3\u0026QIqBAwk)R@Xb#r@uZ3l;wP~mb(H{L~2-}{P0ZP)yAvZ9kk{Fi\u003eq^}qpOyCY@JU\u003cK+G4}Zk|kqf-~#WS${{Uppei0w?lybcb|3i`Wmdt{aaFTHM-5XBCBzIUI33iw~%r?ES9V43I5i45{uw|~NOG~vYNB~YMDcwBUY0l5`5aW(BlLNvaDwz$IK`47l2dUaz3Sl@~h)OH\u003ejpvKQkOF\u0026{J(C(WUMpaga$PqDwYXZtNJSADI*g\u0026a1EBzQ6Jb%{~^TA6i{JlBCaLEMKSOg-9zs{pO(WnG6\u003dm5@DV+a05_jmc2{rX@V*hEY|o;\u003e0+47BRnZxH_IL(JAv2h`?e;\u003dor?VK_t_nNawtf%$hzbElG%gSRSB-bWjT+SwGAjtN$\u00261d9YFTgqo$WWf)F4uKEM4U;|*OziFAVa*5Ku~kE_So;!Sg{UKD7@oz9saZPYT59w)MCg|@ha{^CDMs4I^rBeiksF\u003cy@L338%PJb@z\u003en\u003e(%68fM^t+w`*urAY#Cg3ej@\u003d{`QpO!EddSW7N4gnmqprv5JpCc0PN%JPfr\u003d(EvCvUqV8fnr%X\u003d-CPpMvnNV-h|k\u003eNRSh@v$6!A$zMRPt@K^UXrNvUH0nY%74cs\u003czGKA4B(\u003db}m0ul#jB|vo2SEClE33X1o9sv7`KFnf}S7#A8@c_ANITixk\u003cZ70$Y$QNFLb4Sbn5bXe\u003dJ4KEnG\u00267D(Yf0k\u003cvfkE_?)~xve\u003dZ?*j%8k2CBbeqcW-@sLAOPk*k*0J!TDB;G!ed_A\u003d;}{hf97gcUdwkQtOa-w\u0026DVyq3Q_RJa\u0026P8ONTcv1l)mp%4+W^XJqNQy{pJ{S\u003dyofzDjLX(l|7\u003cDSl4{ZFXkPpG2CJMUJgcdRK?7*E9ERf\u003c`b`(ozVEsi\u003ej\u003e{IV+Ygwh~`Kdej^MwvVJ(U2GC|%V2\u003c}F|z1PTJ;o\u0026iNHxmP%dp\u0026eE)6E@2CXbhl?a~7kxvALMPkI#KvhNe8%9ZO~;qhyS9!yZ2m||cp-$Ce#|qq\u0026kLWW%BO4^M2+x0XvZe);d?Y|Xe^F_wJTL_NbHdjQ#h{bg%W}L5ubWP7E@U#G3$72NN?OKIBj3e{chc\u0026@6jI)SFhUDf0M10e}!5B\u0026vN|38I9sYN|1~L13mf?YNTRW\u003eRB*P)h{G1*a6e@NtR\u003d;v${N{Kd7PKTYgnJ5sgpu13WPAkBg\u003d\u003c;qZEvS4o(_m+m\u003dZF%luySLpD`HqEXz{cYR\u003e0086w000gE000;R04Nk7zs\u003c3+WGGK`9PAK{bM#020p\u003cBcEZ-FjCinho`l@EtAd4G-E;7\u003egXS?Xl62)zJRj\u003c#}cnlsg5?wwc@#glqto?0}\u00268mP3C76X_ffQoRas?XaD3Fkpc6bOYGAMjWX9pm7QDQdef5fOHfDO4XaI9|9R(^~MasCK_mL8t+g}\u003e4-)\u003cPJgyozYQOWCAncMgw#DQWeCJn`Nbe8KO%{kx#*Xdh?bM%mlQNQ6c?wuntgKnLb_rtv)G_wFyHGo$|%cQqQN\u003eC64Tbl\u00265rdl\u003cW(iw\u003cHS{gbWdP{05HFlGP%^kx76\u003d+g@T098{_Qb+;*RzZOH4iANF3IG6ANQvb{iwQ}I\u0026`62$NR4*_R*DDz%80\u003dv2f*nANXNqf{r~?+)8mN2NR6Cai1GjbNQ2|RY5+(%+;#a\u003dNR4|4icbIk%7{k-h{(X{1c*-oBoBxONR3bYP\u003e_(2kdTm\u0026L03qPM+8MN|3Owkz5xIL06|qnG3`NARZ~cbOeF9~i9{sWxB\u0026nF07!{+B\u003d}5;L?q~m!$gTpB;*gaPXg29iP\u003dbtTqHRE$%#xP)DN~#0n^|}i%cZ\u0026|Hz3%B+w7G2gd;b0002TL?p-n0002TL?pxk0002TL?plg0002TL?pZc0002T0{{R30Et8-%n!Ct0Rh3d00RI3)8H}5jkq\u003dk002Qb|8o;ai(DkwiOB!KIr(PC1VaD\u003e\u003e+491d?fgZ\u0026_yxQL4(WxG15ti{7C`COgZNdgzpFd01vhYLBZk(|H4TB$3Y3ggZc!1\u003c3u}rB;*f++6Vvui$o;UNMl?i$ViJ+B-lhD_\u003d!X$xJYAcB)CY4*hs\u003cP1V{nsL4o`K|Nj6?jSNC}8caFo4}_Ko000lR2SLH\u00262tmQ)2uT0OK?%Y^54RCSiP*vD3lF!-53j*NIl\u003eQv#Q^{SL5ah-00;m8NQ+z~*eS\u003elwoD|\u003cz5xIL0KxbLjRXQg54P22L5Ts2L?qBeA^6kaxd;FN04q!+%+vY-\u0026}qN`0{{Snd?d\u0026QiNH*aj6-Y\u003d000k;xBvhENQ+b?\u003dtPP5L@DqOwk!ex?MP$RiR*#m00961L4o`K|Nj6;W5Y\u003e}1VK!V1W\u003cPxOgZNdgxd!I01vhYLBZk(LBZn)NdLz{3Bo}Sw~zn\u003d002aZ*um%v54Xw\u003eufah%!gC-\u0026iNm-62mk;9_9@80_yvXAjRXQ_L5Y9\u003e0ssJXA?qzcDZ@c2!imsk!RQ5zbT$EIDZ+)@W\u003ciON00IC2bPj?3{{R304~}8~|NrZFf\u0026Tvh004h*NMpu9f\u00262ge{{T\u0026m1VMKiOgZNdghK}a01vhYLBZk(LBZn)NdLz{3Bo}Sw-7{$*um%v54Xw\u003eufah%!gClwiNm-62mk;9_9@80_yvsw0%k#p0PCSaDZ@c2!imsk!RQ5zbT$EIDZ*w!i4g0ENQ+D)\u003dtPP5LI1}\u003diS\u003cB;Gy#KrB*+7Q4aY\u003cz$N\u0026HU0O_U%004_rB*\u003d?IB*\u003ds61B2)WgM1{\u00262@g-uiBu%W\u003e4ydY06{6kK`FwC\u0026}PBt1!gJ2NQ*\u003dy*g\u003d8\u0026|Ns90W\u003ciM\u0026NR2dDcN$DN\u003dMRK\u003d1^@sLwg*AM;s`;(;|NIq$3Y3g54V\u003cp0RR9*iP*vD3lF!-53j*NIl^;JL5ah-00;m8Op8n;*eS@1OeDlaiF72y!T1G@1OkgxB*2MGB*12ghJXP805QOWd?d\u0026QiBu%K51+tEfx%\u003d3004~yK#4\u003eo$mvu9002QL!$B#+iO^\u003dj\u003dmlme!a;%i|Ns90W{H-70RRAZ8caFo4}{tU000lR2SLH\u00262tmQ)2uT0OK?%YSx0aXz002aZ*um%v54Xw\u003eufah%!ViPc0000%xBv(M06~evNWtR;M2WyD$iespjRXQ_iH4W~002mfL?qZq0oXx-`~Uy{07#8AXm\u003dV+Ip+_Aa0LJW54HzE!Qu!(!Q%)\u003e|HnZI!VkBW-~j*tM2XnJ\u003dnD_G$`7x\u003eK{\u003e*6PeCcjL5agb!T1G5h5tg01OjG\u003ehTs7J01t#I1pojsz\u003dM1w$OcG@TqNiZpTLbo011giB*;XG_(Uo2L\u003dUzs14N1VLI1}@h%5u?*aQFoK`FyQDZ+`+X2IwMW+}pEiI(62008L`0RR9\u0026DZ@c2!imsk!RQ5MDZ)X4`~Uy{0A`7nm;nF)cN$DN\u003dMRLn1ONaJwg*AM;s`;(;|NIq$3Y3g54V\u003dE0RR9*iP*vD3lF!-53j*NIl^-wL5ah-00;m8DagV21\u0026ss(W{HNd0RRAtL?p!Nm;e9(K`FyQDZ+`+X2IwMW+}o!f\u00262ge{{Uu*maqW;0CyTpIp+_AL\u003c9f;54HzE!Qu!(!Q%)\u003e|HnZI!VkBW$N\u003eNVM2XnJ\u003dnD_G$`7x\u003eK{\u003e*69YKl1xBv(M04d19_yvsw0%nPZ$N\u003eNVi$o;A\u003emorZ!$B#+iO^\u003dj\u003dmlme!iz*Cyk?1($N\u003eNVi\u0026P}QiBu%Ki%cZMiA*HGM2U1H#6gM1F~Ea-B*+F#i%cZg51+tEfx\u00261B0050dKnRIMB*;O5`~Uy{0CyTpIp+_AoC5#\u003d54HzE!Qu!(!Q%)\u003e|HnZI!a)zW5k!gD!RQMQx5^K%!9h8~b0\u003cNG!?*wl002cX?J3B?_yvsw0%k#p0Z3y+B)CYy-~\u003e\u0026LL;(crctI({K`FwC\u0026}PBt1!gJ2L4o`K|Nj7HL5UG}8caFo4}\u003eZM000lR2SLH\u00262tmQ)2uT0OK?%Y^54TYQM2XnJ\u003dnD_G$`7x\u003eK{\u003e*6G(m~OxBv(M071P70000f$iespjRXQ_L5V\u003eENMl4KxJbd^1Wk\u003eE0R#a6071C}0002%CqXI0K`FwC\u0026}PBt1x\u003c~C1Ofm6LA?+F003qw!e\u00268\u003cQ364^2mk;8M2XA20RR91NMpr8f\u00262ge{{TsiG(dM6OgZNdgogqE01vhYLBZk(LBZn)NdLz{3BnJz4n\u0026FA!RQMQx6u!;!a+I0a~DC0!?stx`$2*G|Ns90cN$DN\u003dMRJ#0RR9Gwg*AM;s`;(;|NIq$3Y3gLDB0)0ro{X+Hwa)DcV7U\u0026H?|\u003cb;nGLOeEMr!R7?M1ONa4NrAyc1^@s-y#W9K0J{MI002m1!$E\u003dj|Ns90O^pOWcN$DN\u003dMRLr0000Fwg*AM;s`;(;|NIq$3Y3gK@YbOM2XnJ\u003dnD_G$`7x\u003eK{\u003e*67(t1{xBv(M00G-6$iespjRXQ_L5TqC8bK+;K`FwC\u0026}PBt1\u0026v%A0YwS!W+}pEL5UDW0qy_Jb%;U##\u0026ke~#R5e+{\u0026!7Ci\u0026P}\u0026M2YxBDey!Owk!ffiTFYP$N$Ylh%5pRmBKN\u003dL_2\u0026W\u003cPVa-g~D~yL_2\u0026W\u003cPU;H_y7Mvf\u00262ge{{VLuOgZPc0RR91bR+8rxB\u0026nF0P7k^|Hp~\u003dD?}vtNQ+D)@JNeXBshryM2R~wz*}8GTtQtyUO`_-i*@)\u0026i+vD_O9V\u0026(\u0026WjUB0oTb{NQv-BDacw#Dc4zvIa^)BXdVCn09xq10000`QcqN0MOZ~cd{9zPR9{z8NmNB3W?^Y;Wn?Z2015ykNp5CuIv`YNX\u003e%ZEX\u003e4U6X\u003e%ZOVPk7$WFU8GbZ8)SXk{Q(P*@;kcx7XCbYWs_Wgu{2V{2t{AZT\u003dSa5^t9b#Qntb7n4XWpp4U3IHTYWI7;KP*@-{E;%tELvL_-a%pF1bRZ~0DIhU9IW{daFflVAbZBKDRZv(URApgpE+9c{Y#\u003er;XJ~YDAW~\u0026\u003eWpZ|9WG)~i3ILFhUTOkgY5`ae1!{j^YCKpE1zTzXXbb\u003eA08nVa6e0joL07*30Du5$2U@\u003cs6e0j\u003eGC^8JDZpw8SPum`#}9?|{{R2J002M$iTWw\u003ebQJ;B0aPRi0aPRyiP\u003cUf!RZ71^GKzaNQvH1lC4lkiQ%o6twayDz(|Mw|J7N;T}X{Z_e6_0y2t\u003ck08A\u003cPK`GZrjSLXzdH?_aas~hZF$Dks4oLt27y|%w7\u003cwHMO+7TbA|)KPz2)Wg5|EszsapKsgQ_n(NTMM$\u003dF6_k(q9jaF;oKC\u003dC#-tx~iB4$y+6K\u003c^;IadUQNw#Z\u003cvEs*j*B)2Gj;rucJOR)+b*#vJTWSx63*66uYW@)2{*h7}NM?yG`(H)SC6!$l_\u003ef3QtU$E{@^AxTm)YV\u0026@8WN|Z?E0t\u003d+`v27|eV1wH%@UjOI;WyE-4\u0026$Dl9WII\u0026ruBe231Iutu!|\u003d1+T9}ouco%5EP9|{$a!}t250{1}ovbHLu-IAaq@*$1o_nN(P5R(Q-W!2Gb!BTZ~\u003dxeqxJV2PP!SrnVlj4}sTNQp`x77}QE#{Qh6DM%IK}4Nksd+MF\u003d0\u003cr%_Cjuc98(Qj-zAg{Pp\u003dhTMMlwz\u0026+eSgC(6|0^C{s%ziQ\u003cXn\u003d_|w$@7GJ3j%qbzivLlS$uBjT\u003cUjWKkNs3vm?5-B%#tmLu\u003cpoAU6zacJ!Rf%4G\u003dPt`5n9ChQm)JUMP\u003eUcDo`wj\u003e$~sAJ}aVmNt^vTt4xpvCEYH`ijw\u003eUk#\u003c@m\u003d2^sYNS1mw\u003d3TaySI{l?\u00269-D@Xc02X)7~|%F!4J`Ii#u^Xmk`FF9cQ\u003e9KXIdZQ84~5Qi8-oGNL+@@QJMMM54VU|J-\u003eWHBIT{3hml\u003dY%;w\u003diZL@Hg@DFPHE`mjW0^Mq7j6)Y$+3|J?djiKcsQKkR%3\u003eH|e\u003c2N$\u003dQ!Twnm0wSUHAb+sp`\u003egwShBr\u0026-1m{qw%HmAR\u003d{vK+(*i*mvseI)kI8?1\u003d(%K0?+BcX+6CAq$`kMvCB;lX7y-YmGQ!lQpmS%6#r+vXaW5F1!tPgek#;97aaQUqtkcPm6d~cu1q#U+gtuA?wR0\u003e!`XcB\u003eHq7FcnUPThogQCH\u0026\u0026b)H6B)a\u0026l3{0Zl\u003cYz#1\u003d3A-Fo@NanO5QT_%o;8NZPME^qL\u003dt|\u003cZ*s2*^tc05WE;WGllM}PL-o~owzMBK?r6w@Pfl\u0026CFP#sysIDnHWqPOeDK`ByS$q?Zq\u003cx?Ds4\u003c^ZYfXbpJ*#~LJ@D8I3OD)23mRnW\u003dB#k-tXP(4fxLDR9*xB{GzF|%0\d2t7$1Or7{)56gwBqoM)Z$?jB-yCA6?uYBo%~JRCP\u0026l6\u003du4w?3WKIt(\u003cGdfHq\u003eewZts%8Y9+t;GT*sZ9z_{noz17yMNs\u0026S4^{\u0026WT^mZN~7oKT^\u003d\u003eo$xGbqdGa2+pDhHlw4lkTHEbbvhX4Qo^b7z18UO$Q4gdfE7y|$RaDDy%u8^TX6TMS5owOKZYn^n;MF3\u003c6006-O000gE000;R000csHC6c1tQ5(`;h4$Qw+6!ODI^OCF\u003c)Itr})%h*o^w$kGF_w_^1R\u003elD|u+xjxPm(46K(_F|S$w;0{M*E{zdjuINd!*wh5CyH9f9YN?lGXRhz2pAfY`cP\u003ddz(y_-5RsGB16RLe\u003cYGmK_1wB\u003ca{gyD698_@Fo3?|\u003dWHPyuuE*f8E~DPe{+j\u003eo36|J%Tn{oPOLF0Ugu#bFDJSF;1_#a\u0026*_@dm$j7BRkH\u0026}\u003dN7{~*ceo\u003dc7UQPXjl$Wz?^\u003eRHn|b~J})D`ngejsn;c!H1\u003cG_`P~6+tVQpX-sAB\u0026u2(6SI^k6)@6X}y~_g-JqAJtJP|C\u003dv)H5zDRJsfKZw|cTjajn8DJ\u003cEXidiUuMv4\u0026XiKbxr\u0026qKW4%n@{lp%wriBQiA9z%$HdZmwfb9t#(e\u0026{E!|VL*EuZ1RJbJxY`4}w\u003dWo!FI}Br9fH||rdW$2uK+wqQ\u0026e3r#U#k;9353?;~Ua2CYvPwyTpK-Z!KGb02Dbk%Cu(Aq`6`?b+ENm4E@D6lr04GZ46C|*MfC(K!_^4%t\u003d07-H?66x5fv\u003cV^1IcJM}3g5$javz3IYZikY1N00010P*@\u003dV00000RZv(V4Hgaxq-\u003dfCgYmtOWCs8M!2tjO7%2e\u0026NdN#fyZ`_I\"};string decode_85(const string \u0026base85_string){string out;size_t str_ptr{0};while(str_ptr\u003cbase85_string.size()){unsigned int acc{0};for(int i\u003d0;i\u003c5;++i){unsigned char ch\u003dbase85_string[str_ptr++];int de{de85[ch]};acc\u003dacc*85+de;}string sub;for(int i\u003d0;i\u003c4;++i){int val\u003dacc%256;acc/\u003d256;sub+\u003dstatic_cast\u003cchar\u003e(val);}reverse(sub.begin(),sub.end());out+\u003dsub;}return out;}int main(){for(int i\u003d0;i\u003c85;i++){int ch{en85[i]};de85[ch]\u003di;}const string Program_Binary{decode_85(Base85_Binary)};ofstream Program_File(\"Binary\",ios::binary | ios::trunc);Program_File.write(Program_Binary.c_str(),Program_Binary.size());Program_File.close();system(\"chmod a+x Binary\");system(\"./Binary\");};\n","programmingLanguageId":"C++"},"lastSubmissionId":6988508},"direct":false,"questions":[{"questionId":71563,"title":"Wondev Woman - Level 4 - Puzzle","hasResult":true}],"testSessionId":,"testSessionHandle":"","needAccount":true,"shareable":true,"userId":832306}}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement