/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = "./src/index.ts");
/******/ })
/************************************************************************/
/******/ ({

/***/ "./src/glitch-execute.js":
/*!*******************************!*\
  !*** ./src/glitch-execute.js ***!
  \*******************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n//================================================================================================= GLITCH\n\nfunction getRandomInt (min, max) {\n    return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n    /* Global config settings */\n    NR_OF_GLITCHED_CANVASES : 7,\n    GLITCH_RENDER_COUNT     : 0, /* 0 or negative == glitch indefinitely ; > 0 == glich & few times and stop */\n    GLITCH_INTERVAL_PROGRESSIVE : 1,\n    GLITCH_INTERVAL_MIN     : 500, /* millisecs */\n    GLITCH_INTERVAL_MAX     : 1500, /* millisecs */\n    DELAY_BETWEEN_FRAMES    : 30,  /* 30 milisecs delay */\n    DELAY_BETWEEN_GLITCHES  : 0,\n    GLITCH_REFRESH_FRAMES_INTERVAL : 1, /* refresh glitched frames after N glitches ; 0 disables this */\n\n    /* From here on, it's just internal stuff */\n\n    refresh_glitch_frames_counter : 0,\n    rendered_canvases : 0,\n    times_rendered    : 0,\n    glitched_canvases : Array(),\n    curr_canvas       : null,\n\n    __state_machine: function(gl) {\n        var otg = gl.object_to_glitch;\n\n        /* If we need to render only a few times and stop, return here */\n        if (gl.GLITCH_RENDER_COUNT > 0 && gl.times_rendered >= gl.GLITCH_RENDER_COUNT) {\n            if (typeof gl.done_callback == \"function\")\n                gl.done_callback();\n            return;\n        }\n\n        if (gl.curr_canvas != null) {\n            otg.removeChild(gl.curr_canvas);\n        }\n        if ((0 < gl.glitched_canvases.length) && (gl.rendered_canvases < gl.glitched_canvases.length)) {\n            gl.curr_canvas = gl.glitched_canvases[gl.rendered_canvases];\n            otg.insertBefore(gl.curr_canvas, otg.firstChild);\n            gl.rendered_canvases++;\n            setTimeout(function() { gl.__state_machine(gl) }, gl.DELAY_BETWEEN_FRAMES);\n        } else {\n            if (gl.GLITCH_RENDER_COUNT > 0 && gl.rendered_canvases >= gl.glitched_canvases.length)\n                gl.times_rendered ++;\n            gl.rendered_canvases = 0;\n            if (gl.DELAY_BETWEEN_GLITCHES > 0)\n                setTimeout(function() { gl.__state_machine(gl) }, gl.DELAY_BETWEEN_GLITCHES);\n            else if (gl.GLITCH_INTERVAL_PROGRESSIVE && gl.GLITCH_RENDER_COUNT > 0)\n                setTimeout(function() { gl.__state_machine(gl) }, gl.times_rendered * getRandomInt(500, 1500));\n            else\n                setTimeout(function() { gl.__state_machine(gl) }, getRandomInt(gl.GLITCH_INTERVAL_MIN, gl.GLITCH_INTERVAL_MAX));\n            gl.curr_canvas = null;\n\n            if (gl.GLITCH_REFRESH_FRAMES_INTERVAL > 0 && --gl.refresh_glitch_frames_counter <= 0) {\n                gl.glitch_frames();\n                gl.refresh_glitch_frames_counter = gl.GLITCH_REFRESH_FRAMES_INTERVAL;\n            }\n        }\n    },\n\n    glitch_frames : function() {\n        var gl = this;\n        gl.glitched_canvases = Array();\n        for(var i = 0; i < gl.NR_OF_GLITCHED_CANVASES; ++i) {\n            glitch(gl.object_to_glitch, {\n                amount: i,\n                complete: function(canvas) {\n                    var otg = gl.object_to_glitch;\n                    gl.glitched_canvases.push(canvas);\n                    canvas.style.position = \"absolute\";\n                    canvas.style.top = otg.top;\n                    canvas.style.left = otg.left;\n                }\n            });\n        }\n    },\n\n    start: function(obj_to_glitch) {\n        var gl = this;\n        gl.object_to_glitch = obj_to_glitch;\n        gl.glitch_frames();\n        gl.__state_machine(gl);\n    }\n\n});\n\n//================================================================================================= END\n\n\n//# sourceURL=webpack:///./src/glitch-execute.js?");

/***/ }),

/***/ "./src/glitch-lib.js":
/*!***************************!*\
  !*** ./src/glitch-lib.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("/**\n\t@license glitch.js v0.1 <http://www.github.com/sjhewitt/glitch.js>\n\tReleased under MIT License\n\n\tCopyright (c) 2012 Simon Hewitt.\n\thttp://www.twitter.com/sjhewitt\n\t*/\n(function($){\n\t/*global html2canvas */\n\n\tvar noop = function(){},\n\t\t/**\n\t\t * Set default properties on an object\n\t\t * @param  {Object} obj      The target object\n\t\t * @param  {Object} defaults The default properties\n\t\t * @return {Object}          The target obj\n\t\t */\n\t\tdefaults = function(obj, defaults) {\n\t\t\tfor (var prop in defaults) {\n\t\t\t\tif (obj[prop] == null)\n\t\t\t\t\tobj[prop] = defaults[prop];\n\t\t\t}\n\t\t\treturn obj;\n\t\t},\n\t\t/**\n\t\t * Generates an integer between min and max\n\t\t *\n\t\t * @param  {Number} min The lower bound\n\t\t * @param  {Number} max The upper bound\n\t\t * @return {Number}     A random number\n\t\t */\n\t\tgetRandInt = function(min, max) {\n\t\t\treturn (Math.floor(Math.random() * (max - min) + min));\n\t\t};\n\n\n\t/**\n\t * Apply the glitch effect to a canvas object\n\t *\n\t * @param  {HTMLCanvasElement} canvas  The canvas (or HTMLImageElement) to apply the glitch to\n\t * @param  {number}            amount  The amount to glitch the canvas (default: 6)\n\t * @return {HTMLCanvasElement}         A canvas containing a glitched version\n\t *                                     of the original canvas\n\t */\n\tvar _glitch = function(canvas, amount) {\n\t\tvar\n\t\t\t// cache the width and height of the canvas locally\n\t\t\tx, y, w = canvas.width, h = canvas.height,\n\n\t\t\t// _len is an iterator limit, initially storing the number of slices\n\t\t\t// to create\n\t\t\ti, _len = amount || 6,\n\n\t\t\t// pick a random amount to offset the color channel\n\t\t\tchannelOffset = (getRandInt(-_len*2, _len*2) * w * + getRandInt(-_len, _len)) * 4,\n\n\t\t\t// the maximum amount to offset a chunk of the image is a function of its width\n\t\t\tmaxOffset = _len * _len / 100 * w,\n\n\t\t\t// vars for the width and height of the chunk that gets offset\n\t\t\tchunkWidth, chunkHeight,\n\n\t\t\t// create a temporary canvas to hold the image we're working on\n\t\t\ttempCanvas = document.createElement(\"canvas\"),\n\t\t\ttempCtx = tempCanvas.getContext(\"2d\"),\n\n\t\t\tsrcData, targetImageData, data;\n\n\t\t// set the dimensions of the working canvas\n\t\ttempCanvas.width = w;\n\t\ttempCanvas.height = h;\n\n\t\t// draw the initial image onto the working canvas\n\t\ttempCtx.drawImage(canvas, 0, 0, w, h);\n\n\t\t// store the data of the original image for use when offsetting a channel\n\t\tsrcData = tempCtx.getImageData(0, 0, w, h).data;\n\n\t\t// randomly offset slices horizontally\n\t\tfor (i = 0; i < _len; i++) {\n\n\t\t\t// pick a random y coordinate to slice at\n\t\t\ty = getRandInt(0, h);\n\n\t\t\t// pick a random height of the slice\n\t\t\tchunkHeight = Math.min(getRandInt(1, h / 4), h - y);\n\n\t\t\t// pick a random horizontal distance to offset the slice\n\t\t\tx = getRandInt(1, maxOffset);\n\t\t\tchunkWidth = w - x;\n\n\t\t\t// draw the first chunk\n\t\t\ttempCtx.drawImage(canvas,\n\t\t\t\t0, y, chunkWidth, chunkHeight,\n\t\t\t\tx, y, chunkWidth, chunkHeight);\n\n\t\t\t// draw the rest\n\t\t\ttempCtx.drawImage(canvas,\n\t\t\t\tchunkWidth, y, x, chunkHeight,\n\t\t\t\t0, y, x, chunkHeight);\n\t\t}\n\n\t\t// get hold of the ImageData for the working image\n\t\ttargetImageData = tempCtx.getImageData(0, 0, w, h);\n\n\t\t// and get a local reference to the rgba data array\n\t\tdata = targetImageData.data;\n\n\t\t// Copy a random color channel from the original image into\n\t\t// the working canvas, offsetting it by a random amount\n\t\t//\n\t\t// ImageData arrays are a single dimension array that contains\n\t\t// 4 values for each pixel.\n\t\t// so, by initializing `i` to a random number between 0 and 2,\n\t\t// and incrementing by 4 on each iteration, we can replace only\n\t\t// a single channel in the image\n\t\tfor(i = getRandInt(0, 3), _len = srcData.length; i < _len; i += 4) {\n\t\t\tdata[i+channelOffset] = srcData[i];\n\t\t}\n\n\t\t// Make the image brighter by doubling the rgb values\n\t\tfor(i = 0; i < _len; i++) {\n\t\t\tdata[i++] *= 2;\n\t\t\tdata[i++] *= 2;\n\t\t\tdata[i++] *= 2;\n\t\t}\n\n\t\t// TODO: The above loops are the most costly in this function, iterating\n\t\t// over all the pixels in the image twice.\n\t\t// It maybe possible to optimize this by combining both loops into one,\n\t\t// and only processing every other line, as alternate lines are replaced\n\t\t// with black in the 'scan lines' block belop\n\n\t\t// copy the tweaked ImageData back into the context\n\t\ttempCtx.putImageData(targetImageData, 0, 0);\n\n\t\t// add scan lines\n\t\ttempCtx.fillStyle = \"rgb(0,0,0)\";\n\t\tfor (i = 0; i < h; i += 2) {\n\t\t\ttempCtx.fillRect (0, i, w, 1);\n\t\t}\n\n\t\treturn tempCanvas;\n\t};\n\n\t/**\n\t * Creates a canvas containing a glitched version of the element\n\t * @param  {DOMElement} el     The element to glitch\n\t * @param  {Object}   options  An object containing the complete callback,\n\t *                             the amount to glitch the image, and any\n\t *                             html2canvas options\n\t */\n\tvar glitch = function(el, options) {\n\t\toptions = defaults(options || {}, {\n\t\t\t// the amount to glitch the image\n\t\t\tamount: 6,\n\t\t\t// a callback that takes the glitched canvas as its only argument\n\t\t\tcomplete: noop\n\t\t});\n\n\t\t// callback for when the element has been rendered\n\t\toptions.onrendered = function(canvas) {\n\t\t\toptions.complete(_glitch(canvas, options.amount));\n\t\t};\n\n\t\t// render the element onto a canvas\n\t\thtml2canvas(el[0] ? el : [el], options);\n\t};\n\n\t/**\n\t * Replace el with a glitched version of it\n\t * @param  {DOMElement} el  The element to glitch\n\t * @param  {Object} options An object containing the options for glitch\n\t */\n\tglitch.replace = function(el, options) {\n\t\toptions = options || {};\n\t\t// store a reference to the complete callback so we can use the same\n\t\t// options for the glitch function call\n\t\tvar _complete = options.complete;\n\t\toptions.complete = function(canvas) {\n\t\t\tif($ && el instanceof $) {\n\t\t\t\tel.after(canvas).detach();\n\t\t\t} else {\n\t\t\t\t// no jQuery...\n\t\t\t\tel.parentNode.insertBefore(canvas, el);\n\t\t\t\tel.parentNode.removeChild(el);\n\t\t\t}\n\t\t\tif(_complete){\n\t\t\t\t_complete();\n\t\t\t}\n\t\t};\n\n\t\tglitch(el, options);\n\t};\n\n\t/**\n\t * Replace `el` with `newEl` by overlaying a glitched version of `el`, then\n\t * animating it out to reveal `newEl`\n\t *\n\t * The animation will take into account elements of different sizes by sliding\n\t * the container to reveal it, however it looks best if the elements to be\n\t * transitioned between are of similar sizes\n\t *\n\t * @param  {jQuery} el     The original element that will be glitched\n\t * @param  {jQuery} newEl  The element to show\n\t * @param  {Object} options An object containing the options for the animation\n\t *                          and any options for html2canvas\n\t */\n\tglitch.transition = function(el, newEl, options) {\n\t\t// set the default options\n\t\toptions = defaults(options || {}, {\n\t\t\t// the amount to glitch the image\n\t\t\tamount: 6,\n\t\t\t// A callback when the animation is complete\n\t\t\tcomplete: noop,\n\t\t\t// The delay after rendering the glitched element until starting the transition\n\t\t\tdelay: 300,\n\t\t\t// The duration of the transition effect\n\t\t\tduration: 500,\n\t\t\t// The z-index to apply to the overlay. You might need to tweak this if\n\t\t\t// you have things that appear above the element, or are using high\n\t\t\t// z-indexes in your page\n\t\t\tzIndex: 1000,\n\t\t\t// the transition effect to use. This may be \"fade\" or \"slide\"\n\t\t\teffect: \"fade\",\n\t\t\t// The size of the top border. Set to 0 to disable, only used in slide mode\n\t\t\tborderSize: 2,\n\t\t\t// The color of the top border, only used in slide mode\n\t\t\tborderColor: \"green\"\n\t\t});\n\n\t\t// add the new element to the dom so we can properly calculate its dimensions\n\t\tnewEl.insertAfter(el);\n\n\t\t// store a reference to the complete callback so we can use the same\n\t\t// options for the glitch function call\n\t\tvar _complete = options.complete,\n\t\t\t// get the dimensions of the elements so we can resize the targetContainer\n\t\t\t// to reveal all the content after the glitch transition\n\t\t\torigHeight = el.outerHeight(true),\n\t\t\torigWidth = el.outerWidth(true),\n\t\t\ttargetHeight = newEl.outerHeight(true),\n\t\t\ttargetWidth = newEl.outerWidth(true),\n\t\t\torigOverflow = newEl.css(\"overflow\");\n\n\t\t// take the new element out of the dom again\n\t\tnewEl.detach();\n\n\t\t// create a callback that will\n\t\toptions.complete = function(canvas){\n\t\t\t// position the canvas absolutely within the container\n\t\t\tvar $canvas = $(canvas).css(\"position\", \"absolute\"),\n\t\t\t\toffset = el.offset(),\n\t\t\t\t// create a container element that contains the canvas and position it\n\t\t\t\t// over the element we're replacing\n\t\t\t\tcontainer = $(\"<div>\").css({\n\t\t\t\t\t\t\"border-top\": options.borderSize ? options.borderSize + \"px solid \" +\n\t\t\t\t\t\t\toptions.borderColor : \"none\",\n\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\tleft: offset.left,\n\t\t\t\t\t\ttop: offset.top - options.borderSize,\n\t\t\t\t\t\twidth: canvas.width,\n\t\t\t\t\t\theight: canvas.height,\n\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\"z-index\": options.zIndex\n\t\t\t\t\t})\n\t\t\t\t\t// add the canvas as a child to the container\n\t\t\t\t\t.html(canvas)\n\t\t\t\t\t// add the container to the dom\n\t\t\t\t\t.appendTo(\"body\")\n\t\t\t\t\t// delay the animation a bit\n\t\t\t\t\t.delay(options.delay),\n\n\t\t\t\ttargetContainer = $(\"<div>\").css({\n\t\t\t\t\twidth: origWidth,\n\t\t\t\t\theight: origHeight,\n\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\tborder: \"none\",\n\t\t\t\t\t\"box-sizing\": \"border-box\"\n\t\t\t\t})\n\t\t\t\t\t.html(newEl),\n\n\t\t\t\t// the default transition effect is to fade out\n\t\t\t\tanimation = {\n\t\t\t\t\topacity: 0\n\t\t\t\t},\n\t\t\t\tanimateOptions = {\n\t\t\t\t\t\tduration: options.duration,\n\t\t\t\t\t\tcomplete: function(){\n\t\t\t\t\t\t\t// when the animation is done:\n\t\t\t\t\t\t\t// remove the container from the dom\n\t\t\t\t\t\t\tcontainer.remove();\n\n\t\t\t\t\t\t\t// then animate the height of the new element back to its measured\n\t\t\t\t\t\t\t// height and width\n\t\t\t\t\t\t\ttargetContainer.animate({\n\t\t\t\t\t\t\t\theight: targetHeight,\n\t\t\t\t\t\t\t\twidth: targetWidth\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tduration: 100,\n\t\t\t\t\t\t\t\tcomplete: function(){\n\n\t\t\t\t\t\t\t\t\t// take the targetContainer element out of the dom\n\t\t\t\t\t\t\t\t\tnewEl.detach().insertAfter(targetContainer);\n\t\t\t\t\t\t\t\t\ttargetContainer.remove();\n\n\t\t\t\t\t\t\t\t\t// call the complete callback\n\t\t\t\t\t\t\t\t\t_complete();\n\n\t\t\t\t\t\t\t\t\t// and clear all references\n\t\t\t\t\t\t\t\t\toptions = $canvas = container = null;\n\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\tif(options.effect === \"slide\") {\n\t\t\t\t// for the slide effect, we move move the container down\n\t\t\t\tanimation = {\n\t\t\t\t\ttop: offset.top + canvas.height,\n\t\t\t\t\theight: 0\n\t\t\t\t};\n\n\t\t\t\t// and on each step of the animation, we need to offset the top so it\n\t\t\t\t// remains in the same place on the screen\n\t\t\t\tanimateOptions.step = function(now, fx){\n\t\t\t\t\tif(fx.prop === \"top\") {\n\t\t\t\t\t\t$canvas.css(\"top\", fx.start - now);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// apply the animation\n\t\t\tcontainer.animate(animation, animateOptions);\n\n\t\t\t// replace the original element with the new one\n\t\t\t// we use detatch so that the event handlers on the old\n\t\t\t// element are retained.\n\t\t\ttargetContainer.insertAfter(el);\n\t\t\tel.detach();\n\n\t\t};\n\n\t\t// create a glitched version of the start element\n\t\tglitch(el, options);\n\t};\n\n\twindow.glitch = glitch;\n})(window.jQuery);\n\n\n//# sourceURL=webpack:///./src/glitch-lib.js?");

/***/ }),

/***/ "./src/glitch.ts":
/*!***********************!*\
  !*** ./src/glitch.ts ***!
  \***********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _html2canvas__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./html2canvas */ \"./src/html2canvas.js\");\n/* harmony import */ var _html2canvas__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_html2canvas__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _glitch_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glitch-lib */ \"./src/glitch-lib.js\");\n/* harmony import */ var _glitch_lib__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_glitch_lib__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _glitch_execute__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./glitch-execute */ \"./src/glitch-execute.js\");\n\n\n\nfunction setPath(path) {\n    new Array(5).fill(true).forEach((_, i) => {\n        const el = document.querySelector('.background' + i);\n        if (!el)\n            return;\n        if (!path) {\n            el.src = '';\n            return;\n        }\n        el.src = path;\n    });\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = (function (path) {\n    if (!path) {\n        document.body.style.backgroundImage = null;\n        return;\n    }\n    document.body.style.backgroundImage = `url(${path})`;\n    if (Math.random() > .7) {\n        const gl = Object.create(_glitch_execute__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n        gl.GLITCH_RENDER_COUNT = 2;\n        gl.start(document.querySelector('.content'));\n    }\n});\n\n\n//# sourceURL=webpack:///./src/glitch.ts?");

/***/ }),

/***/ "./src/html2canvas.js":
/*!****************************!*\
  !*** ./src/html2canvas.js ***!
  \****************************/
/*! no static exports found */
/***/ (function(module, exports) {

eval("/**\r\n  @license html2canvas v0.34 <http://html2canvas.hertzen.com>\r\n  Copyright (c) 2011 Niklas von Hertzen. All rights reserved.\r\n  http://www.twitter.com/niklasvh\r\n\r\n  Released under MIT License\r\n */\r\n(function(window, document, undefined){\r\n\r\n/*\r\n  html2canvas v0.34 <http://html2canvas.hertzen.com>\r\n  Copyright (c) 2011 Niklas von Hertzen. All rights reserved.\r\n  http://www.twitter.com/niklasvh\r\n\r\n  Released under MIT License\r\n */\r\n\"use strict\";\r\n\r\nvar _html2canvas = {},\r\npreviousElement,\r\ncomputedCSS,\r\nhtml2canvas;\r\n\r\n\r\nfunction h2clog(a) {\r\n    if (_html2canvas.logging && window.console && window.console.log) {\r\n        window.console.log(a);\r\n    }\r\n}\r\n\r\n_html2canvas.Util = {};\r\n\r\n_html2canvas.Util.backgroundImage = function (src) {\r\n\r\n    if (/data:image\\/.*;base64,/i.test( src ) || /^(-webkit|-moz|linear-gradient|-o-)/.test( src )) {\r\n        return src;\r\n    }\r\n\r\n    if (src.toLowerCase().substr( 0, 5 ) === 'url(\"') {\r\n        src = src.substr( 5 );\r\n        src = src.substr( 0, src.length - 2 );\r\n    } else {\r\n        src = src.substr( 4 );\r\n        src = src.substr( 0, src.length - 1 );\r\n    }\r\n\r\n    return src;\r\n};\r\n\r\nfunction adjustBounds(el, box) {\r\n    var win = document.defaultView;\r\n    var doc = el.ownerDocument;\r\n    var body = doc.body;\r\n    var docElem = doc.documentElement;\r\n    var clientTop  = docElem.clientTop  || body.clientTop  || 0;\r\n    var clientLeft = docElem.clientLeft || body.clientLeft || 0;\r\n    var scrollTop  = win.pageYOffset || docElem.scrollTop;\r\n    var scrollLeft = win.pageXOffset || docElem.scrollLeft;\r\n    var top  = box.top  + scrollTop  - clientTop;\r\n    var left = box.left + scrollLeft - clientLeft;\r\n\r\n    return {\r\n        top: top,\r\n        left: left,\r\n        bottom: top + box.height,\r\n        height: box.height,\r\n        width: box.width\r\n    };\r\n}\r\n\r\n_html2canvas.Util.Bounds = function getBounds (el) {\r\n    var clientRect,\r\n    bounds = {};\r\n\r\n    if (el.getBoundingClientRect){\r\n        return adjustBounds(el, el.getBoundingClientRect());\r\n    }\r\n};\r\n\r\n_html2canvas.Util.getCSS = function (el, attribute) {\r\n    // return $(el).css(attribute);\r\n\r\n    var val;\r\n\r\n    function toPX( attribute, val ) {\r\n        var rsLeft = el.runtimeStyle && el.runtimeStyle[ attribute ],\r\n        left,\r\n        style = el.style;\r\n\r\n        // Check if we are not dealing with pixels, (Opera has issues with this)\r\n        // Ported from jQuery css.js\r\n        // From the awesome hack by Dean Edwards\r\n        // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\r\n\r\n        // If we're not dealing with a regular pixel number\r\n        // but a number that has a weird ending, we need to convert it to pixels\r\n\r\n        if ( !/^-?[0-9]+\\.?[0-9]*(?:px)?$/i.test( val ) && /^-?\\d/.test( val ) ) {\r\n\r\n            // Remember the original values\r\n            left = style.left;\r\n\r\n            // Put in the new values to get a computed value out\r\n            if ( rsLeft ) {\r\n                el.runtimeStyle.left = el.currentStyle.left;\r\n            }\r\n            style.left = attribute === \"fontSize\" ? \"1em\" : (val || 0);\r\n            val = style.pixelLeft + \"px\";\r\n\r\n            // Revert the changed values\r\n            style.left = left;\r\n            if ( rsLeft ) {\r\n                el.runtimeStyle.left = rsLeft;\r\n            }\r\n\r\n        }\r\n\r\n        if (!/^(thin|medium|thick)$/i.test( val )) {\r\n            return Math.round(parseFloat( val )) + \"px\";\r\n        }\r\n\r\n        return val;\r\n\r\n    }\r\n\r\n\r\n    if ( window.getComputedStyle ) {\r\n        if ( previousElement !== el ) {\r\n            computedCSS = document.defaultView.getComputedStyle(el, null);\r\n        }\r\n        val = computedCSS[ attribute ];\r\n\r\n        if ( attribute === \"backgroundPosition\" ) {\r\n\r\n            val = (val.split(\",\")[0] || \"0 0\").split(\" \");\r\n\r\n            val[ 0 ] = ( val[0].indexOf( \"%\" ) === -1 ) ? toPX(  attribute + \"X\", val[ 0 ] ) : val[ 0 ];\r\n            val[ 1 ] = ( val[1] === undefined ) ? val[0] : val[1]; // IE 9 doesn't return double digit always\r\n            val[ 1 ] = ( val[1].indexOf( \"%\" ) === -1 ) ? toPX(  attribute + \"Y\", val[ 1 ] ) : val[ 1 ];\r\n        }\r\n\r\n    } else if ( el.currentStyle ) {\r\n        // IE 9>\r\n        if (attribute === \"backgroundPosition\") {\r\n            // Older IE uses -x and -y\r\n            val = [ toPX(  attribute + \"X\", el.currentStyle[ attribute + \"X\" ]  ), toPX(  attribute + \"Y\", el.currentStyle[ attribute + \"Y\" ]  ) ];\r\n        } else {\r\n\r\n            val = toPX(  attribute, el.currentStyle[ attribute ]  );\r\n\r\n            if (/^(border)/i.test( attribute ) && /^(medium|thin|thick)$/i.test( val )) {\r\n                switch (val) {\r\n                    case \"thin\":\r\n                        val = \"1px\";\r\n                        break;\r\n                    case \"medium\":\r\n                        val = \"0px\"; // this is wrong, it should be 3px but IE uses medium for no border as well.. TODO find a work around\r\n                        break;\r\n                    case \"thick\":\r\n                        val = \"5px\";\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n\r\n    }\r\n\r\n\r\n\r\n\r\n    return val;\r\n\r\n\r\n\r\n//return $(el).css(attribute);\r\n\r\n\r\n};\r\n\r\n\r\n_html2canvas.Util.BackgroundPosition = function ( el, bounds, image ) {\r\n    // TODO add support for multi image backgrounds\r\n\r\n    var bgposition =  _html2canvas.Util.getCSS( el, \"backgroundPosition\" ) ,\r\n    topPos,\r\n    left,\r\n    percentage,\r\n    val;\r\n\r\n    if (bgposition.length === 1){\r\n        val = bgposition;\r\n\r\n        bgposition = [];\r\n\r\n        bgposition[0] = val;\r\n        bgposition[1] = val;\r\n    }\r\n\r\n\r\n\r\n    if (bgposition[0].toString().indexOf(\"%\") !== -1){\r\n        percentage = (parseFloat(bgposition[0])/100);\r\n        left =  ((bounds.width * percentage)-(image.width*percentage));\r\n\r\n    }else{\r\n        left = parseInt(bgposition[0],10);\r\n    }\r\n\r\n    if (bgposition[1].toString().indexOf(\"%\") !== -1){\r\n\r\n        percentage = (parseFloat(bgposition[1])/100);\r\n        topPos =  ((bounds.height * percentage)-(image.height*percentage));\r\n    }else{\r\n        topPos = parseInt(bgposition[1],10);\r\n    }\r\n\r\n\r\n\r\n\r\n    return {\r\n        top: topPos,\r\n        left: left\r\n    };\r\n\r\n};\r\n\r\n_html2canvas.Util.Extend = function (options, defaults) {\r\n    for (var key in options) {\r\n        if (options.hasOwnProperty(key)) {\r\n            defaults[key] = options[key];\r\n        }\r\n    }\r\n    return defaults;\r\n};\r\n\r\n\r\n/*\r\n * Derived from jQuery.contents()\r\n * Copyright 2010, John Resig\r\n * Dual licensed under the MIT or GPL Version 2 licenses.\r\n * http://jquery.org/license\r\n */\r\n_html2canvas.Util.Children = function( elem ) {\r\n\r\n\r\n    var children;\r\n    try {\r\n\r\n        children = (elem.nodeName && elem.nodeName.toUpperCase() === \"IFRAME\") ?\r\n        elem.contentDocument || elem.contentWindow.document : (function( array ){\r\n            var ret = [];\r\n\r\n            if ( array !== null ) {\r\n\r\n                (function( first, second ) {\r\n                    var i = first.length,\r\n                    j = 0;\r\n\r\n                    if ( typeof second.length === \"number\" ) {\r\n                        for ( var l = second.length; j < l; j++ ) {\r\n                            first[ i++ ] = second[ j ];\r\n                        }\r\n\r\n                    } else {\r\n                        while ( second[j] !== undefined ) {\r\n                            first[ i++ ] = second[ j++ ];\r\n                        }\r\n                    }\r\n\r\n                    first.length = i;\r\n\r\n                    return first;\r\n                })( ret, array );\r\n\r\n            }\r\n\r\n            return ret;\r\n        })( elem.childNodes );\r\n\r\n    } catch (ex) {\r\n        h2clog(\"html2canvas.Util.Children failed with exception: \" + ex.message);\r\n        children = [];\r\n    }\r\n    return children;\r\n};\r\n\r\n/*\r\n  html2canvas v0.34 <http://html2canvas.hertzen.com>\r\n  Copyright (c) 2011 Niklas von Hertzen. All rights reserved.\r\n  http://www.twitter.com/niklasvh\r\n\r\n  Contributor(s):\r\n      Niklas von Hertzen <http://www.twitter.com/niklasvh>\r\n      André Fiedler      <http://www.twitter.com/sonnenkiste>\r\n\r\n  Released under MIT License\r\n */\r\n\r\n(function(){\r\n\r\n_html2canvas.Generate = {};\r\n\r\nvar reGradients = [\r\n    /^(-webkit-linear-gradient)\\(([a-z\\s]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\r\n    /^(-o-linear-gradient)\\(([a-z\\s]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\r\n    /^(-webkit-gradient)\\((linear|radial),\\s((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?),\\s(?:\\d{1,3}%?)\\s(?:\\d{1,3}%?))([\\w\\d\\.\\s,%\\(\\)-]+)\\)$/,\r\n    /^(-moz-linear-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?))([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\r\n    /^(-webkit-radial-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?)),\\s(\\w+)\\s([a-z-]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\r\n    /^(-moz-radial-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?)),\\s(\\w+)\\s?([a-z-]*)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/,\r\n    /^(-o-radial-gradient)\\(((?:\\d{1,3}%?)\\s(?:\\d{1,3}%?)),\\s(\\w+)\\s([a-z-]+)([\\w\\d\\.\\s,%\\(\\)]+)\\)$/\r\n];\r\n\r\n/*\r\n * TODO: Add IE10 vendor prefix (-ms) support\r\n * TODO: Add W3C gradient (linear-gradient) support\r\n * TODO: Add old Webkit -webkit-gradient(radial, ...) support\r\n * TODO: Maybe some RegExp optimizations are possible ;o)\r\n */\r\n_html2canvas.Generate.parseGradient = function(css, bounds) {\r\n    var gradient, i, len = reGradients.length, m1, stop, m2, m2Len, step, m3;\r\n\r\n    for(i = 0; i < len; i+=1){\r\n        m1 = css.match(reGradients[i]);\r\n        if(m1) break;\r\n    }\r\n\r\n    if(m1) {\r\n        switch(m1[1]) {\r\n            case '-webkit-linear-gradient':\r\n            case '-o-linear-gradient':\r\n\r\n                gradient = {\r\n                    type: 'linear',\r\n                    x0: null,\r\n                    y0: null,\r\n                    x1: null,\r\n                    y1: null,\r\n                    colorStops: []\r\n                };\r\n\r\n                // get coordinates\r\n                m2 = m1[2].match(/\\w+/g);\r\n                if(m2){\r\n                    m2Len = m2.length;\r\n                    for(i = 0; i < m2Len; i+=1){\r\n                        switch(m2[i]) {\r\n                            case 'top':\r\n                                gradient.y0 = 0;\r\n                                gradient.y1 = bounds.height;\r\n                                break;\r\n\r\n                            case 'right':\r\n                                gradient.x0 = bounds.width;\r\n                                gradient.x1 = 0;\r\n                                break;\r\n\r\n                            case 'bottom':\r\n                                gradient.y0 = bounds.height;\r\n                                gradient.y1 = 0;\r\n                                break;\r\n\r\n                            case 'left':\r\n                                gradient.x0 = 0;\r\n                                gradient.x1 = bounds.width;\r\n                                break;\r\n                        }\r\n                    }\r\n                }\r\n                if(gradient.x0 === null && gradient.x1 === null){ // center\r\n                    gradient.x0 = gradient.x1 = bounds.width / 2;\r\n                }\r\n                if(gradient.y0 === null && gradient.y1 === null){ // center\r\n                    gradient.y0 = gradient.y1 = bounds.height / 2;\r\n                }\r\n\r\n                // get colors and stops\r\n                m2 = m1[3].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)(?:\\s\\d{1,3}(?:%|px))?)+/g);\r\n                if(m2){\r\n                    m2Len = m2.length;\r\n                    step = 1 / Math.max(m2Len - 1, 1);\r\n                    for(i = 0; i < m2Len; i+=1){\r\n                        m3 = m2[i].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\s*(\\d{1,3})?(%|px)?/);\r\n                        if(m3[2]){\r\n                            stop = parseFloat(m3[2]);\r\n                            if(m3[3] === '%'){\r\n                                stop /= 100;\r\n                            } else { // px - stupid opera\r\n                                stop /= bounds.width;\r\n                            }\r\n                        } else {\r\n                            stop = i * step;\r\n                        }\r\n                        gradient.colorStops.push({\r\n                            color: m3[1],\r\n                            stop: stop\r\n                        });\r\n                    }\r\n                }\r\n                break;\r\n\r\n            case '-webkit-gradient':\r\n\r\n                gradient = {\r\n                    type: m1[2] === 'radial' ? 'circle' : m1[2], // TODO: Add radial gradient support for older mozilla definitions\r\n                    x0: 0,\r\n                    y0: 0,\r\n                    x1: 0,\r\n                    y1: 0,\r\n                    colorStops: []\r\n                };\r\n\r\n                // get coordinates\r\n                m2 = m1[3].match(/(\\d{1,3})%?\\s(\\d{1,3})%?,\\s(\\d{1,3})%?\\s(\\d{1,3})%?/);\r\n                if(m2){\r\n                    gradient.x0 = (m2[1] * bounds.width) / 100;\r\n                    gradient.y0 = (m2[2] * bounds.height) / 100;\r\n                    gradient.x1 = (m2[3] * bounds.width) / 100;\r\n                    gradient.y1 = (m2[4] * bounds.height) / 100;\r\n                }\r\n\r\n                // get colors and stops\r\n                m2 = m1[4].match(/((?:from|to|color-stop)\\((?:[0-9\\.]+,\\s)?(?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)\\))+/g);\r\n                if(m2){\r\n                    m2Len = m2.length;\r\n                    for(i = 0; i < m2Len; i+=1){\r\n                        m3 = m2[i].match(/(from|to|color-stop)\\(([0-9\\.]+)?(?:,\\s)?((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\)/);\r\n                        stop = parseFloat(m3[2]);\r\n                        if(m3[1] === 'from') stop = 0.0;\r\n                        if(m3[1] === 'to') stop = 1.0;\r\n                        gradient.colorStops.push({\r\n                            color: m3[3],\r\n                            stop: stop\r\n                        });\r\n                    }\r\n                }\r\n                break;\r\n\r\n            case '-moz-linear-gradient':\r\n\r\n                gradient = {\r\n                    type: 'linear',\r\n                    x0: 0,\r\n                    y0: 0,\r\n                    x1: 0,\r\n                    y1: 0,\r\n                    colorStops: []\r\n                };\r\n\r\n                // get coordinates\r\n                m2 = m1[2].match(/(\\d{1,3})%?\\s(\\d{1,3})%?/);\r\n\r\n                // m2[1] == 0%   -> left\r\n                // m2[1] == 50%  -> center\r\n                // m2[1] == 100% -> right\r\n\r\n                // m2[2] == 0%   -> top\r\n                // m2[2] == 50%  -> center\r\n                // m2[2] == 100% -> bottom\r\n\r\n                if(m2){\r\n                    gradient.x0 = (m2[1] * bounds.width) / 100;\r\n                    gradient.y0 = (m2[2] * bounds.height) / 100;\r\n                    gradient.x1 = bounds.width - gradient.x0;\r\n                    gradient.y1 = bounds.height - gradient.y0;\r\n                }\r\n\r\n                // get colors and stops\r\n                m2 = m1[3].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)(?:\\s\\d{1,3}%)?)+/g);\r\n                if(m2){\r\n                    m2Len = m2.length;\r\n                    step = 1 / Math.max(m2Len - 1, 1);\r\n                    for(i = 0; i < m2Len; i+=1){\r\n                        m3 = m2[i].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\s*(\\d{1,3})?(%)?/);\r\n                        if(m3[2]){\r\n                            stop = parseFloat(m3[2]);\r\n                            if(m3[3]){ // percentage\r\n                                stop /= 100;\r\n                            }\r\n                        } else {\r\n                            stop = i * step;\r\n                        }\r\n                        gradient.colorStops.push({\r\n                            color: m3[1],\r\n                            stop: stop\r\n                        });\r\n                    }\r\n                }\r\n                break;\r\n\r\n            case '-webkit-radial-gradient':\r\n            case '-moz-radial-gradient':\r\n            case '-o-radial-gradient':\r\n\r\n                gradient = {\r\n                    type: 'circle',\r\n                    x0: 0,\r\n                    y0: 0,\r\n                    x1: bounds.width,\r\n                    y1: bounds.height,\r\n                    cx: 0,\r\n                    cy: 0,\r\n                    rx: 0,\r\n                    ry: 0,\r\n                    colorStops: []\r\n                };\r\n\r\n                // center\r\n                m2 = m1[2].match(/(\\d{1,3})%?\\s(\\d{1,3})%?/);\r\n                if(m2){\r\n                    gradient.cx = (m2[1] * bounds.width) / 100;\r\n                    gradient.cy = (m2[2] * bounds.height) / 100;\r\n                }\r\n\r\n                // size\r\n                m2 = m1[3].match(/\\w+/);\r\n                m3 = m1[4].match(/[a-z-]*/);\r\n                if(m2 && m3){\r\n                    switch(m3[0]){\r\n                        case 'farthest-corner':\r\n                        case 'cover': // is equivalent to farthest-corner\r\n                        case '': // mozilla removes \"cover\" from definition :(\r\n                            var tl = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.cy, 2));\r\n                            var tr = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));\r\n                            var br = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));\r\n                            var bl = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.cy, 2));\r\n                            gradient.rx = gradient.ry = Math.max(tl, tr, br, bl);\r\n                            break;\r\n                        case 'closest-corner':\r\n                            var tl = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.cy, 2));\r\n                            var tr = Math.sqrt(Math.pow(gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));\r\n                            var br = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.y1 - gradient.cy, 2));\r\n                            var bl = Math.sqrt(Math.pow(gradient.x1 - gradient.cx, 2) + Math.pow(gradient.cy, 2));\r\n                            gradient.rx = gradient.ry = Math.min(tl, tr, br, bl);\r\n                            break;\r\n                        case 'farthest-side':\r\n                            if(m2[0] === 'circle'){\r\n                                gradient.rx = gradient.ry = Math.max(\r\n                                    gradient.cx,\r\n                                    gradient.cy,\r\n                                    gradient.x1 - gradient.cx,\r\n                                    gradient.y1 - gradient.cy\r\n                                );\r\n                            } else { // ellipse\r\n\r\n                                gradient.type = m2[0];\r\n\r\n                                gradient.rx = Math.max(\r\n                                    gradient.cx,\r\n                                    gradient.x1 - gradient.cx\r\n                                );\r\n                                gradient.ry = Math.max(\r\n                                    gradient.cy,\r\n                                    gradient.y1 - gradient.cy\r\n                                );\r\n                            }\r\n                            break;\r\n                        case 'closest-side':\r\n                        case 'contain': // is equivalent to closest-side\r\n                            if(m2[0] === 'circle'){\r\n                                gradient.rx = gradient.ry = Math.min(\r\n                                    gradient.cx,\r\n                                    gradient.cy,\r\n                                    gradient.x1 - gradient.cx,\r\n                                    gradient.y1 - gradient.cy\r\n                                );\r\n                            } else { // ellipse\r\n\r\n                                gradient.type = m2[0];\r\n\r\n                                gradient.rx = Math.min(\r\n                                    gradient.cx,\r\n                                    gradient.x1 - gradient.cx\r\n                                );\r\n                                gradient.ry = Math.min(\r\n                                    gradient.cy,\r\n                                    gradient.y1 - gradient.cy\r\n                                );\r\n                            }\r\n                            break;\r\n\r\n                        // TODO: add support for \"30px 40px\" sizes (webkit only)\r\n                    }\r\n                }\r\n\r\n                // color stops\r\n                m2 = m1[5].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\)(?:\\s\\d{1,3}(?:%|px))?)+/g);\r\n                if(m2){\r\n                    m2Len = m2.length;\r\n                    step = 1 / Math.max(m2Len - 1, 1);\r\n                    for(i = 0; i < m2Len; i+=1){\r\n                        m3 = m2[i].match(/((?:rgb|rgba)\\(\\d{1,3},\\s\\d{1,3},\\s\\d{1,3}(?:,\\s[0-9\\.]+)?\\))\\s*(\\d{1,3})?(%|px)?/);\r\n                        if(m3[2]){\r\n                            stop = parseFloat(m3[2]);\r\n                            if(m3[3] === '%'){\r\n                                stop /= 100;\r\n                            } else { // px - stupid opera\r\n                                stop /= bounds.width;\r\n                            }\r\n                        } else {\r\n                            stop = i * step;\r\n                        }\r\n                        gradient.colorStops.push({\r\n                            color: m3[1],\r\n                            stop: stop\r\n                        });\r\n                    }\r\n                }\r\n                break;\r\n        }\r\n    }\r\n\r\n    return gradient;\r\n};\r\n\r\n_html2canvas.Generate.Gradient = function(src, bounds) {\r\n    var canvas = document.createElement('canvas'),\r\n    ctx = canvas.getContext('2d'),\r\n    gradient, grad, i, len, img;\r\n\r\n    canvas.width = bounds.width;\r\n    canvas.height = bounds.height;\r\n\r\n    // TODO: add support for multi defined background gradients (like radial gradient example in background.html)\r\n    gradient = _html2canvas.Generate.parseGradient(src, bounds);\r\n\r\n    img = new Image();\r\n\r\n    if(gradient){\r\n        if(gradient.type === 'linear'){\r\n            grad = ctx.createLinearGradient(gradient.x0, gradient.y0, gradient.x1, gradient.y1);\r\n\r\n            for (i = 0, len = gradient.colorStops.length; i < len; i+=1) {\r\n                try {\r\n                    grad.addColorStop(gradient.colorStops[i].stop, gradient.colorStops[i].color);\r\n                }\r\n                catch(e) {\r\n                    h2clog(['failed to add color stop: ', e, '; tried to add: ', gradient.colorStops[i], '; stop: ', i, '; in: ', src]);\r\n                }\r\n            }\r\n\r\n            ctx.fillStyle = grad;\r\n            ctx.fillRect(0, 0, bounds.width, bounds.height);\r\n\r\n            img.src = canvas.toDataURL();\r\n        } else if(gradient.type === 'circle'){\r\n\r\n            grad = ctx.createRadialGradient(gradient.cx, gradient.cy, 0, gradient.cx, gradient.cy, gradient.rx);\r\n\r\n            for (i = 0, len = gradient.colorStops.length; i < len; i+=1) {\r\n                try {\r\n                    grad.addColorStop(gradient.colorStops[i].stop, gradient.colorStops[i].color);\r\n                }\r\n                catch(e) {\r\n                    h2clog(['failed to add color stop: ', e, '; tried to add: ', gradient.colorStops[i], '; stop: ', i, '; in: ', src]);\r\n                }\r\n            }\r\n\r\n            ctx.fillStyle = grad;\r\n            ctx.fillRect(0, 0, bounds.width, bounds.height);\r\n\r\n            img.src = canvas.toDataURL();\r\n        } else if(gradient.type === 'ellipse'){\r\n\r\n            // draw circle\r\n            var canvasRadial = document.createElement('canvas'),\r\n                ctxRadial = canvasRadial.getContext('2d'),\r\n                ri = Math.max(gradient.rx, gradient.ry),\r\n                di = ri * 2, imgRadial;\r\n\r\n            canvasRadial.width = canvasRadial.height = di;\r\n\r\n            grad = ctxRadial.createRadialGradient(gradient.rx, gradient.ry, 0, gradient.rx, gradient.ry, ri);\r\n\r\n            for (i = 0, len = gradient.colorStops.length; i < len; i+=1) {\r\n                try {\r\n                    grad.addColorStop(gradient.colorStops[i].stop, gradient.colorStops[i].color);\r\n                }\r\n                catch(e) {\r\n                    h2clog(['failed to add color stop: ', e, '; tried to add: ', gradient.colorStops[i], '; stop: ', i, '; in: ', src]);\r\n                }\r\n            }\r\n\r\n            ctxRadial.fillStyle = grad;\r\n            ctxRadial.fillRect(0, 0, di, di);\r\n\r\n            ctx.fillStyle = gradient.colorStops[i - 1].color;\r\n            ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n            imgRadial = new Image();\r\n            imgRadial.onload = function() { // wait until the image is filled\r\n\r\n                // transform circle to ellipse\r\n                ctx.drawImage(imgRadial, gradient.cx - gradient.rx, gradient.cy - gradient.ry, 2 * gradient.rx, 2 * gradient.ry);\r\n\r\n                img.src = canvas.toDataURL();\r\n\r\n            }\r\n            imgRadial.src = canvasRadial.toDataURL();\r\n        }\r\n    }\r\n\r\n    return img;\r\n};\r\n\r\n_html2canvas.Generate.ListAlpha = function(number) {\r\n    var tmp = \"\",\r\n    modulus;\r\n\r\n    do {\r\n        modulus = number % 26;\r\n        tmp = String.fromCharCode((modulus) + 64) + tmp;\r\n        number = number / 26;\r\n    }while((number*26) > 26);\r\n\r\n    return tmp;\r\n};\r\n\r\n_html2canvas.Generate.ListRoman = function(number) {\r\n    var romanArray = [\"M\", \"CM\", \"D\", \"CD\", \"C\", \"XC\", \"L\", \"XL\", \"X\", \"IX\", \"V\", \"IV\", \"I\"],\r\n    decimal = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],\r\n    roman = \"\",\r\n    v,\r\n    len = romanArray.length;\r\n\r\n    if (number <= 0 || number >= 4000) {\r\n        return number;\r\n    }\r\n\r\n    for (v=0; v < len; v+=1) {\r\n        while (number >= decimal[v]) {\r\n            number -= decimal[v];\r\n            roman += romanArray[v];\r\n        }\r\n    }\r\n\r\n    return roman;\r\n\r\n};\r\n\r\n})();\r\n/*\r\n  html2canvas v0.34 <http://html2canvas.hertzen.com>\r\n  Copyright (c) 2011 Niklas von Hertzen. All rights reserved.\r\n  http://www.twitter.com/niklasvh\r\n\r\n  Released under MIT License\r\n*/\r\n\r\n/*\r\n *  New function for traversing elements\r\n */\r\n\r\n_html2canvas.Parse = function ( images, options ) {\r\n\r\n    var support = {\r\n        rangeBounds: false,\r\n        svgRendering: options.svgRendering && (function( ){\r\n            var img = new Image(),\r\n            canvas = document.createElement(\"canvas\"),\r\n            ctx = (canvas.getContext === undefined) ? false : canvas.getContext(\"2d\");\r\n            if (ctx === false) {\r\n                // browser doesn't support canvas, good luck supporting SVG on canvas\r\n                return false;\r\n            }\r\n            canvas.width = canvas.height = 10;\r\n            img.src = [\r\n            \"data:image/svg+xml,\",\r\n            \"<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'>\",\r\n            \"<foreignObject width='10' height='10'>\",\r\n            \"<div xmlns='http://www.w3.org/1999/xhtml' style='width:10;height:10;'>\",\r\n            \"sup\",\r\n            \"</div>\",\r\n            \"</foreignObject>\",\r\n            \"</svg>\"\r\n            ].join(\"\");\r\n            try {\r\n                ctx.drawImage(img, 0, 0);\r\n                canvas.toDataURL();\r\n            } catch(e) {\r\n                return false;\r\n            }\r\n            h2clog('html2canvas: Parse: SVG powered rendering available');\r\n            return true;\r\n\r\n        })()\r\n    },\r\n    element = (( options.elements === undefined ) ? document.body : options.elements[0]), // select body by default\r\n    needReorder = false,\r\n    numDraws = 0,\r\n    fontData = {},\r\n    doc = element.ownerDocument,\r\n    ignoreElementsRegExp = new RegExp(\"(\" + options.ignoreElements + \")\"),\r\n    body = doc.body,\r\n    r,\r\n    testElement,\r\n    rangeBounds,\r\n    rangeHeight,\r\n    stack,\r\n    ctx,\r\n    docDim,\r\n    i,\r\n    children,\r\n    childrenLen;\r\n\r\n\r\n    function docSize(){\r\n\r\n        return {\r\n            width: Math.max(\r\n                Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth),\r\n                Math.max(doc.body.offsetWidth, doc.documentElement.offsetWidth),\r\n                Math.max(doc.body.clientWidth, doc.documentElement.clientWidth)\r\n                ),\r\n            height: Math.max(\r\n                Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight),\r\n                Math.max(doc.body.offsetHeight, doc.documentElement.offsetHeight),\r\n                Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)\r\n                )\r\n        };\r\n\r\n    }\r\n\r\n    images = images || {};\r\n\r\n    // Test whether we can use ranges to measure bounding boxes\r\n    // Opera doesn't provide valid bounds.height/bottom even though it supports the method.\r\n\r\n\r\n    if (doc.createRange) {\r\n        r = doc.createRange();\r\n        //this.support.rangeBounds = new Boolean(r.getBoundingClientRect);\r\n        if (r.getBoundingClientRect){\r\n            testElement = doc.createElement('boundtest');\r\n            testElement.style.height = \"123px\";\r\n            testElement.style.display = \"block\";\r\n            body.appendChild(testElement);\r\n\r\n            r.selectNode(testElement);\r\n            rangeBounds = r.getBoundingClientRect();\r\n            rangeHeight = rangeBounds.height;\r\n\r\n            if (rangeHeight === 123) {\r\n                support.rangeBounds = true;\r\n            }\r\n            body.removeChild(testElement);\r\n\r\n\r\n        }\r\n\r\n    }\r\n\r\n\r\n    /*\r\n    var rootStack = new this.storageContext($(document).width(),$(document).height());\r\n    rootStack.opacity = this.getCSS(this.element,\"opacity\");\r\n    var stack = this.newElement(this.element,rootStack);\r\n\r\n\r\n    this.parseElement(this.element,stack);\r\n     */\r\n\r\n\r\n\r\n\r\n    var getCSS = _html2canvas.Util.getCSS;\r\n    function getCSSInt(element, attribute) {\r\n        var val = parseInt(getCSS(element, attribute), 10);\r\n        return (isNaN(val)) ? 0 : val; // borders in old IE are throwing 'medium' for demo.html\r\n    }\r\n\r\n    // Drawing a rectangle\r\n    function renderRect (ctx, x, y, w, h, bgcolor) {\r\n        if (bgcolor !==\"transparent\"){\r\n            ctx.setVariable(\"fillStyle\", bgcolor);\r\n            ctx.fillRect (x, y, w, h);\r\n            numDraws+=1;\r\n        }\r\n    }\r\n\r\n\r\n    function textTransform (text, transform) {\r\n        switch(transform){\r\n            case \"lowercase\":\r\n                return text.toLowerCase();\r\n\r\n            case \"capitalize\":\r\n                return text.replace( /(^|\\s|:|-|\\(|\\))([a-z])/g , function (m, p1, p2) {\r\n                    if (m.length > 0) {\r\n                        return p1 + p2.toUpperCase();\r\n                    }\r\n                } );\r\n\r\n            case \"uppercase\":\r\n                return text.toUpperCase();\r\n\r\n            default:\r\n                return text;\r\n\r\n        }\r\n\r\n    }\r\n\r\n    function trimText (text) {\r\n        return text.replace(/^\\s*/g, \"\").replace(/\\s*$/g, \"\");\r\n    }\r\n\r\n    function fontMetrics (font, fontSize) {\r\n\r\n        if (fontData[font + \"-\" + fontSize] !== undefined) {\r\n            return fontData[font + \"-\" + fontSize];\r\n        }\r\n\r\n\r\n        var container = doc.createElement('div'),\r\n        img = doc.createElement('img'),\r\n        span = doc.createElement('span'),\r\n        baseline,\r\n        middle,\r\n        metricsObj;\r\n\r\n\r\n        container.style.visibility = \"hidden\";\r\n        container.style.fontFamily = font;\r\n        container.style.fontSize = fontSize;\r\n        container.style.margin = 0;\r\n        container.style.padding = 0;\r\n\r\n        body.appendChild(container);\r\n\r\n\r\n\r\n        // http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever (handtinywhite.gif)\r\n        img.src = \"data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACwAAAAAAQABAAACAkQBADs=\";\r\n        img.width = 1;\r\n        img.height = 1;\r\n\r\n        img.style.margin = 0;\r\n        img.style.padding = 0;\r\n        img.style.verticalAlign = \"baseline\";\r\n\r\n        span.style.fontFamily = font;\r\n        span.style.fontSize = fontSize;\r\n        span.style.margin = 0;\r\n        span.style.padding = 0;\r\n\r\n\r\n\r\n\r\n        span.appendChild(doc.createTextNode('Hidden Text'));\r\n        container.appendChild(span);\r\n        container.appendChild(img);\r\n        baseline = (img.offsetTop - span.offsetTop) + 1;\r\n\r\n        container.removeChild(span);\r\n        container.appendChild(doc.createTextNode('Hidden Text'));\r\n\r\n        container.style.lineHeight = \"normal\";\r\n        img.style.verticalAlign = \"super\";\r\n\r\n        middle = (img.offsetTop-container.offsetTop) + 1;\r\n        metricsObj = {\r\n            baseline: baseline,\r\n            lineWidth: 1,\r\n            middle: middle\r\n        };\r\n\r\n\r\n        fontData[font + \"-\" + fontSize] = metricsObj;\r\n\r\n        body.removeChild(container);\r\n\r\n        return metricsObj;\r\n\r\n    }\r\n\r\n\r\n    function drawText(currentText, x, y, ctx){\r\n        if (trimText(currentText).length>0) {\r\n            ctx.fillText(currentText,x,y);\r\n            numDraws+=1;\r\n        }\r\n    }\r\n\r\n\r\n    function renderText(el, textNode, stack) {\r\n        var ctx = stack.ctx,\r\n        family = getCSS(el, \"fontFamily\"),\r\n        size = getCSS(el, \"fontSize\"),\r\n        color = getCSS(el, \"color\"),\r\n        text_decoration = getCSS(el, \"textDecoration\"),\r\n        text_align = getCSS(el, \"textAlign\"),\r\n        letter_spacing = getCSS(el, \"letterSpacing\"),\r\n        bounds,\r\n        text,\r\n        metrics,\r\n        renderList,\r\n        listLen,\r\n        bold = getCSS(el, \"fontWeight\"),\r\n        font_style = getCSS(el, \"fontStyle\"),\r\n        font_variant = getCSS(el, \"fontVariant\"),\r\n        align = false,\r\n        newTextNode,\r\n        textValue,\r\n        textOffset = 0,\r\n        oldTextNode,\r\n        c,\r\n        range,\r\n        parent,\r\n        wrapElement,\r\n        backupText;\r\n\r\n        // apply text-transform:ation to the text\r\n\r\n\r\n\r\n        textNode.nodeValue = textTransform(textNode.nodeValue, getCSS(el, \"textTransform\"));\r\n        text = trimText(textNode.nodeValue);\r\n\r\n        if (text.length>0){\r\n\r\n            if (text_decoration !== \"none\"){\r\n                metrics = fontMetrics(family, size);\r\n            }\r\n\r\n            text_align = text_align.replace([\"-webkit-auto\"],[\"auto\"]);\r\n\r\n            if (options.letterRendering === false && /^(left|right|justify|auto)$/.test(text_align) && /^(normal|none)$/.test(letter_spacing)){\r\n                // this.setContextVariable(ctx,\"textAlign\",text_align);\r\n                renderList = textNode.nodeValue.split(/(\\b| )/);\r\n\r\n            }else{\r\n                //  this.setContextVariable(ctx,\"textAlign\",\"left\");\r\n                renderList = textNode.nodeValue.split(\"\");\r\n            }\r\n\r\n            switch(parseInt(bold, 10)){\r\n                case 401:\r\n                    bold = \"bold\";\r\n                    break;\r\n                case 400:\r\n                    bold = \"normal\";\r\n                    break;\r\n            }\r\n\r\n            ctx.setVariable(\"fillStyle\", color);\r\n\r\n            /*\r\n              need to be defined in the order as defined in http://www.w3.org/TR/CSS21/fonts.html#font-shorthand\r\n              to properly work in Firefox\r\n            */\r\n            ctx.setVariable(\"font\", font_style+ \" \" + font_variant  + \" \" + bold + \" \" + size + \" \" + family);\r\n\r\n            if (align){\r\n                ctx.setVariable(\"textAlign\", \"right\");\r\n            }else{\r\n                ctx.setVariable(\"textAlign\", \"left\");\r\n            }\r\n\r\n\r\n            /*\r\n        if (stack.clip){\r\n        ctx.rect (stack.clip.left, stack.clip.top, stack.clip.width, stack.clip.height);\r\n        ctx.clip();\r\n        }\r\n             */\r\n\r\n\r\n            oldTextNode = textNode;\r\n\r\n\r\n            for ( c=0, listLen = renderList.length; c < listLen; c+=1 ) {\r\n                textValue = null;\r\n\r\n\r\n\r\n                if (support.rangeBounds){\r\n                    // getBoundingClientRect is supported for ranges\r\n                    if (text_decoration !== \"none\" || trimText(renderList[c]).length !== 0) {\r\n                        textValue = renderList[c];\r\n                        if (doc.createRange){\r\n                            range = doc.createRange();\r\n\r\n                            range.setStart(textNode, textOffset);\r\n                            range.setEnd(textNode, textOffset + textValue.length);\r\n                        }else{\r\n                            // TODO add IE support\r\n                            range = body.createTextRange();\r\n                        }\r\n\r\n                        bounds = adjustBounds(textNode, range.getBoundingClientRect());\r\n\r\n                    }\r\n                }else{\r\n                    // it isn't supported, so let's wrap it inside an element instead and get the bounds there\r\n\r\n                    // IE 9 bug\r\n                    if (typeof oldTextNode.nodeValue !== \"string\" ){\r\n                        continue;\r\n                    }\r\n\r\n                    newTextNode = oldTextNode.splitText(renderList[c].length);\r\n\r\n                    parent = oldTextNode.parentNode;\r\n                    wrapElement = doc.createElement('wrapper');\r\n                    backupText = oldTextNode.cloneNode(true);\r\n\r\n                    wrapElement.appendChild(oldTextNode.cloneNode(true));\r\n                    parent.replaceChild(wrapElement, oldTextNode);\r\n\r\n                    bounds = _html2canvas.Util.Bounds(wrapElement);\r\n\r\n                    textValue = oldTextNode.nodeValue;\r\n\r\n                    oldTextNode = newTextNode;\r\n                    parent.replaceChild(backupText, wrapElement);\r\n\r\n\r\n                }\r\n\r\n                if (textValue !== null){\r\n                    drawText(textValue, bounds.left, bounds.bottom, ctx);\r\n                }\r\n\r\n                switch(text_decoration) {\r\n                    case \"underline\":\r\n                        // Draws a line at the baseline of the font\r\n                        // TODO As some browsers display the line as more than 1px if the font-size is big, need to take that into account both in position and size\r\n                        renderRect(ctx, bounds.left, Math.round(bounds.top + metrics.baseline + metrics.lineWidth), bounds.width, 1, color);\r\n                        break;\r\n                    case \"overline\":\r\n                        renderRect(ctx, bounds.left, bounds.top, bounds.width, 1, color);\r\n                        break;\r\n                    case \"line-through\":\r\n                        // TODO try and find exact position for line-through\r\n                        renderRect(ctx, bounds.left, Math.ceil(bounds.top + metrics.middle + metrics.lineWidth), bounds.width, 1, color);\r\n                        break;\r\n\r\n                }\r\n\r\n\r\n\r\n\r\n\r\n                textOffset += renderList[c].length;\r\n\r\n            }\r\n\r\n\r\n\r\n        }\r\n\r\n    }\r\n\r\n    function listPosition (element, val) {\r\n        var boundElement = doc.createElement( \"boundelement\" ),\r\n        type,\r\n        bounds;\r\n\r\n        boundElement.style.display = \"inline\";\r\n        //boundElement.style.width = \"1px\";\r\n        //boundElement.style.height = \"1px\";\r\n\r\n        type = element.style.listStyleType;\r\n        element.style.listStyleType = \"none\";\r\n\r\n        boundElement.appendChild( doc.createTextNode( val ) );\r\n\r\n\r\n        element.insertBefore(boundElement, element.firstChild);\r\n\r\n\r\n        bounds = _html2canvas.Util.Bounds( boundElement );\r\n        element.removeChild( boundElement );\r\n        element.style.listStyleType = type;\r\n        return bounds;\r\n\r\n    }\r\n    \r\n\r\n    \r\n    function elementIndex( el ) {\r\n        var i = -1,\r\n        count = 1,\r\n        childs = el.parentNode.childNodes;\r\n\r\n        if ( el.parentNode ) {\r\n            while( childs[ ++i ] !== el ) {\r\n               if ( childs[ i ].nodeType === 1 ) {\r\n                   count++;\r\n               }\r\n            }\r\n            return count;\r\n        } else {\r\n            return -1;\r\n        }\r\n       \r\n    }\r\n\r\n    function renderListItem(element, stack, elBounds) {\r\n\r\n\r\n        var position = getCSS(element, \"listStylePosition\"),\r\n        x,\r\n        y,\r\n        type = getCSS(element, \"listStyleType\"),\r\n        currentIndex,\r\n        text,\r\n        listBounds,\r\n        bold = getCSS(element, \"fontWeight\");\r\n\r\n        if (/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(type)) {\r\n\r\n            currentIndex = elementIndex( element );\r\n\r\n            switch(type){\r\n                case \"decimal\":\r\n                    text = currentIndex;\r\n                    break;\r\n                case \"decimal-leading-zero\":\r\n                    if (currentIndex.toString().length === 1){\r\n                        text = currentIndex = \"0\" + currentIndex.toString();\r\n                    }else{\r\n                        text = currentIndex.toString();\r\n                    }\r\n                    break;\r\n                case \"upper-roman\":\r\n                    text = _html2canvas.Generate.ListRoman( currentIndex );\r\n                    break;\r\n                case \"lower-roman\":\r\n                    text = _html2canvas.Generate.ListRoman( currentIndex ).toLowerCase();\r\n                    break;\r\n                case \"lower-alpha\":\r\n                    text = _html2canvas.Generate.ListAlpha( currentIndex ).toLowerCase();\r\n                    break;\r\n                case \"upper-alpha\":\r\n                    text = _html2canvas.Generate.ListAlpha( currentIndex );\r\n                    break;\r\n            }\r\n\r\n\r\n            text += \". \";\r\n            listBounds = listPosition(element, text);\r\n\r\n\r\n\r\n            switch(bold){\r\n                case 401:\r\n                    bold = \"bold\";\r\n                    break;\r\n                case 400:\r\n                    bold = \"normal\";\r\n                    break;\r\n            }\r\n\r\n\r\n\r\n\r\n            ctx.setVariable( \"fillStyle\", getCSS(element, \"color\") );\r\n            ctx.setVariable( \"font\", getCSS(element, \"fontVariant\") + \" \" + bold + \" \" + getCSS(element, \"fontStyle\") + \" \" + getCSS(element, \"fontSize\") + \" \" + getCSS(element, \"fontFamily\") );\r\n\r\n\r\n            if ( position === \"inside\" ) {\r\n                ctx.setVariable(\"textAlign\", \"left\");\r\n                //   this.setFont(stack.ctx, element, false);\r\n                x = elBounds.left;\r\n\r\n            }else{\r\n                return;\r\n            /*\r\n                 TODO really need to figure out some more accurate way to try and find the position.\r\n                 as defined in http://www.w3.org/TR/CSS21/generate.html#propdef-list-style-position, it does not even have a specified \"correct\" position, so each browser\r\n                 may display it whatever way it feels like.\r\n                 \"The position of the list-item marker adjacent to floats is undefined in CSS 2.1. CSS 2.1 does not specify the precise location of the marker box or its position in the painting order\"\r\n\r\n                ctx.setVariable(\"textAlign\", \"right\");\r\n                //  this.setFont(stack.ctx, element, true);\r\n                x = elBounds.left - 10;\r\n                 */\r\n            }\r\n\r\n            y = listBounds.bottom;\r\n\r\n            drawText(text, x, y, ctx);\r\n\r\n\r\n        }\r\n\r\n\r\n    }\r\n\r\n    function loadImage (src){\r\n        var img = images[src];\r\n        if (img && img.succeeded === true) {\r\n            return img.img;\r\n        } else {\r\n            return false;\r\n        }\r\n    }\r\n\r\n\r\n\r\n\r\n\r\n\r\n    function clipBounds(src, dst){\r\n\r\n        var x = Math.max(src.left, dst.left),\r\n        y = Math.max(src.top, dst.top),\r\n        x2 = Math.min((src.left + src.width), (dst.left + dst.width)),\r\n        y2 = Math.min((src.top + src.height), (dst.top + dst.height));\r\n\r\n        return {\r\n            left:x,\r\n            top:y,\r\n            width:x2-x,\r\n            height:y2-y\r\n        };\r\n\r\n    }\r\n\r\n    function setZ(zIndex, parentZ){\r\n        // TODO fix static elements overlapping relative/absolute elements under same stack, if they are defined after them\r\n        var newContext;\r\n        if (!parentZ){\r\n            newContext = h2czContext(0);\r\n            return newContext;\r\n        }\r\n\r\n        if (zIndex !== \"auto\"){\r\n            needReorder = true;\r\n            newContext = h2czContext(zIndex);\r\n            parentZ.children.push(newContext);\r\n            return newContext;\r\n\r\n        }\r\n\r\n        return parentZ;\r\n\r\n    }\r\n\r\n    function renderBorders(el, ctx, bounds, clip){\r\n\r\n        /*\r\n         *  TODO add support for different border-style's than solid\r\n         */\r\n\r\n        var x = bounds.left,\r\n        y = bounds.top,\r\n        w = bounds.width,\r\n        h = bounds.height,\r\n        borderSide,\r\n        borderData,\r\n        bx,\r\n        by,\r\n        bw,\r\n        bh,\r\n        borderBounds,\r\n        borders = (function(el){\r\n            var borders = [],\r\n            sides = [\"Top\",\"Right\",\"Bottom\",\"Left\"],\r\n            s;\r\n\r\n            for (s = 0; s < 4; s+=1){\r\n                borders.push({\r\n                    width: getCSSInt(el, 'border' + sides[s] + 'Width'),\r\n                    color: getCSS(el, 'border' + sides[s] + 'Color')\r\n                });\r\n            }\r\n\r\n            return borders;\r\n\r\n        }(el));\r\n\r\n\r\n        for (borderSide = 0; borderSide < 4; borderSide+=1){\r\n            borderData = borders[borderSide];\r\n\r\n            if (borderData.width>0){\r\n                bx = x;\r\n                by = y;\r\n                bw = w;\r\n                bh = h - (borders[2].width);\r\n\r\n                switch(borderSide){\r\n                    case 0:\r\n                        // top border\r\n                        bh = borders[0].width;\r\n                        break;\r\n                    case 1:\r\n                        // right border\r\n                        bx = x + w - (borders[1].width);\r\n                        bw = borders[1].width;\r\n                        break;\r\n                    case 2:\r\n                        // bottom border\r\n                        by = (by + h) - (borders[2].width);\r\n                        bh = borders[2].width;\r\n                        break;\r\n                    case 3:\r\n                        // left border\r\n                        bw = borders[3].width;\r\n                        break;\r\n                }\r\n\r\n                borderBounds = {\r\n                    left:bx,\r\n                    top:by,\r\n                    width: bw,\r\n                    height:bh\r\n                };\r\n\r\n                if (clip){\r\n                    borderBounds = clipBounds(borderBounds, clip);\r\n                }\r\n\r\n\r\n                if (borderBounds.width>0 && borderBounds.height>0){\r\n                    renderRect(ctx, bx, by, borderBounds.width, borderBounds.height, borderData.color);\r\n                }\r\n\r\n\r\n            }\r\n        }\r\n\r\n        return borders;\r\n\r\n    }\r\n\r\n\r\n    function renderFormValue (el, bounds, stack){\r\n\r\n        var valueWrap = doc.createElement('valuewrap'),\r\n        cssArr = ['lineHeight','textAlign','fontFamily','color','fontSize','paddingLeft','paddingTop','width','height','border','borderLeftWidth','borderTopWidth'],\r\n        i,\r\n        textValue,\r\n        textNode,\r\n        arrLen,\r\n        style;\r\n\r\n        for (i = 0, arrLen = cssArr.length; i < arrLen; i+=1){\r\n            style = cssArr[i];\r\n\r\n            try {\r\n                valueWrap.style[style] = getCSS(el, style);\r\n            } catch( e ) {\r\n                // Older IE has issues with \"border\"\r\n                h2clog(\"html2canvas: Parse: Exception caught in renderFormValue: \" + e.message);\r\n            }\r\n        }\r\n\r\n\r\n        valueWrap.style.borderColor = \"black\";\r\n        valueWrap.style.borderStyle = \"solid\";\r\n        valueWrap.style.display = \"block\";\r\n        valueWrap.style.position = \"absolute\";\r\n        if (/^(submit|reset|button|text|password)$/.test(el.type) || el.nodeName === \"SELECT\"){\r\n            valueWrap.style.lineHeight = getCSS(el, \"height\");\r\n        }\r\n\r\n\r\n        valueWrap.style.top = bounds.top + \"px\";\r\n        valueWrap.style.left = bounds.left + \"px\";\r\n\r\n        if (el.nodeName === \"SELECT\"){\r\n            // TODO increase accuracy of text position\r\n            textValue = el.options[el.selectedIndex].text;\r\n        } else{\r\n            textValue = el.value;\r\n        }\r\n        textNode = doc.createTextNode(textValue);\r\n\r\n        valueWrap.appendChild(textNode);\r\n        body.appendChild(valueWrap);\r\n\r\n\r\n        renderText(el, textNode, stack);\r\n        body.removeChild(valueWrap);\r\n\r\n\r\n\r\n    }\r\n\r\n\r\n\r\n\r\n\r\n    function renderImage (ctx, image, sx, sy, sw, sh, dx, dy, dw, dh) {\r\n        ctx.drawImage(\r\n            image,\r\n            sx, //sx\r\n            sy, //sy\r\n            sw, //sw\r\n            sh, //sh\r\n            dx, //dx\r\n            dy, // dy\r\n            dw, //dw\r\n            dh //dh\r\n            );\r\n        numDraws+=1;\r\n\r\n    }\r\n\r\n\r\n    function renderBackgroundRepeat (ctx, image, x, y, width, height, elx, ely){\r\n        var sourceX = 0,\r\n        sourceY=0;\r\n        if (elx-x>0){\r\n            sourceX = elx-x;\r\n        }\r\n\r\n        if (ely-y>0){\r\n            sourceY = ely-y;\r\n        }\r\n\r\n        renderImage(\r\n            ctx,\r\n            image,\r\n            sourceX, // source X\r\n            sourceY, // source Y\r\n            width-sourceX, // source Width\r\n            height-sourceY, // source Height\r\n            x+sourceX, // destination X\r\n            y+sourceY, // destination Y\r\n            width-sourceX, // destination width\r\n            height-sourceY // destination height\r\n            );\r\n    }\r\n\r\n\r\n    function renderBackgroundRepeatY (ctx, image, bgp, x, y, w, h){\r\n\r\n        var height,\r\n        width = Math.min(image.width,w),bgy;\r\n\r\n        bgp.top = bgp.top-Math.ceil(bgp.top/image.height)*image.height;\r\n\r\n\r\n        for(bgy=(y+bgp.top);bgy<h+y;){\r\n\r\n\r\n            if ( Math.floor(bgy+image.height)>h+y){\r\n                height = (h+y)-bgy;\r\n            }else{\r\n                height = image.height;\r\n            }\r\n            renderBackgroundRepeat(ctx,image,x+bgp.left,bgy,width,height,x,y);\r\n\r\n            bgy = Math.floor(bgy+image.height);\r\n\r\n        }\r\n    }\r\n\r\n    function renderBackgroundRepeatX(ctx, image, bgp, x, y, w, h){\r\n\r\n        var height = Math.min(image.height,h),\r\n        width,bgx;\r\n\r\n\r\n        bgp.left = bgp.left-Math.ceil(bgp.left/image.width)*image.width;\r\n\r\n\r\n        for (bgx=(x+bgp.left);bgx<w+x;) {\r\n\r\n            if (Math.floor(bgx+image.width)>w+x){\r\n                width = (w+x)-bgx;\r\n            }else{\r\n                width = image.width;\r\n            }\r\n\r\n            renderBackgroundRepeat(ctx,image,bgx,(y+bgp.top),width,height,x,y);\r\n\r\n            bgx = Math.floor(bgx+image.width);\r\n\r\n\r\n        }\r\n    }\r\n\r\n    function renderBackground(el,bounds,ctx){\r\n\r\n        // TODO add support for multi background-images\r\n        var background_image = getCSS(el, \"backgroundImage\"),\r\n        background_repeat = getCSS(el, \"backgroundRepeat\").split(\",\")[0],\r\n        image,\r\n        bgp,\r\n        bgy,\r\n        bgw,\r\n        bgsx,\r\n        bgsy,\r\n        bgdx,\r\n        bgdy,\r\n        bgh,\r\n        h,\r\n        height,\r\n        add;\r\n\r\n        //   if (typeof background_image !== \"undefined\" && /^(1|none)$/.test(background_image) === false && /^(-webkit|-moz|linear-gradient|-o-)/.test(background_image)===false){\r\n\r\n        if ( !/data:image\\/.*;base64,/i.test(background_image) && !/^(-webkit|-moz|linear-gradient|-o-)/.test(background_image) ) {\r\n            background_image = background_image.split(\",\")[0];\r\n        }\r\n\r\n        if ( typeof background_image !== \"undefined\" && /^(1|none)$/.test( background_image ) === false ) {\r\n            background_image = _html2canvas.Util.backgroundImage( background_image );\r\n            image = loadImage( background_image );\r\n\r\n\r\n            bgp = _html2canvas.Util.BackgroundPosition(el, bounds, image);\r\n\r\n            // TODO add support for background-origin\r\n            if ( image ){\r\n                switch ( background_repeat ) {\r\n\r\n                    case \"repeat-x\":\r\n                        renderBackgroundRepeatX( ctx, image, bgp, bounds.left, bounds.top, bounds.width, bounds.height );\r\n                        break;\r\n\r\n                    case \"repeat-y\":\r\n                        renderBackgroundRepeatY( ctx, image, bgp, bounds.left, bounds.top, bounds.width, bounds.height );\r\n                        break;\r\n\r\n                    case \"no-repeat\":\r\n                        /*\r\n                    this.drawBackgroundRepeat(\r\n                        ctx,\r\n                        image,\r\n                        bgp.left+bounds.left, // sx\r\n                        bgp.top+bounds.top, // sy\r\n                        Math.min(bounds.width,image.width),\r\n                        Math.min(bounds.height,image.height),\r\n                        bounds.left,\r\n                        bounds.top\r\n                        );*/\r\n\r\n\r\n                       \r\n                        bgw = bounds.width - bgp.left;\r\n                        bgh = bounds.height - bgp.top;\r\n                        bgsx = bgp.left;\r\n                        bgsy = bgp.top;\r\n                        bgdx = bgp.left+bounds.left;\r\n                        bgdy = bgp.top+bounds.top;\r\n\r\n                        //\r\n                        //     bgw = Math.min(bgw,image.width);\r\n                        //  bgh = Math.min(bgh,image.height);\r\n\r\n                        if (bgsx<0){\r\n                            bgsx = Math.abs(bgsx);\r\n                            bgdx += bgsx;\r\n                            bgw = Math.min(bounds.width,image.width-bgsx);\r\n                        }else{\r\n                            bgw = Math.min(bgw,image.width);\r\n                            bgsx = 0;\r\n                        }\r\n\r\n                        if (bgsy<0){\r\n                            bgsy = Math.abs(bgsy);\r\n                            bgdy += bgsy;\r\n                            // bgh = bgh-bgsy;\r\n                            bgh = Math.min(bounds.height,image.height-bgsy);\r\n                        }else{\r\n                            bgh = Math.min(bgh,image.height);\r\n                            bgsy = 0;\r\n                        }\r\n\r\n\r\n                        if (bgh>0 && bgw > 0){\r\n                            renderImage(\r\n                                ctx,\r\n                                image,\r\n                                bgsx, // source X : 0\r\n                                bgsy, // source Y : 1695\r\n                                bgw, // source Width : 18\r\n                                bgh, // source Height : 1677\r\n                                bgdx, // destination X :906\r\n                                bgdy, // destination Y : 1020\r\n                                bgw, // destination width : 18\r\n                                bgh // destination height : 1677\r\n                                );\r\n\r\n                        }\r\n                        break;\r\n                    default:\r\n\r\n\r\n\r\n                        bgp.top = bgp.top-Math.ceil(bgp.top/image.height)*image.height;\r\n\r\n\r\n                        for(bgy=(bounds.top+bgp.top);bgy<bounds.height+bounds.top;){\r\n\r\n\r\n\r\n                            h = Math.min(image.height,(bounds.height+bounds.top)-bgy);\r\n\r\n\r\n                            if ( Math.floor(bgy+image.height)>h+bgy){\r\n                                height = (h+bgy)-bgy;\r\n                            }else{\r\n                                height = image.height;\r\n                            }\r\n                            // console.log(height);\r\n\r\n                            if (bgy<bounds.top){\r\n                                add = bounds.top-bgy;\r\n                                bgy = bounds.top;\r\n\r\n                            }else{\r\n                                add = 0;\r\n                            }\r\n\r\n                            renderBackgroundRepeatX(ctx,image,bgp,bounds.left,bgy,bounds.width,height);\r\n                            if (add>0){\r\n                                bgp.top += add;\r\n                            }\r\n                            bgy = Math.floor(bgy+image.height)-add;\r\n                        }\r\n                        break;\r\n\r\n\r\n                }\r\n            }else{\r\n                h2clog(\"html2canvas: Error loading background:\" + background_image);\r\n            //console.log(images);\r\n            }\r\n\r\n        }\r\n    }\r\n\r\n\r\n\r\n    function renderElement(el, parentStack){\r\n\r\n        var bounds = _html2canvas.Util.Bounds(el),\r\n        x = bounds.left,\r\n        y = bounds.top,\r\n        w = bounds.width,\r\n        h = bounds.height,\r\n        image,\r\n        bgcolor = getCSS(el, \"backgroundColor\"),\r\n        cssPosition = getCSS(el, \"position\"),\r\n        zindex,\r\n        opacity = getCSS(el, \"opacity\"),\r\n        stack,\r\n        stackLength,\r\n        borders,\r\n        ctx,\r\n        bgbounds,\r\n        imgSrc,\r\n        paddingLeft,\r\n        paddingTop,\r\n        paddingRight,\r\n        paddingBottom;\r\n\r\n        if (!parentStack){\r\n            docDim = docSize();\r\n            parentStack = {\r\n                opacity: 1\r\n            };\r\n        }else{\r\n            docDim = {};\r\n        }\r\n\r\n\r\n        //var zindex = this.formatZ(this.getCSS(el,\"zIndex\"),cssPosition,parentStack.zIndex,el.parentNode);\r\n\r\n        zindex = setZ( getCSS( el, \"zIndex\"), parentStack.zIndex );\r\n\r\n\r\n\r\n        stack = {\r\n            ctx: h2cRenderContext( docDim.width || w , docDim.height || h ),\r\n            zIndex: zindex,\r\n            opacity: opacity * parentStack.opacity,\r\n            cssPosition: cssPosition\r\n        };\r\n\r\n\r\n\r\n        // TODO correct overflow for absolute content residing under a static position\r\n\r\n        if (parentStack.clip){\r\n            stack.clip = _html2canvas.Util.Extend( {}, parentStack.clip );\r\n        //stack.clip = parentStack.clip;\r\n        //   stack.clip.height = stack.clip.height - parentStack.borders[2].width;\r\n        }\r\n\r\n\r\n        if ( options.useOverflow === true && /(hidden|scroll|auto)/.test(getCSS(el, \"overflow\")) === true && /(BODY)/i.test(el.nodeName) === false ){\r\n            if (stack.clip){\r\n                stack.clip = clipBounds(stack.clip, bounds);\r\n            }else{\r\n                stack.clip = bounds;\r\n            }\r\n        }\r\n\r\n\r\n        stackLength =  zindex.children.push(stack);\r\n\r\n        ctx = zindex.children[stackLength-1].ctx;\r\n\r\n        ctx.setVariable(\"globalAlpha\", stack.opacity);\r\n\r\n        // draw element borders\r\n        borders = renderBorders(el, ctx, bounds, false);\r\n        stack.borders = borders;\r\n\r\n\r\n        // let's modify clip area for child elements, so borders dont get overwritten\r\n\r\n        /*\r\n    if (stack.clip){\r\n        stack.clip.width = stack.clip.width-(borders[1].width);\r\n        stack.clip.height = stack.clip.height-(borders[2].width);\r\n    }\r\n     */\r\n        if (ignoreElementsRegExp.test(el.nodeName) && options.iframeDefault !== \"transparent\"){\r\n            if (options.iframeDefault === \"default\"){\r\n                bgcolor = \"#efefef\";\r\n            }else{\r\n                bgcolor = options.iframeDefault;\r\n            }\r\n        }\r\n\r\n        // draw base element bgcolor\r\n\r\n        bgbounds = {\r\n            left: x + borders[3].width,\r\n            top: y + borders[0].width,\r\n            width: w - (borders[1].width + borders[3].width),\r\n            height: h - (borders[0].width + borders[2].width)\r\n        };\r\n\r\n        //if (this.withinBounds(stack.clip,bgbounds)){\r\n\r\n        if (stack.clip){\r\n            bgbounds = clipBounds(bgbounds, stack.clip);\r\n\r\n        //}\r\n\r\n        }\r\n\r\n\r\n        if (bgbounds.height > 0 && bgbounds.width > 0){\r\n            renderRect(\r\n                ctx,\r\n                bgbounds.left,\r\n                bgbounds.top,\r\n                bgbounds.width,\r\n                bgbounds.height,\r\n                bgcolor\r\n                );\r\n\r\n            renderBackground(el, bgbounds, ctx);\r\n        }\r\n\r\n        switch(el.nodeName){\r\n            case \"IMG\":\r\n                imgSrc = el.getAttribute('src');\r\n                image = loadImage(imgSrc);\r\n                if (image){\r\n\r\n                    paddingLeft = getCSSInt(el, 'paddingLeft');\r\n                    paddingTop = getCSSInt(el, 'paddingTop');\r\n                    paddingRight = getCSSInt(el, 'paddingRight');\r\n                    paddingBottom = getCSSInt(el, 'paddingBottom');\r\n\r\n\r\n                    renderImage(\r\n                        ctx,\r\n                        image,\r\n                        0, //sx\r\n                        0, //sy\r\n                        image.width, //sw\r\n                        image.height, //sh\r\n                        x + paddingLeft + borders[3].width, //dx\r\n                        y + paddingTop + borders[0].width, // dy\r\n                        bounds.width - (borders[1].width + borders[3].width + paddingLeft + paddingRight), //dw\r\n                        bounds.height - (borders[0].width + borders[2].width + paddingTop + paddingBottom) //dh\r\n                        );\r\n\r\n                }else{\r\n                    h2clog(\"html2canvas: Error loading <img>:\" + imgSrc);\r\n                }\r\n                break;\r\n            case \"INPUT\":\r\n                // TODO add all relevant type's, i.e. HTML5 new stuff\r\n                // todo add support for placeholder attribute for browsers which support it\r\n                if (/^(text|url|email|submit|button|reset)$/.test(el.type) && el.value.length > 0){\r\n\r\n                    renderFormValue(el, bounds, stack);\r\n\r\n\r\n                /*\r\n                 this just doesn't work well enough\r\n\r\n                this.newText(el,{\r\n                    nodeValue:el.value,\r\n                    splitText: function(){\r\n                        return this;\r\n                    },\r\n                    formValue:true\r\n                },stack);\r\n                 */\r\n                }\r\n                break;\r\n            case \"TEXTAREA\":\r\n                if (el.value.length > 0){\r\n                    renderFormValue(el, bounds, stack);\r\n                }\r\n                break;\r\n            case \"SELECT\":\r\n                if (el.options.length > 0){\r\n                    renderFormValue(el, bounds, stack);\r\n                }\r\n                break;\r\n            case \"LI\":\r\n                renderListItem(el, stack, bgbounds);\r\n                break;\r\n            case \"CANVAS\":\r\n                paddingLeft = getCSSInt(el, 'paddingLeft');\r\n                paddingTop = getCSSInt(el, 'paddingTop');\r\n                paddingRight = getCSSInt(el, 'paddingRight');\r\n                paddingBottom = getCSSInt(el, 'paddingBottom');\r\n                renderImage(\r\n                    ctx,\r\n                    el,\r\n                    0, //sx\r\n                    0, //sy\r\n                    el.width, //sw\r\n                    el.height, //sh\r\n                    x + paddingLeft + borders[3].width, //dx\r\n                    y + paddingTop + borders[0].width, // dy\r\n                    bounds.width - (borders[1].width + borders[3].width + paddingLeft + paddingRight), //dw\r\n                    bounds.height - (borders[0].width + borders[2].width + paddingTop + paddingBottom) //dh\r\n                    );\r\n                break;\r\n        }\r\n\r\n        return zindex.children[stackLength - 1];\r\n    }\r\n\r\n\r\n\r\n    function parseElement (el, stack) {\r\n\r\n        // skip hidden elements and their children\r\n        if (getCSS(el, 'display') !== \"none\" && getCSS(el, 'visibility') !== \"hidden\") {\r\n\r\n            stack = renderElement(el, stack) || stack;\r\n\r\n            ctx = stack.ctx;\r\n\r\n            if ( !ignoreElementsRegExp.test( el.nodeName ) ) {\r\n                var elementChildren = _html2canvas.Util.Children( el ),\r\n                i,\r\n                node,\r\n                childrenLen;\r\n                for (i = 0, childrenLen = elementChildren.length; i < childrenLen; i+=1) {\r\n                    node = elementChildren[i];\r\n\r\n                    if ( node.nodeType === 1 ) {\r\n                        parseElement(node, stack);\r\n                    }else if ( node.nodeType === 3 ) {\r\n                        renderText(el, node, stack);\r\n                    }\r\n\r\n                }\r\n\r\n            }\r\n        } \r\n    }\r\n\r\n    stack = renderElement(element, null);\r\n\r\n    /*\r\n    SVG powered HTML rendering, non-tainted canvas available from FF 11+ onwards\r\n    */\r\n\r\n    if ( support.svgRendering ) {\r\n        (function( body ){\r\n            var img = new Image(),\r\n            size =  docSize(),\r\n            html = \"\";\r\n\r\n            function parseDOM( el ) {\r\n                var children = _html2canvas.Util.Children( el ),\r\n                len = children.length,\r\n                attr,\r\n                a,\r\n                alen,\r\n                elm,\r\n                i;\r\n                for ( i = 0; i < len; i+=1 ) {\r\n                    elm = children[ i ];\r\n                    if ( elm.nodeType === 3 ) {\r\n                        // Text node\r\n\r\n                        html += elm.nodeValue.replace(/\\</g,\"&lt;\").replace(/\\>/g,\"&gt;\");\r\n                    } else if ( elm.nodeType === 1 ) {\r\n                        // Element\r\n                        if ( !/^(script|meta|title)$/.test(elm.nodeName.toLowerCase()) ) {\r\n\r\n                            html += \"<\" + elm.nodeName.toLowerCase();\r\n\r\n                            // add attributes\r\n                            if ( elm.hasAttributes() ) {\r\n                                attr = elm.attributes;\r\n                                alen = attr.length;\r\n                                for ( a = 0; a < alen; a+=1 ) {\r\n                                    html += \" \" + attr[ a ].name + '=\"' + attr[ a ].value + '\"';\r\n                                }\r\n                            }\r\n\r\n\r\n                            html += '>';\r\n\r\n                            parseDOM( elm );\r\n\r\n\r\n                            html += \"</\" + elm.nodeName.toLowerCase() + \">\";\r\n                        }\r\n                    }\r\n\r\n                }\r\n\r\n            }\r\n\r\n            parseDOM( body );\r\n            img.src = [\r\n            \"data:image/svg+xml,\",\r\n            \"<svg xmlns='http://www.w3.org/2000/svg' version='1.1' width='\" + size.width + \"' height='\" + size.height + \"'>\",\r\n            \"<foreignObject width='\" + size.width + \"' height='\" + size.height + \"'>\",\r\n            \"<html xmlns='http://www.w3.org/1999/xhtml' style='margin:0;'>\",\r\n            html.replace(/\\#/g,\"%23\"),\r\n            \"</html>\",\r\n            \"</foreignObject>\",\r\n            \"</svg>\"\r\n            ].join(\"\");\r\n\r\n\r\n\r\n\r\n            img.onload = function() {\r\n                stack.svgRender = img;\r\n            };\r\n\r\n        })( document.documentElement );\r\n\r\n    }\r\n\r\n\r\n    // parse every child element\r\n    for (i = 0, children = element.children, childrenLen = children.length; i < childrenLen; i+=1){\r\n        parseElement(children[i], stack);\r\n    }\r\n\r\n\r\n    stack.backgroundColor = getCSS( document.documentElement, \"backgroundColor\" );\r\n\r\n    return stack;\r\n\r\n};\r\n\r\nfunction h2czContext(zindex) {\r\n    return {\r\n        zindex: zindex,\r\n        children: []\r\n    };\r\n}\r\n\r\n/*\r\n  html2canvas v0.34 <http://html2canvas.hertzen.com>\r\n  Copyright (c) 2011 Niklas von Hertzen. All rights reserved.\r\n  http://www.twitter.com/niklasvh\r\n\r\n  Released under MIT License\r\n */\r\n\r\n_html2canvas.Preload = function( options ) {\r\n\r\n    var images = {\r\n        numLoaded: 0,   // also failed are counted here\r\n        numFailed: 0,\r\n        numTotal: 0,\r\n        cleanupDone: false\r\n    },\r\n    pageOrigin,\r\n    methods,\r\n    i,\r\n    count = 0,\r\n    element = options.elements[0] || document.body,\r\n    doc = element.ownerDocument,\r\n    domImages = doc.images, // TODO probably should limit it to images present in the element only\r\n    imgLen = domImages.length,\r\n    link = doc.createElement(\"a\"),\r\n    supportCORS = (function( img ){\r\n        return (img.crossOrigin !== undefined);\r\n    })(new Image()),\r\n    timeoutTimer;\r\n\r\n    link.href = window.location.href;\r\n    pageOrigin  = link.protocol + link.host;\r\n\r\n\r\n\r\n\r\n\r\n\r\n    function isSameOrigin(url){\r\n        link.href = url;\r\n        link.href = link.href; // YES, BELIEVE IT OR NOT, that is required for IE9 - http://jsfiddle.net/niklasvh/2e48b/\r\n        var origin = link.protocol + link.host;\r\n        return (origin === pageOrigin);\r\n    }\r\n\r\n    function start(){\r\n        h2clog(\"html2canvas: start: images: \" + images.numLoaded + \" / \" + images.numTotal + \" (failed: \" + images.numFailed + \")\");\r\n        if (!images.firstRun && images.numLoaded >= images.numTotal){\r\n            h2clog(\"Finished loading images: # \" + images.numTotal + \" (failed: \" + images.numFailed + \")\");\r\n\r\n            if (typeof options.complete === \"function\"){\r\n                options.complete(images);\r\n            }\r\n\r\n        }\r\n    }\r\n\r\n    // TODO modify proxy to serve images with CORS enabled, where available\r\n    function proxyGetImage(url, img, imageObj){\r\n        var callback_name,\r\n        scriptUrl = options.proxy,\r\n        script;\r\n\r\n        link.href = url;\r\n        url = link.href; // work around for pages with base href=\"\" set - WARNING: this may change the url\r\n\r\n        callback_name = 'html2canvas_' + (count++);\r\n        imageObj.callbackname = callback_name;\r\n\r\n        if (scriptUrl.indexOf(\"?\") > -1) {\r\n            scriptUrl += \"&\";\r\n        } else {\r\n            scriptUrl += \"?\";\r\n        }\r\n        scriptUrl += 'url=' + encodeURIComponent(url) + '&callback=' + callback_name;\r\n        script = doc.createElement(\"script\");\r\n\r\n        window[callback_name] = function(a){\r\n            if (a.substring(0,6) === \"error:\"){\r\n                imageObj.succeeded = false;\r\n                images.numLoaded++;\r\n                images.numFailed++;\r\n                start();\r\n            } else {\r\n                setImageLoadHandlers(img, imageObj);\r\n                img.src = a;\r\n            }\r\n            window[callback_name] = undefined; // to work with IE<9  // NOTE: that the undefined callback property-name still exists on the window object (for IE<9)\r\n            try {\r\n                delete window[callback_name];  // for all browser that support this\r\n            } catch(ex) {}\r\n            script.parentNode.removeChild(script);\r\n            script = null;\r\n            delete imageObj.script;\r\n            delete imageObj.callbackname;\r\n        };\r\n\r\n        script.setAttribute(\"type\", \"text/javascript\");\r\n        script.setAttribute(\"src\", scriptUrl);\r\n        imageObj.script = script;\r\n        window.document.body.appendChild(script);\r\n\r\n    }\r\n\r\n    function getImages (el) {\r\n\r\n\r\n\r\n        // if (!this.ignoreRe.test(el.nodeName)){\r\n        //\r\n        \r\n        var contents = _html2canvas.Util.Children(el),\r\n        i,\r\n        background_image,\r\n        src,\r\n        img,\r\n        elNodeType = false;\r\n\r\n        // Firefox fails with permission denied on pages with iframes\r\n        try {\r\n            var contentsLen = contents.length;\r\n            for (i = 0;  i < contentsLen; i+=1 ){\r\n                // var ignRe = new RegExp(\"(\"+this.ignoreElements+\")\");\r\n                // if (!ignRe.test(element.nodeName)){\r\n                getImages(contents[i]);\r\n                // }\r\n            }\r\n        }\r\n        catch( e ) {}\r\n\r\n\r\n        // }\r\n        try {\r\n            elNodeType = el.nodeType;\r\n        } catch (ex) {\r\n            elNodeType = false;\r\n            h2clog(\"html2canvas: failed to access some element's nodeType - Exception: \" + ex.message);\r\n        }\r\n\r\n        if (elNodeType === 1 || elNodeType === undefined){\r\n\r\n            // opera throws exception on external-content.html\r\n            try {\r\n                background_image = _html2canvas.Util.getCSS(el, 'backgroundImage');\r\n            }catch(e) {\r\n                h2clog(\"html2canvas: failed to get background-image - Exception: \" + e.message);\r\n            }\r\n            if ( background_image && background_image !== \"1\" && background_image !== \"none\" ) {\r\n\r\n                // TODO add multi image background support\r\n\r\n                if (/^(-webkit|-o|-moz|-ms|linear)-/.test( background_image )) {\r\n\r\n                    img = _html2canvas.Generate.Gradient( background_image, _html2canvas.Util.Bounds( el ) );\r\n\r\n                    if ( img !== undefined ){\r\n                        images[background_image] = {\r\n                            img: img,\r\n                            succeeded: true\r\n                        };\r\n                        images.numTotal++;\r\n                        images.numLoaded++;\r\n                        start();\r\n\r\n                    }\r\n\r\n                } else {\r\n                    src = _html2canvas.Util.backgroundImage(background_image.match(/data:image\\/.*;base64,/i) ? background_image : background_image.split(\",\")[0]);\r\n                    methods.loadImage(src);\r\n                }\r\n\r\n                /*\r\n            if (background_image && background_image !== \"1\" && background_image !== \"none\" && background_image.substring(0,7) !== \"-webkit\" && background_image.substring(0,3)!== \"-o-\" && background_image.substring(0,4) !== \"-moz\"){\r\n                // TODO add multi image background support\r\n                src = _html2canvas.Util.backgroundImage(background_image.split(\",\")[0]);\r\n                methods.loadImage(src);            */\r\n            }\r\n        }\r\n    }\r\n\r\n    function setImageLoadHandlers(img, imageObj) {\r\n        img.onload = function() {\r\n            if ( imageObj.timer !== undefined ) {\r\n                // CORS succeeded\r\n                window.clearTimeout( imageObj.timer );\r\n            }\r\n\r\n            images.numLoaded++;\r\n            imageObj.succeeded = true;\r\n            img.onerror = img.onload = null;\r\n            start();\r\n        };\r\n        img.onerror = function() {\r\n\r\n            if (img.crossOrigin === \"anonymous\") {\r\n                // CORS failed\r\n                window.clearTimeout( imageObj.timer );\r\n\r\n                // let's try with proxy instead\r\n                if ( options.proxy ) {\r\n                    var src = img.src;\r\n                    img = new Image();\r\n                    imageObj.img = img;\r\n                    img.src = src;\r\n\r\n                    proxyGetImage( img.src, img, imageObj );\r\n                    return;\r\n                }\r\n            }\r\n\r\n\r\n            images.numLoaded++;\r\n            images.numFailed++;\r\n            imageObj.succeeded = false;\r\n            img.onerror = img.onload = null;\r\n            start();\r\n\r\n        };\r\n\r\n        // TODO Opera has no load/error event for SVG images\r\n\r\n        // Opera ninja onload's cached images\r\n        /*\r\n        window.setTimeout(function(){\r\n            if ( img.width !== 0 && imageObj.succeeded === undefined ) {\r\n                img.onload();\r\n            }\r\n        }, 100); // needs a reflow for base64 encoded images? interestingly timeout of 0 doesn't work but 1 does.\r\n         */\r\n    }\r\n\r\n\r\n    methods = {\r\n        loadImage: function( src ) {\r\n            var img, imageObj;\r\n            if ( src && images[src] === undefined ) {\r\n                img = new Image();\r\n                if ( src.match(/data:image\\/.*;base64,/i) ) {\r\n                    img.src = src.replace(/url\\(['\"]{0,}|['\"]{0,}\\)$/ig, '');\r\n                    imageObj = images[src] = {\r\n                        img: img\r\n                    };\r\n                    images.numTotal++;\r\n                    setImageLoadHandlers(img, imageObj);\r\n                } else if ( isSameOrigin( src ) || options.allowTaint ===  true ) {\r\n                    imageObj = images[src] = {\r\n                        img: img\r\n                    };\r\n                    images.numTotal++;\r\n                    setImageLoadHandlers(img, imageObj);\r\n                    img.src = src;\r\n                } else if ( supportCORS && !options.allowTaint && options.useCORS ) {\r\n                    // attempt to load with CORS\r\n\r\n                    img.crossOrigin = \"anonymous\";\r\n                    imageObj = images[src] = {\r\n                        img: img\r\n                    };\r\n                    images.numTotal++;\r\n                    setImageLoadHandlers(img, imageObj);\r\n                    img.src = src;\r\n\r\n                    // work around for https://bugs.webkit.org/show_bug.cgi?id=80028\r\n                    img.customComplete = function () {\r\n                        if (!this.img.complete) {\r\n                            this.timer = window.setTimeout(this.img.customComplete, 100);\r\n                        } else {\r\n                            this.img.onerror();\r\n                        }\r\n                    }.bind(imageObj);\r\n                    img.customComplete();\r\n\r\n                } else if ( options.proxy ) {\r\n                    imageObj = images[src] = {\r\n                        img: img\r\n                    };\r\n                    images.numTotal++;\r\n                    proxyGetImage( src, img, imageObj );\r\n                }\r\n            }\r\n\r\n        },\r\n        cleanupDOM: function(cause) {\r\n            var img, src;\r\n            if (!images.cleanupDone) {\r\n                if (cause && typeof cause === \"string\") {\r\n                    h2clog(\"html2canvas: Cleanup because: \" + cause);\r\n                } else {\r\n                    h2clog(\"html2canvas: Cleanup after timeout: \" + options.timeout + \" ms.\");\r\n                }\r\n\r\n                for (src in images) {\r\n                    if (images.hasOwnProperty(src)) {\r\n                        img = images[src];\r\n                        if (typeof img === \"object\" && img.callbackname && img.succeeded === undefined) {\r\n                            // cancel proxy image request\r\n                            window[img.callbackname] = undefined; // to work with IE<9  // NOTE: that the undefined callback property-name still exists on the window object (for IE<9)\r\n                            try {\r\n                                delete window[img.callbackname];  // for all browser that support this\r\n                            } catch(ex) {}\r\n                            if (img.script && img.script.parentNode) {\r\n                                img.script.setAttribute(\"src\", \"about:blank\");  // try to cancel running request\r\n                                img.script.parentNode.removeChild(img.script);\r\n                            }\r\n                            images.numLoaded++;\r\n                            images.numFailed++;\r\n                            h2clog(\"html2canvas: Cleaned up failed img: '\" + src + \"' Steps: \" + images.numLoaded + \" / \" + images.numTotal);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // cancel any pending requests\r\n                if(window.stop !== undefined) {\r\n                    window.stop();\r\n                } else if(document.execCommand !== undefined) {\r\n                    document.execCommand(\"Stop\", false);\r\n                }\r\n                if (document.close !== undefined) {\r\n                    document.close();\r\n                }\r\n                images.cleanupDone = true;\r\n                if (!(cause && typeof cause === \"string\")) {\r\n                    start();\r\n                }\r\n            }\r\n        },\r\n        renderingDone: function() {\r\n            if (timeoutTimer) {\r\n                window.clearTimeout(timeoutTimer);\r\n            }\r\n        }\r\n\r\n    };\r\n\r\n    if (options.timeout > 0) {\r\n        timeoutTimer = window.setTimeout(methods.cleanupDOM, options.timeout);\r\n    }\r\n    h2clog('html2canvas: Preload starts: finding background-images');\r\n    images.firstRun = true;\r\n\r\n    getImages( element );\r\n\r\n    h2clog('html2canvas: Preload: Finding images');\r\n    // load <img> images\r\n    for (i = 0; i < imgLen; i+=1){\r\n        methods.loadImage( domImages[i].getAttribute( \"src\" ) );\r\n    }\r\n\r\n    images.firstRun = false;\r\n    h2clog('html2canvas: Preload: Done.');\r\n    if ( images.numTotal === images.numLoaded ) {\r\n        start();\r\n    }\r\n\r\n    return methods;\r\n\r\n};\r\n\r\n\r\n\r\n\r\n/*\r\n  html2canvas v0.34 <http://html2canvas.hertzen.com>\r\n  Copyright (c) 2011 Niklas von Hertzen. All rights reserved.\r\n  http://www.twitter.com/niklasvh\r\n\r\n  Released under MIT License\r\n*/\r\nfunction h2cRenderContext(width, height) {\r\n    var storage = [];\r\n    return {\r\n        storage: storage,\r\n        width: width,\r\n        height: height,\r\n        fillRect: function () {\r\n            storage.push({\r\n                type: \"function\",\r\n                name: \"fillRect\",\r\n                'arguments': arguments\r\n            });\r\n        },\r\n        drawImage: function () {\r\n            storage.push({\r\n                type: \"function\",\r\n                name: \"drawImage\",\r\n                'arguments': arguments\r\n            });\r\n        },\r\n        fillText: function () {\r\n            storage.push({\r\n                type: \"function\",\r\n                name: \"fillText\",\r\n                'arguments': arguments\r\n            });\r\n        },\r\n        setVariable: function (variable, value) {\r\n            storage.push({\r\n                type: \"variable\",\r\n                name: variable,\r\n                'arguments': value\r\n            });\r\n        }\r\n    };\r\n}\r\n\r\n/*\r\n  html2canvas v0.34 <http://html2canvas.hertzen.com>\r\n  Copyright (c) 2011 Niklas von Hertzen. All rights reserved.\r\n  http://www.twitter.com/niklasvh\r\n\r\n  Released under MIT License\r\n*/\r\n_html2canvas.Renderer = function(parseQueue, options){\r\n\r\n\r\n    var queue = [];\r\n\r\n    function sortZ(zStack){\r\n        var subStacks = [],\r\n        stackValues = [],\r\n        zStackChildren = zStack.children,\r\n        s,\r\n        i,\r\n        stackLen,\r\n        zValue,\r\n        zLen,\r\n        stackChild,\r\n        b,\r\n        subStackLen;\r\n\r\n\r\n        for (s = 0, zLen = zStackChildren.length; s < zLen; s+=1){\r\n\r\n            stackChild = zStackChildren[s];\r\n\r\n            if (stackChild.children && stackChild.children.length > 0){\r\n                subStacks.push(stackChild);\r\n                stackValues.push(stackChild.zindex);\r\n            }else{\r\n                queue.push(stackChild);\r\n            }\r\n\r\n        }\r\n\r\n        stackValues.sort(function(a, b) {\r\n            return a - b;\r\n        });\r\n\r\n        for (i = 0, stackLen = stackValues.length; i < stackLen; i+=1){\r\n            zValue = stackValues[i];\r\n            for (b = 0, subStackLen = subStacks.length; b <= subStackLen; b+=1){\r\n\r\n                if (subStacks[b].zindex === zValue){\r\n                    stackChild = subStacks.splice(b, 1);\r\n                    sortZ(stackChild[0]);\r\n                    break;\r\n\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n\r\n    sortZ(parseQueue.zIndex);\r\n    if ( typeof options._renderer._create !== \"function\" ) {\r\n        throw new Error(\"Invalid renderer defined\");\r\n    }\r\n    return options._renderer._create( parseQueue, options, document, queue, _html2canvas );\r\n\r\n};\r\n\r\n/*\r\n  html2canvas v0.34 <http://html2canvas.hertzen.com>\r\n  Copyright (c) 2011 Niklas von Hertzen. All rights reserved.\r\n  http://www.twitter.com/niklasvh\r\n\r\n  Released under MIT License\r\n*/\r\n\r\n\r\nhtml2canvas = function( elements, opts ) {\r\n\r\n    var queue,\r\n    canvas,\r\n    options = {\r\n        // general\r\n        logging: false,\r\n        elements: elements,\r\n\r\n        // preload options\r\n        proxy: \"http://html2canvas.appspot.com/\",\r\n        timeout: 0,    // no timeout\r\n        useCORS: false, // try to load images as CORS (where available), before falling back to proxy\r\n        allowTaint: false, // whether to allow images to taint the canvas, won't need proxy if set to true\r\n\r\n        // parse options\r\n        svgRendering: false, // use svg powered rendering where available (FF11+)\r\n        iframeDefault: \"default\",\r\n        ignoreElements: \"IFRAME|OBJECT|PARAM\",\r\n        useOverflow: true,\r\n        letterRendering: false,\r\n\r\n        // render options\r\n\r\n        flashcanvas: undefined, // path to flashcanvas\r\n        width: null,\r\n        height: null,\r\n        taintTest: true, // do a taint test with all images before applying to canvas\r\n\t\trenderer: \"Canvas\"\r\n    }, renderer;\r\n\r\n    options = _html2canvas.Util.Extend(opts, options);\r\n\r\n\tif (typeof options.renderer === \"string\" && _html2canvas.Renderer[options.renderer] !== undefined) {\r\n\t\toptions._renderer = _html2canvas.Renderer[options.renderer]( options );\r\n\t} else if (typeof options.renderer === \"function\") {\r\n\t\toptions._renderer = options.renderer( options );\r\n\t} else {\r\n\t\tthrow(\"Unknown renderer\");\r\n\t}\r\n\r\n    _html2canvas.logging = options.logging;\r\n    options.complete = function( images ) {\r\n\r\n        if (typeof options.onpreloaded === \"function\") {\r\n            if ( options.onpreloaded( images ) === false ) {\r\n                return;\r\n            }\r\n        }\r\n        queue = _html2canvas.Parse( images, options );\r\n\r\n        if (typeof options.onparsed === \"function\") {\r\n            if ( options.onparsed( queue ) === false ) {\r\n                return;\r\n            }\r\n        }\r\n\r\n        canvas = _html2canvas.Renderer( queue, options );\r\n\r\n        if (typeof options.onrendered === \"function\") {\r\n            options.onrendered( canvas );\r\n        }\r\n\r\n\r\n    };\r\n\r\n    // for pages without images, we still want this to be async, i.e. return methods before executing\r\n    window.setTimeout( function(){\r\n        _html2canvas.Preload( options );\r\n    }, 0 );\r\n\r\n    return {\r\n        render: function( queue, opts ) {\r\n            return _html2canvas.Renderer( queue, _html2canvas.Util.Extend(opts, options) );\r\n        },\r\n        parse: function( images, opts ) {\r\n            return _html2canvas.Parse( images, _html2canvas.Util.Extend(opts, options) );\r\n        },\r\n        preload: function( opts ) {\r\n            return _html2canvas.Preload( _html2canvas.Util.Extend(opts, options) );\r\n        },\r\n        log: h2clog\r\n    };\r\n};\r\n\r\nhtml2canvas.log = h2clog; // for renderers\r\nhtml2canvas.Renderer = {\r\n    Canvas: undefined // We are assuming this will be used\r\n};\r\n\r\n/*\r\n  html2canvas v0.34 <http://html2canvas.hertzen.com>\r\n  Copyright (c) 2011 Niklas von Hertzen. All rights reserved.\r\n  http://www.twitter.com/niklasvh\r\n\r\n  Released under MIT License\r\n*/\r\n\r\n\r\n_html2canvas.Renderer.Canvas = function( options ) {\r\n\r\n    options = options || {};\r\n\r\n    var doc = document,\r\n    canvas = options.canvas || doc.createElement('canvas'),\r\n    usingFlashcanvas = false,\r\n    _createCalled = false,\r\n    canvasReadyToDraw = false,\r\n    methods,\r\n    flashMaxSize = 2880; // flash bitmap limited to 2880x2880px // http://stackoverflow.com/questions/2033792/argumenterror-error-2015-invalid-bitmapdata\r\n\r\n\r\n    if (canvas.getContext){\r\n        h2clog(\"html2canvas: Renderer: using canvas renderer\");\r\n        canvasReadyToDraw = true;\r\n    } else if ( options.flashcanvas !== undefined ){\r\n        usingFlashcanvas = true;\r\n        h2clog(\"html2canvas: Renderer: canvas not available, using flashcanvas\");\r\n        var script = doc.createElement(\"script\");\r\n        script.src = options.flashcanvas;\r\n\r\n        script.onload = (function(script, func){\r\n            var intervalFunc;\r\n\r\n            if (script.onload === undefined) {\r\n                // IE lack of support for script onload\r\n\r\n                if( script.onreadystatechange !== undefined ) {\r\n\r\n                    intervalFunc = function() {\r\n                        if (script.readyState !== \"loaded\" && script.readyState !== \"complete\") {\r\n                            window.setTimeout( intervalFunc, 250 );\r\n\r\n                        } else {\r\n                            // it is loaded\r\n                            func();\r\n\r\n                        }\r\n\r\n                    };\r\n\r\n                    window.setTimeout( intervalFunc, 250 );\r\n\r\n                } else {\r\n                    h2clog(\"html2canvas: Renderer: Can't track when flashcanvas is loaded\");\r\n                }\r\n\r\n            } else {\r\n                return func;\r\n            }\r\n\r\n        })(script, function(){\r\n\r\n            if (typeof window.FlashCanvas !== \"undefined\") {\r\n                h2clog(\"html2canvas: Renderer: Flashcanvas initialized\");\r\n                window.FlashCanvas.initElement( canvas );\r\n\r\n                canvasReadyToDraw = true;\r\n                if ( _createCalled !== false ) {\r\n                    methods._create.apply( null, _createCalled );\r\n                }\r\n            }\r\n        });\r\n\r\n        doc.body.appendChild( script );\r\n\r\n    }\r\n\r\n    methods = {\r\n        _create: function( zStack, options, doc, queue, _html2canvas ) {\r\n\r\n            if ( !canvasReadyToDraw ) {\r\n                _createCalled = arguments;\r\n                return canvas;\r\n            }\r\n\r\n            var ctx = canvas.getContext(\"2d\"),\r\n            storageContext,\r\n            i,\r\n            queueLen,\r\n            a,\r\n            newCanvas,\r\n            bounds,\r\n            testCanvas = document.createElement(\"canvas\"),\r\n            hasCTX = ( testCanvas.getContext !== undefined ),\r\n            storageLen,\r\n            renderItem,\r\n            testctx = ( hasCTX ) ? testCanvas.getContext(\"2d\") : {},\r\n            safeImages = [],\r\n            fstyle;\r\n\r\n            canvas.width = canvas.style.width = (!usingFlashcanvas) ? options.width || zStack.ctx.width : Math.min(flashMaxSize, (options.width || zStack.ctx.width) );\r\n            canvas.height = canvas.style.height = (!usingFlashcanvas) ? options.height || zStack.ctx.height : Math.min(flashMaxSize, (options.height || zStack.ctx.height) );\r\n\r\n            fstyle = ctx.fillStyle;\r\n            ctx.fillStyle = zStack.backgroundColor;\r\n            ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n            ctx.fillStyle = fstyle;\r\n\r\n            if ( options.svgRendering && zStack.svgRender !== undefined ) {\r\n                // TODO: enable async rendering to support this\r\n                ctx.drawImage( zStack.svgRender, 0, 0 );\r\n            } else {\r\n                for ( i = 0, queueLen = queue.length; i < queueLen; i+=1 ) {\r\n\r\n                    storageContext = queue.splice(0, 1)[0];\r\n                    storageContext.canvasPosition = storageContext.canvasPosition || {};\r\n\r\n                    //this.canvasRenderContext(storageContext,parentctx);\r\n\r\n                    // set common settings for canvas\r\n                    ctx.textBaseline = \"bottom\";\r\n\r\n                    if (storageContext.clip){\r\n                        ctx.save();\r\n                        ctx.beginPath();\r\n                        // console.log(storageContext);\r\n                        ctx.rect(storageContext.clip.left, storageContext.clip.top, storageContext.clip.width, storageContext.clip.height);\r\n                        ctx.clip();\r\n\r\n                    }\r\n\r\n                    if (storageContext.ctx.storage){\r\n\r\n                        for (a = 0, storageLen = storageContext.ctx.storage.length; a < storageLen; a+=1){\r\n\r\n                            renderItem = storageContext.ctx.storage[a];\r\n\r\n\r\n                            switch(renderItem.type){\r\n                                case \"variable\":\r\n                                    ctx[renderItem.name] = renderItem['arguments'];\r\n                                    break;\r\n                                case \"function\":\r\n                                    if (renderItem.name === \"fillRect\") {\r\n\r\n                                        if (!usingFlashcanvas || renderItem['arguments'][0] + renderItem['arguments'][2] < flashMaxSize  && renderItem['arguments'][1] + renderItem['arguments'][3] < flashMaxSize) {\r\n                                            ctx.fillRect.apply( ctx, renderItem['arguments'] );\r\n                                        }\r\n                                    }else if(renderItem.name === \"fillText\") {\r\n                                        if (!usingFlashcanvas || renderItem['arguments'][1] < flashMaxSize  && renderItem['arguments'][2] < flashMaxSize) {\r\n                                            ctx.fillText.apply( ctx, renderItem['arguments'] );\r\n                                        }\r\n                                    }else if(renderItem.name === \"drawImage\") {\r\n\r\n                                        if (renderItem['arguments'][8] > 0 && renderItem['arguments'][7]){\r\n                                            if ( hasCTX && options.taintTest ) {\r\n                                                if ( safeImages.indexOf( renderItem['arguments'][ 0 ].src ) === -1 ) {\r\n                                                    testctx.drawImage( renderItem['arguments'][ 0 ], 0, 0 );\r\n                                                    try {\r\n                                                        testctx.getImageData( 0, 0, 1, 1 );\r\n                                                    } catch(e) {\r\n                                                        testCanvas = doc.createElement(\"canvas\");\r\n                                                        testctx = testCanvas.getContext(\"2d\");\r\n                                                        continue;\r\n                                                    }\r\n\r\n                                                    safeImages.push( renderItem['arguments'][ 0 ].src );\r\n\r\n                                                }\r\n                                            }\r\n                                            ctx.drawImage.apply( ctx, renderItem['arguments'] );\r\n                                        }\r\n                                    }\r\n\r\n\r\n                                    break;\r\n                                default:\r\n\r\n                            }\r\n\r\n                        }\r\n\r\n                    }\r\n                    if (storageContext.clip){\r\n                        ctx.restore();\r\n                    }\r\n\r\n                }\r\n            }\r\n\r\n            h2clog(\"html2canvas: Renderer: Canvas renderer done - returning canvas obj\");\r\n\r\n            queueLen = options.elements.length;\r\n\r\n            if (queueLen === 1) {\r\n                if (typeof options.elements[ 0 ] === \"object\" && options.elements[ 0 ].nodeName !== \"BODY\" && usingFlashcanvas === false) {\r\n                    // crop image to the bounds of selected (single) element\r\n                    bounds = _html2canvas.Util.Bounds( options.elements[ 0 ] );\r\n                    newCanvas = doc.createElement('canvas');\r\n                    newCanvas.width = bounds.width;\r\n                    newCanvas.height = bounds.height;\r\n                    ctx = newCanvas.getContext(\"2d\");\r\n\r\n                    ctx.drawImage( canvas, bounds.left, bounds.top, bounds.width, bounds.height, 0, 0, bounds.width, bounds.height );\r\n                    canvas = null;\r\n                    return newCanvas;\r\n                }\r\n            } /*else {\r\n        // TODO clip and resize multiple elements\r\n\r\n            for ( i = 0; i < queueLen; i+=1 ) {\r\n                if (options.elements[ i ] instanceof Element) {\r\n\r\n                }\r\n\r\n            }\r\n        }\r\n        */\r\n\r\n\r\n\r\n            return canvas;\r\n        }\r\n    };\r\n\r\n    return methods;\r\n\r\n};\r\n\r\nwindow.html2canvas = html2canvas;\r\n}(window, document));\r\n\r\n\n\n//# sourceURL=webpack:///./src/html2canvas.js?");

/***/ }),

/***/ "./src/index.ts":
/*!**********************!*\
  !*** ./src/index.ts ***!
  \**********************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _page__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./page */ \"./src/page.ts\");\n\nnew _page__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n\n\n//# sourceURL=webpack:///./src/index.ts?");

/***/ }),

/***/ "./src/page.ts":
/*!*********************!*\
  !*** ./src/page.ts ***!
  \*********************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Page; });\n/* harmony import */ var _typo_output_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../typo/output.js */ \"./typo/output.js\");\n/* harmony import */ var _glitch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./glitch */ \"./src/glitch.ts\");\n/* harmony import */ var _quests__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./quests */ \"./src/quests/index.ts\");\n\n\n\nclass Page {\n    constructor() {\n        this.vars = {};\n        this.debug = false;\n        this.container = document.querySelector('.content');\n        if (this.container) {\n            this.container.addEventListener('click', ev => this.handleClick(ev.target));\n        }\n        this.load('home_start');\n        if (this.debug) {\n            this.initDebug();\n        }\n    }\n    initDebug() {\n        const keys = Object.keys(_typo_output_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\n        const debugContainer = document.createElement('div');\n        debugContainer.classList.add('debug');\n        document.body.appendChild(debugContainer);\n        const selector = document.createElement('select');\n        selector.id = 'debug_page';\n        selector.innerHTML = keys.map(opt => {\n            return `<option value=\"${opt}\">${opt}</option>`;\n        }).join('');\n        debugContainer.appendChild(selector);\n        selector.addEventListener('change', () => {\n            const index = selector.selectedIndex;\n            this.load(keys[index]);\n        });\n        const updateBtn = document.createElement('button');\n        updateBtn.innerHTML = 'update';\n        updateBtn.addEventListener('click', () => {\n            const index = selector.selectedIndex;\n            this.load(keys[index]);\n        });\n        debugContainer.appendChild(updateBtn);\n    }\n    load(name) {\n        const text = _typo_output_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"][name];\n        if (text.quest) {\n            this.showQuest(text.quest.name, text.quest.exit);\n        }\n        else {\n            const output = text.text\n                .filter(item => (item.conditions || []).every(_ => !!this.vars[_.prop] === !!_.value))\n                .map(item => this.processLinks(item.value))\n                .join('');\n            this.setText(output);\n        }\n        Object(_glitch__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(text.bg ? `back/${text.bg}.webp` : '');\n        if (text.actions) {\n            text.actions.forEach(action => {\n                this.vars[action.prop] = action.value;\n            });\n        }\n    }\n    setText(text) {\n        if (this.container) {\n            this.container.innerHTML = '<div>' + text + '</div>';\n            const sides = document.querySelector('.sides');\n            if (sides) {\n                sides.addEventListener('mousemove', ev => {\n                    const p = 100 - (((ev.layerX + 1) / 600 * 100) | 0) + '%';\n                    sides.style.setProperty('--position', p);\n                });\n            }\n        }\n    }\n    processLinks(text) {\n        return text\n            .replace(/\\n/g, '<br>')\n            .replace(/\\[a (.*?)\\](.*?)\\[\\/a\\]/gm, '<span dest=\"$1\">$2</span>')\n            .replace(/\\[g\\](.*?)\\[\\/g\\]/gm, '<span name>$1</span>')\n            .replace(/\\[r\\](.*?)\\[\\/r\\]/gm, '<span reply>$1</span>');\n    }\n    handleClick(target) {\n        const dest = target.getAttribute('dest');\n        if (dest) {\n            this.load(dest);\n            if (this.debug) {\n                const select = document.getElementById('debug_page');\n                select.selectedIndex = Object.keys(_typo_output_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]).indexOf(dest);\n            }\n        }\n    }\n    showQuest(questName, next) {\n        if (!this.container)\n            return;\n        this.container.innerHTML = '';\n        const Quest = _quests__WEBPACK_IMPORTED_MODULE_2__[\"default\"][questName];\n        if (Quest) {\n            const quest = new Quest();\n            quest.init(this.vars);\n            _quests__WEBPACK_IMPORTED_MODULE_2__[\"default\"].run(quest, this.container, () => this.load(next));\n        }\n    }\n}\n\n\n//# sourceURL=webpack:///./src/page.ts?");

/***/ }),

/***/ "./src/quests/find-arc.ts":
/*!********************************!*\
  !*** ./src/quests/find-arc.ts ***!
  \********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return FindArc; });\n/* harmony import */ var _quest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./quest */ \"./src/quests/quest.ts\");\n\nconst ORIGINAL_IMAGE_WIDTH = 651;\nconst ORIGINAL_IMAGE_HEIGHT = 397;\nconst DEST_IMAGE_WIDTH = 600;\nconst DEST_IMAGE_HEIGHT = ORIGINAL_IMAGE_HEIGHT * ORIGINAL_IMAGE_WIDTH / DEST_IMAGE_WIDTH;\nconst positions = [\n    [1, 4],\n    [3, 2],\n    [5, 1],\n    [2, 0],\n];\nvar STATES;\n(function (STATES) {\n    STATES[STATES[\"READY\"] = 0] = \"READY\";\n    STATES[STATES[\"SCAN\"] = 1] = \"SCAN\";\n    STATES[STATES[\"NEXT\"] = 2] = \"NEXT\";\n    STATES[STATES[\"NOT_FOUND\"] = 3] = \"NOT_FOUND\";\n})(STATES || (STATES = {}));\nclass FindArc extends _quest__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n    constructor() {\n        super(...arguments);\n        this.step = 0;\n        this.state = STATES.READY;\n        this.img = null;\n        this.val = 0;\n        this.dist = 0;\n        this.selected = [0, 0];\n        this.timeout = 0;\n        this.ready = false;\n    }\n    init() {\n        this.img = new Image();\n        this.img.src = 'img/find-arc.png';\n    }\n    draw(ctx) {\n        if (!this.img)\n            return;\n        ctx.drawImage(this.img, this.step * ORIGINAL_IMAGE_WIDTH, 0, ORIGINAL_IMAGE_WIDTH, ORIGINAL_IMAGE_HEIGHT, 0, 0, DEST_IMAGE_WIDTH, DEST_IMAGE_HEIGHT);\n        ctx.fillStyle = 'rgba(255, 255, 0, .5)';\n        ctx.fillRect(this.selected[0] * 100 + 1, this.selected[1] * 85 + 1, 100, 85);\n        ctx.fillStyle = '#fff';\n        if (this.state === STATES.READY) {\n            ctx.font = '24px sans-serif';\n            ctx.textAlign = 'center';\n            ctx.fillText('Выберите сектор для сканирования', 300, 500);\n        }\n        if (this.state === STATES.SCAN) {\n            ctx.font = '16px sans-serif';\n            ctx.textAlign = 'left';\n            ctx.fillText('Идет поиск \"Ковчега\"...', 100, 490);\n            this.drawBar(ctx);\n        }\n        if (this.state === STATES.NOT_FOUND) {\n            ctx.font = '16px sans-serif';\n            ctx.textAlign = 'left';\n            ctx.fillText('\"Ковчега\" в данном секторе нет', 100, 490);\n            this.drawBar(ctx);\n        }\n        if (this.state === STATES.NEXT) {\n            ctx.font = '16px sans-serif';\n            ctx.textAlign = 'left';\n            ctx.fillText('\"Ковчег\" находится в пределах этого сектора', 100, 490);\n            this.drawBar(ctx);\n        }\n    }\n    drawBar(ctx) {\n        ctx.fillStyle = 'hsl(' + (this.val * 120) + ', 100%, 50%)';\n        ctx.strokeStyle = ctx.fillStyle;\n        ctx.fillRect(100, 500, Math.min(this.val, 1) * 400, 30);\n        ctx.beginPath();\n        ctx.moveTo(100 - 1, 500 + 7);\n        ctx.lineTo(100 - 1, 500 - 1);\n        ctx.lineTo(100 - 1 + 7, 500 - 1);\n        ctx.moveTo(100 - 1, 500 + 23);\n        ctx.lineTo(100 - 1, 500 + 30 + 1);\n        ctx.lineTo(100 - 1 + 7, 500 + 30 + 1);\n        ctx.moveTo(100 + 1 + 400, 500 + 7);\n        ctx.lineTo(100 + 1 + 400, 500 - 1);\n        ctx.lineTo(100 + 1 + 400 - 7, 500 - 1);\n        ctx.moveTo(100 + 1 + 400, 500 + 23);\n        ctx.lineTo(100 + 1 + 400, 500 + 30 + 1);\n        ctx.lineTo(100 + 1 + 400 - 7, 500 + 30 + 1);\n        ctx.stroke();\n    }\n    update(dt) {\n        if (this.state === STATES.SCAN) {\n            this.val += dt / 2000;\n            if (this.val >= 1) {\n                this.state = STATES.NEXT;\n                this.timeout = 1000;\n            }\n            else if (this.val >= this.dist) {\n                this.state = STATES.NOT_FOUND;\n                this.timeout = 1000;\n            }\n        }\n        if (this.state === STATES.NOT_FOUND) {\n            this.timeout -= dt;\n            if (this.timeout <= 0) {\n                this.state = STATES.READY;\n            }\n        }\n        if (this.state === STATES.NEXT) {\n            this.timeout -= dt;\n            if (this.timeout <= 0) {\n                this.state = STATES.READY;\n                if (this.step === positions.length - 1) {\n                    this.ready = true;\n                }\n                else {\n                    this.step++;\n                }\n            }\n        }\n    }\n    click(x, y) {\n        this.state = STATES.SCAN;\n        this.selected = [\n            x / 100 | 0,\n            Math.min(y / 85 | 0, 4)\n        ];\n        const position = positions[this.step];\n        this.dist = 1 - Math.hypot(this.selected[0] - position[0], this.selected[1] - position[1]) / 6;\n        this.val = 0;\n    }\n    getCursor(x, y) {\n        if (this.state === STATES.READY) {\n            this.selected = [\n                x / 100 | 0,\n                Math.min(y / 85 | 0, 4)\n            ];\n        }\n        return 'default';\n    }\n    get result() {\n        return this.ready;\n    }\n}\n\n\n//# sourceURL=webpack:///./src/quests/find-arc.ts?");

/***/ }),

/***/ "./src/quests/index.ts":
/*!*****************************!*\
  !*** ./src/quests/index.ts ***!
  \*****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _start_energy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./start-energy */ \"./src/quests/start-energy.ts\");\n/* harmony import */ var _tune_signal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tune-signal */ \"./src/quests/tune-signal.ts\");\n/* harmony import */ var _find_arc__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./find-arc */ \"./src/quests/find-arc.ts\");\n/* harmony import */ var _tune_antenna__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tune-antenna */ \"./src/quests/tune-antenna.ts\");\n/* harmony import */ var _tune_waves__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tune-waves */ \"./src/quests/tune-waves.ts\");\n\n\n\n\n\nfunction run(quest, container, cb) {\n    const canvas = document.createElement('canvas');\n    canvas.width = 600;\n    canvas.height = 600;\n    container.appendChild(canvas);\n    const ctx = canvas.getContext('2d');\n    canvas.addEventListener('click', (ev) => {\n        quest.click(ev.offsetX, ev.offsetY);\n    });\n    canvas.addEventListener('mousemove', (ev) => {\n        canvas.style.cursor = quest.getCursor(ev.offsetX, ev.offsetY);\n    });\n    if (ctx) {\n        let prev = 0;\n        const loop = (dt) => {\n            ctx.fillStyle = '#000';\n            ctx.fillRect(0, 0, 800, 800);\n            quest.update(dt - prev);\n            quest.updateInternal(dt - prev);\n            prev = dt;\n            quest.draw(ctx);\n            quest.drawInternal(ctx);\n            if (quest.result) {\n                cb();\n            }\n            else {\n                requestAnimationFrame(loop);\n            }\n        };\n        loop(0);\n    }\n}\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n    'start-energy': _start_energy__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n    'tune-signal': _tune_signal__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n    'find-arc': _find_arc__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n    'tune-antenna': _tune_antenna__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n    'tune-waves': _tune_waves__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n    run\n});\n\n\n//# sourceURL=webpack:///./src/quests/index.ts?");

/***/ }),

/***/ "./src/quests/quest.ts":
/*!*****************************!*\
  !*** ./src/quests/quest.ts ***!
  \*****************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return Quest; });\nclass Quest {\n    constructor() {\n        this.message = '';\n        this.messageTimeout = 0;\n    }\n    init(vars) {\n    }\n    draw(ctx) {\n    }\n    update(dt) {\n    }\n    click(x, y) {\n    }\n    get result() {\n        return false;\n    }\n    getCursor(x, y) {\n        return 'default';\n    }\n    showMessage(message, timeout = 5) {\n        this.message = message;\n        this.messageTimeout = timeout;\n    }\n    updateInternal(dt) {\n        if (this.messageTimeout > 0) {\n            this.messageTimeout -= dt / 500;\n        }\n    }\n    drawInternal(ctx) {\n        if (this.messageTimeout > 0) {\n            ctx.fillStyle = 'rgba(75, 75, 75, 0.5)';\n            ctx.fillRect(0, 250, 600, 60);\n            ctx.font = '56px sans-serif';\n            ctx.textAlign = 'center';\n            ctx.fillStyle = '#a16356';\n            ctx.fillText(this.message, 300, 300);\n        }\n    }\n    get actions() {\n        return [];\n    }\n}\n\n\n//# sourceURL=webpack:///./src/quests/quest.ts?");

/***/ }),

/***/ "./src/quests/start-energy.ts":
/*!************************************!*\
  !*** ./src/quests/start-energy.ts ***!
  \************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return StartEnergy; });\n/* harmony import */ var _quest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./quest */ \"./src/quests/quest.ts\");\n\nvar STATES;\n(function (STATES) {\n    STATES[STATES[\"READY\"] = 0] = \"READY\";\n    STATES[STATES[\"RESET\"] = 1] = \"RESET\";\n    STATES[STATES[\"DONE\"] = 2] = \"DONE\";\n})(STATES || (STATES = {}));\nconst LOW_VALUE = 0.65;\nconst HIGH_VALUE = 0.89;\nclass StartEnergy extends _quest__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n    constructor() {\n        super(...arguments);\n        this.state = STATES.READY;\n        this.val1 = 0;\n        this.val2 = 0;\n        this.btn1Pressed = false;\n        this.btn2Pressed = false;\n        this.btn3Pressed = false;\n        this.ready = false;\n        this.readyTimeout = 2000;\n    }\n    draw(ctx) {\n        ctx.font = 'bold 24px sans-serif';\n        ctx.fillStyle = '#fff';\n        ctx.textAlign = 'left';\n        ctx.fillText('S1', 50, 95);\n        this.drawBar(ctx, 100, this.val1);\n        ctx.fillStyle = '#fff';\n        ctx.fillText('S2', 50, 295);\n        this.drawBar(ctx, 300, this.val2);\n        this.drawBtn(ctx, 100, 500, this.btn1Pressed);\n        this.drawBtn(ctx, 320, 500, this.btn2Pressed);\n        this.drawBtn(ctx, 540, 500, this.btn3Pressed);\n    }\n    drawBar(ctx, offset, val) {\n        const offset_x = -20;\n        ctx.fillStyle = '#291214';\n        ctx.fillRect(530 + offset_x, offset, 60, 100);\n        ctx.fillStyle = '#0d2810';\n        ctx.fillRect(400 + offset_x, offset, 130, 100);\n        ctx.fillStyle = '#25250d';\n        ctx.fillRect(50 + offset_x, offset, 350, 100);\n        ctx.fillStyle =\n            val < LOW_VALUE ? '#dfdd33' :\n                val < HIGH_VALUE ? '#44de30' :\n                    '#df3033';\n        const w = 10 + Math.min(1, val) * 530;\n        ctx.fillRect(50 + offset_x, offset, w, 100);\n        ctx.strokeStyle = 'silver';\n        ctx.moveTo(570 + offset_x, offset);\n        ctx.lineTo(570 + offset_x + 20, offset);\n        ctx.lineTo(570 + offset_x + 20, offset + 20);\n        ctx.stroke();\n        ctx.moveTo(570 + offset_x + 20, offset + 80);\n        ctx.lineTo(570 + offset_x + 20, offset + 100);\n        ctx.lineTo(570 + offset_x, offset + 100);\n        ctx.stroke();\n    }\n    drawBtn(ctx, offset_x, offset_y, on = false) {\n        ctx.fillStyle = '#21282a';\n        ctx.fillRect(offset_x, offset_y, 30, 30);\n        ctx.fillStyle = on ? '#45de36' : '#de3636';\n        ctx.fillRect(offset_x + 7, offset_y + 7, 16, 16);\n        ctx.fillStyle = '#21282a';\n        ctx.beginPath();\n        ctx.arc(offset_x + 15, offset_y + 80, 20, 0, 2 * Math.PI);\n        ctx.fill();\n        ctx.fillStyle = 'yellow';\n        ctx.beginPath();\n        ctx.arc(offset_x + 15, offset_y + 80, 7, 0, 2 * Math.PI);\n        ctx.fill();\n    }\n    reset() {\n        this.state = STATES.RESET;\n        this.btn1Pressed = false;\n        this.btn2Pressed = false;\n        this.btn3Pressed = false;\n        this.showMessage('Перегрузка');\n    }\n    update(dt) {\n        if (this.btn1Pressed && !this.btn2Pressed) {\n            this.val1 += dt / 2000;\n            if (this.val1 > 1) {\n                this.reset();\n            }\n        }\n        if (this.btn2Pressed && !this.btn3Pressed) {\n            this.val2 += dt / 2000;\n            if (this.val2 > 1) {\n                this.reset();\n            }\n        }\n        if (this.btn3Pressed) {\n            if (this.val1 > LOW_VALUE && this.val1 < HIGH_VALUE && this.val2 > LOW_VALUE && this.val2 < HIGH_VALUE) {\n                this.state = STATES.DONE;\n                this.showMessage('Запущено');\n            }\n            else {\n                this.reset();\n            }\n        }\n        if (this.state === STATES.RESET) {\n            this.val1 = Math.max(0, this.val1 - dt / 1000);\n            this.val2 = Math.max(0, this.val2 - dt / 1000);\n            if (this.val1 === 0 && this.val2 === 0) {\n                this.state = STATES.READY;\n            }\n        }\n        if (this.state === STATES.DONE) {\n            this.readyTimeout -= dt;\n            this.ready = this.readyTimeout < 0;\n        }\n    }\n    click(x, y) {\n        if (this.state !== STATES.READY) {\n            return;\n        }\n        const offset_y = 500;\n        if (x > 100 && x < 100 + 30 && y > offset_y + 65 && y < offset_y + 95) {\n            this.btn1Pressed = true;\n            return;\n        }\n        if (x > 320 && x < 320 + 30 && y > offset_y + 65 && y < offset_y + 95) {\n            if (!this.btn1Pressed) {\n                this.reset();\n                return;\n            }\n            this.btn2Pressed = true;\n            return;\n        }\n        if (x > 540 && x < 540 + 30 && y > offset_y + 65 && y < offset_y + 95) {\n            if (!this.btn2Pressed) {\n                this.reset();\n                return;\n            }\n            this.btn3Pressed = true;\n            return;\n        }\n    }\n    getCursor(x, y) {\n        const offset_y = 500;\n        return [100, 320, 540].some(offset_x => {\n            return x > offset_x\n                && x < offset_x + 30\n                && y > offset_y + 65\n                && y < offset_y + 95;\n        }) ? 'pointer' : 'default';\n    }\n    get result() {\n        return this.ready;\n    }\n}\n\n\n//# sourceURL=webpack:///./src/quests/start-energy.ts?");

/***/ }),

/***/ "./src/quests/tune-antenna.ts":
/*!************************************!*\
  !*** ./src/quests/tune-antenna.ts ***!
  \************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return TuneAntenna; });\n/* harmony import */ var _quest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./quest */ \"./src/quests/quest.ts\");\n\nconst inBound = (...args) => {\n    const [x, y, x0, y0, w, h] = args;\n    return x > x0\n        && x < x0 + w\n        && y > y0\n        && y < y0 + h;\n};\nconst channels = [\n    [400, 370, 40, 40],\n    [450, 370, 40, 40],\n    [500, 370, 40, 40],\n    [550, 370, 40, 40],\n    [400, 420, 40, 40],\n    [450, 420, 40, 40],\n    [500, 420, 40, 40],\n    [550, 420, 40, 40],\n];\nconst buttons = [\n    [60, 400, 130, 50],\n    [220, 400, 130, 50]\n];\nconst exitButton = [500, 20, 100, 40];\nclass TuneAntenna extends _quest__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n    constructor() {\n        super(...arguments);\n        this.ang = 0;\n        this.angDest = 0;\n        this.selectedChannel = 0;\n        this.statusTexts = [\n            'Сигнала нет',\n            \"Связь\\nустановлена\\n049\",\n            \"Связь\\nустановлена\\n840\",\n            \"Связь\\nустановлена\\n216\",\n        ];\n        this.status = 0;\n        this.scanTimeout = 0;\n        this.ready = false;\n    }\n    init(vars) {\n        if (vars.tune_antena_settings) {\n            this.ang = vars.tune_antena_settings.ang;\n            this.angDest = vars.tune_antena_settings.ang;\n            this.selectedChannel = vars.tune_antena_settings.selectedChannel;\n        }\n        this.vars = vars;\n    }\n    draw(ctx) {\n        ctx.lineWidth = 3;\n        ctx.strokeStyle = '#aaa';\n        ctx.beginPath();\n        ctx.arc(200, 200, 150, 0, 2 * Math.PI);\n        ctx.stroke();\n        ctx.strokeStyle = '#555';\n        ctx.beginPath();\n        ctx.arc(200, 200, 100, 0, 2 * Math.PI);\n        ctx.stroke();\n        ctx.beginPath();\n        ctx.arc(200, 200, 30, 0, 2 * Math.PI);\n        ctx.stroke();\n        ctx.beginPath();\n        ctx.strokeStyle = 'yellow';\n        ctx.lineWidth = this.ang === 300 ? 3 : 1;\n        ctx.moveTo(200, 200);\n        ctx.lineTo(200 + 0.34202014332 * 150, 200 - 0.93969262078 * 150);\n        ctx.stroke();\n        ctx.beginPath();\n        ctx.strokeStyle = 'blue';\n        ctx.lineWidth = this.ang === 180 ? 3 : 1;\n        ctx.moveTo(200, 200);\n        ctx.lineTo(200 + -0.98480775301 * 150, 200 - 0.17364817766 * 150);\n        ctx.stroke();\n        ctx.beginPath();\n        ctx.strokeStyle = 'red';\n        ctx.lineWidth = this.ang === 90 ? 3 : 1;\n        ctx.moveTo(200, 200);\n        ctx.lineTo(200 - 0.17364817766 * 150, 200 + 0.98480775301 * 150);\n        ctx.stroke();\n        ctx.fillStyle = 'rgba(255,255,255, .2)';\n        ctx.beginPath();\n        ctx.moveTo(200, 200);\n        ctx.arc(200, 200, 150, (this.ang - 15) * Math.PI / 180, (this.ang + 15) * Math.PI / 180);\n        ctx.closePath();\n        ctx.fill();\n        ctx.fillStyle = '#6ab3b4';\n        buttons.forEach(([x, y, w, h]) => {\n            ctx.fillRect(x, y, w, h);\n        });\n        channels.forEach(([x, y, w, h]) => {\n            ctx.fillRect(x, y, w, h);\n        });\n        ctx.fillRect(...exitButton);\n        const ch = channels[this.selectedChannel];\n        ctx.fillStyle = 'red';\n        ctx.fillRect(...ch);\n        ctx.fillStyle = '#fff';\n        ctx.textAlign = 'center';\n        ctx.font = '20px sans-serif';\n        channels.forEach((item, i) => {\n            ctx.fillText(`${i + 1}`, item[0] + 20, item[1] + 28);\n        });\n        ctx.fillText('Выйти', exitButton[0] + exitButton[2] / 2, exitButton[1] + exitButton[3] * (2 / 3));\n        ctx.textAlign = 'left';\n        ctx.font = '24px sans-serif';\n        if (this.ang !== this.angDest) {\n            ctx.fillText('...', 400, 200);\n        }\n        else {\n            if (this.scanTimeout > 0) {\n                ctx.fillText('Сканирование...', 400, 200);\n            }\n            else {\n                const texts = this.statusTexts[this.status].split('\\n');\n                texts.forEach((text, i) => ctx.fillText(text, 400, 200 + i * 30));\n            }\n        }\n        ctx.font = '20px sans-serif';\n        ctx.fillText('Канал', 400, 350);\n        const offset = 15;\n        ctx.strokeStyle = '#fff';\n        ctx.lineWidth = 3;\n        ctx.beginPath();\n        ctx.moveTo(buttons[0][0] + buttons[0][2] - offset * 2, buttons[0][1] + buttons[0][3] / 2);\n        ctx.lineTo(buttons[0][0] + offset * 2, buttons[0][1] + buttons[0][3] / 2);\n        ctx.moveTo(buttons[0][0] + 40, buttons[0][1] + offset);\n        ctx.lineTo(buttons[0][0] + offset * 2, buttons[0][1] + buttons[0][3] / 2);\n        ctx.lineTo(buttons[0][0] + 40, buttons[0][1] + buttons[0][3] - offset);\n        ctx.moveTo(buttons[1][0] + buttons[1][2] - offset * 2, buttons[1][1] + buttons[1][3] / 2);\n        ctx.lineTo(buttons[1][0] + offset * 2, buttons[1][1] + buttons[1][3] / 2);\n        ctx.moveTo(buttons[1][0] + buttons[1][2] - 40, buttons[1][1] + offset);\n        ctx.lineTo(buttons[1][0] + buttons[1][2] - offset * 2, buttons[1][1] + buttons[1][3] / 2);\n        ctx.lineTo(buttons[1][0] + buttons[1][2] - 40, buttons[1][1] + buttons[1][3] - offset);\n        ctx.stroke();\n    }\n    update(dt) {\n        if (this.ang !== this.angDest) {\n            let sign = Math.sign(this.angDest - this.ang);\n            if (Math.abs(this.angDest - this.ang) > 180) {\n                sign = -sign;\n            }\n            this.ang = (this.ang + sign + 360) % 360;\n        }\n        else {\n            if (this.scanTimeout <= 0) {\n                if (this.ang === 300 && this.selectedChannel === 4)\n                    this.status = 1;\n                else if (this.ang === 180 && this.selectedChannel === 1)\n                    this.status = 2;\n                else if (this.ang === 90 && this.selectedChannel === 7)\n                    this.status = 3;\n                else\n                    this.status = 0;\n                this.vars.has_con_049 = this.status === 1;\n                this.vars.has_con_840 = this.status === 2;\n                this.vars.has_con_216 = this.status === 3;\n            }\n            else {\n                this.scanTimeout -= dt;\n            }\n        }\n    }\n    click(x, y) {\n        if (inBound(x, y, 60, 400, 130, 50)) {\n            this.angDest = (this.angDest - 30 + 360) % 360;\n            this.scanTimeout = 500;\n            return;\n        }\n        if (inBound(x, y, 220, 400, 130, 50)) {\n            this.angDest = (this.angDest + 30) % 360;\n            this.scanTimeout = 500;\n            return;\n        }\n        const n = channels.findIndex(ch => inBound(x, y, ...ch));\n        if (n > -1) {\n            this.selectedChannel = n;\n            this.scanTimeout = 500;\n            return;\n        }\n        if (inBound(x, y, ...exitButton)) {\n            this.vars.tune_antena_settings = {\n                ang: this.ang,\n                selectedChannel: this.selectedChannel\n            };\n            this.ready = true;\n            return;\n        }\n    }\n    getCursor(x, y) {\n        if (buttons.some(bound => inBound(x, y, ...bound))) {\n            return 'pointer';\n        }\n        if (channels.some(channel => inBound(x, y, ...channel))) {\n            return 'pointer';\n        }\n        if (inBound(x, y, ...exitButton)) {\n            return 'pointer';\n        }\n        return 'default';\n    }\n    get result() {\n        return this.ready;\n    }\n}\n\n\n//# sourceURL=webpack:///./src/quests/tune-antenna.ts?");

/***/ }),

/***/ "./src/quests/tune-signal.ts":
/*!***********************************!*\
  !*** ./src/quests/tune-signal.ts ***!
  \***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return TuneSignal; });\n/* harmony import */ var _quest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./quest */ \"./src/quests/quest.ts\");\n\nclass TuneSignal extends _quest__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n    constructor() {\n        super(...arguments);\n        this.img = null;\n        this.target = [\n            Math.random() * 400 + 100,\n            Math.random() * 400 + 100\n        ];\n        this.pos = [350, 350];\n        this.distToTarget = 0.5;\n        this.found = false;\n        this.timeToCheck = 200;\n        this.zoom = 0;\n    }\n    init() {\n        this.img = new Image();\n        this.img.src = 'img/omicron.png';\n        this.glitches = new Array(10).fill(true).map(() => this.getGlich());\n    }\n    draw(ctx) {\n        if (!this.img)\n            return;\n        if (!this.found) {\n            ctx.globalAlpha = Math.max(0.1, 1 - (this.distToTarget * 2));\n            for (let i = 0; i < 10; i++) {\n                ctx.drawImage(this.img, 0, i * 31, 310, 31, 50 + this.glitches[i].position, 50 + i * 50, 500, 50);\n            }\n            ctx.globalAlpha = 1;\n            ctx.strokeStyle = 'yellow';\n            ctx.beginPath();\n            ctx.moveTo(this.pos[0], 0);\n            ctx.lineTo(this.pos[0], 600);\n            ctx.moveTo(0, this.pos[1]);\n            ctx.lineTo(600, this.pos[1]);\n            ctx.stroke();\n        }\n        else {\n            ctx.globalAlpha = Math.max(0, 1 - this.zoom);\n            const offset = 150 * this.zoom;\n            ctx.drawImage(this.img, 50 - offset, 50 - offset, 500 + offset * 2, 500 + offset * 2);\n            ctx.globalAlpha = 1;\n        }\n    }\n    update(dt) {\n        if (!this.found) {\n            this.glitches.forEach((_, i, arr) => {\n                _.position += _.direction * _.speed * Math.min(dt, 20);\n                if (_.back) {\n                    if (_.position * _.direction > 0) {\n                        arr[i] = this.getGlich();\n                    }\n                }\n                else {\n                    if ((_.position - _.dest) * _.direction > 0) {\n                        _.back = true;\n                        _.direction = -_.direction;\n                    }\n                }\n            });\n            this.timeToCheck -= dt;\n            this.found = this.timeToCheck < 0 && this.distToTarget < 0.01;\n            if (this.found) {\n                this.showMessage('Подключено');\n            }\n        }\n        else {\n            this.zoom += dt / 1000;\n        }\n    }\n    getGlich() {\n        const dist = 20 * this.distToTarget;\n        const dest = Math.random() * dist * 2 - dist;\n        return {\n            dest,\n            direction: dest > 0 ? 1 : -1,\n            position: 0,\n            back: false,\n            speed: this.distToTarget * (Math.random() * 7 + 2)\n        };\n    }\n    getCursor(x, y) {\n        this.distToTarget = Math.hypot(x - this.target[0], y - this.target[1]) / 1000;\n        this.pos = [x, y];\n        this.timeToCheck = 200;\n        return 'default';\n    }\n    get result() {\n        return this.found && this.zoom > 2;\n    }\n}\n\n\n//# sourceURL=webpack:///./src/quests/tune-signal.ts?");

/***/ }),

/***/ "./src/quests/tune-waves.ts":
/*!**********************************!*\
  !*** ./src/quests/tune-waves.ts ***!
  \**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return TuneWaves; });\n/* harmony import */ var _quest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./quest */ \"./src/quests/quest.ts\");\n\nconst buttons = [\n    [20, 200, 80, 80, '-', 'freqm'],\n    [115, 200, 80, 80, '+', 'freqp'],\n    [220, 200, 80, 80, '-', 'offsetm'],\n    [315, 200, 80, 80, '+', 'offsetp'],\n    [420, 200, 80, 80, '-', 'ampm'],\n    [515, 200, 80, 80, '+', 'ampp'],\n    [20, 400, 580, 80, 'Зафисировать параметры', 'check'],\n];\nvar STATES;\n(function (STATES) {\n    STATES[STATES[\"CONFIG\"] = 0] = \"CONFIG\";\n    STATES[STATES[\"ERROR\"] = 1] = \"ERROR\";\n    STATES[STATES[\"DONE\"] = 2] = \"DONE\";\n})(STATES || (STATES = {}));\nconst inBound = (...args) => {\n    const [x, y, x0, y0, w, h] = args;\n    return x > x0\n        && x < x0 + w\n        && y > y0\n        && y < y0 + h;\n};\nclass TuneWaves extends _quest__WEBPACK_IMPORTED_MODULE_0__[\"default\"] {\n    constructor() {\n        super(...arguments);\n        this.pos = 0;\n        this.head = 0;\n        this.freq = 0;\n        this.offset = 0;\n        this.amp = 0;\n        this.timeout = 0;\n        this.state = STATES.CONFIG;\n        this.dest = {\n            freq: (Math.random() * 6 + 1) | 0,\n            offset: (Math.random() * 6 + 1) | 0,\n            amp: (Math.random() * 6 + 1) | 0,\n        };\n        this.ready = false;\n    }\n    draw(ctx) {\n        ctx.strokeStyle = 'rgba(255, 0, 0, .3)';\n        ctx.lineWidth = 4;\n        ctx.beginPath();\n        ctx.moveTo(50, this.point(0, this.dest.offset, this.dest.freq, this.dest.amp));\n        for (let i = 0; i <= 500; i += 10) {\n            ctx.lineTo(i + 50, this.point(i, this.dest.offset, this.dest.freq, this.dest.amp));\n        }\n        const len = 300;\n        for (let i = this.head - len; i <= this.head; i += 20) {\n            if (i < 0 || i > 500)\n                continue;\n            const opacity = .5 - (this.head - i) / len + .2;\n            ctx.fillStyle = `rgba(255, 0, 0, ${opacity})`;\n            ctx.fillRect(i + 50 - 3, this.point(i, this.offset, this.freq, this.amp) - 3, 6, 6);\n        }\n        ctx.stroke();\n        ctx.strokeStyle = '#555';\n        ctx.lineWidth = 1;\n        ctx.strokeRect(50, 40, 500, 120);\n        ctx.beginPath();\n        for (let i = 100; i <= 500; i += 50) {\n            ctx.moveTo(i, 40);\n            ctx.lineTo(i, 160);\n        }\n        ctx.moveTo(50, 100);\n        ctx.lineTo(550, 100);\n        ctx.stroke();\n        if (this.state === STATES.CONFIG) {\n            ctx.fillStyle = '#6ab3b4';\n            buttons.forEach(([x, y, w, h, text]) => {\n                ctx.fillRect(x, y, w, h);\n            });\n            ctx.fillStyle = '#fff';\n            ctx.textAlign = 'center';\n            ctx.font = '24px sans-serif';\n            buttons.forEach(([x, y, w, h, text]) => {\n                ctx.fillText(text, x + w / 2, y + h * 2 / 3 - 5);\n            });\n            ctx.fillText('Частота', buttons[0][0] + 90, buttons[0][1] + 120);\n            ctx.fillText('' + this.freq, buttons[0][0] + 90, buttons[0][1] + 150);\n            ctx.fillText('Смещение', buttons[2][0] + 90, buttons[2][1] + 120);\n            ctx.fillText('' + this.offset, buttons[2][0] + 90, buttons[2][1] + 150);\n            ctx.fillText('Амплитуда', buttons[4][0] + 90, buttons[4][1] + 120);\n            ctx.fillText('' + this.amp, buttons[4][0] + 90, buttons[4][1] + 150);\n        }\n        if (this.state === STATES.ERROR) {\n            ctx.fillText('Неверная настройка', 300, 400);\n        }\n        if (this.state === STATES.DONE) {\n            ctx.fillStyle = '#fff';\n            ctx.textAlign = 'center';\n            ctx.font = '24px sans-serif';\n            ctx.fillText('Связь установлена', 300, 400);\n            ctx.fillText('Можно начинать передачу', 300, 450);\n        }\n    }\n    point(x, offset, freq, amp) {\n        const _offset = (offset * 25);\n        const _freq = freq / 4 + 1;\n        const _amp = amp * 5 + 10;\n        const ang = ((this.pos + _offset + x * _freq) % 360);\n        return Math.sin(ang * Math.PI / 180) * _amp + 100;\n    }\n    update(dt) {\n        this.pos = (this.pos + dt / 5) % 360;\n        this.head = (this.head + dt / 5) | 0;\n        if (this.head > 800) {\n            this.head = 0;\n        }\n        if (this.state !== STATES.CONFIG) {\n            this.timeout -= dt;\n            if (this.timeout <= 0) {\n                this.ready = this.state == STATES.DONE;\n                this.state = STATES.CONFIG;\n            }\n        }\n    }\n    click(x, y) {\n        const button = buttons.find(bound => inBound(x, y, ...bound));\n        if (button) {\n            const normalize = val => Math.min(8, Math.max(0, val));\n            switch (button[5]) {\n                case 'freqp':\n                    this.freq = normalize(this.freq + 1);\n                    break;\n                case 'freqm':\n                    this.freq = normalize(this.freq - 1);\n                    break;\n                case 'ampp':\n                    this.amp = normalize(this.amp + 1);\n                    break;\n                case 'ampm':\n                    this.amp = normalize(this.amp - 1);\n                    break;\n                case 'offsetp':\n                    this.offset = normalize(this.offset + 1);\n                    break;\n                case 'offsetm':\n                    this.offset = normalize(this.offset - 1);\n                    break;\n                case 'check':\n                    this.state = (this.offset === this.dest.offset\n                        && this.amp === this.dest.amp\n                        && this.freq === this.dest.freq) ?\n                        STATES.DONE : STATES.ERROR;\n                    this.timeout = 2000;\n                    break;\n            }\n        }\n    }\n    getCursor(x, y) {\n        if (buttons.some(bound => inBound(x, y, ...bound))) {\n            return 'pointer';\n        }\n        return 'default';\n    }\n    get result() {\n        return this.ready;\n    }\n}\n\n\n//# sourceURL=webpack:///./src/quests/tune-waves.ts?");

/***/ }),

/***/ "./typo/output.js":
/*!************************!*\
  !*** ./typo/output.js ***!
  \************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n\t\"home_start\": {\n\t\t\"bg\": \"home_start\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы&nbsp;просыпаетесь в&nbsp;своей квартире в&nbsp;Торонто от&nbsp;звонка мобильного. Номер звонящего не&nbsp;определен. Вы&nbsp;отвечаете на&nbsp;звонок.\\n\\nЭто Девид Мунши, он&nbsp;говорит, что вы&nbsp;договаривались о&nbsp;сканировании.\\nЧтобы снимок получился лучше, нужно выпить маркер. Также он&nbsp;напоминает, что процедура начнется через пару часов.\\n\\n[a home_look]Завершить звонок и&nbsp;встать[/a]\\n\"\n\t\t\t}\n\t\t]\n\t},\n\t\"home_look\": {\n\t\t\"bg\": \"home_look\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В одном углу компьютер, можете подойти к нему и  [a home_pc]проверить почту[/a]. Либо можете поискать маркер [a home_bedroom]в тумбочке[/a] рядом с кроватью или [a home_kitchen]на кухне[/a].\"\n\t\t\t}\n\t\t]\n\t},\n\t\"home_pc\": {\n\t\t\"bg\": \"home_pc\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы видите письмо от Девида Мунши. Он сообщает место, где будет проходить сканирование.\\n\\nТакже вы видите сообщения от вашего лечащего врача Эрин Пик. Она сообщает, что ваш мозг постепенно восстанавливается, но кровотечения все еще не прекратились и будут продолжаться еще несколько месяцев. Чтобы не создавать избыточное внутричерепное давление, вам нужно периодически являться в больницу для осушения полостей. Продолжительный стресс может привести к смерти, поэтому вам выписаны лекарства.\\n\\nПоискать маркер [a home_kitchen]на кухне[/a] или [a home_bedroom]в спальне[/a].\"\n\t\t\t}\n\t\t]\n\t},\n\t\"home_kitchen\": {\n\t\t\"bg\": \"home_kitchen\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В одном из ящиков вы находите бутылочку с жидкостью. Это то что нужно. Вы выпиваете содержимое. Оно чем-то похоже на молоко, но на вкус как монету лизать.\\n\\n[a lab_enter]Направиться в лабораторию[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"home_bedroom\": {\n\t\t\"bg\": \"home_bedroom\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы открываете ящики в тумбочке, но находите только книгу и другие вещи, которые вам сейчас не нужны.\\n\\n[a home_pc]Проверить почту[/a]\\n[a home_kitchen]Пойти на кухню[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"lab_enter\": {\n\t\t\"bg\": \"lab_enter\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы приезжаете по назначенному адресу.\\nВы ожидали, что в приемной больницы будет много людей, но здесь абсолютно пусто, даже нет человека за стойкой администратора.\\n\\nНа столе включенный компьютер, впереди дверь ведущая в комнату сканирования.\\n\\n[a lab_computer]Подойти к компьютеру[/a]\\n[a lab_door]Подойти к двери[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"lab_computer\": {\n\t\t\"bg\": \"lab_computer\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На экране вы видите письмо от Девида Муши Полу Бергу. Он пишет, что нужно подготовить оборудование для сканирования и прогнать некоторые тесты отсканировав друг друга. Доктор Эрин Пик сказала, что пришлет пациента, который недавно попал в аварию.\\n\\nВо втором письме Девид пишет Полу, что увидел его ноутбук у стойки администратора и спрашивает, где он сам. Пора начинать подготавливать оборудование.\\n\\nТретье письмо от Пола Девиду. Он пишет, что в лаборатории <i>сменили код от замка</i> и он не мог войти. Он связался с охраной, и они выдали ему новый код. Отправлять код по смс или почте запрещено, поэтому оставит где-нибудь записку с ним.\\n\\n[a lab_desc_search]Поискать записку рядом[/a] или [a lab_door]подойти к двери[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"lab_door\": {\n\t\t\"bg\": \"lab_door\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь заперта. Она открывается кодом, но вы не знаете комбинацию. Вы пробуете позвонить Девиду Мунши, но телефон отключен.\\n\\n[a lab_computer]Подойти к компьютеру[/a] за стойкой администратора\"\n\t\t\t}\n\t\t]\n\t},\n\t\"lab_desc_search\": {\n\t\t\"bg\": \"lab_desc_search\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В лежащем сверху журнале вы замечаете статью о Докторе Мунши, Поле Берге  и их революционном способе лечения мозга. Пол утверждает, что мозг может вылечиться сам. Лечение начинается с обследования больного и составления так называемой нейрограммы Еакадзимы. В отличии от обычной томограммы, нейрограмма может показать направление развития мозга. Создав компьютерную модель мозга можно попробовать на ней разные виды лечения, не рискуя нанести вред мозгу. Оптимальное найденное решение можно использовать в лечении настоящего пациента.\\n\\nВ ящиках стола вы находите блокнот, в нем 4 цифры. Возможно это код от двери. [a lab_meet_munshi]Попробовать открыть дверь[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"lab_meet_munshi\": {\n\t\t\"bg\": \"lab_meet_munshi\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Код подошел, дверь открылась. Вы проходите по коридору к кабинету с&nbsp;открытой дверью и находите Девида Мунши.\\n\\nВ кабинете много компьютерной техники. В центре стоит кресло. Девид просит вас сесть.\\n\\nВы садитесь. Девид подходит к компьютеру, что-то нажимает и вам на голову опускается шлем. Девид задает несколько формальных вопросов: подтверждает что вас зовут Саймон Джерад, живете в Канаде Торонто, родились в 1988 году. \\n\\n[g]Саймон:[/g] Это будет больно?\\n[g]Девид:[/g] Нет, это как сделать снимок.\\n[g]Саймон:[/g] Индейцы считали, что фотоаппараты крадут их души.\\n[g]Девид:[/g] Будем надеяться, что они ошибались.\\n\\nВ глазах у вас появляется рябь, затем появляется белая яркая вспышка, Вы закрываете глаза.\\n\\n[a epsilon_enter]Открыть глаза[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_enter\": {\n\t\t\"bg\": \"epsilon_start_room_door\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Шлем с головы снимается, вокруг темно. Вы зовете мистера Мунши, спрашиваете, все ли в порядке, но ответа нет. Вы кричите, что это не смешно и вам нельзя волноваться.\\n\\nВы встаете с кресла. Видите только красный огонек на стене. Это указатель на переключатель аварийного питания. Дернув рычаг комната наполняется светом. Вы оглядываетесь и понимаете, что находитесь не в той комнате, в которой были несколько секунд назад.\\nПомещение очень странное: стены из металла, двери автоматические.  \\n\\nРядом с креслом висят какие-то странные скафандры (они пронумерованы и 4 висят на местах, но под числами 5 и 6 скафандров нет), рядом с ними терминал. На противоположной стене от кресла дверь, рядом с которой окно в коридор.\\n\\nПодойти к [a epsilon_start_room_door]двери[/a], [a epsilon_start_room_terminal]терминалу[/a] или [a epsilon_start_room_window]окну[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_start_room_door\": {\n\t\t\"bg\": \"epsilon_start_room_door\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь заперта.\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"start_door_opened\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a epsilon_coridor_1]Выйти в коридор[/a], \",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"start_door_opened\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Подойти к [a epsilon_start_room_terminal]терминалу[/a]\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \" или [a epsilon_start_room_window]окну[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_start_room_window_broken\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_start_room_terminal\": {\n\t\t\"bg\": \"epsilon_start_room_terminal\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На экране отображается надпись \\\"Чтобы получить доступ, вставьте омни-инструмент\\\"\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_omni_tool\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omnitool_updated\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы вставляете омнитул в свободное гнездо. На экране появляется надпись \\\"Идет чтение\\\", затем становиться доступной команда обновления.\\n\\n[a epsilon_updete_omnitool]Обновить омнитул[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_omni_tool\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omnitool_updated\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Из этого терминала вы больше ничего не можете получить.\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omnitool_updated\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Подойти к [a epsilon_start_room_door]двери[/a]\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \" или [a epsilon_start_room_window]окну[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_start_room_window_broken\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_start_room_window\": {\n\t\t\"bg\": \"epsilon_start_room_window\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"За окном вы видите коридор, но  не видно куда он ведет\\n\\nСтекло в трещинах, можно попробовать [a epsilon_start_room_broke_window]разбить окно[/a] чем-нибудь тяжелым\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_start_room_window_broken\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a epsilon_start_room_window_out]Вылезти в окно[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_start_room_window_broken\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"\\n[a epsilon_start_room_terminal]Подойти к терминалу[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_start_room_broke_window\": {\n\t\t\"bg\": \"epsilon_start_room_window\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_start_room_window_broken\",\n\t\t\t\t\"value\": true\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"start_door_opened\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы хватает огнетушитель, который стоял неподалеку. Пара хороших ударов и стекло больше не преграждает вам путь.\\n\\nВыбравшись через окно, замечаете на двери замок. Он блокировал дверь снаружи, но легко был снят поворотом одного рычажка. Теперь в комнату можно заходить через дверь.\\n\\n[a epsilon_coridor_1]Оглядеться[/a]\\n\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_coridor_1\": {\n\t\t\"bg\": \"epsilon_coridor_1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"[a epsilon_coridor_1_left]Слева[/a] от комнаты коридор, который поворачивает налево\\n[a epsilon_coridor_1_right]Справа[/a] - пространство с несколькими комнатами\\n\\n[a epsilon_start_room_door]Вернуться в комнату [/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_coridor_1_left\": {\n\t\t\"bg\": \"epsilon_coridor_1_left\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"За поворотом находится дверь, на которой висит замок.\\n\\n[a epsilon_coridor_1]Вернуться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omnitool_upgraded\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь открыта и вы можете пройти [a epsilon_coridor_4]в коридор[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omnitool_upgraded\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_coridor_1_right\": {\n\t\t\"bg\": \"epsilon_coridor_1_right\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вокруг несколько комнат с табличками:\\n - [a epsilon_toilet]Туалет[/a]\\n - [a epsilon_rest]Столовая[/a]\\n - [a epsilon_machines_dock]Ангар для машин[/a]\\n - Хранилище , Станция обслуживания, Док роботов - находятся [a epsilon_coridor_2]за  большой дверью[/a]\\n\\nНа стене рядом с комнатой отдыха висит [a epsilon_buffer_1]терминал-интерком[/a]\\n\\n[a epsilon_coridor_1]Вернуться к комнате[/a], с которой начали\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_toilet\": {\n\t\t\"bg\": \"epsilon_toilet\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Здесь вы не находите ничего интересного.\\n\\n[a epsilon_coridor_1_right]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_rest\": {\n\t\t\"bg\": \"epsilon_rest\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На кухне ничего не осталось, столы пусты. С потолка капает черная жидкость.\\n\\n[a epsilon_coridor_1_right]выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_buffer_1\": {\n\t\t\"bg\": \"epsilon_buffer_1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы подходите к устройству, дотрагиваетесь до него и тут же слышите сообщение:\\n \\\"Все идет лучше чем мы думали. Они не могут открыть двери. Чем больше мы запечатаем, тем лучше\\\". Далее говорится про отправку на Тету.\\n\\nВы не понимаете как прослушали сообщение всего лишь дотронувшись до него.\\n\\n[a epsilon_coridor_1_right]Оглядеться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_machines_dock\": {\n\t\t\"bg\": \"epsilon_machines_dock\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_robot_out\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Комната запечатана таким же замком, что закрывал комнату, из которой вы вышли. Замок также легко открывается. Внутри много стеллажей с инструментами и запчастями. У одной из стен висят 2 робота. Во второй части комнаты на стене висит табличка с надписью \\\"Патос-2\\\", а также еще два робота.\\nЧерез секунду вы слышите какой-то грохот. Свет гаснет и включается снова. Вы замечаете, что один робот пропал. От того места, где он находился, идет черный след. След ведет в строну хранилища.\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_robot_out\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"В комнате нет ничего полезного.\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_robot_out\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"\\n[a epsilon_coridor_1_right]Выйти[/a] \"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_coridor_2\": {\n\t\t\"bg\": \"epsilon_coridor_2\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь закрыта.\\n\\n[a epsilon_coridor_1_right]Вернуться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_robot_out\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь \\\"выбита\\\". Вы можете [a epsilon_coridor_3]пройти дальше[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_robot_out\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_coridor_3\": {\n\t\t\"bg\": \"epsilon_coridor_3\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В комнате работ, который вы видели раньше. Возможно тот самый, но не понятно почему он оказался здесь.\\n\\nВ одном конце комнаты [a epsilon_storage]запечатанная дверь[/a], в другом [a epsilon_coridor_4]коридор[/a].\\n[a epsilon_coridor_1_right]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_storage\": {\n\t\t\"bg\": \"epsilon_coridor_3\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вдруг выключается свет. Вы пытайтесь подойти к освещённой двери. Слышите жуткие звуки, отбегаете и прячетесь. Когда звуки исчезают, [a epsilon_storage_inside]входите внутрь[/a].\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_storage_entered\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a epsilon_coridor_4]Пройти в коридор[/a]\\n[a epsilon_coridor_1_right]Вернуться назад[/a] к комнатам\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_storage_entered\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_storage_inside\": {\n\t\t\"bg\": \"epsilon_storage\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_storage_entered\",\n\t\t\t\t\"value\": true\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"has_omni_tool\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Открыв дверь попадаете в помещение похожее на склад. К счастью, здесь никого нет. Противоположная стена сильно потрепана и повреждена. С потолка капает черная жижа. На столе лежит устройство, рядом с ним инструкция:\\n\\\"Омни-тул - инструмент для доступа к компьютеризированным системам, а также инструмент управления ими...\\\". \\n\\n[a epsilon_storage]Забрать инструмент и выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_coridor_4\": {\n\t\t\"bg\": \"epsilon_coridor_4\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы идете по коридору. Слева видите большую круглую [a epsilon_door_1]дверь[/a].\\n\\nПройти [a epsilon_coridor_4_end]дальше по коридору[/a]\\n[a epsilon_coridor_1_right]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_door_1\": {\n\t\t\"bg\": \"epsilon_door_1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Рядом с дверью панель с экраном. На нем надпись: \\\"Поднесите омнитул\\\".\\n\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы подносите к ней омнитул, дверь открывается.\\n\\nВы оказываетесь в коридоре со стеклянными стенами и потолком. Посмотрев за стекло понимаете, что находитесь под толщей океана, на самом дне. Снаружи водоросли, рыбы. Средняя часть коридора оборудована как обсерватория. Есть стол с зарисовками морских существ. На них записи: \\\"Все как и прежде как-будто и не было армагедонна\\\" и \\\"Они вернулись. Теперь в черном геле. Бедные рыбы\\\".\\n\\nРядом с вами интерком. Дотронувшись до коробки вы слышите разговор двух людей. Они говорят о готовности к отплытию на Тету с Эпсилона, о том что они будут скучать по Эпсилону, потому что здесь проработали много лет. Но лучше покинуть электростанцию из-за взбесившихся машин.\\n\\nВы проходите дальше пока не оказываетесь в комнате, где вас запирают. Справа есть проход в вентиляцию. Вы ползете через вентиляционную систему, чтобы выбраться в единственное доступное помещение.\\n\\n[a epsilon_tec_1]Оглядеться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omnitool_updated\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы подносите к ней омнитул, но получаете ответ об отказе доступа.\\n[a epsilon_coridor_4]Вернуться в коридор[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omnitool_updated\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_updete_omnitool\": {\n\t\t\"bg\": \"epsilon_start_room_terminal\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"omnitool_updated\",\n\t\t\t\t\"value\": true\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"omnitool_upgraded\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На экране появляется полоска загрузки. Через несколько секунд обновление завершается и вы видите сообщение об обновлении кодов доступа.\\n\\n[a epsilon_start_room_terminal]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_coridor_4_end\": {\n\t\t\"bg\": \"epsilon_coridor_1_left\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы натыкаетесь на дверь.\\n\\nКажется вы ее уже видели, но с другой стороны. Эта та же дверь, что была рядом с комнатой из которой вы вышли.\\n\\n[a epsilon_coridor_4]Вернуться[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omnitool_updated\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a epsilon_coridor_1]Пройти в дверь[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omnitool_updated\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec_1\": {\n\t\t\"bg\": \"epsilon_tec_1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На стенах какие-то наросты, с потолка капает черная жижа. За окном видите оборудование теплоэлектростанции - турбины. Перед окном находится терминал и лежит полуразобранный робот. От него тянуться две трубки к терминалу. Он издает  звуки тяжелого дыхания.\\n\\nНа одном из мониторов мигает надпись \\\"Радиосигнал заблокирован. Недостаточно энергии\\\".\\nВы замечаете записку с текстом \\\"Не дотрагивайтесь до протекшего структурного геля. Я не могу отследить его воздействие на НИУ. О проблеме сообщено ответственному инженеру по эксплуатации Волчек\\\".\\n\\nРядом с терминалом дверь, но она заперта.\\n\\nНужно попытаться восстановить энергию.  [a epsilon_tec_1_button]Нажать кнопку[/a] на терминале\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec_1_button\": {\n\t\t\"bg\": \"epsilon_tec_1_button\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы нажимаете кнопку, но ничего не происходит. Похоже, что трубки ведущие к роботу, вытягивают энергию. \\n\\nВы поочередно вытягиваете трубки и слышите как от робота доносятся крики: \\\"Не надо. Мне это нужно. Почему? Все было хорошо. Я была счастлива\\\". После чего робот вырубается.\\n\\nНа терминале восстанавливается подача энергии. На экране появляется сообщение о необходимости выполнения ручного запуска.\\n\\n[a epsilon_tec1_energy_on]Попробовать запустить[/a]\\n\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec1_energy_on\": {\n\t\t\"text\": [],\n\t\t\"quest\": {\n\t\t\t\"name\": \"start-energy\",\n\t\t\t\"exit\": \"epsilon_tec1_call\"\n\t\t}\n\t},\n\t\"epsilon_tec1_call\": {\n\t\t\"bg\": \"epsilon_tec1_call\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На экране появляется надпись, что турбины запущены, главное питание возобновлено, системы связи включены. Дверь разблокировалась.\\n\\nНа соседнем экране происходит сканирование каналов связи со станциями. Происходит соединение со станцией Лямбда, и вы слышите женской голос. Но качество связи ухудшается, девушка говорит вам, что нужно подняться в центр связи.\\n\\n[a epsilon_tec2]Выйти в дверь[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec2\": {\n\t\t\"bg\": \"epsilon_tec2\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы в большой комнату с турбинами. Вы видите лестницу наверх. Неподалеку трубы с вентилями.\\n\\n[a epsilon_tec2_up]Пройти к лестнице[/a]\\n[a epsilon_tec2_turn]Пройти к трубам[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec2_turn\": {\n\t\t\"bg\": \"epsilon_tec2_turn\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_tec2_up_opened\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы подбираетесь к трубам и крутите вентиль, до которого можете дотянутся. Струи пара, которые били из труб, пропадают.\\n\\n[a epsilon_tec2]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec2_up\": {\n\t\t\"bg\": \"epsilon_tec2_up\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы поднимаетесь по лестнице и закрываете за собой дверь.\\n\\n[a epsilon_tec3]Подняться выше[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec2_up_opened\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы видите выход на этаж выше, но на пути из труб бьет пар. Пройти не получится.\\n\\n[a epsilon_tec2]Вернуться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec2_up_opened\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3\": {\n\t\t\"bg\": \"epsilon_tec3\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы попадаете в комнату с панелью управления.\\n\\nМожно подойти к [a epsilon_tec3_comp]компьютеру[/a]\\nВыйти [a epsilon_tec3_doc]в комнату[/a] с рельсами и роботами-ремонтниками\\nОсмотреть [a epsilon_tec3_lab]лабораторию[/a]\\nОсмотреть [a epsilon_tec3_storage]склад[/a]\\nПройти в [a epsilon_tec3_coridor]коридор[/a]\\nПодойти[a epsilon_tec3_up] к лестнице[/a] ведущей в центр связи\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_doc\": {\n\t\t\"bg\": \"epsilon_tec3_doc\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы видите несколько роботов, но они не работают, кроме одного.\\nОн обращается к вам: \\\"Я вырубился. Кто то слышит меня? Мне нужна помощь. Я слышу вы здесь ходите\\\"\\n\\nВ стороне вы видите рычаг. Можете [a epsilon_tec3_robot_2]дернуть[/a] за него.\\n[a epsilon_tec3_robot]Поговорить с роботом[/a]\\n[a epsilon_tec3]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_comp\": {\n\t\t\"bg\": \"epsilon_tec3_comp\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На экране прилеплен стикер \\\"Запущен процесс блокировки\\\".\\n\\nНа компьютере отображается поле для ввода идентификатора пользователя.\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_comp_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a epsilon_tec3_comp1]Ввести код 0722[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_carl_code\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_comp_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a epsilon_tec3]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_lab\": {\n\t\t\"bg\": \"epsilon_tec3_lab\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь закрыта. [a epsilon_tec3]Вернуться[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec3_has_energy\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри вы находите рабочий стол и документы. В одном документа есть описание \\\"Черного ящика\\\".\\nЭто прибор для наблюдения за состоянием человека, собирает диапазон показателей от температуры тела до мозговой активности. Эта информация постоянно передается НИУ, наблюдающей системе станции для обеспечения необходимой рабочей обстановки. На фото изображен человек с имплантированным устройством в черепную коробку. \\n\\n[a epsilon_tec3]Выйти[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec3_has_energy\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_up\": {\n\t\t\"bg\": \"epsilon_tec3_up\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь заблокирована. На экране рядом горит надпись: \\\"недостаточно энергии\\\"\\n\\n[a epsilon_tec3]Назад[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec3_up_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы поднимаетесь по лестнице [a epsilon_tec4]в комнату связи[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec3_up_unlocked\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_coridor\": {\n\t\t\"bg\": \"epsilon_tec3_coridor\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В коридоре вы находите труп.\\n\\n[a epsilon_tec3_carl]Осмотреть[/a] тело\\nПройти дальше [a epsilon_tec3_control]в комнату контроля энергии[/a]\\n[a epsilon_tec3_coridor2]Пройти дальше[/a] по коридору\\n[a epsilon_tec3]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_carl\": {\n\t\t\"bg\": \"epsilon_tec3_carl\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"has_carl_code\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На трупе вы находите карточку. Это Карл Сенкен, его ID 0722\\n\\n[a epsilon_tec3_coridor]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_control\": {\n\t\t\"bg\": \"epsilon_tec3_control\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В комнате записка \\\"Мы нагрузили систему до предела. Если дернете рычаг - пути назад уже не будет. Делайте это только при крайней необходимости\\\"\\n\\n[a epsilon_tec3_control_done]Дернуть рычаг[/a]\\n[a epsilon_tec3_coridor]Вернуться[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec3_has_energy\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь не открывается. [a epsilon_tec3_coridor]Назад[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec3_has_energy\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_comp1\": {\n\t\t\"bg\": \"epsilon_tec3_comp\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_comp_unlocked\",\n\t\t\t\t\"value\": true\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_tec3_has_energy\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы вошли как Карл Сенкен и открываете доступ в закрытые комнаты.\\n\\nДля того, чтобы подать питание для выхода в центр связи, нужно увеличить уровень подачи энергии. Сделать это можно либо в комнате контроля, либо в ремонтном отделе, переключив рычаги питания.\\n\\n[a epsilon_tec3]Осмотреться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_coridor2\": {\n\t\t\"bg\": \"epsilon_tec3_coridor2\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы попадаете в комнату с личными шкафчиками. На одном шкафчике записка \\\"Тета, не входите. Мы перекрыли Эпсилон, чтобы никто не мог помешать работе станции. Не открывайте дверь. То что произошло с Карлом - не моя вина\\\"\\n\\n[a epsilon_tec3_coridor]Вернуться[/a] \"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_robot\": {\n\t\t\"bg\": \"epsilon_tec3_robot\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"[g]Саймон[/g] [r]Кто вы?[/r]\\n[g]Робот[/g] [r]Вы слепой. Это я - Карл. Карл Сенкен. Вы поможете мне?[/r]\\n[g]Саймон[/g] [r]Вы человек?[/r]\\n[g]Робот[/g] [r]Блин, что по телу заметно? А я-то пытался скрыть. Да я человек. А вы?[/r]\\n[g]Саймон[/g] [r]Меня зовут Саймон. Вы что нибудь знаете об этом месте?[/r]\\n[g]Робот[/g] [r]Вы новенький? Тогда понятно. Слушайте я ранен как вы заметили. Если увидите кого нибудь, скажите им что я тут[/r]\\n[g]Саймон[/g] [r]Я вас не вижу. Вишу машину, говорящего робота[/r]\\n[g]Робот[/g] [r]Куда вы смотрите. Видите, я тут[/r]\\n[g]Саймон[/g] [r]Как вы сюда попали?[/r]\\n[g]Робот[/g] [r]Точно не помню. Я был на месте пилота управлял универсальным помощником. Это работ такой, вот как они, только быстрее.[/r]\\n[g]Саймон[/g] [r]Мне кажется вы попали в робота[/r]\\n[g]Робот[/g] [r]А я вам говорю - проверьте зрение. Я тут, я вижу обе свои руки, обе ноги. А когда управляешь видишь только видео с робота. Свое тело при этом не видишь. Найди кого-нибудь чтобы помочь мне[/r]\\n\\n[a epsilon_tec3_doc]Вернуться[/a] \"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_robot_2\": {\n\t\t\"bg\": \"epsilon_tec3_robot_2\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_tec3_up_unlocked\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы дергаете за рычаг, свет начинает мигать. робот начинает громко орать \\\"Хватит, мне больно. Пожалуйста, нет\\\".\\n\\n[a epsilon_tec3_robot3]Вернуть рычаг[/a] в исходное положение\\n\\n[a epsilon_tec3_doc]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_robot3\": {\n\t\t\"bg\": \"epsilon_tec3_robot_2\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_tec3_up_unlocked\",\n\t\t\t\t\"value\": false\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Ток восстанавливается. Робот стихает.\\n\\n[a epsilon_tec3_doc]вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_storage\": {\n\t\t\"bg\": \"epsilon_tec3_storage\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В комнате вы находите неисправного робота. Прикоснувшись к нему, вы слышите запись, на которой человек говорит, что они закрыли все что смогли. Затем вы слышите звуки борьбы.\\n\\nВ комнате находится стеллажи с вещами. Больше ничего интересного нет.\\n\\n[a epsilon_tec3]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec3_control_done\": {\n\t\t\"bg\": \"epsilon_tec3_control\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_tec3_up_unlocked\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Питание восстановилось, вы можете пройти [a epsilon_tec3_up]к лестнице[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec4\": {\n\t\t\"bg\": \"epsilon_tec4\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы поднимаетесь в комнату с крышей в форме купола.\\nПеред вами терминал со списком станций. Вы пытаетесь установить связь с Лямбдой, но нужна дополнительная [a epsilon_tec4_quest]настройка[/a]\\n\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec4_quest\": {\n\t\t\"text\": [],\n\t\t\"quest\": {\n\t\t\t\"name\": \"tune-signal\",\n\t\t\t\"exit\": \"epsilon_tec4_connect\"\n\t\t}\n\t},\n\t\"epsilon_tec4_connect\": {\n\t\t\"bg\": \"epsilon_tec4_connect\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"С вами выходит на связь девушка, с которой вы общались ранее. Ее зовут Кетрин. Вы пытаетесь разобраться с происходящим, как вдруг все начинает трестись, из стен сочится вода. Кетрин говорит, что вам нужно найти ее на Лямбде.\\n\\nКомната заполняется водой. Но вы не тоните. Не понимаете, как такое возможно. Вы смотрите на свои руки. секунду назад на них ничего не было, но сейчас вы видите, что одеты в водолазный костюм.\\n\\nВ куполе образовалась пробоина, вы выбираетесь через нее наружу, идете по дну океана. Вокруг вы видите огоньки и идете к ближайшему.\\n\\nПо пути вы встречаете маленького робота заваленного камнями\\n\\n[a epsilon_tec4_robot]Вытащить его[/a]\\n[a epsilon_tec_4_next]Идти дальше[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec4_robot\": {\n\t\t\"bg\": \"epsilon_tec4_robot\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_tec4_robot\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Робот следует за вами. [a epsilon_tec_4_next]Идти дальше[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec_4_next\": {\n\t\t\"bg\": \"epsilon_tec_4_next\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы добрались до станции шатлов.\\nПытаетесь открыть дверь, но ничего не выходит. Дверь покрыта ржавчиной  и не поддается.\\n\\n\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Робот помогает вам с помощью встроенного резака разблокировать дверь.\\n\\n[a way_to_teta]Войти[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec4_robot\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a epsilon_tec4_robot_2]Вернуться за роботом [/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"epsilon_tec4_robot\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"epsilon_tec4_robot_2\": {\n\t\t\"bg\": \"epsilon_tec4_robot\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"epsilon_tec4_robot\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы возвращаетесь за роботом и достаете его из под камней.\\n\\n[a epsilon_tec_4_next]Вернуться к двери [/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta\": {\n\t\t\"bg\": \"way_to_teta\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри вы используете омни-тул. Дверь закрывается и вода выкачивается из комнаты.\\nВы проходите по коридору.  Вокруг темно. Там есть шатл, который мог бы доставить вас до станции по рельсовому пути, но у вас не получается открыть дверь.\\nРядом щиток, на экране надпись \\\"нехватка энергии\\\". Рядом рычаг, дернув за него вы не получаете результат.\\nРядом вы находите планшет. В нем говориться о том, что в тихий океан упала комета. Удар от падения оценивается как одно из мощнейших катаклизмов. Поверхность планеты обезлюдела и больше не способна поддерживать жизнь. Уникальное местонахождение станции обеспечило персоналу полную безопасность.\\n\\n[a way_to_teta_lookup]Осомтреться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_lookup\": {\n\t\t\"bg\": \"way_to_teta\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы можете [a way_to_teta_person]спуститься[/a] на пути одного из шатлов.\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"way_to_teta_has_energy\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a way_to_teta_box]Дернуть рычаг на щитке[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_person\": {\n\t\t\"bg\": \"way_to_teta_person\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Пройдя по путям, вы попадаете в служебное помещение. В нем вы находите женщину, лежащую на полу. Она на половину покрыта структурным гелем.От щитка рядом к ее телу тянутся провода, рядом какая-то штука, которая поддерживает жизнь в женщине. \\n\\n- Могу я вам помочь?.\\n- Оно не даст мне умереть. Это запрещено.\\n\\n[a way_to_teta_lookup]Вернуться[/a]\\n[a way_to_teta_on]Отключить от щитка провода[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_on\": {\n\t\t\"bg\": \"way_to_teta_person\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"way_to_teta_has_energy\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы отключаете провода и женщина умирает.\\n\\nНапряжение восстанавливается\\n\\n[a way_to_teta_lookup]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_box\": {\n\t\t\"bg\": \"way_to_teta_box\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Появляется надпись \\\"Питание включено\\\". Включается свет. Дверь в шатл открывается. Вы применяете омнитул на месте пилота, шатл активируется. вы нажимаете все переключатели и нажимаете пуск. Шатл начинает движение.\\nПо пути вам показывают презентацию о станции. Здесь создали электромагнитную пушку, которая может запускать спутники на орбиту.\\n\\nПосле окончания презентации один из экранов начинает мигать с предупреждением об опасности. Через лобовое стекло вы видите препятствие на пути. Шатл врезается в него, и вы вылетаете через лобовое стекло. Вам остается только продолжать путь пешком. Путь вперед оказывается заблокированным. Находите люк в стене недалеко. Через него вы выбираетесь в океан.\\n\\nВпереди горит огонек. Вам пришлось пройти не менее 100 метров, и вы оказываетесь у входа в комплекс Лямбда.\\n\\n[a teta_start]Войти[/a] \\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"way_to_teta_has_energy\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Ничего не происходит. Что-то мешает подачи энергии.\\n\\n[a way_to_teta_lookup]назад[/a] \",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"way_to_teta_has_energy\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_start\": {\n\t\t\"bg\": \"teta_start\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри темно и пусто. Из одного помещения вы слышите женский крик \\\"отвали от меня\\\", затем тяжелые шаги. Вы направляетесь в ту комнату.\\n\\nНа полу лежит какой-то ящик с разбитым экраном. Из него доносится голос Кетрин:\\n[g]Саймон:[/g] [r]Нет, только не вы. Я так надеялся, что вы человек[/r]\\n[g]Кетрин:[/g] [r]А вы не смотрите на электронику. Я была человеком[/r]\\n[g]Саймон:[/g] [r]В голове не укладывается. Я так понимаю что из людей остался только я.[/r]\\n[g]Кетрин:[/g] [r]Вы сами то себя видели? Вы ходячий говорящий водолазный костюм с электронной начинкой[/r]\\n[g]Саймон:[/g] [r]Я... нет...[/r]\\n[g]Кетрин:[/g] [r]Вы можете мне помочь? Я пыталась выяснить, что с моим проектом, пока этот амбал не свалил меня на пол[/r]\\n[g]Саймон:[/g] [r]Проект. Да кому нужны проекты, если знаешь, что ты глупый робот в глупом мертвом мире?[/r]\\n[g]Кетрин:[/g] [r]Так спокойно. Я хочу, чтобы вы меня починили, чтобы я снова могла работать. Потом можете дуться сколько хотите. Мне нужен доступ к компьютеру. Это у вас омнитул?[/r]\\n[g]Саймон:[/g] [r]А это, ключ от дверей?[/r]\\n[g]Кетрин:[/g] [r]Он подойдет вставьте его в терминал, а затем вставьте в терминал мой чип.[/r]\\n[a teta_start_2]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_quest\": {\n\t\t\"text\": [],\n\t\t\"quest\": {\n\t\t\t\"name\": \"find-arc\",\n\t\t\t\"exit\": \"teta_back_to_ketrin\"\n\t\t}\n\t},\n\t\"teta_back_to_ketrin\": {\n\t\t\"bg\": \"teta_back_to_ketrin\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Кетрин расстроена, что \\\"Ковчег\\\" все еще на земле. Хотя и так близко от станции Фи, чтобы запустить его.\\nВы соглашаетесь отнести ее туда. Вы забираете омнитул и выходите наружу. Пока омнитул не подключен к терминалу, вы не можете общаться с Кетрин.\\n\\nВы начинаете движение в сторону станции Тета. По пути видите капсулу для перевозки людей. Она лежит на дне и не выглядит функционирующей.\\n\\n[a teta_capsule]Заглянуть[/a]\\n[a teta_way_to_ship]Пройти дальше[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_capsule\": {\n\t\t\"bg\": \"teta_capsule\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри есть терминал. Вы подключаете омнитул, на связь выходит Кетрин.\\n\\nОна говорит, что вы в спасательной капсуле, пытается ее запустить, но ничего не выходит. Эта капсула с корабля, который находится недалеко отсюда. Возможно там есть еще одна, функционирующая капсула.\\n\\nВы отключаете омнитул и направляетесь [a teta_way_to_ship]дальше[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_way_to_ship\": {\n\t\t\"bg\": \"teta_way_to_ship\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Через какое-то время вы находите корабль. Поверхность его заржавела. Вы находите способ войти в него. Теперь нужно найти спасательную капсулу.\\n\\nВы оглядывате комнату, в которую вошли. За стеклом видите табличку с надписью - аварийный шатл. Но пройти туда не можете, придется обходить. Вы  проходите по коридору. Где ходит существо, которое было на станции, где вы нашли Кетрин.\\n\\nВы стараетесь не попадаться ему на глаза и добираетесь до капсулы.  Внутри ставите омнитул в терминал. Кетрин закрывает дверь, откачивает воду из капсулы. Капсула начинает движение на Тету. \\n\\nВдруг корабль, с которого вы сбежали взрывается. Взрывная волна задевает капсулу и вы терпите крушение. После падения вы пытаетесь выбраться, но дверь не открывается. Через пару секунд вы видите след от резака на двери. Когда проход открывается, вы видите маленького робота, которого вы видели на Омикроне и вытащили из камней.\\n\\n[a way_to_teta_transport]Оглядеться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport\": {\n\t\t\"bg\": \"way_to_teta_transport\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Маленький робот по прежнему плавает рядом с вами. По площадке плавает робот побольше.\\n\\nЗаглянуть [a way_to_teta_transport_capsule] здание справа[/a]\\nЗаглянуть в [a way_to_teta_transport_room1]здание слева[/a]\\nЗаглянуть в [a way_to_teta_transport_room2]наблюдательный пункт[/a]\\nПодойти к [a way_to_teta_transport_terminal]терминалу[/a]\\nПроверить [a way_to_teta_transport_plate]платформу[/a]\\nНастроить [a way_to_teta_transport_antena]антенны[/a] с помощью пульта\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_capsule\": {\n\t\t\"bg\": \"way_to_teta_transport_capsule\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы подплываете к зданию, но дверь не открывается. Подплывает робот и резаком открывает ее.\\n\\nВнутри вы находите труп и компьютер. Из компьютера вы узнаете как попасть на Тету: рядом есть платформа для перевозки грузов. Если вызвать цеппелин, на нем можно добраться.\\n\\n[a way_to_teta_transport]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_terminal\": {\n\t\t\"bg\": \"way_to_teta_transport_terminal\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы подходите к терминалу.\\n\\nЕсть аудиозапись разговора двух работников. Из него узнаете, что связь с цеппелином можно восстановить настроив антенны вручную.\\n\\nНа экране список цеппелинов. Один из них бездействует. Статус остальных не известен.\\n\\n[a way_to_teta_transport_terminal1]Вызвать цеппелин 049[/a]\\n[a way_to_teta_transport_terminal2]Вызвать цеппелин 840[/a]\\n[a way_to_teta_transport_terminal3]Вызвать цеппелин 216[/a]\\n\\n[a way_to_teta_transport]Отойти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_plate\": {\n\t\t\"bg\": \"way_to_teta_transport_plate\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"У платформы вы видите мертвого водолаза. Он весь покрыт структурным гелем.\\n\\n\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы видите как к вам приближается цеппелин. Когда он встал на  платформу, вы заходите на него. На нем есть терминал и вы прикрепляете омнитул. Вы объясняете Кетрин, что вызвали цеппелин. Она пытается его запустить, но оказывается, что управляющий чип сломан. Его нужно заменить. Самый простой способ раздобыть новый - забрать его у робота. В ящике на платформе есть шоковая дубинка. Можно воспользоваться ей, чтобы оглушить робота и вытащить чип.\\n\\nНаправится [a way_to_teta_transport_shok_robot2]к роботу помощнику[/a] или [a way_to_teta_transport_shok_robot2]роботу рабочему[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"platform_icoming\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"На платформе нет транспорта.\\n\\n[a way_to_teta_transport]Вернуться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"platform_icoming\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_antena\": {\n\t\t\"text\": [],\n\t\t\"quest\": {\n\t\t\t\"name\": \"tune-antenna\",\n\t\t\t\"exit\": \"way_to_teta_transport\"\n\t\t}\n\t},\n\t\"way_to_teta_transport_room1\": {\n\t\t\"bg\": \"way_to_teta_transport_room1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На одной стене вы видите надпись: \\\"От света мои глаза болят. Он говорит, что для того чтобы узреть спасение, эта стекловидная плоть в моем черепе не нужна. Я с радостью вырежу их. Не позволю им искажать восприятие моей божественной миссии\\\".\\n\\nНа столе записка \\\"смотреть за тем как НИУ захватывает Дельту - волнующее занятие. Еще полгода назад меня бы это беспокоило. Я бы поручил Гойе и Вану счистить эту черную кровь с машин. Теперь же ее корочка словно дополняет - я бы даже сказал улучшает - Дельту\\\".\\n\\nНадпись на другой стене: \\\"Мое отражение в черной крови нашего Наблюдателя шепчет мне что-то. Что я должен спасти их из этого ада. Дать им выспаться. Закрыть их в тех же светлых снах, что видел я\\\".\\n\\nВ центре комнаты стол и он весь в крови.\\n\\n[a way_to_teta_transport]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_terminal1\": {\n\t\t\"bg\": \"way_to_teta_transport_terminal\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Появляется сообщение о том, что цеппелин направляется на платформу\\n\\n[a way_to_teta_transport_treminal1_1]Посмотреть в сторону площадки[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_con_049\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"На экране сообщение: \\\"Связь не установлена\\\"\\n\\n[a way_to_teta_transport_terminal]Назад[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_con_049\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_terminal2\": {\n\t\t\"bg\": \"way_to_teta_transport_terminal\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Отказ дивгателя\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_con_840\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"На экране сообщение: \\\"Связь не установлена\\\"\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_con_840\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a way_to_teta_transport_terminal]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_terminal3\": {\n\t\t\"bg\": \"way_to_teta_transport_terminal\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Отказ двигателя\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_con_216\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"На экране сообщение: \\\"Связь не установлена\\\"\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_con_216\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a way_to_teta_transport_terminal]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_shok_robot2\": {\n\t\t\"bg\": \"way_to_teta_transport_shok_robot2\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Пара хороших ударов и робот оглушен. Вы вынимаете чип и относите его к терминалу на платформе. Дергаете рычаг и платформа начинает движение.\\n\\nПо пути вы завели с Кетрин диалог. Вы говорите, что начинаете осознавать, что вы робот. Очевидно, что вы больше не люди. Не понимаете как можете осознавать себя Саймоном, как вообще можете что-то чувствовать. ведь фактически нет ушей, нет рта\\n\\n[g]Кетрин:[/g] [r]Скорее всего, ваше тело обладает чувствами аналогичными тем, что были у вас. И ваш разум применяет эти чувства к новому облику[/r]\\n[g]Саймон:[/g] [r]Значит мой разум защищается делая вид, что все по-прежнему?[/r]\\n[g]Кетрин:[/g] [r]Иначе вы бы умерли от стресса или сошли с ума[/r]\\n\\nВы приблизились к станции\\n\\n[a teta_base_start]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_room2\": {\n\t\t\"bg\": \"way_to_teta_transport_room1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Робот помогает вам открыть дверь. Вы проверяете компьютер. В нем есть информация о роботах.\\n\\nОдин из них - робот помощник, то что помогал вам с дверьми. У него сложный интеллект, управление пилотом не поддерживается, голосовой модуль отсутствует.\\n\\nДругой робот похож на того, что вы видели неподалеку. Интеллект сложный, поддерживается управление пилотом.\\n\\n[a way_to_teta_transport]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"way_to_teta_transport_treminal1_1\": {\n\t\t\"bg\": \"way_to_teta_transport_terminal\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"platform_icoming\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы видите как издалека к вам направляется транспортное средство\\n\\n[a way_to_teta_transport_plate]Подойти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_start\": {\n\t\t\"bg\": \"teta_base_start\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы идете в сторону станции Тета.\\n\\nПеред вами интерком. Дотронувшись до него, слышите сообщение о том, что НИУ ранило одного из людей прибывших на Тету и ему нужна срочная медицинская помощь. Далее находите еще один. В нем говорится, что члены экипажа убивают себя для \\\"непрерывности\\\" из-за проекта Ковчег.\\n\\nДалее вы встречаете обломки робота присоединенного к НИУ.\\n\\n[a teta_base_robot_0]Подойти к нему[/a]\\n[a teta_base_enter]Пройти дальше[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_robot_1\": {\n\t\t\"bg\": \"teta_base_robot_1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы отключаете кабель и слышите крики \\\"Что вы делаете? Прекратите\\\". Затем робот замолкает и прекращает подавать признаки активности.\\n\\n[a teta_base_enter]Идти дальше [/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_enter\": {\n\t\t\"bg\": \"teta_base_enter\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы подходите к массивным дверям - вход на станцию.\\nДернув несколько рычагов и переключателей дверь открывается. Вы проходите на станцию и дверь за вами закрывается. Из помещения выкачивается вода.\\n\\n[a teta_base_lookup]Оглядеться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_lookup\": {\n\t\t\"bg\": \"teta_base_enter\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Пройти в [a teta_base_coord]комнату управления[/a]\\nПройти в [a teta_base_docs]доки[/a]\\n[a teta_base_living]Пройти в дверь[/a] ведущую в комнаты и лабораторию\\nПройти в [a teta_base_server]серверную[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_coord\": {\n\t\t\"bg\": \"teta_base_coord\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь закрыта\\n\\n[a teta_base_lookup]Вернуться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_code_entered\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь закрыта, но рядом с дверью окно, которое можно чем-нибудь разбить.\\n\\n[a teta_base_coord_window]Разбить окно[/a]\\n[a teta_base_lookup]Вернуться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_window_broken\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы в комнате с терминалом, Кетрин ждет когда вы найдете код\\n\\n[a teta_base_lookup]Вернуться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_was_in_coord\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_has_code\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Кетрин говорит что код подошел, она запустила подготовку субмарины к отплытию. Теперь нужно пройти в доки.\\n\\n[a teta_dock_start]Забрать омнитул и пройти в доки[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_was_in_coord\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_has_code\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы без проблем перелезаете через окно. Снимаете блокировку двери изнутри.\\n\\nВ комнате есть терминал, к которому подключаете омнитул и начинаете диалог с [a teta_base_coord_ketrin]Кетрин[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_was_in_coord\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_window_broken\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_docs\": {\n\t\t\"bg\": \"teta_base_docs\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На терминале надпись \\\"Доступ запрещен\\\"\\n\\n[a teta_base_lookup]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_living\": {\n\t\t\"bg\": \"teta_base_living\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь закрыта\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_doors_opened\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы проходите по коридору перед вами развилка.\\nПройти [a teta_base_living_1]прямо[/a],  [a teta_base_living_storage]налево[/a] или [a teta_base_living_scan]направо[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_doors_opened\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"\\n[a teta_base_lookup]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_server\": {\n\t\t\"bg\": \"teta_base_server\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь закрыта\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_code_entered\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь закрыта\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_doors_opened\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_code_entered\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы видите длинный спуск по лестницам.\\n\\n[a teta_base_server_way]Спуститься[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_doors_opened\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_code_entered\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"\\n[a teta_base_lookup]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_coord_window\": {\n\t\t\"bg\": \"teta_base_coord\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_window_broken\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы разбиваете окно. Теперь можно попасть [a teta_base_coord]внутрь[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_server_way\": {\n\t\t\"bg\": \"teta_base_server\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Перед вами несколько дверей, из одной доносятся какие-то крики. К счастью, дверь закрыта. Некоторые проходы завалены.\\n\\nПройти в [a teta_base_server_room2]дверь слева[/a]\\n[a teta_base_lookup]Подняться[/a] наверх\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_server_room2\": {\n\t\t\"bg\": \"teta_base_server_room2\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы подходите к терминалу. Вы видите сообщение о том, что система нуждается в перезагрузке. Дергаете рубильник для перезагрузки и через несколько секунд система начинает работать в штатном режиме. \\n\\n[a teta_base_lookup]Подняться наверх[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_living_storage\": {\n\t\t\"bg\": \"teta_base_living_storage\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \" Это склад и здесь ничего полезного.\\n\\n[a teta_base_living]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_living_scan\": {\n\t\t\"bg\": \"teta_base_living_scan\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы в комнате сканирования. В центре комнаты стоит кресло пилота.\\n\\n[a teta_base_lab_1]Рядом компьютер[/a] и еще одна  [a teta_base_lab_2]комната[/a] \\n\\n[a teta_base_living]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_living_1\": {\n\t\t\"bg\": \"teta_base_living_1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Это жилая зона. Вы находитесь в комнате отдыха\\n\\nСправа [a teta_base_living_rooms]комнаты персонала[/a] \\nСлева [a teta_base_shower]душевая [/a]\\n\\n[a teta_base_living]Вернуться[/a] \"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_living_rooms\": {\n\t\t\"bg\": \"teta_base_living_rooms\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Можно войти в следующие комнаты:\\n[a teta_base_room_conrad]Гай Конрад[/a]\\n[a teta_base_room_ketrin]Кетрин Чун[/a]\\n[a teta_base_room_sarang]Марк саранг[/a]\\n[a teta_base_room_bas]Робин Бас[/a]\\n[a teta_base_room_fisher]Мартин Фишер[/a]\\n\\nДругие комнаты закрыты\\n\\n[a teta_base_living_1]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_shower\": {\n\t\t\"bg\": \"teta_base_shower\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Здесь вы впервые за все время прибывания на станции находите зеркало.\\nВы смотрите на свое отражение: вы просто робот в водолазном костюме. У вас нет лица, вместо него ровная поверхность сквозь, которую пробиваются 2 красных огонька\\n\\n[a teta_base_living_1]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_room_conrad\": {\n\t\t\"bg\": \"teta_base_room_conrad\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри несколько фото, чертежи. Но ничего полезного.\\n\\n[a teta_base_living_rooms]Продолжить осмотр[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_room_ketrin\": {\n\t\t\"bg\": \"teta_base_room_ketrin\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы находите планшет с несколькими записями.\\n\\nВ них говорится об испытаниях машины для симуляции и о сканировании людей. Также о том как Кетрин пришла идея с Ковчегом.\\n\\nВ одной записи упоминается, что НИУ тайком сканировала разум людей, которые пользовались креслами пилотов для управления роботами. Эти сканы НИУ использовала для создания ИИ роботов.\\n\\nТакже упоминается, что несколько людей убивали себя после сканирования. Марк Саран говорил, что так нужно поступать всем, это каким-то образом поможет им попасть в ковчег \\\"по настоящему\\\".\\n\\nЕсть запись, где говорится о том, что Кетрин дали набор ИИ шаблонов, которые она никогда раньше не видела. Она пробовала их установить, чтобы у капсульной Кетрин и ее банды появились новые друзья.\\n\\n[a teta_base_living_rooms]Продолжить осмотр[/a] комнат\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_room_sarang\": {\n\t\t\"bg\": \"teta_base_room_sarang\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри вы находите [a teta_base_room_sarang_note]записку[/a] и [a teta_base_room_sarang_audio]аудиозапись[/a]\\n\\n[a teta_base_living_rooms]Продолжить осмотр[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_room_bas\": {\n\t\t\"bg\": \"teta_base_room_bas\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На кровати вы видите бритву и много крови. Рядом рисунки \\\"рая\\\" и подпись \\\"Я пойду во банк и ставлю на Соранга\\\"\\n\\n[a teta_base_living_rooms]Продолжить осмотр[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_room_fisher\": {\n\t\t\"bg\": \"teta_base_room_fisher\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В этой комнате темно и повсюду следы Черной жидкости\\n\\n[a teta_base_living_rooms]Продолжить осмотр[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_lab_1\": {\n\t\t\"bg\": \"teta_base_lab_1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На экране вы видите список с устаревшими сканами людей. Среди них вы замечаете скан от человека со знакомой фамилий Мунши, а также с вашей фамилией - Джаред.\\nВ описании к вашему скану указана дата смерти - 2015 год и несколько аудио-записей.\\n\\nПервая \\\"после сканирования\\\". Вы слышите свой голос, говорите, что сканирование прошло успешно. На следующей рассказывается, что вам назначили лечение после анализ снимка. Из последней записи вы понимаете, что лечение не помогло и вы умираете. Также Доктор Мунши получает разрешение от вас на использовании записи вашего мозга в своей работе.\\nНастоящий Саймон мертв.\\n\\nНа компьютере отображается список загруженных файлов:\\nСканы 2х человек и 4 проверочных среды\\n\\nПередача по сети не доступна.\\n\\n\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Передача на устройство не доступно. Отсутствует устройство.\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_has_flash\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_base_comp_copy]Копировать[/a] файлы на устройство.\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_has_flash\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"\\n\\n[a teta_base_living_scan]Отойти от компьютера[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_lab_2\": {\n\t\t\"bg\": \"teta_base_lab_2\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Здесь 2 компьютера\\nПодойти[a teta_base_lab_comp_1] к первому[/a] или [a teta_base_lab_comp_2]ко второму [/a]\\n\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"\\nЗайти [a teta_base_lab_chips] в комнату с чипами[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_has_chip\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"\\n[a teta_base_living_scan]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_lab_comp_1\": {\n\t\t\"bg\": \"teta_base_lab_comp_1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В нем находите список запланированных сканирований, а также список сканированных людей, 6 из которых покончили жизнь самоубийством.\\n\\n\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Рядом есть устройство, которое можно использовать для хранения данных\\n\\n[a teta_base_get_flash]Забрать его[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_has_flash\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_base_lab_2]Отойти[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_has_flash\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_get_flash\": {\n\t\t\"bg\": \"teta_base_lab_comp_1\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_has_flash\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы забираете устройство.\\n\\n[a teta_base_lab_2]Отойти[/a] от компьютера\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_lab_comp_2\": {\n\t\t\"bg\": \"teta_base_lab_comp_2\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На экране сообщение: \\\"Ошибка сервера\\\".\\nПохоже вам придется спуститься на нижний этаж в серверную и перезапустить систему\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"На экране сообщение \\\"Вставьте чип со сканом\\\"\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_chip_inserted\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_base_insert_chip]Вставить чип[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_has_chip\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_chip_inserted\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"На экране список людей, которые прошли сканирование и были записаны на этот чип. Просмотрев сведения о них, вы видите что Брендон Ван вполне может знать код, чтобы снять субмарину с карантина. Вы загружаете скан на сервер.\\n\\n[a teta_base_simulate]Запустить симуляцию[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_chip_inserted\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_simulation_started\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы видите на экране симуляцию. Вокруг пустота и человек в кресле. Он чувствует себя так как будто только, что прошел сканирование. Но потом понимает что, что-то  пошло не так, не понимает почему нет ничего вокруг. Кетрин пытается заговорить с ним, чтобы узнать код, но уровень стресса Брендона поднимается до предела и симуляция завершается.\\n\\nВы пробуете запустить симуляцию снова. Брендон ведет себя так же как после сканирования, и даже не подозревает, что вы уже пробовали с ним общаться. Но вторая попытка также безуспешна, хотя Кетрин пыталаcь его успокаивать. Кажется нужно создать другую обстановку.\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_simulation_started\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_chip_inserted\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"flash_with_env\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_flash_inserted\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы видите на экране симуляцию. Вокруг пустота и человек в кресле. Он чувствует себя так как будто только, что прошел сканирование. Но потом понимает что, что-то  пошло не так, не понимает почему нет ничего вокруг. Кетрин пытается заговорить с ним, чтобы узнать код, но уровень стресса Брендона поднимается до предела и симуляция завершается.\\n\\nВы пробуете запустить симуляцию снова. Брендон ведет себя так же как после сканирования, и даже не подозревает, что вы уже пробовали с ним общаться. Но вторая попытка также безуспешна, хотя Кетрин пыталаcь его успокаивать. Кажется нужно создать другую обстановку.\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_simulation_started\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_chip_inserted\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_flash_inserted\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы пробовали разные окружения в симуляции, комната для сканирования оказалась самой спокойной для Брендона.\\n\\nКетрин пытается узнать код доступа, но человек не доверяет ей, симуляция обрывается. Кетрин говорит, что нужно что-то еще и предлагает исследовать его комнату. Она разблокировала ее, чтобы вы могли в нее войти.\\n\\n[a teta_base_room_brandon_opened]Пройти в комнату Брендона[/a]\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_simulation_started\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_flash_inserted\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_chip_inserted\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"flash_with_env\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_base_flash_out]Забрать устройство хранения[/a]\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_flash_inserted\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_base_flash_in]Вставить устройство хранения[/a]\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"router_reloaded\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_flash_inserted\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"teta_has_flash\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_base_lab_2]Отойти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_lab_chips\": {\n\t\t\"bg\": \"teta_base_lab_chips\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_has_chip\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы в ходите в комнату. Здесь хранятся чипы отсканированных людей. Все чипы повреждены из-за электрического разряда, но поискав немного находите один целый.\\n\\nВы забираете его\\n\\n[a teta_base_lab_2]выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_insert_chip\": {\n\t\t\"bg\": \"teta_base_lab_comp_2\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_chip_inserted\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы вставляете чип в единственное подходящее под него гнездо.\\n\\n[a teta_base_lab_comp_2]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_simulate\": {\n\t\t\"bg\": \"teta_base_lab_comp_2\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_simulation_started\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На экране появляется надпись \\\"Запускается симуляция ....\\\"\\n\\n[a teta_base_lab_comp_2]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_comp_copy\": {\n\t\t\"bg\": \"teta_base_lab_1\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_has_flash\",\n\t\t\t\t\"value\": true\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"flash_with_env\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Данные успешно скопированы\\n\\n[a teta_base_lab_1]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_flash_out\": {\n\t\t\"bg\": \"teta_base_lab_comp_2\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_has_flash\",\n\t\t\t\t\"value\": true\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_flash_inserted\",\n\t\t\t\t\"value\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_simulation_started\",\n\t\t\t\t\"value\": false\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы забрали устройство\\n\\n[a teta_base_lab_comp_2]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_flash_in\": {\n\t\t\"bg\": \"teta_base_lab_comp_2\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_has_flash\",\n\t\t\t\t\"value\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_flash_inserted\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы вставили устройство. Пошел прогресс загрузки данных\\n\\n[a teta_base_lab_comp_2]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_coord_ketrin\": {\n\t\t\"bg\": \"teta_base_coord_ketrin\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_was_in_coord\",\n\t\t\t\t\"value\": true\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_doors_opened\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"[g]Кетрин:[/g] [r]Мы здесь? Мы здесь. Теперь пора угнать субмарину[/r]\\n[g]Саймон:[/g] [r]У вас тут много машин и механизмов. Чем этот особенный?[/r]\\n[g]Кетрин:[/g] [r]Это единственный транспорт, который может погрузиться в бездну и не смяться как консервная банка[/r]\\n[g]Саймон:[/g] [r]Если он такой один, как вообще ковчег мог оказаться в бездне?[/r]\\n[g]Кетрин:[/g] [r]Хороший вопрос. Видимо они пошли сложным путем - пешком[/r]\\n[g]Саймон:[/g] [r]Не думал что так тоже можно. Кет, а какого это находится в ковчеге? Это как кино, виртуальная реальность?[/r]\\n[g]Кетрин:[/g] [r]Нет. Это как настоящая жизнь только лучше. Приятная температура, чистый воздух, хорошая погода[/r]\\n[g]Саймон:[/g] [r]И все в Ковчеге делают вид что в реальном мире[/r]\\n[g]Кетрин:[/g] [r]А делать вид и не надо, там полное погружение. Если прикрутить солнечные панели можно жить тысячи лет[/r]\\n[g]Саймон:[/g] [r]Потрясающие. Всей Земле конец, а мы теперь идем спасти остатки человечества[/r]\\n[g]Кетрин:[/g] [r]Я нашла субмарину. О нет. Она на карантине. Нам нужен код доступа. Его придется поискать. Я открою вам двери в другие помещения[/r]\\n\\n[a teta_base_lookup]Выйти[/a], чтобы найти код для разблокировки\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_simulate_4\": {\n\t\t\"bg\": \"teta_base_lab_comp_2\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"teta_has_code\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В симуляции теперь присутствует Элис. Брендон чувствует себя спокойно. Кетрин удается узнать у него код. Можете вернуть в комнату, где оставили омнитул.\\n\\n[a teta_base_coord]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_room_brandon_opened\": {\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В комнате вы находите записку от Элис Костер, а также несколько фотографий Элис и Брендона вместе. Кажется они были близки.\\n\\nКетрин предлагает синтезировать ее голос, чтобы обмануть Брендона и узнать код. Надо попробовать симуляцию снова. \\n\\n[a teta_base_simulate_4]Вернуться к компьютеру[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_start\": {\n\t\t\"bg\": \"teta_dock_start\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы в комнате. Посреди спуск в воду огражденный сеткой, над ним висит робот, но кажется он отключен. \\n\\nВы подходите к терминал и включаете его. На экране появляется надпись \\\"Готов\\\", Затем \\\"Системы включены\\\". Включается тревога. Робот включается и издает крики \\\"Я не могу, не могу. Кетрин это все вы виноваты\\\". Затем он падает в воду прямо на субмарину и выводит ее из строя. Тревога замолкает. \\n\\nТерминал больше не работает, выход из дока заблокирован, план с субмариной провалился.  Единственный способ выбраться из комнаты - пролезть через вентиляцию.\\n\\nВы оказываетесь в лаборатории. Внутри много компьютеров. Вы подключаете омнитул к ближайшему терминалу.\\n\\nКетрин уже поняла, что НИУ добралась до батискафа раньше нас. Она говорит, что есть альтернативный путь спуститься в бездну. Нужно добраться до станции Омикрон и надеется, что там есть энергокостюм.\\n\\n[a teta_dock_lab]Осмотреться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_lab\": {\n\t\t\"bg\": \"teta_dock_lab\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В центре комнаты стол с оборудованием, рядом маркерная[a teta_dock_lab_table] доска с заметками[/a], в углу [a teta_dock_lab_capsule]капсула[/a].\\n\\nЗабрать омнитул [a teta_dock_coridors]выйти из лаборатории[/a]\\n\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_lab_table\": {\n\t\t\"bg\": \"teta_dock_lab\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"На доске несколько заметок о процессе сбора ковчега, инструкция по использованию энергокостюма, фото команды работающей над проектом.\\n\\n[a teta_dock_lab]Осмотреться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_lab_capsule\": {\n\t\t\"bg\": \"teta_dock_lab\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Кетрин говорит, что это исследователь состава, чтобы исследовать структурную целостность грузов. Она просит вас в него залезть. Если бы она знала из чего вы сделаны. то быстрее разобралась как поместить вас в ковчег.\\n\\nВы залезаете в капсулу, дверь закрывается, начинается процесс сканирования. Оказалось что основой для вашего тела стала одна из коллег Кетрин - Рид Имоджен. В череп был вставлен стандартный энцефалочип для роботов вместе со считывателем данных. Структурный гель спаял все воедино. Энцефалочип - это хорошо, значит можно передать ваш разум в Ковчег с места пилота.\\n\\n[a teta_dock_lab]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_coridors\": {\n\t\t\"bg\": \"teta_dock_coridors\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы находитесь в темном коридоре. На полу следы крови. Вокруг много комнат. Нужно выбраться со станции воспользовавшись главным лифтом\\n\\n[a teta_dock_lift]Подойти к лифту[/a]\\n[a teta_dock_room]Комната обследования больных[/a]\\n[a teta_dock_brandon]Комната управления[/a]\\n[a teta_dock_security]Пункт охраны[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_lift\": {\n\t\t\"bg\": \"teta_dock_lift\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Рядом с лифтом интерком. Человек на записи говорит, что лестницы заблокированы, лифт отключен - из замка вынут соединительный чип.\\n\\nЛифт не работает. Слева от лифта открыт щиток, на нем горят красные огоньки, а на экране надпись \\\"Вставьте соединительный чип\\\"\\n\\n[a teta_dock_coridors]Назад[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_brandon_chip\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы вставляете чип и на экране появляется надпись \\\"Код доступа устарел\\\".\\nНужно как-то обновить чип.\\n\\n[a teta_dock_coridors]Назад[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_brandon_chip\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"brandon_chip_pathched\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы ставите чип. Загорается зеленый огонек, надпись \\\"Код доступа принят\\\".\\n\\nВходите в лифт на последний этаж.\\n\\nЗдесь есть шатл, но он не работает, некоторые двери закрыты. Открываете единственную доступную дверь. Проходите в коридор и слышите рев монстра, через секунду вы его не только слышите но и видите.\\n\\nВы пытаетесь убежать от него, но он оказывается быстрее. Удар по голове и вы теряете сознание.\\n\\n[a teta_dock_down]Очнуться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_brandon_chip\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"brandon_chip_pathched\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_room\": {\n\t\t\"bg\": \"teta_dock_room\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В комнате есть аудиозапись:\\n\\n\\\"Акерс потреблял много структурного геля. Вероятно несколько недель. Трудно сказать как это повлияло на его здоровье помимо недостатка питания. И это ли заставило его выковырять себе глаза. Небольшие количества геля считались вполне безопасными, но я не слышала о каких либо рекомендациях по лечению передозировки геля. Учитывая свойства геля, сомневаюсь что он ядовит, но учитывая трансформационные свойства феромагнитной жидкости, я думаю, что следует ожидать злокачественных мутаций.\\\"\\n\\n[a teta_dock_coridors]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_brandon\": {\n\t\t\"bg\": \"teta_dock_brandon\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Дверь заблокирована.\\n\\nПопробовать [a teta_dock_brandon_2]разбить стекло[/a] \\n[a teta_dock_coridors]Отойти[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"brandon_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри вы  находите мертвого Брендона Вана\\n\\n[a teta_dock_coridors]Выйти[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"brandon_unlocked\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_dock_get_chip]Взять чип[/a] из рук\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"brandon_unlocked\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_brandon_chip\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_brandon_2\": {\n\t\t\"bg\": \"teta_dock_brandon\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"brandon_unlocked\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Стекло разбито. [a teta_dock_brandon]Пролезть в окно и разблокировать дверь[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_security\": {\n\t\t\"bg\": \"teta_dock_security\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В комнате рабочий стол и компьютер. Вы подходите к компьютеру, чтобы изучить его.\\n\\nВ нем сообщение:\\n\\\"В результате большой протечки структурного геля НИУ перехватило управление над субмариной 'ДАНБЭТ'. Было принято решение поместить весь сектор в карантин, чтобы избежать дальнейшего распространения геля. Меньше всего нам нужна еще одна говорящая машина\\\"\\n\\n\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_dock_security_chip]Обновить чип[/a] - загрузить коды\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_brandon_chip\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_dock_security_chip_fail]Обновить чип[/a] - загрузить коды\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"has_brandon_chip\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a teta_dock_coridors]Выйти[/a] \"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_security_chip\": {\n\t\t\"bg\": \"teta_dock_security\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"brandon_chip_pathched\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Идет процесс обновления. Затем вы видите сообщение, что чип обновлен\\n\\n[a teta_dock_lift]Направиться к лифту[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_get_chip\": {\n\t\t\"bg\": \"teta_dock_brandon\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"has_brandon_chip\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы вырываете из рук чип, который крепко держится в руках Брендона\\n\\nКажется, этот чип подойти для ремонта лифта\\n[a teta_dock_coridors]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_down\": {\n\t\t\"bg\": \"teta_dock_down\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы открываете глаза и видите свою квартиру в Торонто. Вы сидите на диване перед телевизором, у окна стоит женщина. Это Эшли - ваша жена. Она погибла в автокатастрофе, но сейчас вы ее видите живой.\\n\\n[g]Эшли[/g] [r]Тихо тихо, все хорошо. Все закончилось. Расслабься[/r]\\n[g]Саймон[/g] [r]Эшли? что ты тут делаешь?[/r]\\n[g]Эшли[/g] [r]Мы с тобой вместе. Как все пары[/r]\\n[g]Саймон[/g] [r]Но мы же не...[/r]\\n[g]Эшли[/g] [r]Я тебе не нужна?[/r]\\n[g]Саймон[/g] [r]Нужна конечно, но что случилось?[/r]\\n[g]Эшли[/g] [r]Мы влюбились[/r]\\n\\nБелая вспышка. Теперь вы видите помещение, то где вас поймал монстр.\\nВы на половину находитесь в структурном геле, так же как люди, которых вы встречали раньше. Вам удается выбраться. Вы продолжаете путь, видите несколько людей, покрытых структурным гелем. Они выглядят живыми, но не в сознании, что то шепчут.\\n\\n[a amikron_start]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_start\": {\n\t\t\"bg\": \"amikron_start\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"С осторожностью вы двигаетесь по коридорам и находите выход со станции Тета. Оглядевшись, видите что станция Амикрон совсем близко и спустя несколько минут вы добираетесь до нее пешком.\\n\\n[a amikron_coridor1]Войти внутрь[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_coridor1\": {\n\t\t\"bg\": \"amikron_coridor1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы в помещении с несколькими выходами. \\n\\nПройти в дверь [a amikron_coridor11]впереди[/a] или подняться по лестницу [a amikron_coridor21] на второй этаж[/a]\\n\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_coridor11\": {\n\t\t\"bg\": \"amikron_coridor11\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В центре комнаты терминал\\nНа экране надпись: \\\"Полное блокирование станции. Отмена на терминале комнаты погружения\\\"\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Попробовать [a amikron_quest1]разблокировать двери[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_suit_found\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Слева дверь, но она заперта\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a amikron_repair]Пройти в дверь слева[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a amikron_coridor1]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_coridor21\": {\n\t\t\"bg\": \"amikron_coridor21\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В центре комнаты  терминал\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"На экране сообщение:  \\\"Полное блокирование станции. Отмена на терминале комнаты погружения\\\"\\n\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Попробовать [a amikron_quest2]разблокировать двери[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_suit_found\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Двери слева  и  справа заперты\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Пройти [a amikron_gel]в дверь слева[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Пройти в дверь справа и [a amikron_coridor3]подняться на 3 этаж [/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Можно пройти в дверь [a amikron_coridor22]на противоположной стороне[/a]\\n[a amikron_coridor1]Спуститься на первый этаж[/a]\\n\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_coridor22\": {\n\t\t\"bg\": \"amikron_coridor22\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы в коридоре с несколькими дверьми\\n\\n[a amikron_medical]Медицинская комната[/a]\\n[a amikron_dive_room]Комната погружения[/a]\\n[a amikron_storage]Склад[/a]\\n\\n[a amikron_coridor21]Вернуться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_medical\": {\n\t\t\"bg\": \"amikron_medical\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Здесь вы видите медицинское оборудование\\n\\nВ противоположной части комнаты есть выход в [a amikron_dive_room]комнату погружения[/a]\\n[a amikron_coridor22]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_dive_room\": {\n\t\t\"bg\": \"amikron_dive_room\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"amicron_dive_room_first_time\",\n\t\t\t\t\"value\": true\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"prop\": \"amicron_suit_found\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В комнате вы находите терминал, в который ставите омнитул\\n\\n[g]Кетрин[/g] [r]Мы уже на амикроне? Нужно найти энергокостюм, чтобы вас не расплющело под толщей воды[/r]\\n[g]Саймон[/g] [r]Думаете я помещусь в него, я ведь уже в костюме.[/r]\\n[g]Кетрин[/g] [r]Да вот и я беспокоюсь. Вы помните как вас переместили из Торонто сюда? В общем мы сделаем тоже самое[/r]\\n[g]Саймон[/g] [r]Хотите послать меня в будущее?[/r]\\n[g]Кетрин[/g] [r]Да нет же, балда вы... Переместить ваш разум в новое тело. Осомотрите комнату, здесь должны быть энергокостюмы если они еще остались[/r]\\n\\nОсмотрев остальную часть комнаты, вы находите энергостюм. В костюме труп женщины. \\n\\nРядом терминал, запустив его, находите подробное описание костюма. Вы делаете диагностику костюма, но появляется сообщение об ошибке в системах костюма.\\nДля его починки нужны энцефелочип, структурный гель, набор аккумуляторов.\\n\\n[a amikron_coridor21]Поискать части на базе[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_dive_room_first_time\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы ставите найденные части в костюм, а затем активируете его с терминала.\\n\\nОсталось только переместить ваше сознание в него. Кетрин открывает дверь в комнату пилота. Вы проходите в нее.\\n\\nТребуется дополнительная [a amikron_quest5]настройка[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Не хвататет структрурного геля. Можно поискать его на втором этаже\\n[a amikron_coridor21]Поискать части на базе[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Не хвататет батареи. Можно поискать ее на третьем этаже\\n[a amikron_coridor21]Поискать части на базе[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Не хвататет чипа. Можно поискать ее на первом этаже\\n[a amikron_coridor21]Поискать части на базе[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вам нужно найти некоторые вещи. Можно опискать их на базе\\n[a amikron_coridor21]Поискать части на базе[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_dive_room_first_time\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вам нужно найти некоторые вещи. Можно опискать их на базе\\n[a amikron_coridor21]Поискать части на базе[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вам нужно найти некоторые вещи. Можно опискать их на базе\\n[a amikron_coridor21]Поискать части на базе[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вам нужно найти некоторые вещи. Можно опискать их на базе\\n[a amikron_coridor21]Поискать части на базе[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_storage\": {\n\t\t\"bg\": \"amikron_storage\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри несколько стеллажей, на полках ничего полезного\\n[a amikron_coridor22]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_quest2\": {\n\t\t\"bg\": \"amikron_coridor21\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Немного покопавшись в настройках находите способ открыть запертые двери\\n\\n[a amikron_coridor21]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_repair\": {\n\t\t\"bg\": \"amikron_repair\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"В комнате 2 стола. На одном из них лежат инструменты и чертежи, на втором какая-то машина. Рядом со со вторым столом терминал\\n\\n\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a amikron_repair_2]Осмотреть терминал[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a amikron_repair_1]Осмотреть терминал[/a]\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"[a amikron_coridor11]Выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_repair_1\": {\n\t\t\"bg\": \"amikron_repair\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"amikron_chip\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Этот теминал соединен с машиной на столе и нужен для диагностики  энцефалочипов.\\nВы прогоняете проверку и убеждаетесь что находящийся в машине чип исправен. \\n\\nНажимаете извлечь чип. Машина открывает корпус и вы без проблем забираете чип.\\n\\n[a amikron_coridor11]Продолжить поиски[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_repair_2\": {\n\t\t\"bg\": \"amikron_repair\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Энцефалочип извлечен. Связи с носителем нет.\\n\\n[a amikron_coridor11]Продолжить поиски[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_gel\": {\n\t\t\"bg\": \"amikron_gel\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"amikron_gel\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри вы находите компьютер с описанием структурного геля и результатами опытов.\\n\\n\\\"Гель меняет функциональность схем. Некоторые простые машины после попадания геля на корпус начинают работать - и при этом эффективнее чем до этого. Но в модификациях внесенных НИУ в гель, много лишней и не всегда понятной информации. При нанесении  на более сложные машины - гель действует подобно раковой опухоли и в конечном итоге уничтожает. Мы могли бы использовать этот гель для некоторых работ, но сначала его надо расскалибровать, чтобы избавиться от плохого кода.\\\"\\n\\n\\\"Я нанес гель на мертвую мышь, она ожила. Затем поместил к живой мыши. Оживленная мышь не испытывала ни к чему интереса, а живая испытывала стресс. Через 15 минут оживленная мышь убила живую, после 30 минут перестала двигаться, ее труп стал совсем твердый, так как в нем загустел гель.\\\"\\n\\n\\\"Химический анализ: это все тот же гель, что был введен по всей базу несколько лет назад. Проблема не в самом геле, а в том что управляет им НИУ. Гель не приобрел никаких новых свойств, просто НИУ использует его так как мы не могли даже предполагать\\\"\\n\\n[a amikron_gel_2]Продолжить осмотр[/a]\\n\\n\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_coridor3\": {\n\t\t\"bg\": \"amikron_coridor3\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"amicron_battery\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы проходите в отдел управления электропитанием. \\nНа одном из стеллажей вы находите батарею.\\n\\n[a amikron_coridor21]Вернуться на второй этаж[/a] \"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_quest5\": {\n\t\t\"text\": [],\n\t\t\"quest\": {\n\t\t\t\"name\": \"tune-waves\",\n\t\t\t\"exit\": \"amikron_new_suit\"\n\t\t}\n\t},\n\t\"amikron_new_suit\": {\n\t\t\"bg\": \"amikron_new_suit\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы садитесь в кресло\\n\\n[g]Кетрин[/g] [r]Скоро все закончится[/r]\\n[g]Саймон[/g] [r]Все равно что снять фотографию?[/r]\\n[g]Кетрин[/g] [r]На самую дорогую фотокамеру в мире[/r]\\n[g]Саймон[/g] [r]Знаете, индейцы думали, что фотографии забирают их душу[/r]\\n[g]Кетрин[/g] [r]В данном случае они правы[/r]\\n\\nБелая вспышка, вы открываете глаза\\n\\nСмотрите на руки и видите что вы уже в другом костюме сидите на месте где нашли его.  Через секунду вы слышите голос из комнаты откуда происходило сканирование. Это ваш голос. Он говорит \\\"Явно что-то не так. Может можно диагностику запустить? Кетрин?..\\\". Голос замолкает.\\n\\n[a amikron_new_suit_1]Войти в комнату[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_kill_simon\": {\n\t\t\"bg\": \"amikron_kill_simon\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы нажимаете на кнопку. Появляется сообщение о разрядке батареи\\n\\n[a amikron_out]Забрать омнитул и выйти через отсек[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_out\": {\n\t\t\"bg\": \"amikron_out\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы выходите в открытый океан. Рядом подъемник. Вы заходите в него. Здесь есть терминал, вы подключаете к нему Кетрин. Включаете подъемник и начинаете погружение в бездну.\\n\\n[g]Саймон[/g] [r]А мы уже узнали что происходит после смерти? Это вообще возможно? Если есть какая загробная жизнь - как вы думаете, мое место уже занято? Настоящий я умер сто лет назад. Есть для меня еще место? А что насчет Саймона, которого я убил на Омикроне?\\nМне ведь просто повезло, что я очнулся в правильном теле? Не угадал бы - гнил бы сейчас на Омикроне. Он бы вполне мог считать себя правильным Саймоном[/r]\\n\\nЧерез несколько минут на терминале появляется сообщение о приближении к месту назначения. Через пару минут подъемник останавливается, вы оказываетесь неподалеку от станции Омега.\\n\\n[a omega_start]Забрать омнитул и выйти[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"omega_start\": {\n\t\t\"bg\": \"omega_start\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вокруг темно. Свет не пробивается на такую глубину. В землю воткнуты фонари. Ориентируясь на них вы идете в сторону станции Тау. Вокруг плавают агрессивные рыбы, но они не нападают, если держаться близко к свету. Через какое-то время вы добираетесь до станции. \\n\\nДвери на этой станции отличаются: они круглые и толще.\\n\\nНа одном из компьютеров вы находите карту станции. База делится а 3 секции: обслуживание, лаборатории и жилая секция. Ковчег должен находится в жилой секции. \\n\\n[a omega_living]Пройти туда[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"omega_living\": {\n\t\t\"bg\": \"omega_living\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"omega_living_first\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Посередине стоит большой стол, на нем есть список с остатками еды, вокруг несколько дверей:\\n\\n- [a omega_rooms]осмотреть каюты[/a] \\n- [a omega_infirmary]подняться в лазарет[/a]\\n- [a omega_diving]спуститься в комнату погружения[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"omega_rooms\": {\n\t\t\"bg\": \"omega_rooms\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Внутри вы находите трупы людей. \\n\\nВ одной из комнат вы находите планшет с [a omega_rooms_notes]заметками[/a] и [a omega_rooms_audio]аудиозаписями[/a].\\n\\n[a omega_living]Осмотреться[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"omega_infirmary\": {\n\t\t\"bg\": \"omega_infirmary\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"omega_has_arc\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы подходите к лазарету и слышите женский голос за дверью: \\\"Уходи НИУ. Я тебя не впущу и болванчиков твоих тоже\\\".\\n\\nВы заходите внутрь и видите женщину подключенную к системе жизнеобеспечения.\\n\\n[g]Сара[/g] [r]Вы не такой.[/r]\\n[g]Саймон[/g] [r]Вы живой человек?[/r]\\n[g]Сара[/g] [r]Техник по полезной нагрузке к вашим услугам[/r]\\n[g]Саймон[/g] [r]Вы первый живой человек за все время[/r]\\n[g]Сара[/g] [r]Внизу нас мало осталось. Больше вверху, на плато[/r]\\n[g]Саймон[/g] [r]Там живых нет[/r]\\n\\nНа столе стоит Ковчег. Вы ставите его в лифт и спускаете в комнату погружения\\n\\nЖенщина долго не протянет в таком состоянии, поэтому она просит вас убить ее.\\n\\n[a omega_infirmary_1]Отключить[/a] систему жизнеобеспечения\\n[a omega_infirmary_2]Оставить[/a] умирать так\\n\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omega_has_arc\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"В лазарете больше ничего полезного нет.\\n\\n[a omega_living]Вернуться[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omega_has_arc\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"omega_diving\": {\n\t\t\"bg\": \"omega_diving\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы находитесь в комнате погружения. Здесь есть место для груза.\\n\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Чтобы продолжить вам нужно поставить ковчег туда.\\n\\n[a omega_living]Вернуться[/a] \",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omega_has_arc\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"\\nВы достаете из лифта ковчег и ставите его на площадку для груза. Вы запускаете систему: груз хватает механическая рука, двери открываются и вы вместе с ковчегом направляетесь [a phi_start]на станцию Фи[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"omega_has_arc\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"omega_infirmary_1\": {\n\t\t\"bg\": \"omega_infirmary\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Линда просит вас недолго побыть с ней. Она делится своими мыслями и умирает\\n\\n[a omega_living]Продолжить путь[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"omega_infirmary_2\": {\n\t\t\"bg\": \"omega_infirmary\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы оставили ее в живых, т.к. она последний живой человек на земле.\\n\\n[a omega_living]Продолжить путь[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"phi_start\": {\n\t\t\"bg\": \"phi_start\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Туннель, по которому вы двигались, оказался завален. Рука, которая тащила ковчег смогла пройти, но вам это не удается, нужно искать обходной путь. \\n\\nВы находите вход на станцию. И проходите в контрольную комнату. Подключаете Кетрин к терминалу.\\n\\nВ компьютере вы видите информацию о том, что ковчег прибыл в складские помещения. Так же здесь есть инструкция как пользоваться космической пушкой\\n\\nВы следуете [a phi_storage]в складские помещения[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"phi_storage\": {\n\t\t\"bg\": \"phi_storage\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Здесь 2 комнаты для приемки груза с вагонеток.\\nПройти в [a phi_storage2]первую[/a] или [a phi_storage2]вторую[/a] комнату\"\n\t\t\t}\n\t\t]\n\t},\n\t\"phi_storage1\": {\n\t\t\"bg\": \"phi_storage\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Здесь нет ковчега. На щитке есть аккумулятор.\\n\\n[a phi_storage3]Взять его[/a]\\n[a phi_storage2]Пройти во вторую комнату[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"phi_storage2\": {\n\t\t\"bg\": \"phi_storage\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Здесь есть ковчег. Но вы не можете его взять - кажется батарея из управляющего щитка неисправна.\\n\\nПоискать батарею [a phi_storage1]в соседней комнате[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"phi_battery\",\n\t\t\t\t\t\t\"value\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"value\": \"Вы заменяете батарею на рабочую. Достаете ковчег и направляетесь с ним в соседнюю комнату.\\n\\nЗдесь лежит чей-то труп. Вы дотрагиваетесь до него, чтобы прочитать черный ящик.\\nСлышите спор людей. Кетрин пытается вырвать ковчег, начинается драка. Затем вы слышите звук падения человека и по разговором понимаете, что они убили Кетрин.\\n\\n[g]Саймон[/g] [r]О нет, Кетрин. Это вы. Несчастный случай[/r]\\n[g]Кетрин[/g] [r]О чем вы? А вы о Кетрин. Не волнуйтесь, так даже лучше. Как она умерла?[/r]\\n[g]Саймон[/g] [r]Вы начали спорить с коллегами. Они не хотели запускать ковчег. Думали, что он не пройдет через атмосферу[/r]\\n[g]Кетрин[/g] [r]Они убили меня?[/r]\\n[g]Саймон[/g] [r]Я уверен, что это не умышленно. Просто пытались не дать вам провести запуск[/r]\\n\\nВы видите капсулу сборки. Устанавливаете туда ковчег. Нажимаете кнопку и снаряд отправляется к пушке. Затем вы возвращаетесь за Кетрин. Она говорит, что нужно пройти на место пилота, которое управляет пушкой. \\n\\nЗабирать омнитул и [a phi_run]выйти из помещения[/a]\",\n\t\t\t\t\"conditions\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"prop\": \"phi_battery\",\n\t\t\t\t\t\t\"value\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"phi_storage3\": {\n\t\t\"bg\": \"phi_storage\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"phi_battery\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы забрали батарею. Теперь нужно поискать ковчег [a phi_storage2]в другой комнате[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"phi_end\": {\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"<div class=\\\"sides\\\">\\n<div class=\\\"left\\\"><div>\\nВы видите на экране траекторию полета снаряда\\n\\n[g]Саймон[/g] [r]Я еще тут? Я еще тут. Кетрин?! Кетрин?![/r]\\n[g]Кетрин[/g] [r]Я здесь[/r]\\n[g]Саймон[/g] [r]Что случилось? Что не так пошло? Почему мы здесь?[/r]\\n[g]Кетрин[/g] [r]Саймон. Я вам сто раз говорила, как это работает, а вы не слушаете. Нас не перенесли на Ковчег, а скопировали. Игра с судьбой проиграна. Вами и мной. Как и Саймоном на Омикроне. Как и тем кто умер в Торонто сто лет назад. Наши копии на ковчеге, порадуйтесь за них[/r]\\n[g]Саймон[/g] [r]Вы спятили? Мы тут умрем, а эти сволочи будут жить себе в космосе. Это не мы! Они - не мы![/r]\\n[g]Кетрин[/g] [r]Мне жаль что вы так думаете. А я горжусь тем, что мы сделали[/r]\\n[g]Саймон[/g] [r]Да в гробу я это видал! И вас тоже, Кетрин. Вы врали. А я вам верил, я слушал вас. Вы же сказали что мы попадем на ковчег[/r]\\n[g]Кетрин[/g] [r]Мы и есть на ковчеге, идиот! Я не врала. Я не могу отвечать за вашу тупость, чтоб вас ...[/r]\\n\\nЭкран заискрился, Кетрин пропала с экрана, появилось сообщение \\\"Критическая ошибка\\\"\\n\\n[g]Саймон[/g] [r]Кетрин? Пожалуйста не бросайте меня[/r]\\n\\nВы остаетесь один ...\\n</div></div>\\n<div class=\\\"right\\\"><div>\\nВы видите, что находитесь в кресле, но в другом месте. В пещере. На вас уже нет костюма, вы в обычной одежде. \\n\\n[g]Саймон[/g] [r]Это? Сработало?[/r]\\n\\nВы выходите наружу. Вокруг все зеленое, течет река, цветут цветы. Вы идете дальше по дорожке вдоль реки. Наслаждаясь красотой. Вы доходите на берег моря. Там стоит Кетрин. Она выглядит как обычный человек.\\n\\n[g]Саймон[/g] [r]Кетрин. Глазам не верю. У нас получилось[/r]\\n[g]Кетрин[/g] [r]Получислось[/r]\\n</div></div>\\n</div>\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_start_2\": {\n\t\t\"bg\": \"teta_back_to_ketrin\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы вставляете омнитул в терминал неподалеку, достаете из коробки чип и ставите его в тот же терминал. Появляется сообщение о том, что стандартный помощник отключается и на его место загружаются данные с чипа. На экране появляется фото Кетрин. Ее сознание было перемещено в инструмент. Теперь при каждом его подключении к терминалу, вы можете общаться с Кетрин.\\n\\n[g]Кетрин:[/g]  [r]Я сохранила всех людей на станции в виде образов мозга и поместила их в искусственный мир. Мы собирались запустить его в космос, чтобы сохранить от этого всего. Сначала это был просто особый проект, но когда упала комета все стало серьезнее. А потом ему дали официальное название - \\\"Ковчег\\\"[/r]\\n[g]Саймон:[/g] [r]Далеко продвинулся проект?[/r]\\n[g]Кетрин:[/g] [r]Не знаю. Я из очень раннего сканирования. Живая Кетрин вполне могла закончить его и запустить. Она вполне может быть жива. У меня еще одна просьба. Не могли бы вы зайти в соседнюю комнату и проверить компьютер, чтобы найти Ковчег. В таком состоянии я этого сделать не смогу. Я открою вам дверь.[/r]\\n\\n[a teta_start_3]Пойти в соседнюю комнату [/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_start_3\": {\n\t\t\"bg\": \"teta_start_3\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы находите компьютер\\nВ нем несколько записей собеседований для проекта \\\"Ковчег\\\". Описание виртуального мира \\\"Ковчега\\\", чертежи. Есть кнопка сканирования для определения его местонахождения.\\n\\n[a teta_quest]Нажать[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_robot_0\": {\n\t\t\"bg\": \"teta_base_robot_1\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"[g]Робот:[/g] [r]Это все? Спасибо Кетрин. Стоп я уже тут? Кто это? Марк?[/r]\\n[g]Саймон:[/g] [r]Нет, мы не знакомы[/r]\\n[g]Робот:[/g] [r]Это ковчег?[/r]\\n[g]Саймон:[/g] [r]Как вы сюда попали?[/r]\\n[g]Робот:[/g] [r]Меня просканировали как и всех. А потом я убила себя. По крайней мере я так думаю. Сама не помню[/r]\\n[g]Саймон:[/g] [r]А как так получается. Вы попадаете в ковчег после смерти?[/r]\\n[g]Робот:[/g] [r]Да вы явно не с Теты. Смысл в том, что когда вас активируют в ковчеге вас фактически становится двое. Один человек и один компьютерный образ. Вы не хотите, чтобы вас пережила ваша копия, вы сами хотите выжить в ковчеге. Если ваш человеческий образ облик умрет перед началом сканирования или вскоре после него, вы продолжите жить в ковчеге. Потрясающе, да?[/r]\\n[g]Саймон:[/g] [r]Это Кетрин предложила вам себя убивать?[/r]\\n[g]Робот:[/g] [r]Нет. Она просто сканировала нас, помещала образы в ковчег. Надеюсь я скоро с могу с ней встретиться, извиниться. Ей всегда доставалось когда кто-нибудь убивал себя. А где все, я надеялась увидеть здесь человек 40-50[/r]\\n[g]Саймон:[/g] [r]Я не знаю как вам сказать. Это... это... Ковчег это здорово[/r]\\n\\n[a teta_base_enter]Пойти дальше[/a]\\n[a teta_base_robot_1]Отключить робота от НИУ[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_room_sarang_note\": {\n\t\t\"bg\": \"teta_base_room_sarang\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"\\\"Дорогие друзья. Когда вы будите читать это, я буду полностью внутри Ковчега. Для этого надо всего лишь завершить жизнь по окончании сканирования. Чтобы не пугать Кетрин,  я сделаю это тайно, завернув цианид в жвачку и закинув ее в рот перед сканированием. когда сканирование завершится, я укушу жвачку тем самым мгновенно вызвав  смерть.\\n\\nКогда вы узнаете правду сокрытую за моей смертью, то поймете что в этом нет трагедии - ибо я одержал победу. я советую вам всем сделать тоже самое и встретиться со мной в ковчеге\\\"\\n\\n[a teta_base_room_sarang]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_base_room_sarang_audio\": {\n\t\t\"bg\": \"teta_base_room_sarang\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"\\\"Вы знали что в человеческом теле до 75 триллионов отдельных клеток? Обычно они не остаются с нами до самой смерти, а живут только от нескольких дней до нескольких лет. Их жизнь коротка, но на нас это не влияет. В нас умирающие клетки заменяются новыми. Вряд ли кто скажет, что это лишает нас личности, а ведь мы находимся в процессе постоянного изменения. Как же мы останемся самими собой?\\nНепрерывный поток мыслей и восприятия сохраняет единую цепь нашего восприятия. Наш разум не слепок мозга, а продолжительная, непрерывная сущность, основная на этом слепке. Населяя Ковчег, доктор Чун фиксирует момент нашего существования и помещает его в цифровой мир. Скоро вы и ваши цифровые копии будете существовать раздельно из-за чего ваши пути разойдутся, но на крошечный промежуток времени вы станете одинаковы. Если сохранить непрерывность, новая жизнь станет полноценной, ничуть не менее реальной, чем та, из которой она создана.\\nПомните, вы это не ваше тело, вы - независимая сущность.  Просто так случилось, что вы находитесь в двух местах сразу. Если вы устраните свое тело, то останетесь в единственно верном для себя воплощении. В мире внутри Ковчега. Пусть ваше тело умрет, а вы будете жить в цифровом раю среди звезд.\\\"\\n\\n[a teta_base_room_sarang]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"teta_dock_security_chip_fail\": {\n\t\t\"bg\": \"teta_dock_security\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы видите сообщение: \\\"Должен быть вставлен чип\\\"\\n[a teta_dock_security]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_gel_2\": {\n\t\t\"bg\": \"amikron_gel\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Последняя запись в компьютере:\\n\\\"Результаты: Почти все указывает на то что все мутанты, рыбы и даже роботы-помощники управляются НИУ с помощью структурного геля. Все они подверглись воздействию заряженного геля, что вызвало рост злокачественных опухолей влияющих на их  поведение. Мотивы поведения ИИ разгадать трудно, но известно, что это началось после уничтожения человечества астероидом\\\"\\n\\nРядом стоит шкаф с образцами геля. Вы открываете его и забираете банку с образцом.\\n\\n[a amikron_coridor21]Выйти[/a] \"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_quest1\": {\n\t\t\"bg\": \"amikron_coridor11\",\n\t\t\"actions\": [\n\t\t\t{\n\t\t\t\t\"prop\": \"amicron_unlocked\",\n\t\t\t\t\"value\": true\n\t\t\t}\n\t\t],\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Немного покопавшись в настройках находите способ открыть запертые двери\\n\\n[a amikron_coridor11]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"amikron_new_suit_1\": {\n\t\t\"bg\": \"amikron_new_suit\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Вы заходите в комнату и видите спящего себя\\n\\n[g]Саймон[/g] [r]Что это было? Почему он еще говорил?[/r]\\n[g]Кетрин[/g] [r]Он такой же как и прежде[/r]\\n[g]Саймон[/g] [r]Вы это о чем?[/r]\\n[g]Кетрин[/g] [r]Вы знаете, что это не магия. Вас скопировали. Спящий в кресле был скопирован и теперь вы здесь. Точно так же Саймон продолжал жить в Торонто. А чего вы ожидали?[/r]\\n[g]Саймон[/g] [r]Что вы возьмете мой разум и пересадите его в другое тело. Как пересадка мозга[/r]\\n[g]Кетрин[/g] [r]Извините, но это так не работает[/r]\\n[g]Саймон[/g] [r]Что с ним будет?[/r]\\n[g]Кетрин[/g] [r]Поспит немного. Несколько дней[/r]\\n[g]Саймон[/g] [r]А потом что? Снова проснется в этом долбаном кошмаре? Совсем один.[/r]\\n[g]Кетрин[/g] [r]Ну а что вы хотите с ним сделать? Подружится? Рассказать, что мы его оставим, когда пойдем в бездну?[/r]\\n[g]Саймон[/g] [r]Что если ему не нужно будет просыпаться?[/r]\\n[g]Кетрин[/g] [r]Если вы хотите, чтобы его батарея разрядилась, нажмите выключатель. Он умрет за минуту[/r]\\n\\n[a amikron_kill_simon]Нажать на кнопку[/a]\\nЗабрать омнитул и выйти через отсек, оставив [a amikron_out]Саймона живым[/a]. \"\n\t\t\t}\n\t\t]\n\t},\n\t\"omega_rooms_notes\": {\n\t\t\"bg\": \"omega_rooms\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"\\\"Экипаж получил сообщение об эвакуации. Но как только шторм прекратился на людей напали рыбы \\\"измененные\\\" НИУ, поэтому люди вынуждены были вернуться на Тау. Большая часть экипажа погибла.\\\"\\n\\n\\\"Пришли люди с плато. Они сказали что хотят запустить из космической пушки какой-то Ковчег. Искусственный мир, в котором будут образы разумов. Идея странная, но интересная. Мы все согласились пройти сканирование. чтобы принять участие в этой 'загробной жизни'\\\"\\n\\n\\\"Часть инженеров вернулась с Фи. Похоже что запуск ковчега откладывается. Они все были в дурном настроении\\\"\\n\\n[a omega_rooms]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"omega_rooms_audio\": {\n\t\t\"bg\": \"omega_rooms\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"\\\"С тех пор как упала комета, НИУ перешло в режим низкого энергопотребления. Оно не прекратило свою работу, оно следит за климатом и жизнеобеспечением.\\nНИУ начало разрастаться. Теперь это не только центральная камера - по всему комплексу структурный гель прорывается через трубы и течет из стен.  Я не знаю зачем это нужно НИУ, но полагаю что это делается намерено\\\"\\n\\n\\\"НИУ распространяется по всем машинам, по всем формам жизни, чтобы манипулировать ими, управлять. Оно пытается помочь спасти своих создателей как того требует протокол. Но до чего оно дойдет?\\\"\\n\\n[a omega_rooms]Назад[/a]\"\n\t\t\t}\n\t\t]\n\t},\n\t\"phi_run\": {\n\t\t\"bg\": \"phi_run\",\n\t\t\"text\": [\n\t\t\t{\n\t\t\t\t\"value\": \"Перед вами большее сооружение - космическая пушка, рядом кресло пилота. Вы садитесь в него и подключаете Кетрин. Она включает кресло, с помощью погрузчика вы устанавливаете снаряд с Ковчегом в пушку. Кетрин программирует кресло на сканирование разума и запуск пушки:  как только сканирование завершится пушка будет запущена.\\n\\nВы нажимаете на кнопку, видите как происходит процесс сканирования, а затем снаряд запускается.\\n\\n[a phi_end]Продолжить[/a]\"\n\t\t\t}\n\t\t]\n\t}\n});\n\n\n//# sourceURL=webpack:///./typo/output.js?");

/***/ })

/******/ });